@bobfrankston/mailx-imap 0.1.44 → 0.1.46
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.
- package/index.d.ts +13 -41
- package/index.js +32 -179
- package/package.json +7 -7
package/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Syncs messages to local store, emits events for new mail.
|
|
5
5
|
*/
|
|
6
6
|
import type { TransportFactory } from "@bobfrankston/tcp-transport";
|
|
7
|
-
import {
|
|
7
|
+
import { FileMessageStore, Store } from "@bobfrankston/mailx-store";
|
|
8
8
|
import type { AccountConfig, MessageEnvelope, Folder } from "@bobfrankston/mailx-types";
|
|
9
9
|
import { EventEmitter } from "node:events";
|
|
10
10
|
/** Events emitted by the IMAP manager */
|
|
@@ -60,8 +60,17 @@ export declare class ImapManager extends EventEmitter {
|
|
|
60
60
|
private configs;
|
|
61
61
|
private watchers;
|
|
62
62
|
private fetchClients;
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
/** The Store is the architectural nexus — owner of MailxDB +
|
|
64
|
+
* FileMessageStore + the event bus. This package (mailx-imap) is a
|
|
65
|
+
* *consumer* of the Store. `this.db` and `this.bodyStore` are getters
|
|
66
|
+
* onto Store-owned objects, kept as fields here for source-diff
|
|
67
|
+
* compatibility during the inversion (so the ~120 existing
|
|
68
|
+
* `this.db.X(...)` callsites don't all need touching at once). Future:
|
|
69
|
+
* every mutation moves to `this.store.X(...)` with bus-emit baked in;
|
|
70
|
+
* these fields shrink to read-only convenience refs. */
|
|
71
|
+
private store;
|
|
72
|
+
private get db();
|
|
73
|
+
private get bodyStore();
|
|
65
74
|
private syncIntervals;
|
|
66
75
|
/** Track which accounts have already shown an error banner — only emit once per session */
|
|
67
76
|
private accountErrorShown;
|
|
@@ -88,7 +97,7 @@ export declare class ImapManager extends EventEmitter {
|
|
|
88
97
|
/** Public read for the IPC surface: snapshot of all account diagnostics. */
|
|
89
98
|
getDiagnosticsSnapshot(): AccountDiagnostics[];
|
|
90
99
|
private transportFactory;
|
|
91
|
-
constructor(
|
|
100
|
+
constructor(store: Store, transportFactory: TransportFactory);
|
|
92
101
|
/** Get OAuth access token for an account (for SMTP auth) */
|
|
93
102
|
getOAuthToken(accountId: string): Promise<string | null>;
|
|
94
103
|
/** Accounts currently re-authenticating — all operations skip these */
|
|
@@ -379,45 +388,8 @@ export declare class ImapManager extends EventEmitter {
|
|
|
379
388
|
private _prefetchBodies;
|
|
380
389
|
/** Get the body store for direct access */
|
|
381
390
|
getBodyStore(): FileMessageStore;
|
|
382
|
-
/** Bulk trash messages — local-first, single IMAP connection for all */
|
|
383
|
-
trashMessages(accountId: string, messages: {
|
|
384
|
-
uid: number;
|
|
385
|
-
folderId: number;
|
|
386
|
-
}[]): Promise<void>;
|
|
387
|
-
/** Bulk move messages — queues the IMAP action only. The service layer
|
|
388
|
-
* (MailxService.moveMessages) owns the local DB mutation via
|
|
389
|
-
* updateMessageFolder; this method used to ALSO deleteMessage here,
|
|
390
|
-
* which wiped the row the service just updated — the message vanished
|
|
391
|
-
* on the next reconcile and "spam folder empty" was the symptom. */
|
|
392
|
-
moveMessages(accountId: string, messages: {
|
|
393
|
-
uid: number;
|
|
394
|
-
folderId: number;
|
|
395
|
-
}[], targetFolderId: number): Promise<void>;
|
|
396
|
-
/** Debounced sync actions — batches rapid local changes into one IMAP operation */
|
|
397
|
-
private syncActionTimers;
|
|
398
|
-
private debounceSyncActions;
|
|
399
|
-
/** Move a message to Trash (delete) — local-first, queues IMAP sync */
|
|
400
|
-
trashMessage(accountId: string, folderId: number, uid: number): Promise<void>;
|
|
401
|
-
/** Move a message between folders — queues IMAP sync only. Service
|
|
402
|
-
* layer owns the local DB update (see MailxService.moveMessage). */
|
|
403
|
-
moveMessage(accountId: string, uid: number, fromFolderId: number, toFolderId: number): Promise<void>;
|
|
404
391
|
/** Move message across accounts using iflow's moveMessageToServer */
|
|
405
392
|
moveMessageCrossAccount(fromAccountId: string, uid: number, fromFolderId: number, toAccountId: string, toFolderId: number): Promise<void>;
|
|
406
|
-
/** Undelete — move from Trash back to original folder. Local-first:
|
|
407
|
-
* the row was moved (not deleted) on trash, so we just move it back
|
|
408
|
-
* in the local DB and reconcile the IMAP queue. Two cases:
|
|
409
|
-
* (a) the to-trash MOVE is still pending — cancel it; the server
|
|
410
|
-
* never saw the delete, so no counter-action is needed.
|
|
411
|
-
* (b) the to-trash MOVE drained — the message is now in Trash on
|
|
412
|
-
* the server with a new uid. Queue a counter-move from
|
|
413
|
-
* trash → original. The IMAP processor's fetchByUid in trash
|
|
414
|
-
* will use the local membership uid (which the reconciler
|
|
415
|
-
* rebound to the server's new trash uid via Message-ID match).
|
|
416
|
-
* If reconcile hasn't run yet (unlikely race), action retries
|
|
417
|
-
* until it does. */
|
|
418
|
-
undeleteMessage(accountId: string, uid: number, originalFolderId: number): Promise<void>;
|
|
419
|
-
/** Update flags — local-first, queues IMAP sync */
|
|
420
|
-
updateFlagsLocal(accountId: string, uid: number, folderId: number, flags: string[]): Promise<void>;
|
|
421
393
|
/** Process pending sync actions for an account */
|
|
422
394
|
processSyncActions(accountId: string): Promise<void>;
|
|
423
395
|
/** Find a folder by specialUse, case-insensitive */
|
package/index.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createAutoImapConfig, CompatImapClient } from "@bobfrankston/iflow-direct";
|
|
7
7
|
import { authenticateOAuth } from "@bobfrankston/oauthsupport";
|
|
8
|
-
import {
|
|
9
|
-
import { loadSettings,
|
|
8
|
+
import { parseSerial, storeBus } from "@bobfrankston/mailx-store";
|
|
9
|
+
import { loadSettings, getConfigDir, getHistoryDays, getPrefetch } from "@bobfrankston/mailx-settings";
|
|
10
10
|
import { EventEmitter } from "node:events";
|
|
11
11
|
import * as fs from "node:fs";
|
|
12
12
|
import * as path from "node:path";
|
|
@@ -135,8 +135,17 @@ export class ImapManager extends EventEmitter {
|
|
|
135
135
|
configs = new Map();
|
|
136
136
|
watchers = new Map();
|
|
137
137
|
fetchClients = new Map();
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
/** The Store is the architectural nexus — owner of MailxDB +
|
|
139
|
+
* FileMessageStore + the event bus. This package (mailx-imap) is a
|
|
140
|
+
* *consumer* of the Store. `this.db` and `this.bodyStore` are getters
|
|
141
|
+
* onto Store-owned objects, kept as fields here for source-diff
|
|
142
|
+
* compatibility during the inversion (so the ~120 existing
|
|
143
|
+
* `this.db.X(...)` callsites don't all need touching at once). Future:
|
|
144
|
+
* every mutation moves to `this.store.X(...)` with bus-emit baked in;
|
|
145
|
+
* these fields shrink to read-only convenience refs. */
|
|
146
|
+
store;
|
|
147
|
+
get db() { return this.store.db; }
|
|
148
|
+
get bodyStore() { return this.store.bodyStore; }
|
|
140
149
|
syncIntervals = new Map();
|
|
141
150
|
/** Track which accounts have already shown an error banner — only emit once per session */
|
|
142
151
|
accountErrorShown = new Set();
|
|
@@ -197,12 +206,11 @@ export class ImapManager extends EventEmitter {
|
|
|
197
206
|
return Array.from(this.diagnostics.values()).map(d => ({ ...d }));
|
|
198
207
|
}
|
|
199
208
|
transportFactory;
|
|
200
|
-
constructor(
|
|
209
|
+
constructor(store, transportFactory) {
|
|
201
210
|
super();
|
|
202
|
-
this.
|
|
211
|
+
this.store = store;
|
|
203
212
|
this.transportFactory = transportFactory;
|
|
204
|
-
|
|
205
|
-
this.bodyStore = new FileMessageStore(storePath);
|
|
213
|
+
// bodyStore is now owned by Store; getter above forwards to it.
|
|
206
214
|
// Cancel pending deferred-delete when move-detect rebinds a row.
|
|
207
215
|
// Without this, the source folder's reconcile-delete grace timer
|
|
208
216
|
// would fire 30 minutes after detection for a row that's already
|
|
@@ -216,6 +224,22 @@ export class ImapManager extends EventEmitter {
|
|
|
216
224
|
console.log(` [reconcile-cancel] ${info.accountId} ${info.fromFolderId}/${info.fromUid}: deferred delete cancelled (move-detect rebound to ${info.toFolderId}/${info.toUid})`);
|
|
217
225
|
}
|
|
218
226
|
});
|
|
227
|
+
// Bridge legacy EventEmitter "folderCountsChanged" to the Store bus
|
|
228
|
+
// so subscribers can listen on a single mechanism. Done in-class
|
|
229
|
+
// rather than at every call site (~20 emit points in this file) to
|
|
230
|
+
// keep the diff small and avoid a per-call regression risk during
|
|
231
|
+
// the refactor. The Store bus is the long-term home; once every
|
|
232
|
+
// consumer subscribes via the bus, the legacy listeners in
|
|
233
|
+
// bin/mailx.ts get retired and the `this.emit("folderCountsChanged"...)`
|
|
234
|
+
// calls can convert in bulk.
|
|
235
|
+
this.on("folderCountsChanged", (accountId, payload) => {
|
|
236
|
+
storeBus.publish({
|
|
237
|
+
topic: `account:${accountId}`,
|
|
238
|
+
kind: "folderCountsChanged",
|
|
239
|
+
accountId,
|
|
240
|
+
folderId: payload?.folderId,
|
|
241
|
+
});
|
|
242
|
+
});
|
|
219
243
|
}
|
|
220
244
|
/** Get OAuth access token for an account (for SMTP auth) */
|
|
221
245
|
async getOAuthToken(accountId) {
|
|
@@ -2928,131 +2952,6 @@ export class ImapManager extends EventEmitter {
|
|
|
2928
2952
|
getBodyStore() {
|
|
2929
2953
|
return this.bodyStore;
|
|
2930
2954
|
}
|
|
2931
|
-
/** Bulk trash messages — local-first, single IMAP connection for all */
|
|
2932
|
-
async trashMessages(accountId, messages) {
|
|
2933
|
-
if (messages.length === 0)
|
|
2934
|
-
return;
|
|
2935
|
-
const trash = this.findFolder(accountId, "trash");
|
|
2936
|
-
// Tombstone each Message-ID so sync won't re-import the source-folder
|
|
2937
|
-
// row before the server-side MOVE completes. Cleared on permanent
|
|
2938
|
-
// failure (clearTombstoneForUid in processSyncActions).
|
|
2939
|
-
for (const msg of messages) {
|
|
2940
|
-
const env = this.db.getMessageByUid(accountId, msg.uid, msg.folderId);
|
|
2941
|
-
if (env?.messageId)
|
|
2942
|
-
this.db.addTombstone(accountId, env.messageId, env.subject || "");
|
|
2943
|
-
}
|
|
2944
|
-
// Local first — move to trash folder locally so the row stays
|
|
2945
|
-
// visible in Trash and Ctrl+Z can restore it. Body file stays in
|
|
2946
|
-
// its original folder dir; the next sync rebinds path on
|
|
2947
|
-
// membership uid change. Old behavior was `db.deleteMessage` +
|
|
2948
|
-
// `unlinkBodyFile` which made undelete impossible (no row to
|
|
2949
|
-
// restore, no body to read). For folders that ARE the trash
|
|
2950
|
-
// already, fall through to hard delete (the action will EXPUNGE
|
|
2951
|
-
// and reconciliation cleans up).
|
|
2952
|
-
for (const msg of messages) {
|
|
2953
|
-
if (trash && trash.id !== msg.folderId) {
|
|
2954
|
-
this.db.moveMessageLocal(accountId, msg.uid, msg.folderId, trash.id);
|
|
2955
|
-
}
|
|
2956
|
-
else {
|
|
2957
|
-
this.unlinkBodyFile(accountId, msg.uid, msg.folderId).catch(() => { });
|
|
2958
|
-
this.db.deleteMessage(accountId, msg.uid, "user-initiated trash (already in trash → expunge)", "mailx-imap trashMessages");
|
|
2959
|
-
}
|
|
2960
|
-
}
|
|
2961
|
-
console.log(` Trashed ${messages.length} messages locally (moved to trash folder, body files retained)`);
|
|
2962
|
-
// Queue IMAP actions
|
|
2963
|
-
for (const msg of messages) {
|
|
2964
|
-
if (trash && trash.id !== msg.folderId) {
|
|
2965
|
-
this.db.queueSyncAction(accountId, "move", msg.uid, msg.folderId, { targetFolderId: trash.id });
|
|
2966
|
-
}
|
|
2967
|
-
else {
|
|
2968
|
-
this.db.queueSyncAction(accountId, "delete", msg.uid, msg.folderId);
|
|
2969
|
-
}
|
|
2970
|
-
}
|
|
2971
|
-
// Recalc folder counts so the tree badge updates immediately instead
|
|
2972
|
-
// of showing stale numbers until the next full sync.
|
|
2973
|
-
const sourceFolderIds = new Set(messages.map(m => m.folderId));
|
|
2974
|
-
for (const fid of sourceFolderIds)
|
|
2975
|
-
this.db.recalcFolderCounts(fid);
|
|
2976
|
-
if (trash)
|
|
2977
|
-
this.db.recalcFolderCounts(trash.id);
|
|
2978
|
-
this.emit("folderCountsChanged", accountId, {});
|
|
2979
|
-
// Process all queued actions in one IMAP session
|
|
2980
|
-
this.debounceSyncActions(accountId);
|
|
2981
|
-
}
|
|
2982
|
-
/** Bulk move messages — queues the IMAP action only. The service layer
|
|
2983
|
-
* (MailxService.moveMessages) owns the local DB mutation via
|
|
2984
|
-
* updateMessageFolder; this method used to ALSO deleteMessage here,
|
|
2985
|
-
* which wiped the row the service just updated — the message vanished
|
|
2986
|
-
* on the next reconcile and "spam folder empty" was the symptom. */
|
|
2987
|
-
async moveMessages(accountId, messages, targetFolderId) {
|
|
2988
|
-
if (messages.length === 0)
|
|
2989
|
-
return;
|
|
2990
|
-
for (const msg of messages) {
|
|
2991
|
-
this.db.queueSyncAction(accountId, "move", msg.uid, msg.folderId, { targetFolderId });
|
|
2992
|
-
}
|
|
2993
|
-
console.log(` [move] ${accountId}: queued IMAP MOVE for ${messages.length} message(s) → folder ${targetFolderId}`);
|
|
2994
|
-
this.debounceSyncActions(accountId);
|
|
2995
|
-
}
|
|
2996
|
-
/** Debounced sync actions — batches rapid local changes into one IMAP operation */
|
|
2997
|
-
syncActionTimers = new Map();
|
|
2998
|
-
debounceSyncActions(accountId) {
|
|
2999
|
-
const existing = this.syncActionTimers.get(accountId);
|
|
3000
|
-
if (existing)
|
|
3001
|
-
clearTimeout(existing);
|
|
3002
|
-
this.syncActionTimers.set(accountId, setTimeout(() => {
|
|
3003
|
-
this.syncActionTimers.delete(accountId);
|
|
3004
|
-
this.processSyncActions(accountId).catch(() => { });
|
|
3005
|
-
}, 1000));
|
|
3006
|
-
}
|
|
3007
|
-
/** Move a message to Trash (delete) — local-first, queues IMAP sync */
|
|
3008
|
-
async trashMessage(accountId, folderId, uid) {
|
|
3009
|
-
const trash = this.findFolder(accountId, "trash");
|
|
3010
|
-
// Tombstone the Message-ID so sync won't re-import the row in the
|
|
3011
|
-
// source folder before the server-side move completes. Cleared on
|
|
3012
|
-
// permanent failure of the queued sync_action (see processSyncActions
|
|
3013
|
-
// catch block, where clearTombstoneForUid runs after attempts >= 5)
|
|
3014
|
-
// so the user sees the row reappear when their action didn't take.
|
|
3015
|
-
const env = this.db.getMessageByUid(accountId, uid, folderId);
|
|
3016
|
-
if (env?.messageId)
|
|
3017
|
-
this.db.addTombstone(accountId, env.messageId, env.subject || "");
|
|
3018
|
-
// Local first — move to trash folder so the row stays visible in
|
|
3019
|
-
// Trash and Ctrl+Z can restore. Body file retained for undelete.
|
|
3020
|
-
// If we're already in trash (or no trash configured), fall through
|
|
3021
|
-
// to hard delete + EXPUNGE.
|
|
3022
|
-
if (trash && trash.id !== folderId) {
|
|
3023
|
-
this.db.moveMessageLocal(accountId, uid, folderId, trash.id);
|
|
3024
|
-
}
|
|
3025
|
-
else {
|
|
3026
|
-
this.unlinkBodyFile(accountId, uid, folderId).catch(() => { });
|
|
3027
|
-
this.db.deleteMessage(accountId, uid, "user-initiated trash (already in trash → expunge)", "mailx-imap trashMessage");
|
|
3028
|
-
}
|
|
3029
|
-
// Queue IMAP action + log the resolution so "I deleted a message and
|
|
3030
|
-
// now it's in neither trash nor deleted" is diagnosable from the log.
|
|
3031
|
-
if (trash && trash.id !== folderId) {
|
|
3032
|
-
const trashFolder = this.db.getFolders(accountId).find(f => f.id === trash.id);
|
|
3033
|
-
this.db.queueSyncAction(accountId, "move", uid, folderId, { targetFolderId: trash.id });
|
|
3034
|
-
console.log(` [trash] ${accountId} UID ${uid}: queued MOVE to "${trashFolder?.path || trash.path}" (id=${trash.id}, specialUse=trash)`);
|
|
3035
|
-
}
|
|
3036
|
-
else {
|
|
3037
|
-
this.db.queueSyncAction(accountId, "delete", uid, folderId);
|
|
3038
|
-
console.log(` [trash] ${accountId} UID ${uid}: queued EXPUNGE in folder ${folderId} (already in trash or no trash configured)`);
|
|
3039
|
-
}
|
|
3040
|
-
// Folder counts moved — refresh both source and trash so the
|
|
3041
|
-
// tree badges update immediately, not at the next sync.
|
|
3042
|
-
this.db.recalcFolderCounts(folderId);
|
|
3043
|
-
if (trash && trash.id !== folderId)
|
|
3044
|
-
this.db.recalcFolderCounts(trash.id);
|
|
3045
|
-
this.emit("folderCountsChanged", accountId, {});
|
|
3046
|
-
// Debounced sync — batches multiple deletes into one IMAP session
|
|
3047
|
-
this.debounceSyncActions(accountId);
|
|
3048
|
-
}
|
|
3049
|
-
/** Move a message between folders — queues IMAP sync only. Service
|
|
3050
|
-
* layer owns the local DB update (see MailxService.moveMessage). */
|
|
3051
|
-
async moveMessage(accountId, uid, fromFolderId, toFolderId) {
|
|
3052
|
-
this.db.queueSyncAction(accountId, "move", uid, fromFolderId, { targetFolderId: toFolderId });
|
|
3053
|
-
console.log(` [move] ${accountId}: queued IMAP MOVE UID ${uid} folder ${fromFolderId} → ${toFolderId}`);
|
|
3054
|
-
this.debounceSyncActions(accountId);
|
|
3055
|
-
}
|
|
3056
2955
|
/** Move message across accounts using iflow's moveMessageToServer */
|
|
3057
2956
|
async moveMessageCrossAccount(fromAccountId, uid, fromFolderId, toAccountId, toFolderId) {
|
|
3058
2957
|
const fromFolders = this.db.getFolders(fromAccountId);
|
|
@@ -3078,52 +2977,6 @@ export class ImapManager extends EventEmitter {
|
|
|
3078
2977
|
});
|
|
3079
2978
|
});
|
|
3080
2979
|
}
|
|
3081
|
-
/** Undelete — move from Trash back to original folder. Local-first:
|
|
3082
|
-
* the row was moved (not deleted) on trash, so we just move it back
|
|
3083
|
-
* in the local DB and reconcile the IMAP queue. Two cases:
|
|
3084
|
-
* (a) the to-trash MOVE is still pending — cancel it; the server
|
|
3085
|
-
* never saw the delete, so no counter-action is needed.
|
|
3086
|
-
* (b) the to-trash MOVE drained — the message is now in Trash on
|
|
3087
|
-
* the server with a new uid. Queue a counter-move from
|
|
3088
|
-
* trash → original. The IMAP processor's fetchByUid in trash
|
|
3089
|
-
* will use the local membership uid (which the reconciler
|
|
3090
|
-
* rebound to the server's new trash uid via Message-ID match).
|
|
3091
|
-
* If reconcile hasn't run yet (unlikely race), action retries
|
|
3092
|
-
* until it does. */
|
|
3093
|
-
async undeleteMessage(accountId, uid, originalFolderId) {
|
|
3094
|
-
const trash = this.findFolder(accountId, "trash");
|
|
3095
|
-
if (!trash)
|
|
3096
|
-
throw new Error("No Trash folder found");
|
|
3097
|
-
// Move locally back to the original folder.
|
|
3098
|
-
const moved = this.db.moveMessageLocal(accountId, uid, trash.id, originalFolderId);
|
|
3099
|
-
if (!moved) {
|
|
3100
|
-
console.log(` [undelete] ${accountId} UID ${uid}: no row in trash — nothing to restore locally (sync may have already pruned)`);
|
|
3101
|
-
}
|
|
3102
|
-
// (a) cancel still-pending to-trash action.
|
|
3103
|
-
const pending = this.db.findPendingSyncAction(accountId, "move", uid, originalFolderId, trash.id);
|
|
3104
|
-
if (pending) {
|
|
3105
|
-
this.db.completeSyncAction(pending.id);
|
|
3106
|
-
console.log(` [undelete] ${accountId} UID ${uid}: cancelled pending MOVE to trash (server never saw delete)`);
|
|
3107
|
-
this.emit("folderCountsChanged", accountId, {});
|
|
3108
|
-
return;
|
|
3109
|
-
}
|
|
3110
|
-
// (b) queue counter-move from trash → original.
|
|
3111
|
-
this.db.queueSyncAction(accountId, "move", uid, trash.id, { targetFolderId: originalFolderId });
|
|
3112
|
-
console.log(` [undelete] ${accountId} UID ${uid}: queued counter-MOVE trash → folder ${originalFolderId}`);
|
|
3113
|
-
this.debounceSyncActions(accountId);
|
|
3114
|
-
this.emit("folderCountsChanged", accountId, {});
|
|
3115
|
-
}
|
|
3116
|
-
/** Update flags — local-first, queues IMAP sync */
|
|
3117
|
-
async updateFlagsLocal(accountId, uid, folderId, flags) {
|
|
3118
|
-
this.db.updateMessageFlags(accountId, uid, flags);
|
|
3119
|
-
this.db.queueSyncAction(accountId, "flags", uid, folderId, { flags });
|
|
3120
|
-
// User-visible pink-dot pending state stays until the action drains.
|
|
3121
|
-
// The 30-second periodic tick was too slow — opening one message to
|
|
3122
|
-
// auto-mark-as-read left it pink for half a minute. Same 1-second
|
|
3123
|
-
// debounce as moves/deletes batches rapid flag churn without the
|
|
3124
|
-
// visual lag.
|
|
3125
|
-
this.debounceSyncActions(accountId);
|
|
3126
|
-
}
|
|
3127
2980
|
/** Process pending sync actions for an account */
|
|
3128
2981
|
async processSyncActions(accountId) {
|
|
3129
2982
|
const actions = this.db.getPendingSyncActions(accountId);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/mailx-imap",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.46",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
},
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@bobfrankston/mailx-types": "^0.1.
|
|
13
|
-
"@bobfrankston/mailx-settings": "^0.1.
|
|
14
|
-
"@bobfrankston/mailx-store": "^0.1.
|
|
12
|
+
"@bobfrankston/mailx-types": "^0.1.13",
|
|
13
|
+
"@bobfrankston/mailx-settings": "^0.1.17",
|
|
14
|
+
"@bobfrankston/mailx-store": "^0.1.25",
|
|
15
15
|
"@bobfrankston/iflow-direct": "^0.1.44",
|
|
16
16
|
"@bobfrankston/tcp-transport": "^0.1.6",
|
|
17
17
|
"@bobfrankston/smtp-direct": "^0.1.8",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
},
|
|
38
38
|
".transformedSnapshot": {
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@bobfrankston/mailx-types": "^0.1.
|
|
41
|
-
"@bobfrankston/mailx-settings": "^0.1.
|
|
42
|
-
"@bobfrankston/mailx-store": "^0.1.
|
|
40
|
+
"@bobfrankston/mailx-types": "^0.1.13",
|
|
41
|
+
"@bobfrankston/mailx-settings": "^0.1.17",
|
|
42
|
+
"@bobfrankston/mailx-store": "^0.1.25",
|
|
43
43
|
"@bobfrankston/iflow-direct": "^0.1.44",
|
|
44
44
|
"@bobfrankston/tcp-transport": "^0.1.6",
|
|
45
45
|
"@bobfrankston/smtp-direct": "^0.1.8",
|