@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 @@
1
+ {"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["sync-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,508 @@
1
+ /**
2
+ * Sync manager — extracted from android-bootstrap.ts for use in both
3
+ * main-thread and Worker contexts.
4
+ *
5
+ * Platform-specific dependencies are injected:
6
+ * - emitEvent: posts events to the UI
7
+ * - vlog: verbose remote logging
8
+ * - createTcpTransport: factory for TCP transport (BridgeTcpTransport or WorkerTcpTransport)
9
+ */
10
+
11
+ import type { WebMailxDB } from "./db.js";
12
+ import type { WebMessageStore } from "./web-message-store.js";
13
+ import type { WebSyncManager } from "./web-service.js";
14
+ import { GmailApiWebProvider } from "./gmail-api-web.js";
15
+ import { ImapWebProvider } from "./imap-web-provider.js";
16
+ import { SmtpClient, type SmtpAuth } from "@bobfrankston/smtp-direct";
17
+ import type { MailProvider, ProviderMessage } from "./provider-types.js";
18
+ import type { Folder, EmailAddress, AccountConfig } from "@bobfrankston/mailx-types";
19
+
20
+ function toEmailAddress(addr: { name?: string; address?: string } | undefined): EmailAddress {
21
+ return { name: addr?.name || "", address: addr?.address || "" };
22
+ }
23
+
24
+ export interface SyncManagerDeps {
25
+ emitEvent: (event: any) => void;
26
+ vlog: (msg: string) => void;
27
+ createTcpTransport: () => any; // TcpTransport — BridgeTcpTransport or WorkerTcpTransport
28
+ }
29
+
30
+ export class SyncManager implements WebSyncManager {
31
+ private providers = new Map<string, MailProvider>();
32
+ private tokenProviders = new Map<string, () => Promise<string>>();
33
+ private deps: SyncManagerDeps;
34
+
35
+ constructor(
36
+ private db: WebMailxDB,
37
+ private bodyStore: WebMessageStore,
38
+ deps: SyncManagerDeps,
39
+ ) {
40
+ this.deps = deps;
41
+ }
42
+
43
+ on(_event: string, _handler: (...args: any[]) => void): void { /* stub */ }
44
+ emit(event: string, ...args: any[]): void { this.deps.emitEvent({ type: event, ...args[0] }); }
45
+
46
+ async addAccount(account: AccountConfig): Promise<void> {
47
+ this.deps.vlog(`addAccount id=${account.id} email=${account.email} host=${account.imap?.host} auth=${account.imap?.auth}`);
48
+ this.db.upsertAccount(account.id, account.name, account.email, JSON.stringify(account));
49
+ if (this.isGmailAccount(account)) {
50
+ const tokenProvider = this.tokenProviders.get(account.id);
51
+ if (tokenProvider) {
52
+ this.providers.set(account.id, new GmailApiWebProvider(tokenProvider));
53
+ console.log(`[sync] ${account.id}: Gmail API provider registered`);
54
+ } else {
55
+ console.warn(`[sync] ${account.id}: no token provider`);
56
+ }
57
+ } else if (account.imap?.host && account.imap?.user) {
58
+ try {
59
+ const provider = new ImapWebProvider({
60
+ server: account.imap.host,
61
+ port: account.imap.port || 993,
62
+ username: account.imap.user,
63
+ password: account.imap.password,
64
+ inactivityTimeout: 300000,
65
+ fetchChunkSize: 10,
66
+ fetchChunkSizeMax: 100,
67
+ }, this.deps.createTcpTransport);
68
+ this.providers.set(account.id, provider);
69
+ this.deps.vlog(`addAccount ${account.id}: IMAP provider registered (${account.imap.host}:${account.imap.port})`);
70
+ console.log(`[sync] ${account.id}: IMAP provider registered (${account.imap.host})`);
71
+ } catch (e: any) {
72
+ this.deps.vlog(`addAccount ${account.id}: IMAP provider FAILED: ${e.message}`);
73
+ console.error(`[sync] ${account.id}: IMAP provider failed: ${e.message}`);
74
+ }
75
+ } else {
76
+ this.deps.vlog(`addAccount ${account.id}: no imap config, skipping`);
77
+ }
78
+ }
79
+
80
+ setTokenProvider(accountId: string, provider: () => Promise<string>): void {
81
+ this.tokenProviders.set(accountId, provider);
82
+ }
83
+
84
+ private isGmailAccount(account: AccountConfig): boolean {
85
+ return account.imap?.host?.includes("gmail") || account.email?.endsWith("@gmail.com") || false;
86
+ }
87
+
88
+ private getProvider(accountId: string): MailProvider | null {
89
+ return this.providers.get(accountId) || null;
90
+ }
91
+
92
+ async syncAll(): Promise<void> {
93
+ const accounts = this.db.getAccounts();
94
+ this.deps.vlog(`syncAll: ${accounts.length} accounts in DB: ${accounts.map((a: any) => a.id).join(",")}`);
95
+
96
+ // Phase 1: Sync INBOX for every account first — user sees new mail fast.
97
+ for (const account of accounts) {
98
+ if (!this.providers.has(account.id)) continue;
99
+ try {
100
+ const folders = await this.syncFolders(account.id);
101
+ const inbox = folders.find((f: any) => f.specialUse === "inbox");
102
+ if (inbox) {
103
+ await this.syncFolder(account.id, inbox.id);
104
+ this.deps.emitEvent({ type: "syncComplete", accountId: account.id });
105
+ }
106
+ } catch (e: any) {
107
+ console.error(`[sync] ${account.id} inbox: ${e.message}`);
108
+ }
109
+ }
110
+
111
+ // Phase 2: Remaining folders.
112
+ for (const account of accounts) {
113
+ if (!this.providers.has(account.id)) continue;
114
+ try {
115
+ const folders = this.db.getFolders(account.id);
116
+ const remaining = folders.filter((f: any) => f.specialUse !== "inbox");
117
+ for (const folder of remaining) {
118
+ try { await this.syncFolder(account.id, folder.id); }
119
+ catch (e: any) { console.error(`[sync] Skip ${folder.path}: ${e.message}`); }
120
+ }
121
+ this.db.updateLastSync(account.id, Date.now());
122
+ this.deps.emitEvent({ type: "syncComplete", accountId: account.id });
123
+ } catch (e: any) {
124
+ console.error(`[sync] ${account.id}: ${e.message}`);
125
+ this.deps.vlog(`syncAll: ${account.id} ERROR: ${e.message}`);
126
+ this.deps.emitEvent({ type: "syncError", accountId: account.id, error: e.message });
127
+ }
128
+ }
129
+ }
130
+
131
+ async syncAccount(accountId: string): Promise<void> {
132
+ const folders = await this.syncFolders(accountId);
133
+ for (const folder of folders) {
134
+ try { await this.syncFolder(accountId, folder.id); }
135
+ catch (e: any) { console.error(`[sync] Skip ${folder.path}: ${e.message}`); }
136
+ }
137
+ this.db.updateLastSync(accountId, Date.now());
138
+ this.deps.emitEvent({ type: "syncComplete", accountId });
139
+ }
140
+
141
+ async syncFolders(accountId: string): Promise<Folder[]> {
142
+ const provider = this.getProvider(accountId);
143
+ if (!provider) {
144
+ const existing = this.db.getFolders(accountId);
145
+ this.deps.vlog(`syncFolders: ${accountId} no provider, returning ${existing.length} cached folders`);
146
+ return existing;
147
+ }
148
+ this.deps.emitEvent({ type: "syncProgress", accountId, phase: "folders", progress: 0 });
149
+ const providerFolders = await provider.listFolders();
150
+ for (const folder of providerFolders) {
151
+ const flags = folder.flags || [];
152
+ if (flags.some((f: string) => f.toLowerCase() === "\\noselect")) continue;
153
+ this.db.upsertFolder(accountId, folder.path, folder.name, folder.specialUse, folder.delimiter);
154
+ }
155
+ this.deps.emitEvent({ type: "syncProgress", accountId, phase: "folders", progress: 100 });
156
+ const dbFolders = this.db.getFolders(accountId);
157
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
158
+ return dbFolders;
159
+ }
160
+
161
+ async syncFolder(accountId: string, folderId: number): Promise<void> {
162
+ const provider = this.getProvider(accountId);
163
+ if (!provider) return;
164
+ const folders = this.db.getFolders(accountId);
165
+ const folder = folders.find((f: any) => f.id === folderId);
166
+ if (!folder) return;
167
+
168
+ this.deps.emitEvent({ type: "syncProgress", accountId, phase: `sync:${folder.path}`, progress: 0 });
169
+ const highestUid = this.db.getHighestUid(accountId, folderId);
170
+ const startDate = new Date(Date.now() - 30 * 86400000);
171
+
172
+ let messages: ProviderMessage[];
173
+ if (highestUid > 0) {
174
+ messages = await provider.fetchSince(folder.path, highestUid, { source: false });
175
+ messages = messages.filter((m: any) => m.uid > highestUid);
176
+ } else {
177
+ const tomorrow = new Date(Date.now() + 86400000);
178
+ messages = await provider.fetchByDate(folder.path, startDate, tomorrow, { source: false });
179
+ }
180
+
181
+ if (messages.length > 0) {
182
+ console.log(`[sync] ${folder.path}: ${messages.length} messages`);
183
+ this.storeProviderMessages(accountId, folderId, messages);
184
+ this.db.recalcFolderCounts(folderId);
185
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
186
+ }
187
+
188
+ // Reconcile deletions
189
+ try {
190
+ const serverUidsArr = await provider.getUids(folder.path);
191
+ const serverUids = new Set(serverUidsArr);
192
+ const localUids = this.db.getUidsForFolder(accountId, folderId);
193
+ if (serverUidsArr.length === 0 && localUids.length > 0) {
194
+ console.log(`[sync] ${folder.path}: reconcile skipped — server returned empty but local has ${localUids.length}`);
195
+ } else {
196
+ const toDelete = localUids.filter((uid: number) => !serverUids.has(uid));
197
+ const RECONCILE_DELETE_THRESHOLD = 0.5;
198
+ if (localUids.length > 0 && toDelete.length / localUids.length > RECONCILE_DELETE_THRESHOLD) {
199
+ console.log(`[sync] ${folder.path}: reconcile refused — would delete ${toDelete.length}/${localUids.length}`);
200
+ } else {
201
+ for (const uid of toDelete) {
202
+ this.db.deleteMessage(accountId, uid);
203
+ this.bodyStore.deleteMessage(accountId, folderId, uid).catch(() => {});
204
+ }
205
+ if (toDelete.length > 0) {
206
+ console.log(`[sync] ${folder.path}: reconciled ${toDelete.length} deletions`);
207
+ this.db.recalcFolderCounts(folderId);
208
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
209
+ }
210
+ }
211
+ }
212
+ } catch (e: any) {
213
+ console.error(`[sync] ${folder.path}: reconcile error: ${e.message}`);
214
+ }
215
+
216
+ this.deps.emitEvent({ type: "folderSynced", accountId, entries: [{ folderId, syncedAt: Date.now() }] });
217
+ this.deps.emitEvent({ type: "syncProgress", accountId, phase: `sync:${folder.path}`, progress: 100 });
218
+ }
219
+
220
+ private storeProviderMessages(accountId: string, folderId: number, messages: ProviderMessage[]): void {
221
+ this.db.beginTransaction();
222
+ try {
223
+ for (const msg of messages) {
224
+ const flags: string[] = [];
225
+ if (msg.seen) flags.push("\\Seen");
226
+ if (msg.flagged) flags.push("\\Flagged");
227
+ if (msg.answered) flags.push("\\Answered");
228
+ if (msg.draft) flags.push("\\Draft");
229
+ const bodyPath = msg.providerId ? `gmail:${msg.providerId}` : "";
230
+ this.db.upsertMessage({
231
+ accountId, folderId, uid: msg.uid,
232
+ messageId: msg.messageId || "", inReplyTo: "", references: [],
233
+ date: msg.date ? msg.date.getTime() : Date.now(),
234
+ subject: msg.subject || "",
235
+ from: toEmailAddress(msg.from?.[0]),
236
+ to: msg.to.map((a: any) => toEmailAddress(a)),
237
+ cc: msg.cc.map((a: any) => toEmailAddress(a)),
238
+ flags, size: msg.size || 0, hasAttachments: false, preview: "", bodyPath,
239
+ });
240
+ }
241
+ this.db.commitTransaction();
242
+ } catch (e: any) {
243
+ this.db.rollbackTransaction();
244
+ console.error(`[sync] storeMessages error: ${e.message}`);
245
+ }
246
+ }
247
+
248
+ async fetchMessageBody(accountId: string, folderId: number, uid: number): Promise<Uint8Array | null> {
249
+ const t0 = Date.now();
250
+ // Cache first — IndexedDB lookup is O(1) and should always win on a
251
+ // previously-fetched body. If this path misses on something the user
252
+ // clearly fetched before, the cache is broken (wrong key shape, wiped
253
+ // IndexedDB, account-id change) and needs investigation — log so it's
254
+ // visible.
255
+ if (await this.bodyStore.hasMessage(accountId, folderId, uid)) {
256
+ const cached = await this.bodyStore.getMessage(accountId, folderId, uid);
257
+ console.log(`[fetchBody] cache hit ${accountId}/${folderId}/${uid} (${Date.now() - t0}ms)`);
258
+ return cached;
259
+ }
260
+ console.log(`[fetchBody] cache miss ${accountId}/${folderId}/${uid} — fetching from provider`);
261
+ const provider = this.getProvider(accountId);
262
+ if (!provider) { console.warn(`[fetchBody] no provider for ${accountId}`); return null; }
263
+ const envelope = this.db.getMessageByUid(accountId, uid, folderId);
264
+ const bp = (envelope as any)?.bodyPath || "";
265
+
266
+ // Wall-clock timeout — without this, an IMAP provider that dangles
267
+ // (Dovecot silently dropped the socket, BridgeTransport stalled) hung
268
+ // the viewer forever. 60 s is generous for a single-message BODY[]
269
+ // fetch on a phone connection; legit large bodies finish in seconds,
270
+ // and anything longer means the socket is dead and retrying on a fresh
271
+ // one is faster than waiting.
272
+ const FETCH_TIMEOUT_MS = 60_000;
273
+ const fetchPromise = (async (): Promise<any> => {
274
+ if (bp.startsWith("gmail:") && (provider as any).fetchById) {
275
+ const providerId = bp.substring(6);
276
+ return (provider as any).fetchById(providerId, { source: true });
277
+ }
278
+ const folders = this.db.getFolders(accountId);
279
+ const folder = folders.find((f: any) => f.id === folderId);
280
+ if (!folder) return null;
281
+ return provider.fetchOne(folder.path, uid, { source: true });
282
+ })();
283
+ let msg: any = null;
284
+ try {
285
+ msg = await Promise.race([
286
+ fetchPromise,
287
+ new Promise((_, reject) => setTimeout(
288
+ () => reject(new Error(`body-fetch timeout ${FETCH_TIMEOUT_MS / 1000}s (${accountId}/${folderId}/${uid})`)),
289
+ FETCH_TIMEOUT_MS
290
+ )),
291
+ ]);
292
+ } catch (e: any) {
293
+ console.error(`[fetchBody] failed ${accountId}/${folderId}/${uid} after ${Date.now() - t0}ms: ${e?.message || e}`);
294
+ throw e;
295
+ }
296
+
297
+ if (!msg?.source) {
298
+ console.warn(`[fetchBody] No source returned for ${accountId}/${folderId}/${uid} (bp=${bp}, ${Date.now() - t0}ms)`);
299
+ return null;
300
+ }
301
+ const raw = new TextEncoder().encode(msg.source);
302
+ await this.bodyStore.putMessage(accountId, folderId, uid, raw);
303
+ this.db.updateBodyPath(accountId, uid, `idb:${accountId}/${folderId}/${uid}`);
304
+ console.log(`[fetchBody] fetched + cached ${accountId}/${folderId}/${uid} (${raw.byteLength} bytes, ${Date.now() - t0}ms)`);
305
+ return raw;
306
+ }
307
+
308
+ async updateFlagsLocal(accountId: string, uid: number, folderId: number, flags: string[]): Promise<void> {
309
+ this.db.updateMessageFlags(accountId, uid, flags);
310
+ this.db.recalcFolderCounts(folderId);
311
+ this.db.queueSyncAction(accountId, "flags", uid, folderId, { flags });
312
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
313
+ }
314
+
315
+ async trashMessage(accountId: string, folderId: number, uid: number): Promise<void> {
316
+ this.db.deleteMessage(accountId, uid);
317
+ this.db.queueSyncAction(accountId, "trash", uid, folderId);
318
+ this.deps.emitEvent({ type: "messageDeleted", accountId, folderId, uid });
319
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
320
+ }
321
+
322
+ async trashMessages(accountId: string, messages: { uid: number; folderId: number }[]): Promise<void> {
323
+ for (const m of messages) await this.trashMessage(accountId, m.folderId, m.uid);
324
+ }
325
+
326
+ async moveMessage(accountId: string, uid: number, folderId: number, targetFolderId: number): Promise<void> {
327
+ this.db.queueSyncAction(accountId, "move", uid, folderId, { targetFolderId });
328
+ this.deps.emitEvent({ type: "messageMoved", accountId, fromFolderId: folderId, toFolderId: targetFolderId, uid });
329
+ }
330
+
331
+ async moveMessages(accountId: string, messages: { uid: number; folderId: number }[], targetFolderId: number): Promise<void> {
332
+ for (const m of messages) await this.moveMessage(accountId, m.uid, m.folderId, targetFolderId);
333
+ }
334
+
335
+ async moveMessageCrossAccount(): Promise<void> {
336
+ throw new Error("Cross-account move not supported on mobile");
337
+ }
338
+
339
+ async undeleteMessage(accountId: string, uid: number, folderId: number): Promise<void> {
340
+ this.db.queueSyncAction(accountId, "undelete", uid, folderId);
341
+ }
342
+
343
+ /** Q112: drain queued move/flag/trash actions to the provider. Android is
344
+ * standalone — it pushes state changes to Gmail (or other provider) the
345
+ * same way desktop does, so local actions propagate without needing a
346
+ * desktop to relay them. Called from android-bootstrap on startup and
347
+ * every 2-min sync tick. `send` actions are drained separately by
348
+ * processSendQueue. */
349
+ async processSyncActions(accountId: string): Promise<void> {
350
+ const provider: any = this.getProvider(accountId);
351
+ if (!provider) return;
352
+ const pending = this.db.getPendingSyncActions(accountId)
353
+ .filter((a: any) => a.action !== "send");
354
+ if (pending.length === 0) return;
355
+ const folders = this.db.getFolders(accountId);
356
+ const folderPath = (id: number): string | null => {
357
+ const f = folders.find((x: any) => x.id === id);
358
+ return f?.path || null;
359
+ };
360
+ for (const p of pending) {
361
+ const path = folderPath(p.folderId);
362
+ if (!path) { this.db.failSyncActionByUid(accountId, p.action, p.uid, `unknown folder ${p.folderId}`); continue; }
363
+ try {
364
+ if (p.action === "flags" && typeof provider.setFlags === "function") {
365
+ await provider.setFlags(path, p.uid, Array.isArray(p.flags) ? p.flags : (p.flags ? [p.flags] : []));
366
+ } else if (p.action === "trash" && typeof provider.trashMessage === "function") {
367
+ await provider.trashMessage(path, p.uid);
368
+ } else if (p.action === "move" && typeof provider.moveMessage === "function") {
369
+ const toId = p.targetFolderId as number;
370
+ const toPath = folderPath(toId);
371
+ if (!toPath) { this.db.failSyncActionByUid(accountId, p.action, p.uid, `unknown target folder ${toId}`); continue; }
372
+ await provider.moveMessage(path, p.uid, toPath);
373
+ } else {
374
+ // Unsupported action for this provider — don't loop forever.
375
+ this.db.failSyncActionByUid(accountId, p.action, p.uid, `provider does not support ${p.action}`);
376
+ continue;
377
+ }
378
+ this.db.completeSyncActionByUid(accountId, p.action, p.uid);
379
+ } catch (e: any) {
380
+ const msg = e?.message || String(e);
381
+ console.error(`[sync-action] ${accountId} ${p.action} uid=${p.uid}: ${msg}`);
382
+ this.db.failSyncActionByUid(accountId, p.action, p.uid, msg);
383
+ }
384
+ }
385
+ }
386
+
387
+ async markFolderRead(folderId: number): Promise<void> {
388
+ this.db.markFolderRead(folderId);
389
+ }
390
+
391
+ async emptyFolder(accountId: string, folderId: number): Promise<void> {
392
+ const uids = this.db.getUidsForFolder(accountId, folderId);
393
+ for (const uid of uids) {
394
+ this.db.deleteMessage(accountId, uid);
395
+ this.bodyStore.deleteMessage(accountId, folderId, uid).catch(() => {});
396
+ }
397
+ this.db.recalcFolderCounts(folderId);
398
+ this.deps.emitEvent({ type: "folderCountsChanged", accountId, counts: {} });
399
+ }
400
+
401
+ queueOutgoingLocal(accountId: string, rawMessage: string): void {
402
+ const provider = this.getProvider(accountId);
403
+ if (provider && typeof (provider as any).sendRaw === "function") {
404
+ (provider as any).sendRaw(rawMessage)
405
+ .then((result: { id: string; threadId: string }) => {
406
+ console.log(`[send] ${accountId}: sent via Gmail API (id=${result.id})`);
407
+ this.deps.emitEvent({ type: "sendComplete", accountId, messageId: result.id });
408
+ })
409
+ .catch((e: any) => {
410
+ console.error(`[send] ${accountId}: Gmail send failed: ${e.message}`);
411
+ this.deps.emitEvent({ type: "sendError", accountId, error: e.message });
412
+ });
413
+ return;
414
+ }
415
+
416
+ const accounts = this.db.getAccountConfigs();
417
+ const row = accounts.find((a: any) => a.id === accountId);
418
+ if (!row) {
419
+ const e = "Unknown account";
420
+ this.deps.emitEvent({ type: "sendError", accountId, error: e });
421
+ throw new Error(e);
422
+ }
423
+ let account: AccountConfig;
424
+ try { account = JSON.parse(row.configJson); }
425
+ catch {
426
+ const e = "Account config malformed";
427
+ this.deps.emitEvent({ type: "sendError", accountId, error: e });
428
+ throw new Error(e);
429
+ }
430
+ if (!account.smtp) {
431
+ const e = "No SMTP config for this account";
432
+ this.deps.emitEvent({ type: "sendError", accountId, error: e });
433
+ throw new Error(e);
434
+ }
435
+
436
+ this.sendViaSmtpDirect(accountId, account, rawMessage)
437
+ .then((result) => {
438
+ console.log(`[send] ${accountId}: sent via SMTP (${result.accepted.length} accepted, ${result.rejected.length} rejected)`);
439
+ this.deps.emitEvent({ type: "sendComplete", accountId });
440
+ })
441
+ .catch((e: any) => {
442
+ console.error(`[send] ${accountId}: SMTP send failed: ${e.message}`);
443
+ this.deps.emitEvent({ type: "sendError", accountId, error: e.message });
444
+ });
445
+ }
446
+
447
+ private async sendViaSmtpDirect(
448
+ accountId: string, account: AccountConfig, raw: string,
449
+ ): Promise<{ accepted: string[]; rejected: { address: string; code: number; message: string }[] }> {
450
+ const smtp = account.smtp!;
451
+ const smtpPort = smtp.port || 587;
452
+ const smtpHost = smtp.host || account.imap?.host;
453
+ if (!smtpHost) throw new Error("No SMTP host");
454
+
455
+ const smtpUser = smtp.user || account.imap?.user || account.email;
456
+ const authType = smtp.auth || (account.imap?.password ? "password" : undefined);
457
+ let auth: SmtpAuth | undefined;
458
+ if (authType === "password") {
459
+ const pass = smtp.password || account.imap?.password;
460
+ if (!pass) throw new Error("SMTP password not configured");
461
+ auth = { method: "PLAIN", user: smtpUser, pass };
462
+ } else if (authType === "oauth2") {
463
+ const tp = this.tokenProviders.get(accountId);
464
+ if (!tp) throw new Error("OAuth token provider not registered");
465
+ const token = await tp();
466
+ auth = { method: "XOAUTH2", user: smtpUser, token };
467
+ }
468
+
469
+ const parseAddrs = (s: string) => s.match(/[\w.+-]+@[\w.-]+/g) || [];
470
+ const toMatch = raw.match(/^To:\s*(.+)$/mi);
471
+ const ccMatch = raw.match(/^Cc:\s*(.+)$/mi);
472
+ const bccMatch = raw.match(/^Bcc:\s*(.+)$/mi);
473
+ const fromMatch = raw.match(/^From:\s*(.+)$/mi);
474
+ const recipients = [
475
+ ...(toMatch ? parseAddrs(toMatch[1]) : []),
476
+ ...(ccMatch ? parseAddrs(ccMatch[1]) : []),
477
+ ...(bccMatch ? parseAddrs(bccMatch[1]) : []),
478
+ ];
479
+ const sender = fromMatch ? (parseAddrs(fromMatch[1])[0] || account.email) : account.email;
480
+ if (recipients.length === 0) throw new Error("No recipients");
481
+
482
+ const rawToSend = raw.replace(/^Bcc:.*\r?\n/mi, "");
483
+
484
+ const client = new SmtpClient({
485
+ host: smtpHost,
486
+ port: smtpPort,
487
+ secure: smtpPort === 465,
488
+ auth,
489
+ localname: "mailx-android",
490
+ }, this.deps.createTcpTransport);
491
+ try {
492
+ await client.connect();
493
+ return await client.sendMail({ from: sender, to: recipients }, rawToSend);
494
+ } finally {
495
+ try { await client.quit(); } catch { /* ignore */ }
496
+ }
497
+ }
498
+
499
+ async saveDraft(_accountId: string, _raw: string, _prevUid?: number, _draftId?: string): Promise<number | null> {
500
+ return null;
501
+ }
502
+
503
+ async deleteDraft(_accountId: string, _uid: number): Promise<void> {}
504
+
505
+ async reauthenticate(_accountId: string): Promise<boolean> { return false; }
506
+ async searchOnServer(_accountId: string, _query: string): Promise<any[]> { return []; }
507
+ async syncAllContacts(): Promise<void> {}
508
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": ".",
5
+ "rootDir": ".",
6
+ "lib": ["ESNext", "DOM"]
7
+ },
8
+ "include": ["*.ts"],
9
+ "exclude": ["node_modules", "prev", "cruft", "tests"]
10
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * JSON-RPC dispatcher for WebMailxService.
3
+ * Maps mailxapi action names to WebMailxService method calls.
4
+ * Same dispatch table as desktop jsonrpc.ts but adapted for async settings.
5
+ */
6
+ type ServiceLike = Record<string, (...args: any[]) => any>;
7
+ export interface RpcRequest {
8
+ _action: string;
9
+ _cbid: string;
10
+ [key: string]: any;
11
+ }
12
+ export interface RpcResponse {
13
+ _cbid: string;
14
+ result?: any;
15
+ error?: string;
16
+ }
17
+ /** Dispatch an incoming mailxapi call to the appropriate WebMailxService method */
18
+ export declare function dispatch(svc: ServiceLike, req: RpcRequest): Promise<RpcResponse>;
19
+ export {};
20
+ //# sourceMappingURL=web-jsonrpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-jsonrpc.d.ts","sourceRoot":"","sources":["web-jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAE3D,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mFAAmF;AACnF,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAQtF"}