@bobfrankston/mailx-store-web 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/android-bootstrap.d.ts +16 -0
  2. package/android-bootstrap.d.ts.map +1 -0
  3. package/android-bootstrap.js +1438 -0
  4. package/android-bootstrap.js.map +1 -0
  5. package/android-bootstrap.ts +1450 -0
  6. package/db.d.ts +146 -0
  7. package/db.d.ts.map +1 -0
  8. package/db.js +725 -0
  9. package/db.js.map +1 -0
  10. package/db.ts +831 -0
  11. package/gmail-api-web.d.ts +11 -0
  12. package/gmail-api-web.d.ts.map +1 -0
  13. package/gmail-api-web.js +11 -0
  14. package/gmail-api-web.js.map +1 -0
  15. package/gmail-api-web.ts +11 -0
  16. package/imap-web-provider.d.ts +33 -0
  17. package/imap-web-provider.d.ts.map +1 -0
  18. package/imap-web-provider.js +140 -0
  19. package/imap-web-provider.js.map +1 -0
  20. package/imap-web-provider.ts +156 -0
  21. package/index.d.ts +10 -0
  22. package/index.d.ts.map +1 -0
  23. package/index.js +10 -0
  24. package/index.js.map +1 -0
  25. package/index.ts +10 -0
  26. package/main-thread-host.d.ts +15 -0
  27. package/main-thread-host.d.ts.map +1 -0
  28. package/main-thread-host.js +292 -0
  29. package/main-thread-host.js.map +1 -0
  30. package/main-thread-host.ts +322 -0
  31. package/package.json +41 -0
  32. package/provider-types.d.ts +7 -0
  33. package/provider-types.d.ts.map +1 -0
  34. package/provider-types.js +7 -0
  35. package/provider-types.js.map +1 -0
  36. package/provider-types.ts +7 -0
  37. package/sql-wasm-esm.js +10 -0
  38. package/sql.js.d.ts +29 -0
  39. package/sync-manager.d.ts +68 -0
  40. package/sync-manager.d.ts.map +1 -0
  41. package/sync-manager.js +506 -0
  42. package/sync-manager.js.map +1 -0
  43. package/sync-manager.ts +508 -0
  44. package/tsconfig.json +10 -0
  45. package/web-jsonrpc.d.ts +20 -0
  46. package/web-jsonrpc.d.ts.map +1 -0
  47. package/web-jsonrpc.js +112 -0
  48. package/web-jsonrpc.js.map +1 -0
  49. package/web-jsonrpc.ts +126 -0
  50. package/web-message-store.d.ts +16 -0
  51. package/web-message-store.d.ts.map +1 -0
  52. package/web-message-store.js +89 -0
  53. package/web-message-store.js.map +1 -0
  54. package/web-message-store.ts +97 -0
  55. package/web-service.d.ts +136 -0
  56. package/web-service.d.ts.map +1 -0
  57. package/web-service.js +687 -0
  58. package/web-service.js.map +1 -0
  59. package/web-service.ts +754 -0
  60. package/web-settings.d.ts +91 -0
  61. package/web-settings.d.ts.map +1 -0
  62. package/web-settings.js +518 -0
  63. package/web-settings.js.map +1 -0
  64. package/web-settings.ts +547 -0
  65. package/worker-bundle.js +6838 -0
  66. package/worker-entry.d.ts +8 -0
  67. package/worker-entry.d.ts.map +1 -0
  68. package/worker-entry.js +218 -0
  69. package/worker-entry.js.map +1 -0
  70. package/worker-entry.ts +245 -0
  71. package/worker-tcp-transport.d.ts +28 -0
  72. package/worker-tcp-transport.d.ts.map +1 -0
  73. package/worker-tcp-transport.js +98 -0
  74. package/worker-tcp-transport.js.map +1 -0
  75. package/worker-tcp-transport.ts +101 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Browser-compatible settings for Android/WebView.
3
+ * Replaces @bobfrankston/mailx-settings which depends on node:fs.
4
+ *
5
+ * Settings are stored in IndexedDB and synced to Google Drive
6
+ * via the GDrive API (same API as desktop cloud mode).
7
+ *
8
+ * On first run, settings are fetched from GDrive. Subsequent reads
9
+ * use the local IndexedDB cache. Writes go to both.
10
+ */
11
+ import type { AccountConfig, MailxSettings, AutocompleteSettings } from "@bobfrankston/mailx-types";
12
+ export declare function setGDriveTokenProvider(provider: () => Promise<string>): void;
13
+ export declare function setGDriveFolderId(folderId: string, folderName?: string, ownerEmail?: string, folderPath?: string): void;
14
+ export declare function cloudRead(filename: string): Promise<string | null>;
15
+ export declare function cloudWrite(filename: string, content: string): Promise<boolean>;
16
+ declare const DEFAULT_PREFERENCES: {
17
+ ui: {
18
+ theme: "system";
19
+ editor: "quill";
20
+ folderWidth: number;
21
+ listViewerSplit: number;
22
+ fontSize: number;
23
+ };
24
+ sync: {
25
+ intervalMinutes: number;
26
+ historyDays: number;
27
+ prefetch: boolean;
28
+ };
29
+ autocomplete: {
30
+ enabled: boolean;
31
+ provider: "off";
32
+ ollamaUrl: string;
33
+ ollamaModel: string;
34
+ cloudApiKey: string;
35
+ cloudModel: string;
36
+ debounceMs: number;
37
+ maxTokens: number;
38
+ };
39
+ };
40
+ declare const DEFAULT_ALLOWLIST: {
41
+ senders: string[];
42
+ domains: string[];
43
+ recipients: string[];
44
+ flaggedSenders: string[];
45
+ flaggedDomains: string[];
46
+ };
47
+ /** Load accounts — first from IndexedDB cache, then GDrive */
48
+ export declare function loadAccounts(): Promise<AccountConfig[]>;
49
+ /** Load accounts directly from GDrive, bypassing local cache */
50
+ export declare function loadAccountsFromCloud(): Promise<AccountConfig[]>;
51
+ /** Save accounts to IndexedDB and GDrive */
52
+ export declare function saveAccounts(accounts: AccountConfig[]): Promise<void>;
53
+ /** Load preferences */
54
+ export declare function loadPreferences(): Promise<typeof DEFAULT_PREFERENCES>;
55
+ /** Save preferences */
56
+ export declare function savePreferences(prefs: any): Promise<void>;
57
+ /** Load full settings (accounts + preferences combined) */
58
+ export declare function loadSettings(): Promise<MailxSettings>;
59
+ /** Save full settings */
60
+ export declare function saveSettings(settings: MailxSettings): Promise<void>;
61
+ /** Load allowlist */
62
+ export declare function loadAllowlist(): Promise<typeof DEFAULT_ALLOWLIST>;
63
+ /** Save allowlist */
64
+ export declare function saveAllowlist(list: typeof DEFAULT_ALLOWLIST): Promise<void>;
65
+ /** Load autocomplete settings */
66
+ export declare function loadAutocomplete(): Promise<AutocompleteSettings>;
67
+ /** Save autocomplete settings */
68
+ export declare function saveAutocomplete(settings: AutocompleteSettings): Promise<void>;
69
+ /** Get history days — read from preferences */
70
+ export declare function getHistoryDays(): Promise<number>;
71
+ /** Get prefetch setting */
72
+ export declare function getPrefetch(): Promise<boolean>;
73
+ /** Get storage info */
74
+ export declare function getStorageInfo(): {
75
+ provider: string;
76
+ mode: string;
77
+ folderId?: string;
78
+ folderName?: string;
79
+ folderPath?: string;
80
+ folderOwner?: string;
81
+ };
82
+ /** Clear all cached settings — used for "Reset Store" */
83
+ export declare function clearSettings(): Promise<void>;
84
+ /** Get or create a stable device ID (UUID stored in localStorage) */
85
+ export declare function getDeviceId(): string;
86
+ /** Save device-specific settings to GDrive (devices/<deviceId>/state.json) */
87
+ export declare function saveDeviceState(state: any): Promise<void>;
88
+ /** Load device-specific settings */
89
+ export declare function loadDeviceState(): Promise<any>;
90
+ export {};
91
+ //# sourceMappingURL=web-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-settings.d.ts","sourceRoot":"","sources":["web-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,518 @@
1
+ /**
2
+ * Browser-compatible settings for Android/WebView.
3
+ * Replaces @bobfrankston/mailx-settings which depends on node:fs.
4
+ *
5
+ * Settings are stored in IndexedDB and synced to Google Drive
6
+ * via the GDrive API (same API as desktop cloud mode).
7
+ *
8
+ * On first run, settings are fetched from GDrive. Subsequent reads
9
+ * use the local IndexedDB cache. Writes go to both.
10
+ */
11
+ const IDB_NAME = "mailx-settings";
12
+ const IDB_VERSION = 1;
13
+ const STORE_NAME = "files";
14
+ // ── IndexedDB helpers ──
15
+ function openSettingsDb() {
16
+ return new Promise((resolve, reject) => {
17
+ const req = indexedDB.open(IDB_NAME, IDB_VERSION);
18
+ req.onupgradeneeded = () => {
19
+ const db = req.result;
20
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
21
+ db.createObjectStore(STORE_NAME);
22
+ }
23
+ };
24
+ req.onsuccess = () => resolve(req.result);
25
+ req.onerror = () => reject(req.error);
26
+ });
27
+ }
28
+ async function idbRead(key) {
29
+ const db = await openSettingsDb();
30
+ return new Promise((resolve, reject) => {
31
+ const tx = db.transaction(STORE_NAME, "readonly");
32
+ const req = tx.objectStore(STORE_NAME).get(key);
33
+ req.onsuccess = () => resolve(req.result);
34
+ req.onerror = () => reject(req.error);
35
+ });
36
+ }
37
+ async function idbWrite(key, value) {
38
+ const db = await openSettingsDb();
39
+ return new Promise((resolve, reject) => {
40
+ const tx = db.transaction(STORE_NAME, "readwrite");
41
+ tx.objectStore(STORE_NAME).put(value, key);
42
+ tx.oncomplete = () => resolve();
43
+ tx.onerror = () => reject(tx.error);
44
+ });
45
+ }
46
+ async function idbDelete(key) {
47
+ const db = await openSettingsDb();
48
+ return new Promise((resolve, reject) => {
49
+ const tx = db.transaction(STORE_NAME, "readwrite");
50
+ tx.objectStore(STORE_NAME).delete(key);
51
+ tx.oncomplete = () => resolve();
52
+ tx.onerror = () => reject(tx.error);
53
+ });
54
+ }
55
+ // ── GDrive API ──
56
+ /** GDrive folder ID for the ".rmfmail" app folder */
57
+ let gDriveFolderId = null;
58
+ /** GDrive folder name (resolved from query — ".rmfmail" today, but kept dynamic in case the query changes) */
59
+ let gDriveFolderName = null;
60
+ /** Full path "My Drive/home/.rmfmail" — surfaced in About so the user can verify */
61
+ let gDriveFolderPath = null;
62
+ /** Owner email of the matched .rmfmail folder — surfaces wrong-account picks (e.g. spouse's shared folder) */
63
+ let gDriveFolderOwner = null;
64
+ /** OAuth token provider — set by bootstrap */
65
+ let tokenProvider = null;
66
+ export function setGDriveTokenProvider(provider) {
67
+ tokenProvider = provider;
68
+ }
69
+ export function setGDriveFolderId(folderId, folderName, ownerEmail, folderPath) {
70
+ gDriveFolderId = folderId;
71
+ if (folderName)
72
+ gDriveFolderName = folderName;
73
+ if (ownerEmail)
74
+ gDriveFolderOwner = ownerEmail;
75
+ if (folderPath)
76
+ gDriveFolderPath = folderPath;
77
+ }
78
+ export async function cloudRead(filename) {
79
+ return gDriveRead(filename);
80
+ }
81
+ export async function cloudWrite(filename, content) {
82
+ return gDriveWrite(filename, content);
83
+ }
84
+ async function gDriveRead(filename) {
85
+ if (!tokenProvider || !gDriveFolderId)
86
+ return null;
87
+ try {
88
+ const token = await tokenProvider();
89
+ // Find file by name in folder
90
+ const q = encodeURIComponent(`name='${filename}' and '${gDriveFolderId}' in parents and trashed=false`);
91
+ const listRes = await globalThis.fetch(`https://www.googleapis.com/drive/v3/files?q=${q}&fields=files(id)`, { headers: { "Authorization": `Bearer ${token}` } });
92
+ if (!listRes.ok)
93
+ return null;
94
+ const listData = await listRes.json();
95
+ const fileId = listData.files?.[0]?.id;
96
+ if (!fileId)
97
+ return null;
98
+ // Download content
99
+ const res = await globalThis.fetch(`https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`, { headers: { "Authorization": `Bearer ${token}` } });
100
+ if (!res.ok)
101
+ return null;
102
+ return res.text();
103
+ }
104
+ catch (e) {
105
+ console.error(`[settings] GDrive read ${filename}: ${e.message}`);
106
+ return null;
107
+ }
108
+ }
109
+ async function gDriveWrite(filename, content) {
110
+ if (!tokenProvider || !gDriveFolderId)
111
+ return false;
112
+ try {
113
+ const token = await tokenProvider();
114
+ // Check if file exists
115
+ const q = encodeURIComponent(`name='${filename}' and '${gDriveFolderId}' in parents and trashed=false`);
116
+ const listRes = await globalThis.fetch(`https://www.googleapis.com/drive/v3/files?q=${q}&fields=files(id)`, { headers: { "Authorization": `Bearer ${token}` } });
117
+ if (!listRes.ok)
118
+ return false;
119
+ const listData = await listRes.json();
120
+ const fileId = listData.files?.[0]?.id;
121
+ if (fileId) {
122
+ // Update existing
123
+ const res = await globalThis.fetch(`https://www.googleapis.com/upload/drive/v3/files/${fileId}?uploadType=media`, {
124
+ method: "PATCH",
125
+ headers: {
126
+ "Authorization": `Bearer ${token}`,
127
+ "Content-Type": "application/json",
128
+ },
129
+ body: content,
130
+ });
131
+ return res.ok;
132
+ }
133
+ else {
134
+ // Create new
135
+ const metadata = JSON.stringify({
136
+ name: filename,
137
+ parents: [gDriveFolderId],
138
+ mimeType: "application/json",
139
+ });
140
+ const boundary = "----mailx" + Date.now();
141
+ const body = `--${boundary}\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n${metadata}\r\n--${boundary}\r\nContent-Type: application/json\r\n\r\n${content}\r\n--${boundary}--`;
142
+ const res = await globalThis.fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", {
143
+ method: "POST",
144
+ headers: {
145
+ "Authorization": `Bearer ${token}`,
146
+ "Content-Type": `multipart/related; boundary=${boundary}`,
147
+ },
148
+ body,
149
+ });
150
+ return res.ok;
151
+ }
152
+ }
153
+ catch (e) {
154
+ console.error(`[settings] GDrive write ${filename}: ${e.message}`);
155
+ return false;
156
+ }
157
+ }
158
+ const PROVIDERS = {
159
+ "gmail.com": {
160
+ label: "Gmail",
161
+ imap: { host: "imap.gmail.com", port: 993, tls: true, auth: "oauth2" },
162
+ smtp: { host: "smtp.gmail.com", port: 587, tls: true, auth: "oauth2" },
163
+ },
164
+ "googlemail.com": {
165
+ label: "Gmail",
166
+ imap: { host: "imap.gmail.com", port: 993, tls: true, auth: "oauth2" },
167
+ smtp: { host: "smtp.gmail.com", port: 587, tls: true, auth: "oauth2" },
168
+ },
169
+ "outlook.com": {
170
+ label: "Outlook",
171
+ imap: { host: "outlook.office365.com", port: 993, tls: true, auth: "oauth2" },
172
+ smtp: { host: "smtp.office365.com", port: 587, tls: true, auth: "oauth2" },
173
+ },
174
+ "hotmail.com": {
175
+ label: "Hotmail",
176
+ imap: { host: "outlook.office365.com", port: 993, tls: true, auth: "oauth2" },
177
+ smtp: { host: "smtp.office365.com", port: 587, tls: true, auth: "oauth2" },
178
+ },
179
+ "yahoo.com": {
180
+ label: "Yahoo",
181
+ imap: { host: "imap.mail.yahoo.com", port: 993, tls: true, auth: "password" },
182
+ smtp: { host: "smtp.mail.yahoo.com", port: 587, tls: true, auth: "password" },
183
+ },
184
+ "icloud.com": {
185
+ label: "iCloud",
186
+ imap: { host: "imap.mail.me.com", port: 993, tls: true, auth: "password" },
187
+ smtp: { host: "smtp.mail.me.com", port: 587, tls: true, auth: "password" },
188
+ },
189
+ };
190
+ function normalizeAccount(acct, globalName) {
191
+ const email = acct.email || "";
192
+ const domain = email.split("@")[1]?.toLowerCase() || "";
193
+ const provider = PROVIDERS[domain];
194
+ const user = acct.imap?.user || acct.user || email;
195
+ return {
196
+ id: acct.id || domain.split(".")[0] || "account",
197
+ name: acct.name || globalName || email.split("@")[0],
198
+ label: acct.label || provider?.label,
199
+ email,
200
+ imap: {
201
+ host: acct.imap?.host || provider?.imap.host || `imap.${domain}`,
202
+ port: acct.imap?.port || provider?.imap.port || 993,
203
+ tls: acct.imap?.tls ?? provider?.imap.tls ?? true,
204
+ auth: acct.imap?.auth || provider?.imap.auth || "password",
205
+ user: acct.imap?.user || user,
206
+ password: acct.imap?.password || acct.password,
207
+ },
208
+ smtp: {
209
+ host: acct.smtp?.host || provider?.smtp.host || `smtp.${domain}`,
210
+ port: acct.smtp?.port || provider?.smtp.port || 587,
211
+ tls: acct.smtp?.tls ?? provider?.smtp.tls ?? true,
212
+ auth: acct.smtp?.auth || provider?.smtp.auth || "password",
213
+ user: acct.smtp?.user || user,
214
+ password: acct.smtp?.password || acct.password,
215
+ },
216
+ enabled: acct.enabled ?? true,
217
+ defaultSend: acct.defaultSend,
218
+ syncContacts: acct.syncContacts ?? (provider?.imap.auth === "oauth2"),
219
+ relayDomains: acct.relayDomains,
220
+ deliveredToPrefix: acct.deliveredToPrefix,
221
+ };
222
+ }
223
+ // ── Default settings ──
224
+ const DEFAULT_PREFERENCES = {
225
+ ui: {
226
+ theme: "system",
227
+ editor: "quill",
228
+ folderWidth: 220,
229
+ listViewerSplit: 40,
230
+ fontSize: 15,
231
+ },
232
+ sync: {
233
+ intervalMinutes: 5,
234
+ historyDays: 30,
235
+ prefetch: true,
236
+ },
237
+ autocomplete: {
238
+ enabled: false,
239
+ provider: "off",
240
+ ollamaUrl: "",
241
+ ollamaModel: "",
242
+ cloudApiKey: "",
243
+ cloudModel: "",
244
+ debounceMs: 600,
245
+ maxTokens: 60,
246
+ },
247
+ };
248
+ const DEFAULT_ALLOWLIST = {
249
+ senders: [],
250
+ domains: [],
251
+ recipients: [],
252
+ flaggedSenders: [],
253
+ flaggedDomains: [],
254
+ };
255
+ // ── JSONC parser (strips comments and trailing commas) ──
256
+ function parseJsonc(text) {
257
+ // Strip /* block comments */ and // line comments, but preserve content inside strings
258
+ let stripped = "";
259
+ let i = 0;
260
+ let inString = false;
261
+ let stringChar = "";
262
+ while (i < text.length) {
263
+ const c = text[i];
264
+ const next = text[i + 1];
265
+ if (inString) {
266
+ stripped += c;
267
+ if (c === "\\" && i + 1 < text.length) {
268
+ stripped += text[i + 1];
269
+ i += 2;
270
+ continue;
271
+ }
272
+ if (c === stringChar)
273
+ inString = false;
274
+ i++;
275
+ continue;
276
+ }
277
+ if (c === '"' || c === "'") {
278
+ inString = true;
279
+ stringChar = c;
280
+ stripped += c;
281
+ i++;
282
+ continue;
283
+ }
284
+ if (c === "/" && next === "/") {
285
+ // Line comment — skip to end of line
286
+ while (i < text.length && text[i] !== "\n")
287
+ i++;
288
+ continue;
289
+ }
290
+ if (c === "/" && next === "*") {
291
+ // Block comment — skip to */
292
+ i += 2;
293
+ while (i < text.length - 1 && !(text[i] === "*" && text[i + 1] === "/"))
294
+ i++;
295
+ i += 2;
296
+ continue;
297
+ }
298
+ stripped += c;
299
+ i++;
300
+ }
301
+ // Strip trailing commas before } or ]
302
+ stripped = stripped.replace(/,(\s*[}\]])/g, "$1");
303
+ return JSON.parse(stripped);
304
+ }
305
+ // ── Public API ──
306
+ /** Load accounts — first from IndexedDB cache, then GDrive */
307
+ export async function loadAccounts() {
308
+ // Try local cache first
309
+ const cached = await idbRead("accounts.jsonc");
310
+ if (cached) {
311
+ try {
312
+ const data = parseJsonc(cached);
313
+ const raw = data.accounts || (Array.isArray(data) ? data : []);
314
+ if (raw.length > 0) {
315
+ return raw.map((a) => normalizeAccount(a, data.name));
316
+ }
317
+ }
318
+ catch (e) {
319
+ console.warn(`[settings] Cached accounts.jsonc parse failed: ${e.message}`);
320
+ }
321
+ }
322
+ // Try GDrive
323
+ const content = await gDriveRead("accounts.jsonc");
324
+ if (content) {
325
+ await idbWrite("accounts.jsonc", content);
326
+ try {
327
+ const data = parseJsonc(content);
328
+ const raw = data.accounts || (Array.isArray(data) ? data : []);
329
+ return raw.map((a) => normalizeAccount(a, data.name));
330
+ }
331
+ catch (e) {
332
+ console.warn(`[settings] GDrive accounts.jsonc parse failed: ${e.message}`);
333
+ }
334
+ }
335
+ return [];
336
+ }
337
+ /** Load accounts directly from GDrive, bypassing local cache */
338
+ export async function loadAccountsFromCloud() {
339
+ const content = await gDriveRead("accounts.jsonc");
340
+ if (content) {
341
+ await idbWrite("accounts.jsonc", content);
342
+ try {
343
+ const data = parseJsonc(content);
344
+ const raw = data.accounts || (Array.isArray(data) ? data : []);
345
+ return raw.map((a) => normalizeAccount(a, data.name));
346
+ }
347
+ catch (e) {
348
+ console.warn(`[settings] loadAccountsFromCloud parse failed: ${e.message}`);
349
+ }
350
+ }
351
+ return [];
352
+ }
353
+ /** Save accounts to IndexedDB and GDrive */
354
+ export async function saveAccounts(accounts) {
355
+ const content = JSON.stringify({ accounts }, null, 2);
356
+ await idbWrite("accounts.jsonc", content);
357
+ await gDriveWrite("accounts.jsonc", content);
358
+ }
359
+ /** Load preferences */
360
+ export async function loadPreferences() {
361
+ const cached = await idbRead("preferences.jsonc");
362
+ if (cached) {
363
+ try {
364
+ const data = parseJsonc(cached);
365
+ return {
366
+ ui: { ...DEFAULT_PREFERENCES.ui, ...data.ui },
367
+ sync: { ...DEFAULT_PREFERENCES.sync, ...data.sync },
368
+ autocomplete: { ...DEFAULT_PREFERENCES.autocomplete, ...data.autocomplete },
369
+ };
370
+ }
371
+ catch { /* parse error */ }
372
+ }
373
+ // Try GDrive
374
+ const content = await gDriveRead("preferences.jsonc");
375
+ if (content) {
376
+ await idbWrite("preferences.jsonc", content);
377
+ try {
378
+ const data = parseJsonc(content);
379
+ return {
380
+ ui: { ...DEFAULT_PREFERENCES.ui, ...data.ui },
381
+ sync: { ...DEFAULT_PREFERENCES.sync, ...data.sync },
382
+ autocomplete: { ...DEFAULT_PREFERENCES.autocomplete, ...data.autocomplete },
383
+ };
384
+ }
385
+ catch { /* parse error */ }
386
+ }
387
+ return { ...DEFAULT_PREFERENCES };
388
+ }
389
+ /** Save preferences */
390
+ export async function savePreferences(prefs) {
391
+ const content = JSON.stringify(prefs, null, 2);
392
+ await idbWrite("preferences.jsonc", content);
393
+ await gDriveWrite("preferences.jsonc", content);
394
+ }
395
+ /** Load full settings (accounts + preferences combined) */
396
+ export async function loadSettings() {
397
+ const accounts = await loadAccounts();
398
+ const prefs = await loadPreferences();
399
+ return {
400
+ accounts,
401
+ ui: prefs.ui,
402
+ sync: prefs.sync,
403
+ autocomplete: prefs.autocomplete,
404
+ store: {
405
+ basePath: "indexeddb",
406
+ compressionBoundaryDays: 365,
407
+ },
408
+ };
409
+ }
410
+ /** Save full settings */
411
+ export async function saveSettings(settings) {
412
+ await saveAccounts(settings.accounts);
413
+ await savePreferences({ ui: settings.ui, sync: settings.sync, autocomplete: settings.autocomplete });
414
+ }
415
+ /** Load allowlist */
416
+ export async function loadAllowlist() {
417
+ const cached = await idbRead("allowlist.jsonc");
418
+ if (cached) {
419
+ try {
420
+ return parseJsonc(cached);
421
+ }
422
+ catch { /* */ }
423
+ }
424
+ const content = await gDriveRead("allowlist.jsonc");
425
+ if (content) {
426
+ await idbWrite("allowlist.jsonc", content);
427
+ try {
428
+ return parseJsonc(content);
429
+ }
430
+ catch { /* */ }
431
+ }
432
+ return { ...DEFAULT_ALLOWLIST };
433
+ }
434
+ /** Save allowlist */
435
+ export async function saveAllowlist(list) {
436
+ const content = JSON.stringify(list, null, 2);
437
+ await idbWrite("allowlist.jsonc", content);
438
+ await gDriveWrite("allowlist.jsonc", content);
439
+ }
440
+ /** Load autocomplete settings */
441
+ export async function loadAutocomplete() {
442
+ const prefs = await loadPreferences();
443
+ return prefs.autocomplete;
444
+ }
445
+ /** Save autocomplete settings */
446
+ export async function saveAutocomplete(settings) {
447
+ const prefs = await loadPreferences();
448
+ prefs.autocomplete = settings;
449
+ await savePreferences(prefs);
450
+ }
451
+ /** Get history days — read from preferences */
452
+ export async function getHistoryDays() {
453
+ const prefs = await loadPreferences();
454
+ return prefs.sync.historyDays || 30;
455
+ }
456
+ /** Get prefetch setting */
457
+ export async function getPrefetch() {
458
+ const prefs = await loadPreferences();
459
+ return prefs.sync.prefetch !== false;
460
+ }
461
+ /** Get storage info */
462
+ export function getStorageInfo() {
463
+ return {
464
+ provider: gDriveFolderId ? "gdrive" : "local",
465
+ mode: gDriveFolderId ? "api" : "local",
466
+ folderId: gDriveFolderId || undefined,
467
+ folderName: gDriveFolderName || undefined,
468
+ folderPath: gDriveFolderPath || undefined,
469
+ folderOwner: gDriveFolderOwner || undefined,
470
+ };
471
+ }
472
+ /** Clear all cached settings — used for "Reset Store" */
473
+ export async function clearSettings() {
474
+ await idbDelete("accounts.jsonc");
475
+ await idbDelete("preferences.jsonc");
476
+ await idbDelete("allowlist.jsonc");
477
+ }
478
+ // ── Per-device settings ──
479
+ const DEVICE_ID_KEY = "mailx-device-id";
480
+ /** Get or create a stable device ID (UUID stored in localStorage) */
481
+ export function getDeviceId() {
482
+ let id = localStorage.getItem(DEVICE_ID_KEY);
483
+ if (!id) {
484
+ id = crypto.randomUUID();
485
+ localStorage.setItem(DEVICE_ID_KEY, id);
486
+ }
487
+ return id;
488
+ }
489
+ /** Save device-specific settings to GDrive (devices/<deviceId>/state.json) */
490
+ export async function saveDeviceState(state) {
491
+ const deviceId = getDeviceId();
492
+ const filename = `devices/${deviceId}/state.json`;
493
+ const content = JSON.stringify(state, null, 2);
494
+ await idbWrite(filename, content);
495
+ await gDriveWrite(filename, content);
496
+ }
497
+ /** Load device-specific settings */
498
+ export async function loadDeviceState() {
499
+ const deviceId = getDeviceId();
500
+ const filename = `devices/${deviceId}/state.json`;
501
+ const cached = await idbRead(filename);
502
+ if (cached) {
503
+ try {
504
+ return parseJsonc(cached);
505
+ }
506
+ catch { /* */ }
507
+ }
508
+ const content = await gDriveRead(filename);
509
+ if (content) {
510
+ await idbWrite(filename, content);
511
+ try {
512
+ return parseJsonc(content);
513
+ }
514
+ catch { /* */ }
515
+ }
516
+ return {};
517
+ }
518
+ //# sourceMappingURL=web-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-settings.js","sourceRoot":"","sources":["web-settings.ts"],"names":[],"mappings":"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"}