@bobfrankston/mailx 1.0.451 → 1.0.453

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 (205) hide show
  1. package/bin/mailx.js.map +1 -0
  2. package/bin/mailx.ts +1498 -0
  3. package/bin/postinstall.js.map +1 -0
  4. package/bin/postinstall.ts +41 -0
  5. package/bin/tsconfig.json +10 -0
  6. package/client/.gitattributes +10 -0
  7. package/client/app.js +51 -2
  8. package/client/app.js.map +1 -0
  9. package/client/app.ts +3112 -0
  10. package/client/components/address-book.js.map +1 -0
  11. package/client/components/address-book.ts +204 -0
  12. package/client/components/alarms.js.map +1 -0
  13. package/client/components/alarms.ts +276 -0
  14. package/client/components/calendar-sidebar.js.map +1 -0
  15. package/client/components/calendar-sidebar.ts +474 -0
  16. package/client/components/calendar.js.map +1 -0
  17. package/client/components/calendar.ts +211 -0
  18. package/client/components/context-menu.js.map +1 -0
  19. package/client/components/context-menu.ts +95 -0
  20. package/client/components/folder-picker.js.map +1 -0
  21. package/client/components/folder-picker.ts +127 -0
  22. package/client/components/folder-tree.js.map +1 -0
  23. package/client/components/folder-tree.ts +1069 -0
  24. package/client/components/message-list.js.map +1 -0
  25. package/client/components/message-list.ts +1129 -0
  26. package/client/components/message-viewer.js.map +1 -0
  27. package/client/components/message-viewer.ts +1257 -0
  28. package/client/components/outbox-view.js.map +1 -0
  29. package/client/components/outbox-view.ts +102 -0
  30. package/client/components/tasks.js.map +1 -0
  31. package/client/components/tasks.ts +234 -0
  32. package/client/compose/compose.js.map +1 -0
  33. package/client/compose/compose.ts +1231 -0
  34. package/client/compose/editor.js.map +1 -0
  35. package/client/compose/editor.ts +599 -0
  36. package/client/compose/ghost-text.js.map +1 -0
  37. package/client/compose/ghost-text.ts +140 -0
  38. package/client/index.html +1 -0
  39. package/client/lib/android-bootstrap.js.map +1 -0
  40. package/client/lib/android-bootstrap.ts +9 -0
  41. package/client/lib/api-client.js.map +1 -0
  42. package/client/lib/api-client.ts +439 -0
  43. package/client/lib/local-service.js.map +1 -0
  44. package/client/lib/local-service.ts +646 -0
  45. package/client/lib/local-store.js.map +1 -0
  46. package/client/lib/local-store.ts +283 -0
  47. package/client/lib/message-state.js.map +1 -0
  48. package/client/lib/message-state.ts +140 -0
  49. package/client/tsconfig.json +19 -0
  50. package/package.json +18 -16
  51. package/packages/mailx-api/.gitattributes +10 -0
  52. package/packages/mailx-api/index.d.ts.map +1 -0
  53. package/packages/mailx-api/index.js.map +1 -0
  54. package/packages/mailx-api/index.ts +283 -0
  55. package/packages/mailx-api/package.json +1 -1
  56. package/packages/mailx-api/tsconfig.json +9 -0
  57. package/packages/mailx-compose/.gitattributes +10 -0
  58. package/packages/mailx-compose/index.d.ts.map +1 -0
  59. package/packages/mailx-compose/index.js.map +1 -0
  60. package/packages/mailx-compose/index.ts +85 -0
  61. package/packages/mailx-compose/tsconfig.json +9 -0
  62. package/packages/mailx-core/index.d.ts.map +1 -0
  63. package/packages/mailx-core/index.js.map +1 -0
  64. package/packages/mailx-core/index.ts +424 -0
  65. package/packages/mailx-core/ipc.d.ts.map +1 -0
  66. package/packages/mailx-core/ipc.js.map +1 -0
  67. package/packages/mailx-core/ipc.ts +62 -0
  68. package/packages/mailx-core/package.json +1 -1
  69. package/packages/mailx-core/tsconfig.json +9 -0
  70. package/packages/mailx-host/.gitattributes +10 -0
  71. package/packages/mailx-host/index.d.ts.map +1 -0
  72. package/packages/mailx-host/index.js.map +1 -0
  73. package/packages/mailx-host/index.ts +38 -0
  74. package/packages/mailx-host/package.json +10 -2
  75. package/packages/mailx-host/tsconfig.json +9 -0
  76. package/packages/mailx-send/.gitattributes +10 -0
  77. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  78. package/packages/mailx-send/cli-queue.js.map +1 -0
  79. package/packages/mailx-send/cli-queue.ts +62 -0
  80. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  81. package/packages/mailx-send/cli-send.js.map +1 -0
  82. package/packages/mailx-send/cli-send.ts +83 -0
  83. package/packages/mailx-send/cli.d.ts.map +1 -0
  84. package/packages/mailx-send/cli.js.map +1 -0
  85. package/packages/mailx-send/cli.ts +126 -0
  86. package/packages/mailx-send/index.d.ts.map +1 -0
  87. package/packages/mailx-send/index.js.map +1 -0
  88. package/packages/mailx-send/index.ts +333 -0
  89. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  90. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  91. package/packages/mailx-send/mailsend/cli.ts +81 -0
  92. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  93. package/packages/mailx-send/mailsend/index.js.map +1 -0
  94. package/packages/mailx-send/mailsend/index.ts +333 -0
  95. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  96. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  97. package/packages/mailx-send/package-lock.json +65 -0
  98. package/packages/mailx-send/package.json +1 -1
  99. package/packages/mailx-send/tsconfig.json +21 -0
  100. package/packages/mailx-server/.gitattributes +10 -0
  101. package/packages/mailx-server/index.d.ts.map +1 -0
  102. package/packages/mailx-server/index.js.map +1 -0
  103. package/packages/mailx-server/index.ts +429 -0
  104. package/packages/mailx-server/package.json +1 -1
  105. package/packages/mailx-server/tsconfig.json +9 -0
  106. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  107. package/packages/mailx-service/google-sync.js.map +1 -0
  108. package/packages/mailx-service/google-sync.ts +238 -0
  109. package/packages/mailx-service/index.d.ts.map +1 -0
  110. package/packages/mailx-service/index.js.map +1 -0
  111. package/packages/mailx-service/index.ts +2461 -0
  112. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  113. package/packages/mailx-service/jsonrpc.js.map +1 -0
  114. package/packages/mailx-service/jsonrpc.ts +268 -0
  115. package/packages/mailx-service/package.json +1 -1
  116. package/packages/mailx-service/tsconfig.json +9 -0
  117. package/packages/mailx-settings/.gitattributes +10 -0
  118. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  119. package/packages/mailx-settings/cloud.js.map +1 -0
  120. package/packages/mailx-settings/cloud.ts +388 -0
  121. package/packages/mailx-settings/index.d.ts.map +1 -0
  122. package/packages/mailx-settings/index.js.map +1 -0
  123. package/packages/mailx-settings/index.ts +892 -0
  124. package/packages/mailx-settings/package.json +1 -1
  125. package/packages/mailx-settings/tsconfig.json +9 -0
  126. package/packages/mailx-store/.gitattributes +10 -0
  127. package/packages/mailx-store/db.d.ts.map +1 -0
  128. package/packages/mailx-store/db.js.map +1 -0
  129. package/packages/mailx-store/db.ts +2007 -0
  130. package/packages/mailx-store/file-store.d.ts.map +1 -0
  131. package/packages/mailx-store/file-store.js.map +1 -0
  132. package/packages/mailx-store/file-store.ts +82 -0
  133. package/packages/mailx-store/index.d.ts.map +1 -0
  134. package/packages/mailx-store/index.js.map +1 -0
  135. package/packages/mailx-store/index.ts +7 -0
  136. package/packages/mailx-store/package.json +1 -1
  137. package/packages/mailx-store/tsconfig.json +9 -0
  138. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  139. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  140. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  141. package/packages/mailx-store-web/db.d.ts.map +1 -0
  142. package/packages/mailx-store-web/db.js.map +1 -0
  143. package/packages/mailx-store-web/db.ts +756 -0
  144. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  145. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  146. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  147. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  148. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  149. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  150. package/packages/mailx-store-web/index.d.ts.map +1 -0
  151. package/packages/mailx-store-web/index.js.map +1 -0
  152. package/packages/mailx-store-web/index.ts +10 -0
  153. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  154. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  155. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  156. package/packages/mailx-store-web/package.json +4 -4
  157. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  158. package/packages/mailx-store-web/provider-types.js.map +1 -0
  159. package/packages/mailx-store-web/provider-types.ts +7 -0
  160. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  161. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  162. package/packages/mailx-store-web/sync-manager.ts +508 -0
  163. package/packages/mailx-store-web/tsconfig.json +10 -0
  164. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  165. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  166. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  167. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  168. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  169. package/packages/mailx-store-web/web-message-store.ts +97 -0
  170. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  171. package/packages/mailx-store-web/web-service.js.map +1 -0
  172. package/packages/mailx-store-web/web-service.ts +616 -0
  173. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  174. package/packages/mailx-store-web/web-settings.js.map +1 -0
  175. package/packages/mailx-store-web/web-settings.ts +522 -0
  176. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  177. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  178. package/packages/mailx-store-web/worker-entry.ts +215 -0
  179. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  180. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  181. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  182. package/packages/mailx-types/.gitattributes +10 -0
  183. package/packages/mailx-types/index.d.ts.map +1 -0
  184. package/packages/mailx-types/index.js.map +1 -0
  185. package/packages/mailx-types/index.ts +498 -0
  186. package/packages/mailx-types/package.json +1 -1
  187. package/packages/mailx-types/tsconfig.json +9 -0
  188. package/tsconfig.base.json +2 -1
  189. package/tsconfig.json +9 -0
  190. package/build-apk.cmd +0 -3
  191. package/npmg.bat +0 -6
  192. package/packages/mailx-imap/index.d.ts +0 -442
  193. package/packages/mailx-imap/index.js +0 -3684
  194. package/packages/mailx-imap/package.json +0 -25
  195. package/packages/mailx-imap/providers/gmail-api.d.ts +0 -8
  196. package/packages/mailx-imap/providers/gmail-api.js +0 -8
  197. package/packages/mailx-imap/providers/types.d.ts +0 -9
  198. package/packages/mailx-imap/providers/types.js +0 -9
  199. package/packages/mailx-imap/tsconfig.tsbuildinfo +0 -1
  200. package/rebuild.cmd +0 -23
  201. package/tdview.cmd +0 -2
  202. package/temp.ps1 +0 -10
  203. package/test-smtp-direct.mjs +0 -4
  204. package/unbash.cmd +0 -55
  205. package/unwedge.cmd +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-api-web.d.ts","sourceRoot":"","sources":["gmail-api-web.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-api-web.js","sourceRoot":"","sources":["gmail-api-web.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Back-compat re-export. The Gmail provider is now a single implementation
3
+ * in @bobfrankston/mailx-sync, used by both desktop (mailx-imap) and
4
+ * Android (this package). Bug fixes (e.g. 403-quota retry, bounded
5
+ * concurrency) land in one place and apply to both platforms.
6
+ *
7
+ * `GmailApiWebProvider` is kept as an alias for back-compat with existing
8
+ * Android wiring; it's the same class as `GmailApiProvider`.
9
+ */
10
+
11
+ export { GmailApiProvider as GmailApiWebProvider } from "@bobfrankston/mailx-sync";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imap-web-provider.d.ts","sourceRoot":"","sources":["imap-web-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAqC,KAAK,gBAAgB,EAAyB,MAAM,4BAA4B,CAAC;AAC7H,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAwDvG,qBAAa,eAAgB,YAAW,YAAY;IAChD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,eAAe,CAAiC;gBAE5C,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG;IAMlE,mEAAmE;IACnE,OAAO,CAAC,SAAS;IAMjB,0DAA0D;YAC5C,SAAS;IAajB,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IASxC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQhG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,EAC/E,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAStE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAU/F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQ9F,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imap-web-provider.js","sourceRoot":"","sources":["imap-web-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * IMAP web provider — implements MailProvider using CompatImapClient + BridgeTransport.
3
+ * Used for non-Gmail accounts on Android/WebView where Node.js isn't available.
4
+ *
5
+ * The native shell (MAUI) exposes TCP via window._nativeBridge.tcp.*; we alias it
6
+ * to window.msgapi in initAndroid() because iflow-direct's BridgeTransport expects
7
+ * that global name.
8
+ *
9
+ * Includes automatic retry on broken pipe / connection errors: if an operation fails
10
+ * with a connection-related error, we create a fresh client and retry once.
11
+ */
12
+
13
+ import { CompatImapClient, BridgeTransport, type ImapClientConfig, type TransportFactory } from "@bobfrankston/iflow-direct";
14
+ import type { MailProvider, ProviderFolder, ProviderMessage, FetchOptions } from "./provider-types.js";
15
+
16
+ /**
17
+ * Convert a NativeFolder (from iflow-direct) into a ProviderFolder,
18
+ * detecting special-use from the IMAP flags.
19
+ */
20
+ function toProviderFolder(f: { path: string; delimiter: string; flags: string[] }, special: Record<string, string | undefined>): ProviderFolder {
21
+ const flagsLower = (f.flags || []).map(x => x.toLowerCase());
22
+ let specialUse = "";
23
+ if (f.path === special.inbox || flagsLower.includes("\\inbox") || f.path.toUpperCase() === "INBOX") specialUse = "inbox";
24
+ else if (f.path === special.sent || flagsLower.includes("\\sent")) specialUse = "sent";
25
+ else if (f.path === special.trash || flagsLower.includes("\\trash")) specialUse = "trash";
26
+ else if (f.path === special.drafts || flagsLower.includes("\\drafts")) specialUse = "drafts";
27
+ else if (f.path === special.spam || f.path === special.junk || flagsLower.includes("\\junk")) specialUse = "junk";
28
+ else if (f.path === special.archive || flagsLower.includes("\\archive")) specialUse = "archive";
29
+
30
+ // Leaf name = last path segment after delimiter
31
+ const leaf = f.delimiter ? f.path.split(f.delimiter).pop() || f.path : f.path;
32
+
33
+ return {
34
+ path: f.path,
35
+ name: leaf,
36
+ delimiter: f.delimiter || "/",
37
+ specialUse,
38
+ flags: f.flags || [],
39
+ };
40
+ }
41
+
42
+ function toProviderMessage(m: any): ProviderMessage {
43
+ return {
44
+ uid: m.uid,
45
+ messageId: m.messageId || "",
46
+ providerId: "",
47
+ date: m.date || null,
48
+ subject: m.subject || "",
49
+ from: m.from || [],
50
+ to: m.to || [],
51
+ cc: m.cc || [],
52
+ seen: !!m.seen,
53
+ flagged: !!m.flagged,
54
+ answered: !!m.answered,
55
+ draft: !!m.draft,
56
+ size: m.size || 0,
57
+ source: m.source || "",
58
+ };
59
+ }
60
+
61
+ /** Check if an error is a connection/broken-pipe error worth retrying */
62
+ function isConnectionError(e: any): boolean {
63
+ const msg = (e?.message || "").toLowerCase();
64
+ return msg.includes("broken pipe") || msg.includes("not connected") ||
65
+ msg.includes("connection") || msg.includes("socket") ||
66
+ msg.includes("timeout") || msg.includes("econnreset") ||
67
+ msg.includes("epipe") || msg.includes("closed");
68
+ }
69
+
70
+ export class ImapWebProvider implements MailProvider {
71
+ private client: CompatImapClient;
72
+ private config: ImapClientConfig;
73
+ private transportFactory: TransportFactory;
74
+ private specialFolders: Record<string, string | undefined> = {};
75
+ private folderListCache: ProviderFolder[] | null = null;
76
+
77
+ constructor(config: ImapClientConfig, transportFactory?: () => any) {
78
+ this.config = config;
79
+ this.transportFactory = transportFactory || (() => new BridgeTransport());
80
+ this.client = new CompatImapClient(config, this.transportFactory);
81
+ }
82
+
83
+ /** Create a fresh client (after broken pipe / connection error) */
84
+ private reconnect(): void {
85
+ console.log("[imap-web] reconnecting after connection error");
86
+ try { this.client.logout(); } catch { /* ignore */ }
87
+ this.client = new CompatImapClient(this.config, this.transportFactory);
88
+ }
89
+
90
+ /** Run an operation with one retry on connection error */
91
+ private async withRetry<T>(op: () => Promise<T>, label: string): Promise<T> {
92
+ try {
93
+ return await op();
94
+ } catch (e: any) {
95
+ if (isConnectionError(e)) {
96
+ console.warn(`[imap-web] ${label}: ${e.message} — reconnecting and retrying`);
97
+ this.reconnect();
98
+ return await op();
99
+ }
100
+ throw e;
101
+ }
102
+ }
103
+
104
+ async listFolders(): Promise<ProviderFolder[]> {
105
+ const native = await this.withRetry(() => this.client.getFolderList(), "listFolders");
106
+ const special = this.client.getSpecialFolders(native);
107
+ this.specialFolders = special as any;
108
+ const result = native.map(f => toProviderFolder(f, this.specialFolders));
109
+ this.folderListCache = result;
110
+ return result;
111
+ }
112
+
113
+ async fetchSince(folder: string, sinceUid: number, options?: FetchOptions): Promise<ProviderMessage[]> {
114
+ const msgs = await this.withRetry(
115
+ () => this.client.fetchMessagesSinceUid(folder, sinceUid, { source: !!options?.source }),
116
+ `fetchSince(${folder})`
117
+ );
118
+ return msgs.map(toProviderMessage);
119
+ }
120
+
121
+ async fetchByDate(folder: string, since: Date, before: Date, options?: FetchOptions,
122
+ onChunk?: (msgs: ProviderMessage[]) => void): Promise<ProviderMessage[]> {
123
+ const wrappedChunk = onChunk ? (raw: any[]) => onChunk(raw.map(toProviderMessage)) : undefined;
124
+ const msgs = await this.withRetry(
125
+ () => this.client.fetchMessageByDate(folder, since, before, { source: !!options?.source }, wrappedChunk),
126
+ `fetchByDate(${folder})`
127
+ );
128
+ return msgs.map(toProviderMessage);
129
+ }
130
+
131
+ async fetchByUids(folder: string, uids: number[], options?: FetchOptions): Promise<ProviderMessage[]> {
132
+ if (!uids.length) return [];
133
+ const range = uids.join(",");
134
+ const msgs = await this.withRetry(
135
+ () => this.client.fetchMessages(folder, range, { source: !!options?.source }),
136
+ `fetchByUids(${folder})`
137
+ );
138
+ return msgs.map(toProviderMessage);
139
+ }
140
+
141
+ async fetchOne(folder: string, uid: number, options?: FetchOptions): Promise<ProviderMessage | null> {
142
+ const msg = await this.withRetry(
143
+ () => this.client.fetchMessageByUid(folder, uid, { source: !!options?.source }),
144
+ `fetchOne(${folder}/${uid})`
145
+ );
146
+ return msg ? toProviderMessage(msg) : null;
147
+ }
148
+
149
+ async getUids(folder: string): Promise<number[]> {
150
+ return this.withRetry(() => this.client.getUids(folder), `getUids(${folder})`);
151
+ }
152
+
153
+ async close(): Promise<void> {
154
+ try { await this.client.logout(); } catch { /* ignore */ }
155
+ }
156
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @bobfrankston/mailx-store-web
3
+ * WebAssembly SQLite + IndexedDB storage for Android/browser.
4
+ * Drop-in replacement for @bobfrankston/mailx-store in non-Node environments.
5
+ */
6
+
7
+ export { WebMailxDB } from "./db.js";
8
+ export { WebMessageStore } from "./web-message-store.js";
9
+ export { WebMailxService } from "./web-service.js";
10
+ export { dispatch } from "./web-jsonrpc.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-thread-host.d.ts","sourceRoot":"","sources":["main-thread-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA4QH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyCtD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-thread-host.js","sourceRoot":"","sources":["main-thread-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Main thread Worker host — thin shim that keeps UI responsive.
3
+ *
4
+ * Responsibilities:
5
+ * 1. Create Worker and proxy mailxapi calls to it
6
+ * 2. Proxy TCP calls from Worker to msgapi.tcp (C# native bridge)
7
+ * 3. Proxy native bridge calls (OAuth, device info)
8
+ * 4. Forward events from Worker to UI event handlers
9
+ * 5. Set up visibilitychange/periodic sync triggers
10
+ *
11
+ * The UI code (api-client.ts) calls window.mailxapi.* exactly as before —
12
+ * this host just routes those calls to the Worker instead of running them inline.
13
+ */
14
+
15
+ const eventHandlers: ((event: any) => void)[] = [];
16
+ let worker: Worker;
17
+ let rpcCounter = 0;
18
+ const pendingRpc = new Map<number, { resolve: (v: any) => void; reject: (e: Error) => void }>();
19
+
20
+ // ── Worker communication ──
21
+
22
+ function sendRpc(action: string, params: any = {}): Promise<any> {
23
+ const id = ++rpcCounter;
24
+ return new Promise((resolve, reject) => {
25
+ pendingRpc.set(id, { resolve, reject });
26
+ worker.postMessage({ type: "rpc", id, action, params });
27
+ // 5-minute timeout for long operations like syncAll
28
+ setTimeout(() => {
29
+ if (pendingRpc.has(id)) {
30
+ pendingRpc.delete(id);
31
+ reject(new Error(`RPC ${action} timeout`));
32
+ }
33
+ }, 300000);
34
+ });
35
+ }
36
+
37
+ // ── TCP proxy: relay Worker TCP requests to msgapi.tcp ──
38
+
39
+ function handleTcpRequest(msg: any): void {
40
+ const msgapi = (window as any).msgapi;
41
+ if (!msgapi?.tcp) {
42
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, error: "TCP bridge not available" });
43
+ return;
44
+ }
45
+
46
+ switch (msg.op) {
47
+ case "connect": {
48
+ msgapi.tcp.connect(msg.host, msg.port, msg.tls)
49
+ .then((streamId: string) => {
50
+ const sid = Number(streamId);
51
+ // Register event forwarding for this stream
52
+ msgapi.tcp.onData(sid, (data: string) => {
53
+ worker.postMessage({ type: "tcp-data", streamId: sid, data });
54
+ });
55
+ msgapi.tcp.onClose(sid, (hadError: boolean) => {
56
+ worker.postMessage({ type: "tcp-close", streamId: sid, hadError });
57
+ });
58
+ msgapi.tcp.onError(sid, (message: string) => {
59
+ worker.postMessage({ type: "tcp-error", streamId: sid, message });
60
+ });
61
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, result: String(sid) });
62
+ })
63
+ .catch((e: any) => {
64
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, error: e.message });
65
+ });
66
+ break;
67
+ }
68
+ case "write": {
69
+ const data = msg.data;
70
+ // btoa for the bridge (C# expects base64)
71
+ msgapi.tcp.write(msg.streamId, data)
72
+ .then(() => {
73
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, result: "ok" });
74
+ })
75
+ .catch((e: any) => {
76
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, error: e.message });
77
+ });
78
+ break;
79
+ }
80
+ case "upgradeTLS": {
81
+ msgapi.tcp.upgradeTLS(msg.streamId, msg.servername)
82
+ .then(() => {
83
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, result: "ok" });
84
+ })
85
+ .catch((e: any) => {
86
+ worker.postMessage({ type: "tcp-response", reqId: msg.reqId, error: e.message });
87
+ });
88
+ break;
89
+ }
90
+ case "close": {
91
+ try { msgapi.tcp.close(msg.streamId); } catch { /* ignore */ }
92
+ break;
93
+ }
94
+ }
95
+ }
96
+
97
+ // ── Native bridge proxy: relay Worker native requests ──
98
+
99
+ function handleNativeRequest(msg: any): void {
100
+ const bridge = (window as any)._nativeBridge;
101
+
102
+ switch (msg.op) {
103
+ case "refreshToken": {
104
+ const email = msg.args?.[0];
105
+ if (bridge?.app?.startOAuth) {
106
+ // Use the existing OAuth flow
107
+ // For now, use the cached token or refresh
108
+ bridge.app.refreshToken?.(email)
109
+ .then((token: string) => {
110
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, result: token });
111
+ })
112
+ .catch((e: any) => {
113
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, error: e.message });
114
+ });
115
+ } else {
116
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, error: "No OAuth bridge" });
117
+ }
118
+ break;
119
+ }
120
+ case "vlog": {
121
+ // Verbose logging via logit
122
+ const text = msg.args?.[0] || "";
123
+ fetch(`https://rmf39.aaz.lt/logit/${encodeURIComponent("V/" + text)}?log=mailx-android`).catch(() => {});
124
+ break;
125
+ }
126
+ case "getAndroidId": {
127
+ bridge?.app?.getAndroidId?.()
128
+ .then((id: string) => {
129
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, result: id });
130
+ })
131
+ .catch((e: any) => {
132
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, error: e.message });
133
+ });
134
+ break;
135
+ }
136
+ case "getDeviceAccounts": {
137
+ bridge?.app?.getDeviceAccounts?.()
138
+ .then((accounts: any) => {
139
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, result: accounts });
140
+ })
141
+ .catch((e: any) => {
142
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, error: e.message });
143
+ });
144
+ break;
145
+ }
146
+ case "localStorageGet": {
147
+ const key = msg.args?.[0];
148
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, result: localStorage.getItem(key) });
149
+ break;
150
+ }
151
+ case "localStorageSet": {
152
+ const [key, value] = msg.args || [];
153
+ localStorage.setItem(key, value);
154
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, result: "ok" });
155
+ break;
156
+ }
157
+ default: {
158
+ worker.postMessage({ type: "native-response", reqId: msg.reqId, error: `Unknown native op: ${msg.op}` });
159
+ }
160
+ }
161
+ }
162
+
163
+ // ── Event handling ──
164
+
165
+ function handleWorkerEvent(event: any): void {
166
+ for (const handler of eventHandlers) {
167
+ try { handler(event); } catch { /* ignore */ }
168
+ }
169
+ // Also dispatch to the global host service-channel event callback
170
+ const cb = (window as any)._msgapiServiceEvent;
171
+ if (cb) try { cb(event); } catch { /* ignore */ }
172
+ }
173
+
174
+ // ── Worker message router ──
175
+
176
+ function onWorkerMessage(e: MessageEvent): void {
177
+ const msg = e.data;
178
+
179
+ if (msg.type === "rpc-response") {
180
+ const pending = pendingRpc.get(msg.id);
181
+ if (pending) {
182
+ pendingRpc.delete(msg.id);
183
+ if (msg.error) pending.reject(new Error(msg.error));
184
+ else pending.resolve(msg.result);
185
+ }
186
+ return;
187
+ }
188
+
189
+ if (msg.type === "event") {
190
+ handleWorkerEvent(msg.event);
191
+ return;
192
+ }
193
+
194
+ if (msg.type === "tcp") {
195
+ handleTcpRequest(msg);
196
+ return;
197
+ }
198
+
199
+ if (msg.type === "native") {
200
+ handleNativeRequest(msg);
201
+ return;
202
+ }
203
+
204
+ if (msg.type === "init-complete") {
205
+ console.log("[host] Worker initialization complete");
206
+ return;
207
+ }
208
+
209
+ if (msg.type === "init-error") {
210
+ console.error(`[host] Worker init failed: ${msg.error}`);
211
+ return;
212
+ }
213
+ }
214
+
215
+ // ── Install mailxapi bridge (same interface as before, routes to Worker) ──
216
+
217
+ function installBridge(): void {
218
+ (window as any).mailxapi = {
219
+ isApp: true,
220
+ platform: "android",
221
+
222
+ // All service methods proxy to the Worker
223
+ getAccounts: () => sendRpc("getAccounts"),
224
+ getFolders: (accountId: string) => sendRpc("getFolders", { accountId }),
225
+ getMessages: (accountId: string, folderId: number, page?: number, pageSize?: number) =>
226
+ sendRpc("getMessages", { accountId, folderId, page, pageSize }),
227
+ getUnifiedInbox: (page?: number, pageSize?: number) =>
228
+ sendRpc("getUnifiedInbox", { page, pageSize }),
229
+ getMessage: (accountId: string, uid: number, allowRemote?: boolean, folderId?: number) =>
230
+ sendRpc("getMessage", { accountId, uid, allowRemote, folderId }),
231
+ getAttachment: (accountId: string, uid: number, index: number, folderId?: number) =>
232
+ sendRpc("getAttachment", { accountId, uid, index, folderId }),
233
+ updateFlags: (accountId: string, uid: number, flags: any) =>
234
+ sendRpc("updateFlags", { accountId, uid, flags }),
235
+ deleteMessage: (accountId: string, uid: number) =>
236
+ sendRpc("deleteMessage", { accountId, uid }),
237
+ deleteMessages: (accountId: string, uids: number[]) =>
238
+ sendRpc("deleteMessages", { accountId, uids }),
239
+ undeleteMessage: (accountId: string, uid: number, folderId: number) =>
240
+ sendRpc("undeleteMessage", { accountId, uid, folderId }),
241
+ moveMessage: (accountId: string, uid: number, targetFolderId: number, targetAccountId?: string) =>
242
+ sendRpc("moveMessage", { accountId, uid, targetFolderId, targetAccountId }),
243
+ moveMessages: (accountId: string, uids: number[], targetFolderId: number) =>
244
+ sendRpc("moveMessages", { accountId, uids, targetFolderId }),
245
+ markFolderRead: (folderId: number) =>
246
+ sendRpc("markFolderRead", { folderId }),
247
+ sendMessage: async (msg: any) => { await sendRpc("sendMessage", msg); return { ok: true }; },
248
+ saveDraft: (p: any) => sendRpc("saveDraft", p),
249
+ deleteDraft: (accountId: string, draftUid: number) =>
250
+ sendRpc("deleteDraft", { accountId, draftUid }),
251
+ syncAll: () => sendRpc("syncAll"),
252
+ syncAccount: (accountId: string) => sendRpc("syncAccount", { accountId }),
253
+ triggerSync: () => sendRpc("syncAll"),
254
+ getSyncPending: () => sendRpc("getSyncPending"),
255
+ reauthenticate: (accountId: string) => sendRpc("reauthenticate", { accountId }),
256
+ searchMessages: (query: string, page?: number, pageSize?: number) =>
257
+ sendRpc("searchMessages", { query, page, pageSize }),
258
+ searchContacts: (query: string) => sendRpc("searchContacts", { query }),
259
+ listContacts: (query: string, page = 1, pageSize = 100) => sendRpc("listContacts", { query, page, pageSize }),
260
+ upsertContact: (name: string, email: string) => sendRpc("upsertContact", { name, email }),
261
+ deleteContact: (email: string) => sendRpc("deleteContact", { email }),
262
+ addContact: (name: string, email: string) => sendRpc("addContact", { name, email }),
263
+ getSettings: () => sendRpc("getSettings"),
264
+ saveSettings: (data: any) => sendRpc("saveSettingsData", data),
265
+ allowRemoteContent: (type: string, value: string) =>
266
+ sendRpc("allowRemoteContent", { type, value }),
267
+ getVersion: () => sendRpc("getVersion"),
268
+ getAutocompleteSettings: () => sendRpc("getAutocompleteSettings"),
269
+ saveAutocompleteSettings: (data: any) => sendRpc("saveAutocompleteSettings", data),
270
+ emptyFolder: (accountId: string, folderId: number) =>
271
+ sendRpc("emptyFolder", { accountId, folderId }),
272
+ resetAll: () => sendRpc("resetStore"),
273
+
274
+ // Event registration
275
+ onEvent: (handler: (event: any) => void) => { eventHandlers.push(handler); },
276
+ };
277
+ }
278
+
279
+ // ── Public entry point ──
280
+
281
+ export async function createWorkerHost(): Promise<void> {
282
+ console.log("[host] Creating service worker...");
283
+
284
+ // Wait for native bridge
285
+ await new Promise<void>((resolve) => {
286
+ const check = () => {
287
+ if ((window as any)._nativeBridge) { resolve(); return; }
288
+ setTimeout(check, 50);
289
+ };
290
+ window.addEventListener("nativebridgeready", () => resolve(), { once: true });
291
+ check();
292
+ });
293
+
294
+ // Alias for TCP bridge
295
+ if ((window as any)._nativeBridge && !(window as any).msgapi) {
296
+ (window as any).msgapi = (window as any)._nativeBridge;
297
+ }
298
+
299
+ // Create Worker
300
+ // Note: Worker URL must point to the bundled worker entry.
301
+ // For now, use the same-origin asset path.
302
+ // Use bundled worker (esbuild inlines all dependencies — no import map needed)
303
+ worker = new Worker("../packages/mailx-store-web/worker-bundle.js");
304
+ worker.onmessage = onWorkerMessage;
305
+ worker.onerror = (e) => console.error("[host] Worker error:", e.message);
306
+
307
+ // Install the mailxapi bridge
308
+ installBridge();
309
+
310
+ // Tell Worker to initialize
311
+ worker.postMessage({ type: "init", config: {} });
312
+
313
+ // Sync on resume
314
+ document.addEventListener("visibilitychange", () => {
315
+ if (document.visibilityState === "visible") {
316
+ console.log("[sync] resume poll");
317
+ sendRpc("syncAll").catch(() => {});
318
+ }
319
+ });
320
+
321
+ console.log("[host] Worker host ready");
322
+ }
@@ -10,10 +10,10 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "@bobfrankston/mailx-types": "file:../mailx-types",
13
- "@bobfrankston/iflow-direct": "file:../../../MailApps/iflow-direct",
14
- "@bobfrankston/tcp-transport": "file:../../../MailApps/tcp-transport",
15
- "@bobfrankston/smtp-direct": "file:../../../MailApps/smtp-direct",
16
- "@bobfrankston/mailx-sync": "file:../../../MailApps/mailx-sync",
13
+ "@bobfrankston/iflow-direct": "file:../../../../MailApps/iflow-direct",
14
+ "@bobfrankston/tcp-transport": "file:../../../../MailApps/tcp-transport",
15
+ "@bobfrankston/smtp-direct": "file:../../../../MailApps/smtp-direct",
16
+ "@bobfrankston/mailx-sync": "file:../../../../MailApps/mailx-sync",
17
17
  "sql.js": "^1.14.1"
18
18
  },
19
19
  "repository": {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["provider-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-types.js","sourceRoot":"","sources":["provider-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Back-compat re-export. Canonical types live in @bobfrankston/mailx-sync.
3
+ * Earlier this file was a hand-maintained copy of mailx-imap's types — that
4
+ * arrangement drifted. Now both sides import from one place.
5
+ */
6
+
7
+ export type { MailProvider, ProviderFolder, ProviderMessage, FetchOptions } from "@bobfrankston/mailx-sync";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["sync-manager.ts"],"names":[],"mappings":"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"}