/
account.ts
105 lines (82 loc) · 3.95 KB
/
account.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import {from} from "rxjs";
import {pick} from "ramda";
import {AccountConfig} from "src/shared/model/account";
import {Context} from "src/electron-main/model";
import {Endpoints} from "src/shared/api/main";
import {configureSessionByAccount, initSessionByAccount} from "src/electron-main/session";
import {pickAccountStrict} from "src/shared/util";
export async function buildEndpoints(
ctx: Context,
): Promise<Pick<Endpoints, "addAccount" | "updateAccount" | "changeAccountOrder" | "removeAccount">> {
return {
addAccount: (
{type, login, entryUrl, database, credentials, proxy, loginDelayUntilSelected, loginDelaySecondsRange},
) => from((async () => {
const account = {
type,
login,
entryUrl,
database,
credentials,
proxy,
loginDelayUntilSelected,
loginDelaySecondsRange,
} as AccountConfig; // TODO ger rid of "TS as" casting
const settings = await ctx.settingsStore.readExisting();
settings.accounts.push(account);
const result = await ctx.settingsStore.write(settings);
await initSessionByAccount(ctx, pick(["login", "proxy"], account), {skipClearSessionCaches: true});
return result;
})()),
updateAccount: (
{login, entryUrl, database, credentials, proxy, loginDelayUntilSelected, loginDelaySecondsRange},
) => from((async () => {
const settings = await ctx.settingsStore.readExisting();
const account = pickAccountStrict(settings.accounts, {login});
const {credentials: existingCredentials} = account;
account.database = database;
if (typeof entryUrl === "undefined") {
throw new Error('"entryUrl" is undefined');
}
account.entryUrl = entryUrl;
if (credentials) {
if ("password" in credentials) {
existingCredentials.password = credentials.password;
}
if ("twoFactorCode" in credentials) {
existingCredentials.twoFactorCode = credentials.twoFactorCode;
}
if (account.type === "protonmail" && "mailPassword" in credentials) {
account.credentials.mailPassword = credentials.mailPassword;
}
}
account.proxy = proxy;
await configureSessionByAccount(pick(["login", "proxy"], account));
account.loginDelayUntilSelected = loginDelayUntilSelected;
account.loginDelaySecondsRange = loginDelaySecondsRange;
return await ctx.settingsStore.write(settings);
})()),
changeAccountOrder: ({login, index: moveToIndex}) => from((async () => {
const settings = await ctx.settingsStore.readExisting();
if (isNaN(moveToIndex) || moveToIndex < 0 || moveToIndex >= settings.accounts.length) {
throw new Error(`Invalid "index" value`);
}
const accountToMove = pickAccountStrict(settings.accounts, {login});
const removeIndex = settings.accounts.indexOf(accountToMove);
if (removeIndex === moveToIndex) {
return settings;
}
settings.accounts.splice(removeIndex, 1);
settings.accounts.splice(moveToIndex, 0, accountToMove);
return await ctx.settingsStore.write(settings);
})()),
removeAccount: ({login}) => from((async () => {
const settings = await ctx.settingsStore.readExisting();
const account = pickAccountStrict(settings.accounts, {login});
const index = settings.accounts.indexOf(account);
settings.accounts.splice(index, 1);
// TODO remove session, not yet supported by Electron?
return await ctx.settingsStore.write(settings);
})()),
};
}