@bobfrankston/rmfmail 1.1.2 → 1.1.3

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 (80) hide show
  1. package/bin/mailx.js +9 -1
  2. package/bin/mailx.js.map +1 -1
  3. package/bin/mailx.ts +10 -1
  4. package/client/android-bootstrap.bundle.js +1 -1
  5. package/client/android-bootstrap.bundle.js.map +2 -2
  6. package/client/app.bundle.js +58 -1
  7. package/client/app.bundle.js.map +2 -2
  8. package/client/compose/compose.bundle.js +41 -1
  9. package/client/compose/compose.bundle.js.map +2 -2
  10. package/client/lib/api-client.js +41 -0
  11. package/client/lib/api-client.js.map +1 -1
  12. package/client/lib/api-client.ts +29 -0
  13. package/client/lib/message-state.js +23 -0
  14. package/client/lib/message-state.js.map +1 -1
  15. package/client/lib/message-state.ts +21 -0
  16. package/package.json +3 -3
  17. package/packages/mailx-bus/index.d.ts +2 -0
  18. package/packages/mailx-bus/index.d.ts.map +1 -1
  19. package/packages/mailx-bus/index.js +9 -0
  20. package/packages/mailx-bus/index.js.map +1 -1
  21. package/packages/mailx-bus/index.ts +11 -0
  22. package/packages/mailx-bus/package.json +1 -1
  23. package/packages/mailx-bus/store-events.d.ts +79 -0
  24. package/packages/mailx-bus/store-events.d.ts.map +1 -0
  25. package/packages/mailx-bus/store-events.js +155 -0
  26. package/packages/mailx-bus/store-events.js.map +1 -0
  27. package/packages/mailx-bus/store-events.ts +165 -0
  28. package/packages/mailx-core/index.d.ts.map +1 -1
  29. package/packages/mailx-core/index.js +25 -3
  30. package/packages/mailx-core/index.js.map +1 -1
  31. package/packages/mailx-core/index.ts +23 -3
  32. package/packages/mailx-host/package.json +1 -1
  33. package/packages/mailx-imap/index.d.ts +0 -37
  34. package/packages/mailx-imap/index.d.ts.map +1 -1
  35. package/packages/mailx-imap/index.js +17 -172
  36. package/packages/mailx-imap/index.js.map +1 -1
  37. package/packages/mailx-imap/index.ts +17 -179
  38. package/packages/mailx-imap/package-lock.json +2 -2
  39. package/packages/mailx-imap/package.json +1 -1
  40. package/packages/mailx-service/index.d.ts +16 -0
  41. package/packages/mailx-service/index.d.ts.map +1 -1
  42. package/packages/mailx-service/index.js +89 -77
  43. package/packages/mailx-service/index.js.map +1 -1
  44. package/packages/mailx-service/index.ts +83 -75
  45. package/packages/mailx-service/local-store.d.ts +54 -2
  46. package/packages/mailx-service/local-store.d.ts.map +1 -1
  47. package/packages/mailx-service/local-store.js +147 -2
  48. package/packages/mailx-service/local-store.js.map +1 -1
  49. package/packages/mailx-service/local-store.ts +147 -3
  50. package/packages/mailx-service/reconciler.d.ts.map +1 -1
  51. package/packages/mailx-service/reconciler.js +28 -8
  52. package/packages/mailx-service/reconciler.js.map +1 -1
  53. package/packages/mailx-service/reconciler.ts +28 -8
  54. package/packages/mailx-service/sync-queue.d.ts +16 -0
  55. package/packages/mailx-service/sync-queue.d.ts.map +1 -1
  56. package/packages/mailx-service/sync-queue.js +33 -3
  57. package/packages/mailx-service/sync-queue.js.map +1 -1
  58. package/packages/mailx-service/sync-queue.ts +33 -3
  59. package/packages/mailx-settings/package.json +1 -1
  60. package/packages/mailx-store/bus.d.ts +79 -0
  61. package/packages/mailx-store/bus.d.ts.map +1 -0
  62. package/packages/mailx-store/bus.js +155 -0
  63. package/packages/mailx-store/bus.js.map +1 -0
  64. package/packages/mailx-store/index.d.ts +2 -0
  65. package/packages/mailx-store/index.d.ts.map +1 -1
  66. package/packages/mailx-store/index.js +5 -0
  67. package/packages/mailx-store/index.js.map +1 -1
  68. package/packages/mailx-store/index.ts +7 -0
  69. package/packages/mailx-store/package.json +2 -1
  70. package/packages/mailx-store-web/db.d.ts.map +1 -1
  71. package/packages/mailx-store-web/db.js +9 -1
  72. package/packages/mailx-store-web/db.js.map +1 -1
  73. package/packages/mailx-store-web/db.ts +9 -1
  74. package/packages/mailx-store-web/package.json +2 -1
  75. package/packages/mailx-store-web/sync-manager.d.ts +4 -0
  76. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -1
  77. package/packages/mailx-store-web/sync-manager.js +32 -4
  78. package/packages/mailx-store-web/sync-manager.js.map +1 -1
  79. package/packages/mailx-store-web/sync-manager.ts +28 -4
  80. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-36832 → node_modules.npmglobalize-stash-444}/.package-lock.json +0 -0
@@ -829,9 +829,14 @@ export class MailxService implements MailxApi {
829
829
  try { fs.unlinkSync(entry.path); } catch { /* file already gone — fine */ }
830
830
  }
831
831
 
832
+ /** Toggle flags. Local DB write + Store event + server-mirror enqueue.
833
+ * No IMAP code path runs in the click→ack window — the queued drain
834
+ * fires 1s later, coalescing rapid toggles. */
832
835
  async updateFlags(accountId: string, uid: number, flags: string[]): Promise<void> {
833
836
  const envelope = this.db.getMessageByUid(accountId, uid);
834
- await this.imapManager.updateFlagsLocal(accountId, uid, envelope?.folderId || 0, flags);
837
+ const folderId = envelope?.folderId || 0;
838
+ this.localStore.updateFlags(accountId, uid, folderId, flags);
839
+ this.syncQueue.enqueueFlag(accountId, uid, folderId, flags);
835
840
  }
836
841
 
837
842
  // ── Remote content allow-list ──
@@ -1959,84 +1964,72 @@ export class MailxService implements MailxApi {
1959
1964
 
1960
1965
  // ── Delete / Move / Undelete ──
1961
1966
 
1967
+ /** Trash a single message. Local-first: local row moves to Trash (or
1968
+ * expunges if already there); the server mirror is queued. */
1962
1969
  async deleteMessage(accountId: string, uid: number): Promise<void> {
1963
1970
  const envelope = this.db.getMessageByUid(accountId, uid);
1964
1971
  if (!envelope) throw new Error("Message not found");
1965
- // Mark as pending server-side delete. The row stays visible (struck
1966
- // through in the UI) until the IMAP MOVE-to-Trash / EXPUNGE confirms
1967
- // server-side. Replaces the old tombstone-by-Message-ID hack: server
1968
- // is authoritative, our flag tracks "in flight" state, not "hide
1969
- // from view." Undelete (Ctrl-Z) clears the flag.
1970
1972
  this.db.setMessagePendingDelete(accountId, uid, envelope.folderId);
1971
- await this.imapManager.trashMessage(accountId, envelope.folderId, envelope.uid);
1973
+ const trash = this.localStore.findSpecialFolder(accountId, "trash");
1974
+ const result = this.localStore.trashMessage(accountId, uid, envelope.folderId, trash?.id ?? null);
1975
+ if (result === "moved-to-trash" && trash) {
1976
+ this.syncQueue.enqueueMove(accountId, uid, envelope.folderId, trash.id);
1977
+ } else {
1978
+ this.syncQueue.enqueueDelete(accountId, uid, envelope.folderId, "delete");
1979
+ }
1972
1980
  }
1973
1981
 
1982
+ /** Bulk trash. Same shape as deleteMessage but loops; each row gets its
1983
+ * own pending-delete flag, local move/expunge, and queue entry. */
1974
1984
  async deleteMessages(accountId: string, uids: number[]): Promise<void> {
1975
- const messages = uids.map(uid => {
1976
- const env = this.db.getMessageByUid(accountId, uid);
1977
- if (!env) return null;
1978
- this.db.setMessagePendingDelete(accountId, uid, env.folderId);
1979
- return { uid: env.uid, folderId: env.folderId };
1980
- }).filter(m => m !== null);
1981
- await this.imapManager.trashMessages(accountId, messages);
1985
+ const trash = this.localStore.findSpecialFolder(accountId, "trash");
1986
+ this.localStore.bus.withBatch(() => {
1987
+ for (const uid of uids) {
1988
+ const env = this.db.getMessageByUid(accountId, uid);
1989
+ if (!env) continue;
1990
+ this.db.setMessagePendingDelete(accountId, uid, env.folderId);
1991
+ const result = this.localStore.trashMessage(accountId, uid, env.folderId, trash?.id ?? null);
1992
+ if (result === "moved-to-trash" && trash) {
1993
+ this.syncQueue.enqueueMove(accountId, uid, env.folderId, trash.id);
1994
+ } else {
1995
+ this.syncQueue.enqueueDelete(accountId, uid, env.folderId, "delete");
1996
+ }
1997
+ }
1998
+ });
1982
1999
  }
1983
2000
 
2001
+ /** Move a message to another folder. Same-account moves go through the
2002
+ * Store + queue. Cross-account moves still synchronously bridge two
2003
+ * IMAP connections (rare; local-first violation noted as future work). */
1984
2004
  async moveMessage(accountId: string, uid: number, targetFolderId: number, targetAccountId?: string): Promise<void> {
2005
+ if (targetAccountId && targetAccountId !== accountId) {
2006
+ // Cross-account: source row removed, body re-fetched on target
2007
+ // via the destination provider. Done synchronously today — moving
2008
+ // this onto the bus needs a two-sided outbound APPEND queue which
2009
+ // is out of scope for this refactor. Local DB cleanup still
2010
+ // happens via mailx-imap (see moveMessageCrossAccount).
2011
+ await this.imapManager.moveMessageCrossAccount(accountId, uid, this.db.getMessageByUid(accountId, uid)?.folderId || 0, targetAccountId, targetFolderId);
2012
+ return;
2013
+ }
1985
2014
  const envelope = this.db.getMessageByUid(accountId, uid);
1986
2015
  if (!envelope) throw new Error("Message not found");
1987
-
1988
- // Tombstone before the local move so sync can't re-import the
1989
- // pre-move row into the source folder before IMAP MOVE completes.
1990
- // Cleared on terminal IMAP failure (see processSyncActions catch).
1991
- if (envelope.messageId) this.db.addTombstone(accountId, envelope.messageId, envelope.subject || "");
1992
-
1993
- // Local-first: move BOTH the legacy `messages.folder_id` AND the
1994
- // `message_folders` membership row so the user-visible list query
1995
- // (which joins through mf) reflects the move immediately. Pre-fix
1996
- // this used `updateMessageFolder` which only touched the legacy
1997
- // column; messages stayed visible in the source folder via the mf
1998
- // join and reappeared on the next refresh — symptom: "I marked
1999
- // them as spam and they came back."
2000
- const moved = this.db.moveMessageLocal(accountId, uid, envelope.folderId, targetFolderId);
2016
+ const moved = this.localStore.moveMessage(accountId, uid, envelope.folderId, targetFolderId);
2001
2017
  if (!moved) throw new Error(`Move failed: no row at (${accountId}, folder=${envelope.folderId}, uid=${uid})`);
2002
- this.db.recalcFolderCounts(envelope.folderId);
2003
- this.db.recalcFolderCounts(targetFolderId);
2004
-
2005
- // Sync to server in background
2006
- if (targetAccountId && targetAccountId !== accountId) {
2007
- this.imapManager.moveMessageCrossAccount(accountId, envelope.uid, envelope.folderId, targetAccountId, targetFolderId).catch(e => console.error(` Move sync failed: ${e.message}`));
2008
- } else {
2009
- this.imapManager.moveMessage(accountId, envelope.uid, envelope.folderId, targetFolderId).catch(e => console.error(` Move sync failed: ${e.message}`));
2010
- }
2018
+ this.syncQueue.enqueueMove(accountId, uid, envelope.folderId, targetFolderId);
2011
2019
  }
2012
2020
 
2021
+ /** Bulk move. Loops the single-move pattern under a withBatch so the
2022
+ * one folder-counts re-render fires once per affected folder, not per
2023
+ * message. */
2013
2024
  async moveMessages(accountId: string, uids: number[], targetFolderId: number): Promise<void> {
2014
- const messages = uids.map(uid => {
2015
- const env = this.db.getMessageByUid(accountId, uid);
2016
- if (!env) return null;
2017
- // Tombstone before the local move so sync can't re-import the
2018
- // pre-move row into the source folder before the IMAP MOVE
2019
- // completes (server still sees it there until then). Cleared
2020
- // on terminal IMAP failure (see processSyncActions catch
2021
- // block) so the row reappears when the action didn't take.
2022
- if (env.messageId) this.db.addTombstone(accountId, env.messageId, env.subject || "");
2023
- return { uid: env.uid, folderId: env.folderId };
2024
- }).filter(m => m !== null);
2025
-
2026
- // Local-first move via mf-aware helper. See moveMessage() above for
2027
- // why updateMessageFolder isn't sufficient.
2028
- const sourceFolderIds = new Set<number>();
2029
- for (const msg of messages) {
2030
- if (msg) {
2031
- this.db.moveMessageLocal(accountId, msg.uid, msg.folderId, targetFolderId);
2032
- sourceFolderIds.add(msg.folderId);
2025
+ this.localStore.bus.withBatch(() => {
2026
+ for (const uid of uids) {
2027
+ const env = this.db.getMessageByUid(accountId, uid);
2028
+ if (!env) continue;
2029
+ if (!this.localStore.moveMessage(accountId, uid, env.folderId, targetFolderId)) continue;
2030
+ this.syncQueue.enqueueMove(accountId, uid, env.folderId, targetFolderId);
2033
2031
  }
2034
- }
2035
- for (const fid of sourceFolderIds) this.db.recalcFolderCounts(fid);
2036
- this.db.recalcFolderCounts(targetFolderId);
2037
-
2038
- // Sync to server in background
2039
- this.imapManager.moveMessages(accountId, messages, targetFolderId).catch(e => console.error(` Move sync failed: ${e.message}`));
2032
+ });
2040
2033
  }
2041
2034
 
2042
2035
  /** Move messages to the account's configured spam folder (accounts.jsonc "spam" path).
@@ -2106,17 +2099,27 @@ export class MailxService implements MailxApi {
2106
2099
  return { ok: true, row };
2107
2100
  }
2108
2101
 
2102
+ /** Restore from Trash. Local-first: move the row back, clear tombstone
2103
+ * and pending-delete flag, then either retract the still-queued MOVE
2104
+ * to trash or queue a counter-MOVE (trash → original). */
2109
2105
  async undeleteMessage(accountId: string, uid: number, folderId: number): Promise<void> {
2110
- // Clear both the tombstone (so sync re-imports the row if the
2111
- // server still has it) AND the pending_delete flag (visible-state
2112
- // marker). The IMAP undelete (UID STORE -FLAGS \Deleted /
2113
- // move-back) is queued by the imapManager call; if the server
2114
- // already EXPUNGEd the message, the row is gone anyway and these
2115
- // clears are no-ops.
2116
- const envelope = this.db.getMessageByUid(accountId, uid, folderId);
2106
+ const trash = this.localStore.findSpecialFolder(accountId, "trash");
2107
+ if (!trash) throw new Error("No Trash folder configured");
2108
+
2109
+ // Clear bookkeeping flags before the local move so a re-sync mid-flight
2110
+ // can't re-mark the row as pending-delete and re-tombstone it.
2111
+ const envelope = this.db.getMessageByUid(accountId, uid, trash.id);
2117
2112
  if (envelope?.messageId) this.db.removeTombstone(accountId, envelope.messageId);
2118
- this.db.clearMessagePendingDelete(accountId, uid, folderId);
2119
- await this.imapManager.undeleteMessage(accountId, uid, folderId);
2113
+ this.db.clearMessagePendingDelete(accountId, uid, trash.id);
2114
+
2115
+ this.localStore.undeleteMessage(accountId, uid, trash.id, folderId);
2116
+
2117
+ // (a) MOVE to trash still queued? retract it — server never saw the
2118
+ // delete, no counter-action needed. (b) Already drained → queue
2119
+ // the counter-MOVE so server state catches up.
2120
+ if (!this.syncQueue.cancelPendingMove(accountId, uid, folderId, trash.id)) {
2121
+ this.syncQueue.enqueueMove(accountId, uid, trash.id, folderId);
2122
+ }
2120
2123
  }
2121
2124
 
2122
2125
  async deleteOnServer(accountId: string, folderPath: string, uid: number): Promise<void> {
@@ -2291,12 +2294,17 @@ export class MailxService implements MailxApi {
2291
2294
  for (const child of children) {
2292
2295
  await this.spillFolderContentsToTrash(accountId, child as any, trash, client);
2293
2296
  }
2294
- // Move messages to Trash root. Reuse existing trashMessages path so
2295
- // body files / sync queue / count refresh all behave consistently.
2297
+ // Move messages to Trash root via the Store + queue. withBatch
2298
+ // coalesces folder-count events into one re-render per topic.
2296
2299
  const uids = await client.getUids(folder.path).catch(() => [] as number[]);
2297
2300
  if (uids.length > 0) {
2298
- const messages = uids.map((uid: number) => ({ uid, folderId: folder.id }));
2299
- await this.imapManager.trashMessages(accountId, messages);
2301
+ this.localStore.bus.withBatch(() => {
2302
+ for (const uid of uids) {
2303
+ const result = this.localStore.trashMessage(accountId, uid, folder.id, trash.id);
2304
+ if (result === "moved-to-trash") this.syncQueue.enqueueMove(accountId, uid, folder.id, trash.id);
2305
+ else this.syncQueue.enqueueDelete(accountId, uid, folder.id, "delete");
2306
+ }
2307
+ });
2300
2308
  }
2301
2309
  // Folder should now be empty; delete it on the server.
2302
2310
  try {
@@ -15,7 +15,7 @@
15
15
  * one IPC method through it as proof-of-pattern. Subsequent steps migrate
16
16
  * remaining call sites and remove the server-fetch path from the UI.
17
17
  */
18
- import type { MailxDB, FileMessageStore } from "@bobfrankston/mailx-store";
18
+ import type { MailxDB, FileMessageStore, StoreBus } from "@bobfrankston/mailx-store";
19
19
  import type { MessageEnvelope, MessageQuery, PagedResult } from "@bobfrankston/mailx-types";
20
20
  /** What the UI gets back from a body read. Mirrors the historical
21
21
  * `getMessage` shape so call-site migration is mechanical. `cached: false`
@@ -47,6 +47,11 @@ export interface LocalMessage extends MessageEnvelope {
47
47
  export declare class LocalStore {
48
48
  private db;
49
49
  private bodyStore;
50
+ /** Event bus for Store mutations. Defaults to the process-singleton
51
+ * so cross-package subscribers (bin/mailx.ts forwarder → WebView,
52
+ * in-process reconciler triggers) see all writes without explicit
53
+ * wiring. Tests can pass a fresh StoreBus for isolation. */
54
+ readonly bus: StoreBus;
50
55
  private static readonly PARSED_LRU_CAPACITY;
51
56
  private parsedLru;
52
57
  private parsedLruGet;
@@ -56,7 +61,12 @@ export declare class LocalStore {
56
61
  private getCachedAllowlist;
57
62
  private getCachedSettings;
58
63
  invalidateConfigCaches(): void;
59
- constructor(db: MailxDB, bodyStore: FileMessageStore);
64
+ constructor(db: MailxDB, bodyStore: FileMessageStore,
65
+ /** Event bus for Store mutations. Defaults to the process-singleton
66
+ * so cross-package subscribers (bin/mailx.ts forwarder → WebView,
67
+ * in-process reconciler triggers) see all writes without explicit
68
+ * wiring. Tests can pass a fresh StoreBus for isolation. */
69
+ bus?: StoreBus);
60
70
  /** DB-shape account list (id/name/email/lastSync). The richer
61
71
  * AccountConfig (with imap/smtp/etc.) lives in accounts.jsonc and is
62
72
  * loaded by mailx-settings, not the DB — that path stays in
@@ -68,6 +78,14 @@ export declare class LocalStore {
68
78
  lastSync: number;
69
79
  }[];
70
80
  getFolders(accountId: string): any[];
81
+ /** Look up a folder by RFC 6154 specialUse tag (`trash`, `drafts`, `sent`,
82
+ * `junk`, etc.) for the given account. Falls back to a case-insensitive
83
+ * path match for legacy rows where specialUse never got tagged.
84
+ * Returns null when the account has no such folder configured. */
85
+ findSpecialFolder(accountId: string, specialUse: string): {
86
+ id: number;
87
+ path: string;
88
+ } | null;
71
89
  /** Single envelope by (account, uid, folder). Null when the row isn't
72
90
  * in the DB — caller decides whether to show "deleted" or queue a
73
91
  * server lookup via the reconciler. */
@@ -91,5 +109,39 @@ export declare class LocalStore {
91
109
  getTasks(accountId: string, includeCompleted?: boolean): any[];
92
110
  searchContacts(query: string, limit?: number): any[];
93
111
  listContacts(query: string, page?: number, pageSize?: number): any;
112
+ /** Update a message's flag set. Local DB write completes synchronously;
113
+ * the server-mirror enqueue is the caller's responsibility (typically
114
+ * via SyncQueue.enqueueFlag) so callers that don't want a server push
115
+ * — pure-local UI state like "pin in pane" — can skip it.
116
+ *
117
+ * Publishes:
118
+ * `message:<uuid>` { kind: "flagsChanged" }
119
+ * `folder:<id>` (auto fan-out)
120
+ */
121
+ updateFlags(accountId: string, uid: number, folderId: number, flags: string[]): void;
122
+ /** Move a message between folders in the same account. Adds a tombstone
123
+ * on the Message-ID so the next sync doesn't re-import the pre-move row
124
+ * in the source folder before the server-side MOVE completes; tombstone
125
+ * is cleared on terminal IMAP failure (see processSyncActions).
126
+ *
127
+ * Returns true if a local row existed and was moved, false otherwise.
128
+ *
129
+ * Publishes:
130
+ * `message:<uuid>` { kind: "messageMoved", folderId: source, targetFolderId }
131
+ * `folder:<source>` and `folder:<target>` (auto fan-out + explicit count)
132
+ */
133
+ moveMessage(accountId: string, uid: number, fromFolderId: number, targetFolderId: number): boolean;
134
+ /** Trash a message. If a trash folder is configured and the message is
135
+ * not already in it, this is a move-to-trash. If the message is already
136
+ * in trash (or no trash exists), it's a hard delete + body unlink.
137
+ *
138
+ * Returns "moved-to-trash" or "expunged" so the caller knows whether
139
+ * to enqueue an IMAP MOVE or a DELETE+EXPUNGE on the queue.
140
+ */
141
+ trashMessage(accountId: string, uid: number, folderId: number, trashFolderId: number | null): "moved-to-trash" | "expunged";
142
+ /** Restore a message from trash back to its original folder. Local-only;
143
+ * caller handles the queue (cancel-pending-MOVE vs queue-counter-MOVE).
144
+ * Returns true if a local row was moved. */
145
+ undeleteMessage(accountId: string, uid: number, trashFolderId: number, originalFolderId: number): boolean;
94
146
  }
95
147
  //# sourceMappingURL=local-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  * remaining call sites and remove the server-fetch path from the UI.
17
17
  */
18
18
  import * as fs from "node:fs";
19
- import { parseSerial } from "@bobfrankston/mailx-store";
19
+ import { parseSerial, storeBus } from "@bobfrankston/mailx-store";
20
20
  import { sanitizeHtml } from "@bobfrankston/mailx-types";
21
21
  import { loadSettings, loadAllowlist } from "@bobfrankston/mailx-settings";
22
22
  import { sniffAndFixCharset } from "./charset.js";
@@ -58,6 +58,7 @@ function parseListUnsubscribe(headers) {
58
58
  export class LocalStore {
59
59
  db;
60
60
  bodyStore;
61
+ bus;
61
62
  // Parsed-body LRU. `simpleParser` is the dominant cost of getMessage on
62
63
  // a body that's already on disk — 100-500 ms for a typical Gmail message
63
64
  // (heavier multipart/alternative + embedded-image swizzling than plainer
@@ -112,9 +113,15 @@ export class LocalStore {
112
113
  this._allowlistCache = null;
113
114
  this._settingsCache = null;
114
115
  }
115
- constructor(db, bodyStore) {
116
+ constructor(db, bodyStore,
117
+ /** Event bus for Store mutations. Defaults to the process-singleton
118
+ * so cross-package subscribers (bin/mailx.ts forwarder → WebView,
119
+ * in-process reconciler triggers) see all writes without explicit
120
+ * wiring. Tests can pass a fresh StoreBus for isolation. */
121
+ bus = storeBus) {
116
122
  this.db = db;
117
123
  this.bodyStore = bodyStore;
124
+ this.bus = bus;
118
125
  }
119
126
  // ── Account list (read-only here; mutations go through MailxService
120
127
  // until the cloud-write path is part of the queue too) ──
@@ -129,6 +136,16 @@ export class LocalStore {
129
136
  getFolders(accountId) {
130
137
  return this.db.getFolders(accountId);
131
138
  }
139
+ /** Look up a folder by RFC 6154 specialUse tag (`trash`, `drafts`, `sent`,
140
+ * `junk`, etc.) for the given account. Falls back to a case-insensitive
141
+ * path match for legacy rows where specialUse never got tagged.
142
+ * Returns null when the account has no such folder configured. */
143
+ findSpecialFolder(accountId, specialUse) {
144
+ const folders = this.db.getFolders(accountId);
145
+ const f = folders.find(x => x.specialUse === specialUse ||
146
+ x.path.toLowerCase() === specialUse.toLowerCase());
147
+ return f ? { id: f.id, path: f.path } : null;
148
+ }
132
149
  // ── Message envelopes ──
133
150
  /** Single envelope by (account, uid, folder). Null when the row isn't
134
151
  * in the DB — caller decides whether to show "deleted" or queue a
@@ -365,5 +382,133 @@ export class LocalStore {
365
382
  listContacts(query, page = 1, pageSize = 100) {
366
383
  return this.db.listContacts(query, page, pageSize);
367
384
  }
385
+ // ── Write paths (local-only; mirror to server is queued separately) ──
386
+ /** Update a message's flag set. Local DB write completes synchronously;
387
+ * the server-mirror enqueue is the caller's responsibility (typically
388
+ * via SyncQueue.enqueueFlag) so callers that don't want a server push
389
+ * — pure-local UI state like "pin in pane" — can skip it.
390
+ *
391
+ * Publishes:
392
+ * `message:<uuid>` { kind: "flagsChanged" }
393
+ * `folder:<id>` (auto fan-out)
394
+ */
395
+ updateFlags(accountId, uid, folderId, flags) {
396
+ this.db.updateMessageFlags(accountId, uid, flags);
397
+ const env = this.db.getMessageByUid(accountId, uid, folderId);
398
+ const msgUuid = env?.uuid;
399
+ if (msgUuid) {
400
+ this.bus.publish({
401
+ topic: `message:${msgUuid}`,
402
+ kind: "flagsChanged",
403
+ accountId, folderId, uid, msgUuid, flags,
404
+ });
405
+ }
406
+ }
407
+ /** Move a message between folders in the same account. Adds a tombstone
408
+ * on the Message-ID so the next sync doesn't re-import the pre-move row
409
+ * in the source folder before the server-side MOVE completes; tombstone
410
+ * is cleared on terminal IMAP failure (see processSyncActions).
411
+ *
412
+ * Returns true if a local row existed and was moved, false otherwise.
413
+ *
414
+ * Publishes:
415
+ * `message:<uuid>` { kind: "messageMoved", folderId: source, targetFolderId }
416
+ * `folder:<source>` and `folder:<target>` (auto fan-out + explicit count)
417
+ */
418
+ moveMessage(accountId, uid, fromFolderId, targetFolderId) {
419
+ const env = this.db.getMessageByUid(accountId, uid, fromFolderId);
420
+ if (!env)
421
+ return false;
422
+ if (env.messageId)
423
+ this.db.addTombstone(accountId, env.messageId, env.subject || "");
424
+ const moved = this.db.moveMessageLocal(accountId, uid, fromFolderId, targetFolderId);
425
+ if (!moved)
426
+ return false;
427
+ this.db.recalcFolderCounts(fromFolderId);
428
+ this.db.recalcFolderCounts(targetFolderId);
429
+ const msgUuid = env?.uuid;
430
+ if (msgUuid) {
431
+ this.bus.publish({
432
+ topic: `message:${msgUuid}`,
433
+ kind: "messageMoved",
434
+ accountId, folderId: fromFolderId, targetFolderId, uid, msgUuid,
435
+ });
436
+ }
437
+ // Folder count change isn't tied to a specific message uuid — publish
438
+ // to both folder topics directly. (The fan-out only covers the source
439
+ // via the message event's folderId; target needs its own publish.)
440
+ this.bus.publish({
441
+ topic: `folder:${targetFolderId}`,
442
+ kind: "folderCountsChanged",
443
+ accountId, folderId: targetFolderId,
444
+ });
445
+ return true;
446
+ }
447
+ /** Trash a message. If a trash folder is configured and the message is
448
+ * not already in it, this is a move-to-trash. If the message is already
449
+ * in trash (or no trash exists), it's a hard delete + body unlink.
450
+ *
451
+ * Returns "moved-to-trash" or "expunged" so the caller knows whether
452
+ * to enqueue an IMAP MOVE or a DELETE+EXPUNGE on the queue.
453
+ */
454
+ trashMessage(accountId, uid, folderId, trashFolderId) {
455
+ const env = this.db.getMessageByUid(accountId, uid, folderId);
456
+ if (env?.messageId)
457
+ this.db.addTombstone(accountId, env.messageId, env.subject || "");
458
+ const msgUuid = env?.uuid;
459
+ if (trashFolderId != null && trashFolderId !== folderId) {
460
+ this.db.moveMessageLocal(accountId, uid, folderId, trashFolderId);
461
+ this.db.recalcFolderCounts(folderId);
462
+ this.db.recalcFolderCounts(trashFolderId);
463
+ if (msgUuid) {
464
+ this.bus.publish({
465
+ topic: `message:${msgUuid}`,
466
+ kind: "messageMoved",
467
+ accountId, folderId, targetFolderId: trashFolderId, uid, msgUuid,
468
+ });
469
+ }
470
+ this.bus.publish({
471
+ topic: `folder:${trashFolderId}`,
472
+ kind: "folderCountsChanged",
473
+ accountId, folderId: trashFolderId,
474
+ });
475
+ return "moved-to-trash";
476
+ }
477
+ this.db.deleteMessage(accountId, uid, "user-initiated trash (already in trash → expunge)", "LocalStore.trashMessage");
478
+ this.db.recalcFolderCounts(folderId);
479
+ if (msgUuid) {
480
+ this.bus.publish({
481
+ topic: `message:${msgUuid}`,
482
+ kind: "messageRemoved",
483
+ accountId, folderId, uid, msgUuid,
484
+ });
485
+ }
486
+ return "expunged";
487
+ }
488
+ /** Restore a message from trash back to its original folder. Local-only;
489
+ * caller handles the queue (cancel-pending-MOVE vs queue-counter-MOVE).
490
+ * Returns true if a local row was moved. */
491
+ undeleteMessage(accountId, uid, trashFolderId, originalFolderId) {
492
+ const moved = this.db.moveMessageLocal(accountId, uid, trashFolderId, originalFolderId);
493
+ if (!moved)
494
+ return false;
495
+ this.db.recalcFolderCounts(trashFolderId);
496
+ this.db.recalcFolderCounts(originalFolderId);
497
+ const env = this.db.getMessageByUid(accountId, uid, originalFolderId);
498
+ const msgUuid = env?.uuid;
499
+ if (msgUuid) {
500
+ this.bus.publish({
501
+ topic: `message:${msgUuid}`,
502
+ kind: "messageMoved",
503
+ accountId, folderId: trashFolderId, targetFolderId: originalFolderId, uid, msgUuid,
504
+ });
505
+ }
506
+ this.bus.publish({
507
+ topic: `folder:${originalFolderId}`,
508
+ kind: "folderCountsChanged",
509
+ accountId, folderId: originalFolderId,
510
+ });
511
+ return true;
512
+ }
368
513
  }
369
514
  //# sourceMappingURL=local-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-store.js","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-store.js","sourceRoot":"","sources":["local-store.ts"],"names":[],"mappings":"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"}