@remit/mailbox-service 0.0.112 → 0.0.114
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/dist/account-credentials.d.ts +83 -0
- package/dist/account-credentials.js +104 -0
- package/dist/attribute-mapper.d.ts +36 -0
- package/dist/attribute-mapper.js +119 -0
- package/dist/body-parse.d.ts +28 -0
- package/{src/body-parse.ts → dist/body-parse.js} +18 -26
- package/dist/body-part-mapper.d.ts +92 -0
- package/dist/body-part-mapper.js +301 -0
- package/dist/body-sync-queue.d.ts +59 -0
- package/dist/body-sync-queue.js +56 -0
- package/dist/body-sync-terminal.d.ts +58 -0
- package/dist/body-sync-terminal.js +95 -0
- package/dist/body-sync.d.ts +351 -0
- package/dist/body-sync.js +1204 -0
- package/dist/calendar-parts.d.ts +23 -0
- package/dist/calendar-parts.js +18 -0
- package/dist/classification-backfill.d.ts +91 -0
- package/dist/classification-backfill.js +180 -0
- package/dist/classify-message.d.ts +31 -0
- package/dist/classify-message.js +89 -0
- package/dist/connection-factory.d.ts +54 -0
- package/dist/connection-factory.js +54 -0
- package/dist/connection-test.d.ts +41 -0
- package/dist/connection-test.js +152 -0
- package/dist/external-move.d.ts +94 -0
- package/dist/external-move.js +173 -0
- package/dist/filter-operations.d.ts +42 -0
- package/dist/filter-operations.js +211 -0
- package/dist/filters/filter-config.d.ts +14 -0
- package/dist/filters/filter-config.js +10 -0
- package/{src/filters/list-id.ts → dist/filters/list-id.d.ts} +2 -16
- package/dist/filters/list-id.js +26 -0
- package/dist/filters/match.d.ts +69 -0
- package/dist/filters/match.js +165 -0
- package/dist/filters/pipeline.d.ts +64 -0
- package/dist/filters/pipeline.js +100 -0
- package/{src/flag-push-terminal.ts → dist/flag-push-terminal.d.ts} +16 -72
- package/dist/flag-push-terminal.js +63 -0
- package/dist/flag-push.d.ts +69 -0
- package/dist/flag-push.js +111 -0
- package/dist/flag-queue.d.ts +175 -0
- package/dist/flag-queue.js +291 -0
- package/dist/folder-operations.d.ts +39 -0
- package/dist/folder-operations.js +112 -0
- package/dist/folder-placement.d.ts +13 -0
- package/dist/folder-placement.js +23 -0
- package/dist/heuristics/authenticationResults.d.ts +10 -0
- package/dist/heuristics/authenticationResults.js +187 -0
- package/dist/heuristics/classifyByHeaders.d.ts +82 -0
- package/dist/heuristics/classifyByHeaders.js +365 -0
- package/dist/heuristics/classifyPlacement.d.ts +67 -0
- package/dist/heuristics/classifyPlacement.js +153 -0
- package/dist/heuristics/machineSenders.d.ts +21 -0
- package/{src/heuristics/machineSenders.ts → dist/heuristics/machineSenders.js} +34 -40
- package/dist/heuristics/senderMismatch.d.ts +81 -0
- package/dist/heuristics/senderMismatch.js +192 -0
- package/dist/heuristics/socialDomains.d.ts +14 -0
- package/{src/heuristics/socialDomains.ts → dist/heuristics/socialDomains.js} +9 -9
- package/dist/heuristics/transactionalDomains.d.ts +18 -0
- package/{src/heuristics/transactionalDomains.ts → dist/heuristics/transactionalDomains.js} +8 -8
- package/dist/imapflow-connection.d.ts +377 -0
- package/dist/imapflow-connection.js +1147 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +65 -0
- package/dist/list-id-backfill.d.ts +83 -0
- package/dist/list-id-backfill.js +132 -0
- package/dist/mailbox-cursor-rebuild.d.ts +74 -0
- package/dist/mailbox-cursor-rebuild.js +71 -0
- package/{src/mailbox-cursor.ts → dist/mailbox-cursor.d.ts} +20 -98
- package/dist/mailbox-cursor.js +102 -0
- package/dist/mailbox-intent.d.ts +41 -0
- package/{src/mailbox-intent.ts → dist/mailbox-intent.js} +38 -64
- package/dist/mailbox-management.d.ts +240 -0
- package/dist/mailbox-management.js +576 -0
- package/dist/mailbox-presence.d.ts +52 -0
- package/{src/mailbox-presence.ts → dist/mailbox-presence.js} +19 -30
- package/dist/mailbox-queue.d.ts +129 -0
- package/dist/mailbox-queue.js +216 -0
- package/dist/mailbox-sync.d.ts +93 -0
- package/dist/mailbox-sync.js +490 -0
- package/dist/mailbox-upstream.d.ts +38 -0
- package/{src/mailbox-upstream.ts → dist/mailbox-upstream.js} +37 -47
- package/dist/message-category.d.ts +51 -0
- package/{src/message-category.ts → dist/message-category.js} +28 -71
- package/dist/message-move.d.ts +285 -0
- package/dist/message-move.js +858 -0
- package/dist/message-parser.d.ts +14 -0
- package/dist/message-parser.js +17 -0
- package/{src/message-presence.ts → dist/message-presence.d.ts} +1 -13
- package/dist/message-presence.js +29 -0
- package/dist/message-read.d.ts +51 -0
- package/dist/message-read.js +31 -0
- package/dist/message-sync.d.ts +345 -0
- package/dist/message-sync.js +1358 -0
- package/dist/mime-walker.d.ts +102 -0
- package/dist/mime-walker.js +198 -0
- package/dist/organize-job.d.ts +20 -0
- package/dist/organize-job.js +37 -0
- package/dist/outbox-attachment-content.d.ts +37 -0
- package/dist/outbox-attachment-content.js +50 -0
- package/dist/outbox-attachment-filename.d.ts +19 -0
- package/dist/outbox-attachment-filename.js +64 -0
- package/dist/outbox-attachment.d.ts +148 -0
- package/dist/outbox-attachment.js +273 -0
- package/dist/outbox-queue.d.ts +73 -0
- package/dist/outbox-queue.js +280 -0
- package/{src/outbox-status.ts → dist/outbox-status.d.ts} +1 -6
- package/dist/outbox-status.js +18 -0
- package/dist/ownership.d.ts +24 -0
- package/dist/ownership.js +83 -0
- package/dist/placement-move-terminal.d.ts +67 -0
- package/dist/placement-move-terminal.js +88 -0
- package/dist/placement-move.d.ts +83 -0
- package/dist/placement-move.js +216 -0
- package/{src/placement-settled.ts → dist/placement-settled.d.ts} +13 -68
- package/dist/placement-settled.js +75 -0
- package/dist/quarantine.d.ts +95 -0
- package/dist/quarantine.js +131 -0
- package/dist/refusal.d.ts +31 -0
- package/dist/refusal.js +3 -0
- package/{src/restore-source-placement.ts → dist/restore-source-placement.d.ts} +29 -97
- package/dist/restore-source-placement.js +79 -0
- package/dist/search-text-backfill.d.ts +15 -0
- package/dist/search-text-backfill.js +33 -0
- package/dist/snippet.d.ts +61 -0
- package/dist/snippet.js +129 -0
- package/dist/spam-report.d.ts +86 -0
- package/dist/spam-report.js +241 -0
- package/dist/sync-warning.d.ts +21 -0
- package/dist/sync-warning.js +26 -0
- package/dist/sync-watermarks.d.ts +138 -0
- package/dist/sync-watermarks.js +205 -0
- package/dist/test-helpers/fake-imap.d.ts +151 -0
- package/dist/test-helpers/fake-imap.js +508 -0
- package/dist/test-helpers/folder-roles.d.ts +34 -0
- package/dist/test-helpers/folder-roles.js +47 -0
- package/dist/test-helpers/mime-tree-generator.d.ts +82 -0
- package/dist/test-helpers/mime-tree-generator.js +329 -0
- package/dist/test-helpers/test-store.d.ts +69 -0
- package/dist/test-helpers/test-store.js +193 -0
- package/dist/text/normalizer.d.ts +20 -0
- package/dist/text/normalizer.js +102 -0
- package/dist/thread-message-rows.d.ts +69 -0
- package/dist/thread-message-rows.js +40 -0
- package/dist/thread-root.d.ts +7 -0
- package/dist/thread-root.js +25 -0
- package/dist/types.d.ts +343 -0
- package/dist/types.js +19 -0
- package/package.json +86 -88
- package/src/account-credentials.ts +0 -210
- package/src/attribute-mapper.test.ts +0 -104
- package/src/attribute-mapper.ts +0 -148
- package/src/body-parse.test.ts +0 -55
- package/src/body-part-mapper.property.test.ts +0 -354
- package/src/body-part-mapper.ts +0 -410
- package/src/body-sync-queue.test.ts +0 -64
- package/src/body-sync-queue.ts +0 -131
- package/src/body-sync-terminal.test.ts +0 -148
- package/src/body-sync-terminal.ts +0 -174
- package/src/body-sync.test.ts +0 -925
- package/src/body-sync.ts +0 -1891
- package/src/calendar-parts.ts +0 -41
- package/src/classification-backfill.test.ts +0 -285
- package/src/classification-backfill.ts +0 -363
- package/src/classify-message.test.ts +0 -142
- package/src/classify-message.ts +0 -116
- package/src/connection-factory.ts +0 -102
- package/src/connection-test.ts +0 -208
- package/src/credentials.test.ts +0 -181
- package/src/external-move.test.ts +0 -262
- package/src/external-move.ts +0 -285
- package/src/filter-operations.test.ts +0 -319
- package/src/filter-operations.ts +0 -377
- package/src/filter-update.test.ts +0 -313
- package/src/filters/filter-config.test.ts +0 -87
- package/src/filters/filter-config.ts +0 -34
- package/src/filters/list-id.test.ts +0 -50
- package/src/filters/match.test.ts +0 -392
- package/src/filters/match.ts +0 -225
- package/src/filters/pipeline.test.ts +0 -199
- package/src/filters/pipeline.ts +0 -170
- package/src/flag-push.test.ts +0 -112
- package/src/flag-push.ts +0 -198
- package/src/flag-queue.test.ts +0 -197
- package/src/flag-queue.ts +0 -509
- package/src/folder-operations.test.ts +0 -273
- package/src/folder-operations.ts +0 -217
- package/src/folder-placement.ts +0 -56
- package/src/forwarded-message.test.ts +0 -122
- package/src/heuristics/authenticationResults.test.ts +0 -189
- package/src/heuristics/authenticationResults.ts +0 -212
- package/src/heuristics/classifyByHeaders.test.ts +0 -889
- package/src/heuristics/classifyByHeaders.ts +0 -467
- package/src/heuristics/classifyPlacement.test.ts +0 -366
- package/src/heuristics/classifyPlacement.ts +0 -211
- package/src/heuristics/classifyRealMail.test.ts +0 -242
- package/src/heuristics/machineSenders.test.ts +0 -101
- package/src/heuristics/senderMismatch.test.ts +0 -346
- package/src/heuristics/senderMismatch.ts +0 -259
- package/src/imapflow-connect-retry.test.ts +0 -97
- package/src/imapflow-connection.test.ts +0 -503
- package/src/imapflow-connection.ts +0 -1476
- package/src/index.ts +0 -397
- package/src/list-id-backfill.test.ts +0 -207
- package/src/list-id-backfill.ts +0 -274
- package/src/mailbox-cursor-rebuild.test.ts +0 -171
- package/src/mailbox-cursor-rebuild.ts +0 -146
- package/src/mailbox-cursor.test.ts +0 -141
- package/src/mailbox-delete-intent.test.ts +0 -119
- package/src/mailbox-management.test.ts +0 -243
- package/src/mailbox-management.ts +0 -838
- package/src/mailbox-presence.test.ts +0 -74
- package/src/mailbox-queue.ts +0 -397
- package/src/mailbox-rename-intent.test.ts +0 -220
- package/src/mailbox-rename-subtree.test.ts +0 -287
- package/src/mailbox-sync.test.ts +0 -286
- package/src/mailbox-sync.ts +0 -724
- package/src/message-move.test.ts +0 -726
- package/src/message-move.ts +0 -1518
- package/src/message-parser.ts +0 -26
- package/src/message-presence.test.ts +0 -50
- package/src/message-read.ts +0 -87
- package/src/message-save-retry.test.ts +0 -90
- package/src/message-sync-flags.test.ts +0 -167
- package/src/message-sync.test.ts +0 -762
- package/src/message-sync.ts +0 -2133
- package/src/mime-walker.test.ts +0 -311
- package/src/mime-walker.ts +0 -306
- package/src/organize-job.ts +0 -93
- package/src/outbox-attachment-content.test.ts +0 -153
- package/src/outbox-attachment-content.ts +0 -104
- package/src/outbox-attachment-filename.test.ts +0 -132
- package/src/outbox-attachment-filename.ts +0 -76
- package/src/outbox-attachment.test.ts +0 -626
- package/src/outbox-attachment.ts +0 -536
- package/src/outbox-failed-recovery.test.ts +0 -299
- package/src/outbox-queue.test.ts +0 -315
- package/src/outbox-queue.ts +0 -525
- package/src/ownership.ts +0 -140
- package/src/placement-move-terminal.ts +0 -145
- package/src/placement-move.ts +0 -363
- package/src/placement-settled.test.ts +0 -147
- package/src/placement.test.ts +0 -404
- package/src/quarantine.test.ts +0 -133
- package/src/quarantine.ts +0 -229
- package/src/refusal.ts +0 -29
- package/src/snippet.test.ts +0 -213
- package/src/snippet.ts +0 -152
- package/src/spam-report.test.ts +0 -329
- package/src/spam-report.ts +0 -357
- package/src/sync-warning.test.ts +0 -213
- package/src/sync-warning.ts +0 -56
- package/src/sync-watermarks.test.ts +0 -409
- package/src/sync-watermarks.ts +0 -319
- package/src/system-flag-wire-format.test.ts +0 -77
- package/src/test-helpers/fake-imap.ts +0 -690
- package/src/test-helpers/folder-roles.ts +0 -66
- package/src/test-helpers/mime-tree-generator.ts +0 -461
- package/src/test-helpers/test-queue.ts +0 -56
- package/src/test-helpers/test-store.ts +0 -299
- package/src/text/normalizer.test.ts +0 -223
- package/src/text/normalizer.ts +0 -140
- package/src/thread-message-rows.ts +0 -77
- package/src/thread-root.test.ts +0 -29
- package/src/thread-root.ts +0 -51
- package/src/types/mailparser-augment.d.ts +0 -23
- package/src/types/natural-porter-stemmer.d.ts +0 -50
- package/src/types/stopword.d.ts +0 -69
- package/src/types.ts +0 -371
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImapFlow-based IMAP connection
|
|
3
|
+
*
|
|
4
|
+
* Modern async/await replacement for the node-imap based ImapConnection.
|
|
5
|
+
* Provides the same interface but uses ImapFlow under the hood.
|
|
6
|
+
*/
|
|
7
|
+
import { Readable } from "node:stream";
|
|
8
|
+
import type { FlatMailboxInfo, ImapBoxStatus, ImapConnectionConfig, ImapConnectionState, ImapEnvelopeSnapshot, ImapMailboxStatus, ImapMessage, ImapNamespaces } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Convert an envelope date into an ISO string, tolerating non-Date values.
|
|
11
|
+
*
|
|
12
|
+
* imapflow types `envelope.date` as a Date, but a malformed `Date:` header can
|
|
13
|
+
* leave it as a string or other value at runtime. Returns "" for absent or
|
|
14
|
+
* invalid dates so one bad header never poisons the whole fetch batch.
|
|
15
|
+
*/
|
|
16
|
+
export declare const toIsoDateString: (value: unknown) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Coerce an IMAP INTERNALDATE into a valid `Date`, tolerating malformed input.
|
|
19
|
+
*
|
|
20
|
+
* INTERNALDATE is the server's receive time and is almost always a clean Date.
|
|
21
|
+
* But a broken server (or an unexpected imapflow runtime value) can yield a
|
|
22
|
+
* string that `new Date` cannot parse, or a wholly unexpected type. Either way
|
|
23
|
+
* `getTime()` would be `NaN`, which is the message's date-of-last-resort — it
|
|
24
|
+
* is the fallback `parseHeaderDate` uses and is stored as the message's
|
|
25
|
+
* `internalDate` — so a `NaN` here silently corrupts every downstream date and
|
|
26
|
+
* gets rejected by ElectroDB, permanently failing the message.
|
|
27
|
+
*
|
|
28
|
+
* When the value cannot produce a valid Date we fall back to `now` so the
|
|
29
|
+
* message still syncs with an approximate receive time rather than being
|
|
30
|
+
* dropped. Returns `null` only for a genuinely absent value, which the caller
|
|
31
|
+
* skips (a transient imapflow artifact, see #408 — not bad data).
|
|
32
|
+
*/
|
|
33
|
+
export declare const toInternalDate: (value: unknown) => Date | null;
|
|
34
|
+
/**
|
|
35
|
+
* Compile node-imap style search criteria into an ImapFlow search object.
|
|
36
|
+
*
|
|
37
|
+
* A criterion this does not understand throws, and so does an empty criteria
|
|
38
|
+
* list. imapflow reads an empty object as `SEARCH ALL`
|
|
39
|
+
* (`imapflow/lib/commands/search.js`), so quietly skipping one turns a narrow
|
|
40
|
+
* probe into "every message in the mailbox" — the reconcile and move paths then
|
|
41
|
+
* act on a stranger's UID (#912). Header names accumulate in a Map so that a
|
|
42
|
+
* name like `__proto__` lands as a query term rather than hitting the
|
|
43
|
+
* prototype setter and vanishing.
|
|
44
|
+
*
|
|
45
|
+
* Values travel as structured tokens, never interpolated into a criterion
|
|
46
|
+
* string, so a quote or a CRLF in a header value cannot alter the query.
|
|
47
|
+
*/
|
|
48
|
+
export declare const convertSearchCriteria: (criteria: unknown[]) => Record<string, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* ImapFlow-based IMAP connection
|
|
51
|
+
*
|
|
52
|
+
* Drop-in replacement for ImapConnection using the ImapFlow library.
|
|
53
|
+
* Benefits:
|
|
54
|
+
* - Native async/await API (no callback wrapping)
|
|
55
|
+
* - Built-in envelope parsing that works with mokapi
|
|
56
|
+
* - Proper IDLE support with events
|
|
57
|
+
* - Built-in TypeScript types
|
|
58
|
+
* - Active maintenance
|
|
59
|
+
*/
|
|
60
|
+
export declare class ImapFlowConnection {
|
|
61
|
+
private client;
|
|
62
|
+
private _state;
|
|
63
|
+
private config;
|
|
64
|
+
private currentMailbox;
|
|
65
|
+
constructor(config: ImapConnectionConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Current connection state
|
|
68
|
+
*/
|
|
69
|
+
get state(): ImapConnectionState;
|
|
70
|
+
/**
|
|
71
|
+
* Whether the connection is established and authenticated
|
|
72
|
+
*/
|
|
73
|
+
get isConnected(): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Connect to the IMAP server with retry logic.
|
|
76
|
+
*
|
|
77
|
+
* Retries up to 3 times with exponential backoff (1s, 2s, 4s) on connection errors.
|
|
78
|
+
* Authentication errors are not retried.
|
|
79
|
+
*/
|
|
80
|
+
connect: () => Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Single connection attempt
|
|
83
|
+
*/
|
|
84
|
+
private attemptConnect;
|
|
85
|
+
/**
|
|
86
|
+
* Cleanup client state for retry
|
|
87
|
+
*/
|
|
88
|
+
private cleanup;
|
|
89
|
+
/**
|
|
90
|
+
* Sleep for a specified duration
|
|
91
|
+
*/
|
|
92
|
+
private sleep;
|
|
93
|
+
/**
|
|
94
|
+
* Disconnect from the IMAP server
|
|
95
|
+
*/
|
|
96
|
+
disconnect: () => Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Get IMAP namespaces
|
|
99
|
+
*
|
|
100
|
+
* Note: ImapFlow doesn't expose namespaces directly, so we return
|
|
101
|
+
* the default namespace. The mailbox listing works without explicit
|
|
102
|
+
* namespace handling in ImapFlow.
|
|
103
|
+
*/
|
|
104
|
+
getNamespaces: () => Promise<ImapNamespaces>;
|
|
105
|
+
/**
|
|
106
|
+
* List all mailboxes as a flat list, preserving original paths from server.
|
|
107
|
+
* This avoids path corruption from split/join operations.
|
|
108
|
+
*
|
|
109
|
+
* @param nsPrefix - Optional namespace prefix to filter mailboxes
|
|
110
|
+
*/
|
|
111
|
+
listMailboxes: (nsPrefix?: string) => Promise<FlatMailboxInfo[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Convert ImapFlow flags Set to string array
|
|
114
|
+
*/
|
|
115
|
+
private convertFlags;
|
|
116
|
+
/**
|
|
117
|
+
* Open a mailbox for reading
|
|
118
|
+
*
|
|
119
|
+
* @param mailboxPath - Full path to the mailbox (e.g., "INBOX", "[Gmail]/Sent")
|
|
120
|
+
* @param readOnly - Whether to open read-only (default: true)
|
|
121
|
+
*/
|
|
122
|
+
openBox: (mailboxPath: string, readOnly?: boolean) => Promise<ImapBoxStatus>;
|
|
123
|
+
/**
|
|
124
|
+
* Build an ImapBoxStatus from an imapflow MailboxObject.
|
|
125
|
+
*/
|
|
126
|
+
private toBoxStatus;
|
|
127
|
+
/**
|
|
128
|
+
* Close the currently open mailbox
|
|
129
|
+
*
|
|
130
|
+
* @param _expunge - Whether to permanently remove deleted messages (not used in ImapFlow)
|
|
131
|
+
*/
|
|
132
|
+
closeBox: (_expunge?: boolean) => Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Search for messages, answering UIDs.
|
|
135
|
+
*
|
|
136
|
+
* imapflow answers a successful SEARCH with an array — empty when the
|
|
137
|
+
* server matched nothing — and `false` when the command failed or no
|
|
138
|
+
* mailbox was selected. Collapsing the two into `[]` makes a failed SEARCH
|
|
139
|
+
* indistinguishable from an empty mailbox, and every caller here acts on
|
|
140
|
+
* emptiness by deleting something: the cursor rebuild reads it as "every
|
|
141
|
+
* local row is stale", and {@link isMessageGoneFromOpenMailbox} reads it as
|
|
142
|
+
* "this message is gone". A failure therefore throws.
|
|
143
|
+
*/
|
|
144
|
+
search: (criteria: unknown[]) => Promise<number[]>;
|
|
145
|
+
/**
|
|
146
|
+
* Fetch messages by UID
|
|
147
|
+
*
|
|
148
|
+
* Uses ImapFlow's native envelope parsing which works correctly
|
|
149
|
+
* with all IMAP servers including mokapi.
|
|
150
|
+
*/
|
|
151
|
+
fetchMessages: (uids: number[]) => Promise<ImapMessage[]>;
|
|
152
|
+
/**
|
|
153
|
+
* True when this session negotiated CONDSTORE (RFC 7162) and the open
|
|
154
|
+
* mailbox keeps persistent mod-sequences.
|
|
155
|
+
*
|
|
156
|
+
* Both halves matter. `enabled` reflects the ENABLE exchange, not merely
|
|
157
|
+
* the advertised capability, and a server may still answer NOMODSEQ for an
|
|
158
|
+
* individual mailbox — in which case RFC 7162 Section 3.1.2.2 requires it
|
|
159
|
+
* to reject CHANGEDSINCE with a BAD response.
|
|
160
|
+
*/
|
|
161
|
+
supportsCondstore: () => boolean;
|
|
162
|
+
/**
|
|
163
|
+
* FETCH everything in the open mailbox whose MODSEQ is strictly greater
|
|
164
|
+
* than `sinceModseq` — new arrivals and metadata changes to messages
|
|
165
|
+
* already synced, in one pass over the whole UID space.
|
|
166
|
+
*
|
|
167
|
+
* The CONDSTORE guard is load-bearing rather than defensive: imapflow drops
|
|
168
|
+
* the CHANGEDSINCE modifier when the extension is unavailable, so the same
|
|
169
|
+
* call would degrade into a fetch of every message in the mailbox.
|
|
170
|
+
*/
|
|
171
|
+
fetchMessagesChangedSince: (sinceModseq: bigint) => Promise<ImapMessage[]>;
|
|
172
|
+
/**
|
|
173
|
+
* One UID FETCH over `range`, mapped to {@link ImapMessage}. The shared
|
|
174
|
+
* body of {@link fetchMessages} and {@link fetchMessagesChangedSince} —
|
|
175
|
+
* both need identical message shapes and differ only in what they select.
|
|
176
|
+
*/
|
|
177
|
+
private runMessageFetch;
|
|
178
|
+
/**
|
|
179
|
+
* Cheap envelope-only FETCH for the UIDVALIDITY cursor rebuild (#1272):
|
|
180
|
+
* UID + Message-ID + INTERNALDATE only — no flags, no BODYSTRUCTURE, no
|
|
181
|
+
* References header, no body. Deliberately lighter than {@link
|
|
182
|
+
* fetchMessages} so a rebuild pass over a large mailbox stays cheap (epic
|
|
183
|
+
* #1281 invariant 6).
|
|
184
|
+
*/
|
|
185
|
+
fetchEnvelopeSnapshots: (uids: number[]) => Promise<ImapEnvelopeSnapshot[]>;
|
|
186
|
+
/**
|
|
187
|
+
* Fetch the full message body (RFC822 source) for a single message by UID.
|
|
188
|
+
*
|
|
189
|
+
* @param uid - The UID of the message to fetch
|
|
190
|
+
* @returns The raw message body, or null when the UID FETCH matched no message
|
|
191
|
+
*/
|
|
192
|
+
fetchMessageBody: (uid: number) => Promise<Buffer | null>;
|
|
193
|
+
/**
|
|
194
|
+
* Fetch full message bodies (RFC822 source) for many UIDs in ONE pipelined
|
|
195
|
+
* ranged UID FETCH on a single connection — the desktop-client pattern.
|
|
196
|
+
*
|
|
197
|
+
* Mirrors `fetchMessages`: one comma-joined UID range, one `client.fetch`,
|
|
198
|
+
* one SELECT (the caller opens the box once for the whole batch). Yields
|
|
199
|
+
* `{ uid, source }` as each message arrives so the caller can stream each
|
|
200
|
+
* body straight to storage without buffering the whole batch.
|
|
201
|
+
*
|
|
202
|
+
* `source` is a readable stream over the message bytes — callers must
|
|
203
|
+
* consume it (e.g. pipe to an upload) before requesting the next item.
|
|
204
|
+
*/
|
|
205
|
+
fetchMessageBodies(uids: number[]): AsyncGenerator<{
|
|
206
|
+
uid: number;
|
|
207
|
+
source: Readable;
|
|
208
|
+
}>;
|
|
209
|
+
/**
|
|
210
|
+
* Parse the References header from IMAP headers buffer.
|
|
211
|
+
* Returns an array of Message-IDs, with the first being the thread root.
|
|
212
|
+
*/
|
|
213
|
+
private parseReferencesHeader;
|
|
214
|
+
/**
|
|
215
|
+
* Convert ImapFlow envelope to our ImapEnvelope format
|
|
216
|
+
*/
|
|
217
|
+
private convertEnvelope;
|
|
218
|
+
/**
|
|
219
|
+
* Add flags to messages by UID.
|
|
220
|
+
* Requires mailbox to be open (not read-only).
|
|
221
|
+
*
|
|
222
|
+
* @param uids - Array of message UIDs
|
|
223
|
+
* @param flags - Array of flags to add (e.g., ["\\Seen", "\\Flagged"])
|
|
224
|
+
*/
|
|
225
|
+
addFlags: (uids: number[], flags: string[]) => Promise<void>;
|
|
226
|
+
/**
|
|
227
|
+
* Remove flags from messages by UID.
|
|
228
|
+
* Requires mailbox to be open (not read-only).
|
|
229
|
+
*
|
|
230
|
+
* @param uids - Array of message UIDs
|
|
231
|
+
* @param flags - Array of flags to remove (e.g., ["\\Seen", "\\Flagged"])
|
|
232
|
+
*/
|
|
233
|
+
removeFlags: (uids: number[], flags: string[]) => Promise<void>;
|
|
234
|
+
/**
|
|
235
|
+
* Replace all flags on messages by UID.
|
|
236
|
+
* Requires mailbox to be open (not read-only).
|
|
237
|
+
*
|
|
238
|
+
* @param uids - Array of message UIDs
|
|
239
|
+
* @param flags - Array of flags to set (replaces all existing flags)
|
|
240
|
+
*/
|
|
241
|
+
setFlags: (uids: number[], flags: string[]) => Promise<void>;
|
|
242
|
+
/**
|
|
243
|
+
* Create a new mailbox.
|
|
244
|
+
*
|
|
245
|
+
* @param path - Full path of the mailbox to create (e.g., "Projects/ClientA")
|
|
246
|
+
* @returns Object with path and whether it was created (false if already exists)
|
|
247
|
+
*/
|
|
248
|
+
createMailbox: (path: string) => Promise<{
|
|
249
|
+
path: string;
|
|
250
|
+
created: boolean;
|
|
251
|
+
}>;
|
|
252
|
+
/**
|
|
253
|
+
* Delete a mailbox.
|
|
254
|
+
*
|
|
255
|
+
* @param path - Full path of the mailbox to delete
|
|
256
|
+
* @returns Object with the deleted path
|
|
257
|
+
*/
|
|
258
|
+
deleteMailbox: (path: string) => Promise<{
|
|
259
|
+
path: string;
|
|
260
|
+
}>;
|
|
261
|
+
/**
|
|
262
|
+
* Rename a mailbox.
|
|
263
|
+
*
|
|
264
|
+
* @param oldPath - Current path of the mailbox
|
|
265
|
+
* @param newPath - New path for the mailbox
|
|
266
|
+
* @returns Object with old and new paths
|
|
267
|
+
*/
|
|
268
|
+
renameMailbox: (oldPath: string, newPath: string) => Promise<{
|
|
269
|
+
path: string;
|
|
270
|
+
newPath: string;
|
|
271
|
+
}>;
|
|
272
|
+
/**
|
|
273
|
+
* Subscribe to a mailbox.
|
|
274
|
+
*
|
|
275
|
+
* @param path - Full path of the mailbox to subscribe to
|
|
276
|
+
*/
|
|
277
|
+
subscribeMailbox: (path: string) => Promise<void>;
|
|
278
|
+
/**
|
|
279
|
+
* Unsubscribe from a mailbox.
|
|
280
|
+
*
|
|
281
|
+
* @param path - Full path of the mailbox to unsubscribe from
|
|
282
|
+
*/
|
|
283
|
+
unsubscribeMailbox: (path: string) => Promise<void>;
|
|
284
|
+
/**
|
|
285
|
+
* Move messages to another mailbox.
|
|
286
|
+
* Uses ImapFlow's messageMove which wraps UID MOVE command.
|
|
287
|
+
* Returns mapping of source UIDs to destination UIDs from COPYUID response.
|
|
288
|
+
*
|
|
289
|
+
* @param uids - Array of message UIDs to move
|
|
290
|
+
* @param destination - Destination mailbox path
|
|
291
|
+
* @returns Object with destination path, uidValidity, and uidMap
|
|
292
|
+
*/
|
|
293
|
+
moveMessages: (uids: number[], destination: string) => Promise<{
|
|
294
|
+
destination: string;
|
|
295
|
+
uidValidity: number;
|
|
296
|
+
uidMap: Map<number, number>;
|
|
297
|
+
}>;
|
|
298
|
+
/**
|
|
299
|
+
* Copy messages to another mailbox.
|
|
300
|
+
* Uses ImapFlow's messageCopy which wraps UID COPY command.
|
|
301
|
+
* Returns mapping of source UIDs to destination UIDs from COPYUID response.
|
|
302
|
+
*
|
|
303
|
+
* @param uids - Array of message UIDs to copy
|
|
304
|
+
* @param destination - Destination mailbox path
|
|
305
|
+
* @returns Object with destination path, uidValidity, and uidMap
|
|
306
|
+
*/
|
|
307
|
+
copyMessages: (uids: number[], destination: string) => Promise<{
|
|
308
|
+
destination: string;
|
|
309
|
+
uidValidity: number;
|
|
310
|
+
uidMap: Map<number, number>;
|
|
311
|
+
}>;
|
|
312
|
+
/**
|
|
313
|
+
* Permanently delete messages (mark \Deleted + expunge).
|
|
314
|
+
* Uses ImapFlow's messageDelete which wraps STORE +FLAGS.SILENT \Deleted
|
|
315
|
+
* followed by UID EXPUNGE.
|
|
316
|
+
*
|
|
317
|
+
* @param uids - Array of message UIDs to delete
|
|
318
|
+
* @returns Number of messages deleted
|
|
319
|
+
*/
|
|
320
|
+
deleteMessages: (uids: number[]) => Promise<number>;
|
|
321
|
+
/**
|
|
322
|
+
* Get mailbox status.
|
|
323
|
+
*
|
|
324
|
+
* Message/unseen counts come from the IMAP STATUS command (no SELECT). The
|
|
325
|
+
* \Deleted count is not part of imapflow's typed STATUS query (there is no
|
|
326
|
+
* IMAP4rev2 STATUS=DELETED in the API), so it is derived by selecting the
|
|
327
|
+
* mailbox read-only and running SEARCH \Deleted — a projection re-read from
|
|
328
|
+
* the server, never a locally computed value.
|
|
329
|
+
*
|
|
330
|
+
* @param mailboxPath - Full path to the mailbox
|
|
331
|
+
* @returns Mailbox status including unseen and deleted counts
|
|
332
|
+
*/
|
|
333
|
+
getMailboxStatus: (mailboxPath: string) => Promise<ImapMailboxStatus>;
|
|
334
|
+
/**
|
|
335
|
+
* Count messages flagged \Deleted but not yet expunged.
|
|
336
|
+
*
|
|
337
|
+
* Selects the mailbox read-only (no state change) and counts SEARCH \Deleted
|
|
338
|
+
* hits. Read-only SELECT is idempotent against an already-open mailbox.
|
|
339
|
+
*/
|
|
340
|
+
private countDeleted;
|
|
341
|
+
/**
|
|
342
|
+
* Append a message to a mailbox.
|
|
343
|
+
* Used primarily for testing to seed messages.
|
|
344
|
+
*
|
|
345
|
+
* @param mailbox - Mailbox path to append to
|
|
346
|
+
* @param message - RFC 822 message content
|
|
347
|
+
* @param flags - Optional flags to set on the message
|
|
348
|
+
* @returns Object with destination path, uidValidity, and uid of the appended message
|
|
349
|
+
*/
|
|
350
|
+
append: (mailbox: string, message: string | Buffer, flags?: string[]) => Promise<{
|
|
351
|
+
destination: string;
|
|
352
|
+
uidValidity: number;
|
|
353
|
+
uid: number;
|
|
354
|
+
}>;
|
|
355
|
+
/**
|
|
356
|
+
* Ensure the connection is established
|
|
357
|
+
*/
|
|
358
|
+
private ensureConnected;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Create an ImapFlow connection from account data using password credentials.
|
|
362
|
+
*/
|
|
363
|
+
export declare const createImapFlowConnectionFromAccount: (account: {
|
|
364
|
+
imapHost: string;
|
|
365
|
+
imapPort: number;
|
|
366
|
+
imapTls: boolean;
|
|
367
|
+
username: string;
|
|
368
|
+
}, password: string) => ImapFlowConnection;
|
|
369
|
+
/**
|
|
370
|
+
* Create an ImapFlow connection using a credentials union (password or OAuth access token).
|
|
371
|
+
*/
|
|
372
|
+
export declare const createImapFlowConnectionWithCredentials: (account: {
|
|
373
|
+
imapHost: string;
|
|
374
|
+
imapPort: number;
|
|
375
|
+
imapTls: boolean;
|
|
376
|
+
username: string;
|
|
377
|
+
}, credentials: import("./types.js").MailCredentials) => ImapFlowConnection;
|