@bobfrankston/rmfmail 1.0.467

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 (330) hide show
  1. package/README.md +429 -0
  2. package/bin/build-icon-ico.js +283 -0
  3. package/bin/lean-accounts.js +172 -0
  4. package/bin/mailx.js +1580 -0
  5. package/bin/mailx.js.map +1 -0
  6. package/bin/mailx.ts +1549 -0
  7. package/bin/postinstall.js +39 -0
  8. package/bin/postinstall.js.map +1 -0
  9. package/bin/postinstall.ts +41 -0
  10. package/bin/tsconfig.json +10 -0
  11. package/client/.gitattributes +10 -0
  12. package/client/.msger-window.json +1 -0
  13. package/client/android.html +226 -0
  14. package/client/app.js +3400 -0
  15. package/client/app.js.map +1 -0
  16. package/client/app.ts +3190 -0
  17. package/client/components/address-book.js +199 -0
  18. package/client/components/address-book.js.map +1 -0
  19. package/client/components/address-book.ts +204 -0
  20. package/client/components/alarms.js +299 -0
  21. package/client/components/alarms.js.map +1 -0
  22. package/client/components/alarms.ts +276 -0
  23. package/client/components/calendar-sidebar.js +508 -0
  24. package/client/components/calendar-sidebar.js.map +1 -0
  25. package/client/components/calendar-sidebar.ts +474 -0
  26. package/client/components/calendar.js +217 -0
  27. package/client/components/calendar.js.map +1 -0
  28. package/client/components/calendar.ts +211 -0
  29. package/client/components/context-menu.js +80 -0
  30. package/client/components/context-menu.js.map +1 -0
  31. package/client/components/context-menu.ts +95 -0
  32. package/client/components/folder-picker.js +119 -0
  33. package/client/components/folder-picker.js.map +1 -0
  34. package/client/components/folder-picker.ts +127 -0
  35. package/client/components/folder-tree.js +1093 -0
  36. package/client/components/folder-tree.js.map +1 -0
  37. package/client/components/folder-tree.ts +1069 -0
  38. package/client/components/message-list.js +1140 -0
  39. package/client/components/message-list.js.map +1 -0
  40. package/client/components/message-list.ts +1129 -0
  41. package/client/components/message-viewer.js +1291 -0
  42. package/client/components/message-viewer.js.map +1 -0
  43. package/client/components/message-viewer.ts +1257 -0
  44. package/client/components/outbox-view.js +104 -0
  45. package/client/components/outbox-view.js.map +1 -0
  46. package/client/components/outbox-view.ts +102 -0
  47. package/client/components/tasks.js +261 -0
  48. package/client/components/tasks.js.map +1 -0
  49. package/client/components/tasks.ts +234 -0
  50. package/client/compose/compose.css +560 -0
  51. package/client/compose/compose.html +52 -0
  52. package/client/compose/compose.js +1289 -0
  53. package/client/compose/compose.js.map +1 -0
  54. package/client/compose/compose.ts +1231 -0
  55. package/client/compose/editor.js +616 -0
  56. package/client/compose/editor.js.map +1 -0
  57. package/client/compose/editor.ts +599 -0
  58. package/client/compose/ghost-text.js +122 -0
  59. package/client/compose/ghost-text.js.map +1 -0
  60. package/client/compose/ghost-text.ts +140 -0
  61. package/client/favicon.svg +11 -0
  62. package/client/icon.ico +0 -0
  63. package/client/icon.png +0 -0
  64. package/client/index.html +230 -0
  65. package/client/lib/android-bootstrap.js +9 -0
  66. package/client/lib/android-bootstrap.js.map +1 -0
  67. package/client/lib/android-bootstrap.ts +9 -0
  68. package/client/lib/api-client.js +378 -0
  69. package/client/lib/api-client.js.map +1 -0
  70. package/client/lib/api-client.ts +439 -0
  71. package/client/lib/local-service.js +603 -0
  72. package/client/lib/local-service.js.map +1 -0
  73. package/client/lib/local-service.ts +646 -0
  74. package/client/lib/local-store.js +214 -0
  75. package/client/lib/local-store.js.map +1 -0
  76. package/client/lib/local-store.ts +283 -0
  77. package/client/lib/mailxapi.js +304 -0
  78. package/client/lib/message-state.js +132 -0
  79. package/client/lib/message-state.js.map +1 -0
  80. package/client/lib/message-state.ts +160 -0
  81. package/client/package.json +16 -0
  82. package/client/styles/components.css +2049 -0
  83. package/client/styles/layout.css +332 -0
  84. package/client/styles/variables.css +85 -0
  85. package/client/tsconfig.json +19 -0
  86. package/package.json +124 -0
  87. package/packages/mailx-api/.gitattributes +10 -0
  88. package/packages/mailx-api/index.d.ts +10 -0
  89. package/packages/mailx-api/index.d.ts.map +1 -0
  90. package/packages/mailx-api/index.js +322 -0
  91. package/packages/mailx-api/index.js.map +1 -0
  92. package/packages/mailx-api/index.ts +283 -0
  93. package/packages/mailx-api/package.json +27 -0
  94. package/packages/mailx-api/tsconfig.json +9 -0
  95. package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
  96. package/packages/mailx-compose/.gitattributes +10 -0
  97. package/packages/mailx-compose/index.d.ts +21 -0
  98. package/packages/mailx-compose/index.d.ts.map +1 -0
  99. package/packages/mailx-compose/index.js +61 -0
  100. package/packages/mailx-compose/index.js.map +1 -0
  101. package/packages/mailx-compose/index.ts +85 -0
  102. package/packages/mailx-compose/package.json +18 -0
  103. package/packages/mailx-compose/tsconfig.json +9 -0
  104. package/packages/mailx-core/index.d.ts +139 -0
  105. package/packages/mailx-core/index.d.ts.map +1 -0
  106. package/packages/mailx-core/index.js +403 -0
  107. package/packages/mailx-core/index.js.map +1 -0
  108. package/packages/mailx-core/index.ts +424 -0
  109. package/packages/mailx-core/ipc.d.ts +13 -0
  110. package/packages/mailx-core/ipc.d.ts.map +1 -0
  111. package/packages/mailx-core/ipc.js +56 -0
  112. package/packages/mailx-core/ipc.js.map +1 -0
  113. package/packages/mailx-core/ipc.ts +62 -0
  114. package/packages/mailx-core/package.json +18 -0
  115. package/packages/mailx-core/tsconfig.json +9 -0
  116. package/packages/mailx-host/.gitattributes +10 -0
  117. package/packages/mailx-host/index.d.ts +21 -0
  118. package/packages/mailx-host/index.d.ts.map +1 -0
  119. package/packages/mailx-host/index.js +29 -0
  120. package/packages/mailx-host/index.js.map +1 -0
  121. package/packages/mailx-host/index.ts +38 -0
  122. package/packages/mailx-host/package.json +23 -0
  123. package/packages/mailx-host/tsconfig.json +9 -0
  124. package/packages/mailx-host/types-shim.d.ts +14 -0
  125. package/packages/mailx-imap/.gitattributes +10 -0
  126. package/packages/mailx-imap/index.d.ts +442 -0
  127. package/packages/mailx-imap/index.d.ts.map +1 -0
  128. package/packages/mailx-imap/index.js +3684 -0
  129. package/packages/mailx-imap/index.js.map +1 -0
  130. package/packages/mailx-imap/index.ts +3652 -0
  131. package/packages/mailx-imap/package-lock.json +131 -0
  132. package/packages/mailx-imap/package.json +28 -0
  133. package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
  134. package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
  135. package/packages/mailx-imap/providers/gmail-api.js +8 -0
  136. package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
  137. package/packages/mailx-imap/providers/gmail-api.ts +8 -0
  138. package/packages/mailx-imap/providers/outlook-api.ts +7 -0
  139. package/packages/mailx-imap/providers/types.d.ts +9 -0
  140. package/packages/mailx-imap/providers/types.d.ts.map +1 -0
  141. package/packages/mailx-imap/providers/types.js +9 -0
  142. package/packages/mailx-imap/providers/types.js.map +1 -0
  143. package/packages/mailx-imap/providers/types.ts +9 -0
  144. package/packages/mailx-imap/tsconfig.json +9 -0
  145. package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
  146. package/packages/mailx-send/.gitattributes +10 -0
  147. package/packages/mailx-send/README.md +217 -0
  148. package/packages/mailx-send/cli-queue.d.ts +11 -0
  149. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  150. package/packages/mailx-send/cli-queue.js +59 -0
  151. package/packages/mailx-send/cli-queue.js.map +1 -0
  152. package/packages/mailx-send/cli-queue.ts +62 -0
  153. package/packages/mailx-send/cli-send.d.ts +17 -0
  154. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  155. package/packages/mailx-send/cli-send.js +75 -0
  156. package/packages/mailx-send/cli-send.js.map +1 -0
  157. package/packages/mailx-send/cli-send.ts +83 -0
  158. package/packages/mailx-send/cli.d.ts +22 -0
  159. package/packages/mailx-send/cli.d.ts.map +1 -0
  160. package/packages/mailx-send/cli.js +115 -0
  161. package/packages/mailx-send/cli.js.map +1 -0
  162. package/packages/mailx-send/cli.ts +126 -0
  163. package/packages/mailx-send/index.d.ts +77 -0
  164. package/packages/mailx-send/index.d.ts.map +1 -0
  165. package/packages/mailx-send/index.js +264 -0
  166. package/packages/mailx-send/index.js.map +1 -0
  167. package/packages/mailx-send/index.ts +333 -0
  168. package/packages/mailx-send/mailsend/README.md +133 -0
  169. package/packages/mailx-send/mailsend/cli.d.ts +12 -0
  170. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  171. package/packages/mailx-send/mailsend/cli.js +70 -0
  172. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  173. package/packages/mailx-send/mailsend/cli.ts +81 -0
  174. package/packages/mailx-send/mailsend/index.d.ts +77 -0
  175. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  176. package/packages/mailx-send/mailsend/index.js +264 -0
  177. package/packages/mailx-send/mailsend/index.js.map +1 -0
  178. package/packages/mailx-send/mailsend/index.ts +333 -0
  179. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  180. package/packages/mailx-send/mailsend/package.json +26 -0
  181. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  182. package/packages/mailx-send/package-lock.json +65 -0
  183. package/packages/mailx-send/package.json +37 -0
  184. package/packages/mailx-send/tsconfig.json +21 -0
  185. package/packages/mailx-server/.gitattributes +10 -0
  186. package/packages/mailx-server/index.d.ts +8 -0
  187. package/packages/mailx-server/index.d.ts.map +1 -0
  188. package/packages/mailx-server/index.js +397 -0
  189. package/packages/mailx-server/index.js.map +1 -0
  190. package/packages/mailx-server/index.ts +429 -0
  191. package/packages/mailx-server/package.json +28 -0
  192. package/packages/mailx-server/tsconfig.json +9 -0
  193. package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
  194. package/packages/mailx-service/google-sync.d.ts +96 -0
  195. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  196. package/packages/mailx-service/google-sync.js +153 -0
  197. package/packages/mailx-service/google-sync.js.map +1 -0
  198. package/packages/mailx-service/google-sync.ts +238 -0
  199. package/packages/mailx-service/index.d.ts +366 -0
  200. package/packages/mailx-service/index.d.ts.map +1 -0
  201. package/packages/mailx-service/index.js +2589 -0
  202. package/packages/mailx-service/index.js.map +1 -0
  203. package/packages/mailx-service/index.ts +2512 -0
  204. package/packages/mailx-service/jsonrpc.d.ts +25 -0
  205. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  206. package/packages/mailx-service/jsonrpc.js +238 -0
  207. package/packages/mailx-service/jsonrpc.js.map +1 -0
  208. package/packages/mailx-service/jsonrpc.ts +268 -0
  209. package/packages/mailx-service/package.json +22 -0
  210. package/packages/mailx-service/tsconfig.json +9 -0
  211. package/packages/mailx-settings/.gitattributes +10 -0
  212. package/packages/mailx-settings/cloud.d.ts +47 -0
  213. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  214. package/packages/mailx-settings/cloud.js +408 -0
  215. package/packages/mailx-settings/cloud.js.map +1 -0
  216. package/packages/mailx-settings/cloud.ts +393 -0
  217. package/packages/mailx-settings/index.d.ts +140 -0
  218. package/packages/mailx-settings/index.d.ts.map +1 -0
  219. package/packages/mailx-settings/index.js +872 -0
  220. package/packages/mailx-settings/index.js.map +1 -0
  221. package/packages/mailx-settings/index.ts +908 -0
  222. package/packages/mailx-settings/package.json +20 -0
  223. package/packages/mailx-settings/tsconfig.json +9 -0
  224. package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
  225. package/packages/mailx-store/.gitattributes +10 -0
  226. package/packages/mailx-store/db.d.ts +346 -0
  227. package/packages/mailx-store/db.d.ts.map +1 -0
  228. package/packages/mailx-store/db.js +1796 -0
  229. package/packages/mailx-store/db.js.map +1 -0
  230. package/packages/mailx-store/db.ts +2007 -0
  231. package/packages/mailx-store/file-store.d.ts +36 -0
  232. package/packages/mailx-store/file-store.d.ts.map +1 -0
  233. package/packages/mailx-store/file-store.js +80 -0
  234. package/packages/mailx-store/file-store.js.map +1 -0
  235. package/packages/mailx-store/file-store.ts +82 -0
  236. package/packages/mailx-store/index.d.ts +7 -0
  237. package/packages/mailx-store/index.d.ts.map +1 -0
  238. package/packages/mailx-store/index.js +7 -0
  239. package/packages/mailx-store/index.js.map +1 -0
  240. package/packages/mailx-store/index.ts +7 -0
  241. package/packages/mailx-store/package.json +19 -0
  242. package/packages/mailx-store/tsconfig.json +9 -0
  243. package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
  244. package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
  245. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  246. package/packages/mailx-store-web/android-bootstrap.js +1247 -0
  247. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  248. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  249. package/packages/mailx-store-web/db.d.ts +132 -0
  250. package/packages/mailx-store-web/db.d.ts.map +1 -0
  251. package/packages/mailx-store-web/db.js +642 -0
  252. package/packages/mailx-store-web/db.js.map +1 -0
  253. package/packages/mailx-store-web/db.ts +756 -0
  254. package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
  255. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  256. package/packages/mailx-store-web/gmail-api-web.js +11 -0
  257. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  258. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  259. package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
  260. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  261. package/packages/mailx-store-web/imap-web-provider.js +140 -0
  262. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  263. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  264. package/packages/mailx-store-web/index.d.ts +10 -0
  265. package/packages/mailx-store-web/index.d.ts.map +1 -0
  266. package/packages/mailx-store-web/index.js +10 -0
  267. package/packages/mailx-store-web/index.js.map +1 -0
  268. package/packages/mailx-store-web/index.ts +10 -0
  269. package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
  270. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  271. package/packages/mailx-store-web/main-thread-host.js +292 -0
  272. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  273. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  274. package/packages/mailx-store-web/package.json +23 -0
  275. package/packages/mailx-store-web/provider-types.d.ts +7 -0
  276. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  277. package/packages/mailx-store-web/provider-types.js +7 -0
  278. package/packages/mailx-store-web/provider-types.js.map +1 -0
  279. package/packages/mailx-store-web/provider-types.ts +7 -0
  280. package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
  281. package/packages/mailx-store-web/sql.js.d.ts +29 -0
  282. package/packages/mailx-store-web/sync-manager.d.ts +68 -0
  283. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  284. package/packages/mailx-store-web/sync-manager.js +506 -0
  285. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  286. package/packages/mailx-store-web/sync-manager.ts +508 -0
  287. package/packages/mailx-store-web/tsconfig.json +10 -0
  288. package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
  289. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  290. package/packages/mailx-store-web/web-jsonrpc.js +102 -0
  291. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  292. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  293. package/packages/mailx-store-web/web-message-store.d.ts +16 -0
  294. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  295. package/packages/mailx-store-web/web-message-store.js +89 -0
  296. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  297. package/packages/mailx-store-web/web-message-store.ts +97 -0
  298. package/packages/mailx-store-web/web-service.d.ts +111 -0
  299. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  300. package/packages/mailx-store-web/web-service.js +542 -0
  301. package/packages/mailx-store-web/web-service.js.map +1 -0
  302. package/packages/mailx-store-web/web-service.ts +616 -0
  303. package/packages/mailx-store-web/web-settings.d.ts +83 -0
  304. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  305. package/packages/mailx-store-web/web-settings.js +491 -0
  306. package/packages/mailx-store-web/web-settings.js.map +1 -0
  307. package/packages/mailx-store-web/web-settings.ts +522 -0
  308. package/packages/mailx-store-web/worker-bundle.js +6838 -0
  309. package/packages/mailx-store-web/worker-entry.d.ts +8 -0
  310. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  311. package/packages/mailx-store-web/worker-entry.js +187 -0
  312. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  313. package/packages/mailx-store-web/worker-entry.ts +215 -0
  314. package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
  315. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  316. package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
  317. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  318. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  319. package/packages/mailx-types/.gitattributes +10 -0
  320. package/packages/mailx-types/index.d.ts +319 -0
  321. package/packages/mailx-types/index.d.ts.map +1 -0
  322. package/packages/mailx-types/index.js +243 -0
  323. package/packages/mailx-types/index.js.map +1 -0
  324. package/packages/mailx-types/index.ts +498 -0
  325. package/packages/mailx-types/package.json +16 -0
  326. package/packages/mailx-types/tsconfig.json +9 -0
  327. package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
  328. package/todo.json +13 -0
  329. package/tsconfig.base.json +31 -0
  330. package/tsconfig.json +9 -0
@@ -0,0 +1,542 @@
1
+ /**
2
+ * Web-compatible MailxService for Android/browser.
3
+ * Replaces @bobfrankston/mailx-service which depends on Node.js (fs, dns, mailparser).
4
+ *
5
+ * Key differences from desktop:
6
+ * - Uses WebMailxDB (wa-sqlite) instead of MailxDB (node:sqlite)
7
+ * - Uses WebMessageStore (IndexedDB) instead of FileMessageStore (filesystem)
8
+ * - Uses postal-mime or manual header parsing instead of mailparser's simpleParser
9
+ * - Settings via IndexedDB + GDrive API instead of filesystem
10
+ * - No dns.resolveMx — provider detection is static (Gmail/Outlook/Yahoo/iCloud)
11
+ */
12
+ import { sanitizeHtml, encodeQuotedPrintable, htmlToPlainText } from "@bobfrankston/mailx-types";
13
+ import { loadSettings, saveSettings, loadAllowlist, saveAllowlist, loadAutocomplete, saveAutocomplete, getStorageInfo } from "./web-settings.js";
14
+ /** Parse an RFC 2822 message from raw bytes. Handles basic MIME. */
15
+ function parseEmailSource(raw) {
16
+ const headers = new Map();
17
+ const headerEnd = raw.indexOf("\r\n\r\n");
18
+ const headerSection = headerEnd >= 0 ? raw.substring(0, headerEnd) : raw;
19
+ const body = headerEnd >= 0 ? raw.substring(headerEnd + 4) : "";
20
+ // Parse headers (handle continuations)
21
+ const headerLines = headerSection.split("\r\n");
22
+ let lastKey = "";
23
+ for (const line of headerLines) {
24
+ if (line.startsWith(" ") || line.startsWith("\t")) {
25
+ // Continuation
26
+ if (lastKey) {
27
+ headers.set(lastKey, (headers.get(lastKey) || "") + " " + line.trim());
28
+ }
29
+ }
30
+ else {
31
+ const colon = line.indexOf(":");
32
+ if (colon > 0) {
33
+ lastKey = line.substring(0, colon).toLowerCase().trim();
34
+ headers.set(lastKey, line.substring(colon + 1).trim());
35
+ }
36
+ }
37
+ }
38
+ const contentType = headers.get("content-type") || "text/plain";
39
+ const transferEncoding = (headers.get("content-transfer-encoding") || "").toLowerCase();
40
+ const attachments = [];
41
+ // Check for multipart
42
+ const boundaryMatch = contentType.match(/boundary="?([^";\s]+)"?/i);
43
+ if (boundaryMatch) {
44
+ const boundary = boundaryMatch[1];
45
+ return parseMimeParts(body, boundary, headers);
46
+ }
47
+ // Single part
48
+ let decoded = decodeBody(body, transferEncoding);
49
+ const isHtml = contentType.includes("text/html");
50
+ return {
51
+ html: isHtml ? decoded : "",
52
+ text: isHtml ? "" : decoded,
53
+ headers,
54
+ attachments,
55
+ };
56
+ }
57
+ function parseMimeParts(body, boundary, topHeaders) {
58
+ const parts = body.split("--" + boundary);
59
+ let html = "";
60
+ let text = "";
61
+ const attachments = [];
62
+ for (let i = 1; i < parts.length; i++) {
63
+ const part = parts[i];
64
+ if (part.startsWith("--"))
65
+ break; // End marker
66
+ const partHeaderEnd = part.indexOf("\r\n\r\n");
67
+ if (partHeaderEnd < 0)
68
+ continue;
69
+ const partHeaderSection = part.substring(0, partHeaderEnd);
70
+ const partBody = part.substring(partHeaderEnd + 4).replace(/\r?\n$/, "");
71
+ // Parse part headers
72
+ const partHeaders = new Map();
73
+ const partHeaderLines = partHeaderSection.split("\r\n");
74
+ let lastKey = "";
75
+ for (const line of partHeaderLines) {
76
+ if (line.startsWith(" ") || line.startsWith("\t")) {
77
+ if (lastKey)
78
+ partHeaders.set(lastKey, (partHeaders.get(lastKey) || "") + " " + line.trim());
79
+ }
80
+ else {
81
+ const colon = line.indexOf(":");
82
+ if (colon > 0) {
83
+ lastKey = line.substring(0, colon).toLowerCase().trim();
84
+ partHeaders.set(lastKey, line.substring(colon + 1).trim());
85
+ }
86
+ }
87
+ }
88
+ const partType = partHeaders.get("content-type") || "text/plain";
89
+ const partEncoding = (partHeaders.get("content-transfer-encoding") || "").toLowerCase();
90
+ const disposition = partHeaders.get("content-disposition") || "";
91
+ // Nested multipart
92
+ const nestedBoundary = partType.match(/boundary="?([^";\s]+)"?/i);
93
+ if (nestedBoundary) {
94
+ const nested = parseMimeParts(partBody, nestedBoundary[1], topHeaders);
95
+ if (!html && nested.html)
96
+ html = nested.html;
97
+ if (!text && nested.text)
98
+ text = nested.text;
99
+ attachments.push(...nested.attachments);
100
+ continue;
101
+ }
102
+ if (disposition.includes("attachment") || (partType.includes("application/") && !partType.includes("text/"))) {
103
+ const filenameMatch = disposition.match(/filename="?([^";\r\n]+)"?/i) || partType.match(/name="?([^";\r\n]+)"?/i);
104
+ const decoded = decodeBody(partBody, partEncoding);
105
+ attachments.push({
106
+ filename: filenameMatch?.[1]?.trim() || `attachment-${attachments.length}`,
107
+ contentType: partType.split(";")[0].trim(),
108
+ size: decoded.length,
109
+ contentId: (partHeaders.get("content-id") || "").replace(/[<>]/g, ""),
110
+ content: new TextEncoder().encode(decoded),
111
+ });
112
+ }
113
+ else if (partType.includes("text/html")) {
114
+ const charsetMatch = partType.match(/charset="?([^";\s]+)"?/i);
115
+ html = decodeBody(partBody, partEncoding, charsetMatch?.[1] || "utf-8");
116
+ }
117
+ else if (partType.includes("text/plain")) {
118
+ const charsetMatch = partType.match(/charset="?([^";\s]+)"?/i);
119
+ text = decodeBody(partBody, partEncoding, charsetMatch?.[1] || "utf-8");
120
+ }
121
+ }
122
+ return { html, text, headers: topHeaders, attachments };
123
+ }
124
+ function decodeBody(body, encoding, charset = "utf-8") {
125
+ // Step 1: decode the transfer encoding to a byte array
126
+ let bytes;
127
+ if (encoding === "base64") {
128
+ try {
129
+ const binary = atob(body.replace(/\s/g, ""));
130
+ bytes = Uint8Array.from(binary, c => c.charCodeAt(0));
131
+ }
132
+ catch {
133
+ return body;
134
+ }
135
+ }
136
+ else if (encoding === "quoted-printable") {
137
+ // Decode QP into bytes (NOT into a string — multi-byte UTF-8 must stay as bytes)
138
+ const cleaned = body.replace(/=\r?\n/g, "");
139
+ const out = [];
140
+ for (let i = 0; i < cleaned.length; i++) {
141
+ const c = cleaned[i];
142
+ if (c === "=" && i + 2 < cleaned.length && /[0-9A-Fa-f]{2}/.test(cleaned.substr(i + 1, 2))) {
143
+ out.push(parseInt(cleaned.substr(i + 1, 2), 16));
144
+ i += 2;
145
+ }
146
+ else {
147
+ // Existing character — encode as its byte (assumes ASCII for QP source)
148
+ out.push(c.charCodeAt(0) & 0xff);
149
+ }
150
+ }
151
+ bytes = new Uint8Array(out);
152
+ }
153
+ else if (encoding === "7bit" || encoding === "8bit" || encoding === "" || encoding === "binary") {
154
+ // No transfer encoding — body is already a string of single-byte chars
155
+ bytes = Uint8Array.from(body, c => c.charCodeAt(0) & 0xff);
156
+ }
157
+ else {
158
+ // Unknown encoding — return as-is
159
+ return body;
160
+ }
161
+ // Step 2: decode bytes using the declared charset (default UTF-8)
162
+ try {
163
+ const normalized = charset.toLowerCase().replace("windows-", "windows-").replace("iso-", "iso-");
164
+ return new TextDecoder(normalized).decode(bytes);
165
+ }
166
+ catch {
167
+ // Unknown charset — fall back to UTF-8 with replacement chars
168
+ return new TextDecoder("utf-8").decode(bytes);
169
+ }
170
+ }
171
+ // ── Service ──
172
+ export class WebMailxService {
173
+ db;
174
+ bodyStore;
175
+ syncManager;
176
+ constructor(db, bodyStore, syncManager) {
177
+ this.db = db;
178
+ this.bodyStore = bodyStore;
179
+ this.syncManager = syncManager;
180
+ }
181
+ // ── Accounts ──
182
+ async getAccounts() {
183
+ const dbAccounts = this.db.getAccounts();
184
+ const settings = await loadSettings();
185
+ const ordered = [];
186
+ for (const cfg of settings.accounts) {
187
+ const a = dbAccounts.find(d => d.id === cfg.id);
188
+ if (a)
189
+ ordered.push({ ...a, label: cfg.label, defaultSend: cfg.defaultSend || false });
190
+ }
191
+ for (const a of dbAccounts) {
192
+ if (!ordered.find((o) => o.id === a.id))
193
+ ordered.push(a);
194
+ }
195
+ return ordered;
196
+ }
197
+ // ── Folders ──
198
+ getFolders(accountId) {
199
+ return this.db.getFolders(accountId);
200
+ }
201
+ // ── Messages ──
202
+ getUnifiedInbox(page = 1, pageSize = 50) {
203
+ return this.db.getUnifiedInbox(page, pageSize);
204
+ }
205
+ getMessages(accountId, folderId, page = 1, pageSize = 50, sort = "date", sortDir = "desc", search) {
206
+ return this.db.getMessages({ accountId, folderId, page, pageSize, sort: sort, sortDir: sortDir, search });
207
+ }
208
+ async getMessage(accountId, uid, allowRemote = false, folderId) {
209
+ const envelope = this.db.getMessageByUid(accountId, uid, folderId);
210
+ if (!envelope)
211
+ throw new Error("Message not found");
212
+ let bodyHtml = "";
213
+ let bodyText = "";
214
+ let hasRemoteContent = false;
215
+ let attachments = [];
216
+ let raw = null;
217
+ try {
218
+ raw = await this.syncManager.fetchMessageBody(accountId, envelope.folderId, envelope.uid);
219
+ }
220
+ catch (fetchErr) {
221
+ // Mirror the desktop service: surface as structured bodyError
222
+ // so the viewer shows its dedicated error banner instead of
223
+ // rendering the message text verbatim in the body area.
224
+ const rawErr = fetchErr.message || "fetch failed";
225
+ const isTransient = /connection|Too many|UNAVAILABLE|rate|429|5\d\d|timeout|ENOTFOUND|ECONNRESET|ETIMEDOUT/i.test(rawErr);
226
+ return {
227
+ ...envelope, bodyHtml: "", bodyText: "",
228
+ bodyError: rawErr, bodyErrorTransient: isTransient,
229
+ hasRemoteContent: false, remoteAllowed: false, attachments: [], deliveredTo: "", returnPath: "", listUnsubscribe: ""
230
+ };
231
+ }
232
+ if (!raw) {
233
+ return {
234
+ ...envelope, bodyHtml: "", bodyText: "",
235
+ bodyError: "Message body not cached locally and the server fetch returned nothing.",
236
+ bodyErrorTransient: true,
237
+ hasRemoteContent: false, remoteAllowed: false, attachments: [], deliveredTo: "", returnPath: "", listUnsubscribe: ""
238
+ };
239
+ }
240
+ else {
241
+ const source = new TextDecoder().decode(raw);
242
+ const parsed = parseEmailSource(source);
243
+ bodyHtml = parsed.html || "";
244
+ bodyText = parsed.text || "";
245
+ attachments = (parsed.attachments || []).map((a, i) => ({
246
+ id: i,
247
+ filename: a.filename || `attachment-${i}`,
248
+ mimeType: a.contentType || "application/octet-stream",
249
+ size: a.size || 0,
250
+ contentId: a.contentId || ""
251
+ }));
252
+ }
253
+ // Sanitize HTML
254
+ if (bodyHtml && !allowRemote) {
255
+ const allowList = await loadAllowlist();
256
+ const senderAddr = envelope.from?.address || "";
257
+ const senderDomain = senderAddr.split("@")[1] || "";
258
+ const toAddrs = (envelope.to || []).map((a) => a.address);
259
+ const isAllowed = allowList.senders.includes(senderAddr) ||
260
+ allowList.domains.includes(senderDomain) ||
261
+ toAddrs.some((a) => allowList.recipients?.includes(a));
262
+ if (isAllowed) {
263
+ allowRemote = true;
264
+ }
265
+ else {
266
+ const result = sanitizeHtml(bodyHtml);
267
+ bodyHtml = result.html;
268
+ hasRemoteContent = result.hasRemoteContent;
269
+ }
270
+ }
271
+ return {
272
+ ...envelope, bodyHtml, bodyText, hasRemoteContent, remoteAllowed: allowRemote,
273
+ attachments, deliveredTo: "", returnPath: "", listUnsubscribe: "",
274
+ };
275
+ }
276
+ async updateFlags(accountId, uid, flags) {
277
+ const envelope = this.db.getMessageByUid(accountId, uid);
278
+ await this.syncManager.updateFlagsLocal(accountId, uid, envelope?.folderId || 0, flags);
279
+ }
280
+ // ── Remote content allow-list ──
281
+ async allowRemoteContent(type, value) {
282
+ const list = await loadAllowlist();
283
+ if (type === "sender" && !list.senders.includes(value))
284
+ list.senders.push(value);
285
+ else if (type === "domain" && !list.domains.includes(value))
286
+ list.domains.push(value);
287
+ else if (type === "recipient") {
288
+ if (!list.recipients)
289
+ list.recipients = [];
290
+ if (!list.recipients.includes(value))
291
+ list.recipients.push(value);
292
+ }
293
+ await saveAllowlist(list);
294
+ }
295
+ // ── Search ──
296
+ async search(q, page = 1, pageSize = 50, scope = "all", accountId, folderId) {
297
+ if (!q.trim())
298
+ return { items: [], total: 0, page, pageSize };
299
+ // On mobile, always use local search (no server-side IMAP search)
300
+ if (scope === "current" && accountId && folderId) {
301
+ return this.db.searchMessages(q, page, pageSize, accountId, folderId);
302
+ }
303
+ return this.db.searchMessages(q, page, pageSize);
304
+ }
305
+ // ── Sync ──
306
+ getSyncPending() {
307
+ return { pending: this.db.getTotalPendingSyncCount() };
308
+ }
309
+ async syncAll() {
310
+ await this.syncManager.syncAll();
311
+ }
312
+ async syncAccount(accountId) {
313
+ const folders = await this.syncManager.syncFolders(accountId);
314
+ // INBOX-first: await INBOX so the UI re-renders new mail immediately,
315
+ // then fire the rest in the background so labels don't block the
316
+ // list. S57 (Android parity with desktop's local-first rule).
317
+ const inbox = folders.find(f => f.specialUse === "inbox");
318
+ const others = folders.filter(f => f.specialUse !== "inbox");
319
+ if (inbox) {
320
+ try {
321
+ await this.syncManager.syncFolder(accountId, inbox.id);
322
+ }
323
+ catch (e) {
324
+ console.error(` Skipping INBOX ${inbox.path}: ${e.message}`);
325
+ }
326
+ }
327
+ // Background fan-out: don't await; errors log. UI already has INBOX.
328
+ (async () => {
329
+ for (const folder of others) {
330
+ try {
331
+ await this.syncManager.syncFolder(accountId, folder.id);
332
+ }
333
+ catch (e) {
334
+ console.error(` Skipping folder ${folder.path}: ${e.message}`);
335
+ }
336
+ }
337
+ })().catch(() => { });
338
+ }
339
+ async reauthenticate(accountId) {
340
+ return this.syncManager.reauthenticate(accountId);
341
+ }
342
+ // ── Send ──
343
+ async send(msg) {
344
+ const settings = await loadSettings();
345
+ const account = settings.accounts.find(a => a.id === msg.from);
346
+ if (!account)
347
+ throw new Error(`Unknown account: ${msg.from}`);
348
+ const fromHeader = msg.fromAddress || `${account.name} <${account.email}>`;
349
+ const to = msg.to.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
350
+ const cc = msg.cc?.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
351
+ const bcc = msg.bcc?.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
352
+ // HTML-bodied send gets a multipart/alternative wrapper with a
353
+ // text/plain derived from the HTML — matches desktop's path; spam
354
+ // filters score HTML-only mail harshly without it.
355
+ const hasHtml = !!msg.bodyHtml;
356
+ const htmlBody = msg.bodyHtml || "";
357
+ const textBody = msg.bodyText || (hasHtml ? htmlToPlainText(htmlBody) : "");
358
+ const htmlEncoded = hasHtml ? encodeQuotedPrintable(htmlBody) : "";
359
+ const textEncoded = encodeQuotedPrintable(textBody);
360
+ const domain = account.email.split("@")[1] || "mailx.local";
361
+ const messageId = `<${Date.now()}.${Math.random().toString(36).slice(2)}@${domain}>`;
362
+ const envelope = [
363
+ `From: ${fromHeader}`, `To: ${to}`,
364
+ cc ? `Cc: ${cc}` : null, bcc ? `Bcc: ${bcc}` : null,
365
+ `Subject: ${msg.subject}`, `Date: ${new Date().toUTCString()}`,
366
+ `Message-ID: ${messageId}`,
367
+ msg.inReplyTo ? `In-Reply-To: ${msg.inReplyTo}` : null,
368
+ msg.references?.length ? `References: ${msg.references.join(" ")}` : null,
369
+ `MIME-Version: 1.0`,
370
+ ].filter(h => h !== null);
371
+ let rawMessage;
372
+ if (hasHtml) {
373
+ const altBoundary = `mailx_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
374
+ const body = `--${altBoundary}\r\n` +
375
+ `Content-Type: text/plain; charset=UTF-8\r\n` +
376
+ `Content-Transfer-Encoding: quoted-printable\r\n\r\n` +
377
+ `${textEncoded}\r\n` +
378
+ `--${altBoundary}\r\n` +
379
+ `Content-Type: text/html; charset=UTF-8\r\n` +
380
+ `Content-Transfer-Encoding: quoted-printable\r\n\r\n` +
381
+ `${htmlEncoded}\r\n` +
382
+ `--${altBoundary}--\r\n`;
383
+ const headers = [
384
+ ...envelope,
385
+ `Content-Type: multipart/alternative; boundary="${altBoundary}"`,
386
+ ].join("\r\n");
387
+ rawMessage = `${headers}\r\n\r\n${body}`;
388
+ }
389
+ else {
390
+ const headers = [
391
+ ...envelope,
392
+ `Content-Type: text/plain; charset=UTF-8`,
393
+ `Content-Transfer-Encoding: quoted-printable`,
394
+ ].join("\r\n");
395
+ rawMessage = `${headers}\r\n\r\n${textEncoded}`;
396
+ }
397
+ // queueOutgoingLocal on the Android bridge is async (it flushes
398
+ // sql.js → IndexedDB before returning so a tab-close in the
399
+ // debounce window can't lose the row). On the web-worker
400
+ // SyncManager it's synchronous and returns void; awaiting an
401
+ // undefined value is benign, so this works for both.
402
+ await this.syncManager.queueOutgoingLocal(account.id, rawMessage);
403
+ for (const addr of msg.to)
404
+ this.db.recordSentAddress(addr.name, addr.address);
405
+ if (msg.cc)
406
+ for (const addr of msg.cc)
407
+ this.db.recordSentAddress(addr.name, addr.address);
408
+ if (msg.bcc)
409
+ for (const addr of msg.bcc)
410
+ this.db.recordSentAddress(addr.name, addr.address);
411
+ }
412
+ // ── Delete / Move ──
413
+ async deleteMessage(accountId, uid) {
414
+ const envelope = this.db.getMessageByUid(accountId, uid);
415
+ if (!envelope)
416
+ throw new Error("Message not found");
417
+ await this.syncManager.trashMessage(accountId, envelope.folderId, envelope.uid);
418
+ }
419
+ async deleteMessages(accountId, uids) {
420
+ const messages = uids.map(uid => {
421
+ const env = this.db.getMessageByUid(accountId, uid);
422
+ if (!env)
423
+ return null;
424
+ return { uid: env.uid, folderId: env.folderId };
425
+ }).filter(m => m !== null);
426
+ await this.syncManager.trashMessages(accountId, messages);
427
+ }
428
+ async moveMessage(accountId, uid, targetFolderId, targetAccountId) {
429
+ const envelope = this.db.getMessageByUid(accountId, uid);
430
+ if (!envelope)
431
+ throw new Error("Message not found");
432
+ if (targetAccountId && targetAccountId !== accountId) {
433
+ await this.syncManager.moveMessageCrossAccount(accountId, envelope.uid, envelope.folderId, targetAccountId, targetFolderId);
434
+ }
435
+ else {
436
+ await this.syncManager.moveMessage(accountId, envelope.uid, envelope.folderId, targetFolderId);
437
+ }
438
+ }
439
+ async moveMessages(accountId, uids, targetFolderId) {
440
+ const messages = uids.map(uid => {
441
+ const env = this.db.getMessageByUid(accountId, uid);
442
+ if (!env)
443
+ return null;
444
+ return { uid: env.uid, folderId: env.folderId };
445
+ }).filter(m => m !== null);
446
+ await this.syncManager.moveMessages(accountId, messages, targetFolderId);
447
+ }
448
+ async undeleteMessage(accountId, uid, folderId) {
449
+ await this.syncManager.undeleteMessage(accountId, uid, folderId);
450
+ }
451
+ // ── Drafts ──
452
+ async saveDraft(accountId, subject, bodyHtml, bodyText, to, cc, previousDraftUid, draftId) {
453
+ const settings = await loadSettings();
454
+ const account = settings.accounts.find(a => a.id === accountId);
455
+ if (!account)
456
+ throw new Error(`Unknown account: ${accountId}`);
457
+ const id = draftId || `mailx-draft-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
458
+ const body = bodyHtml || bodyText || "";
459
+ const bodyEncoded = encodeQuotedPrintable(body);
460
+ const headers = [
461
+ `From: ${account.name} <${account.email}>`,
462
+ to ? `To: ${to}` : null, cc ? `Cc: ${cc}` : null,
463
+ `Subject: ${subject || "(no subject)"}`, `Date: ${new Date().toUTCString()}`,
464
+ `X-Mailx-Draft-ID: ${id}`,
465
+ `MIME-Version: 1.0`, `Content-Type: text/html; charset=UTF-8`, `Content-Transfer-Encoding: quoted-printable`,
466
+ ].filter(h => h !== null).join("\r\n");
467
+ const raw = `${headers}\r\n\r\n${bodyEncoded}`;
468
+ const uid = await this.syncManager.saveDraft(accountId, raw, previousDraftUid, id);
469
+ return { uid, draftId: id };
470
+ }
471
+ async deleteDraft(accountId, draftUid) {
472
+ await this.syncManager.deleteDraft(accountId, draftUid);
473
+ }
474
+ // ── Contacts ──
475
+ searchContacts(query) {
476
+ query = (query || "").trim();
477
+ if (query.length < 1)
478
+ return [];
479
+ return this.db.searchContacts(query);
480
+ }
481
+ /** Address-book listing — paginated, filterable. Mirrors mailx-service's
482
+ * signature so the same client-side address-book modal works on Android
483
+ * without an "ipc(...).listContacts is not a function" crash. */
484
+ listContacts(query, page = 1, pageSize = 100) {
485
+ return this.db.listContacts(query || "", page, pageSize);
486
+ }
487
+ /** Manual upsert from the address-book UI. The desktop path queues a
488
+ * Google People sync; Android relies on the desktop pushing changes
489
+ * back, so this is local-only for now. */
490
+ upsertContact(name, email) {
491
+ this.db.upsertContact(name || "", email);
492
+ return { ok: true };
493
+ }
494
+ deleteContact(email) {
495
+ this.db.deleteContactLocal(email);
496
+ return { ok: true };
497
+ }
498
+ addContact(name, email) {
499
+ if (!email || !/^[^\s<>@]+@[^\s<>@]+\.[^\s<>@]+$/.test(email))
500
+ return false;
501
+ this.db.recordSentAddress(name || "", email);
502
+ return true;
503
+ }
504
+ /** Q49 heuristic mirror: true if the user has ever sent a message to
505
+ * `recipientEmail` that had a non-empty Cc field. Compose uses this to
506
+ * decide whether to auto-expand the Cc row on reply. */
507
+ hasCcHistoryTo(recipientEmail) {
508
+ return this.db.hasCcHistoryTo?.(recipientEmail) ?? false;
509
+ }
510
+ // ── Settings ──
511
+ async getSettings() {
512
+ return loadSettings();
513
+ }
514
+ async saveSettingsData(settings) {
515
+ await saveSettings(settings);
516
+ }
517
+ getStorageInfo() {
518
+ return getStorageInfo();
519
+ }
520
+ // ── Folder management (limited on mobile — read-only) ──
521
+ markFolderRead(folderId) {
522
+ this.db.markFolderRead(folderId);
523
+ }
524
+ // ── Autocomplete ──
525
+ async getAutocompleteSettings() {
526
+ return loadAutocomplete();
527
+ }
528
+ async saveAutocompleteSettings(settings) {
529
+ await saveAutocomplete(settings);
530
+ }
531
+ async autocomplete(_req) {
532
+ // Autocomplete disabled on mobile by default
533
+ return { suggestion: "" };
534
+ }
535
+ // ── Reset ──
536
+ async resetStore() {
537
+ await this.db.resetStore();
538
+ await this.bodyStore.clear();
539
+ console.log("[service] Store reset complete");
540
+ }
541
+ }
542
+ //# sourceMappingURL=web-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-service.js","sourceRoot":"","sources":["web-service.ts"],"names":[],"mappings":"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"}