@vaultsandbox/client 0.5.1 → 0.6.1
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/README.md +3 -1
- package/dist/client.d.ts +41 -12
- package/dist/client.js +97 -34
- package/dist/client.js.map +1 -1
- package/dist/crypto/constants.d.ts +52 -3
- package/dist/crypto/constants.js +56 -3
- package/dist/crypto/constants.js.map +1 -1
- package/dist/crypto/decrypt.d.ts +1 -0
- package/dist/crypto/decrypt.js +65 -6
- package/dist/crypto/decrypt.js.map +1 -1
- package/dist/crypto/keypair.d.ts +2 -7
- package/dist/crypto/keypair.js +9 -11
- package/dist/crypto/keypair.js.map +1 -1
- package/dist/crypto/signature.js +5 -3
- package/dist/crypto/signature.js.map +1 -1
- package/dist/crypto/utils.d.ts +1 -0
- package/dist/crypto/utils.js +7 -1
- package/dist/crypto/utils.js.map +1 -1
- package/dist/email.js +1 -0
- package/dist/email.js.map +1 -1
- package/dist/http/api-client.d.ts +2 -1
- package/dist/http/api-client.js +7 -2
- package/dist/http/api-client.js.map +1 -1
- package/dist/inbox.d.ts +71 -3
- package/dist/inbox.js +127 -7
- package/dist/inbox.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/strategies/delivery-strategy.d.ts +4 -2
- package/dist/strategies/polling-strategy.d.ts +2 -2
- package/dist/strategies/polling-strategy.js +39 -18
- package/dist/strategies/polling-strategy.js.map +1 -1
- package/dist/strategies/sse-strategy.d.ts +7 -2
- package/dist/strategies/sse-strategy.js +108 -21
- package/dist/strategies/sse-strategy.js.map +1 -1
- package/dist/sync/inbox-sync.d.ts +31 -0
- package/dist/sync/inbox-sync.js +52 -0
- package/dist/sync/inbox-sync.js.map +1 -0
- package/dist/types/index.d.ts +21 -11
- package/dist/types/index.js.map +1 -1
- package/dist/utils/email-utils.d.ts +1 -1
- package/dist/utils/email-utils.js +9 -8
- package/dist/utils/email-utils.js.map +1 -1
- package/dist/utils/hash.d.ts +15 -0
- package/dist/utils/hash.js +31 -0
- package/dist/utils/hash.js.map +1 -0
- package/package.json +1 -1
package/dist/inbox.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Inbox class - manages email retrieval and decryption for a single inbox
|
|
3
3
|
*/
|
|
4
4
|
import createDebug from 'debug';
|
|
5
|
-
import { decryptRaw } from './crypto/decrypt.js';
|
|
5
|
+
import { decryptMetadata, decryptRaw } from './crypto/decrypt.js';
|
|
6
6
|
import { decryptEmailData } from './utils/email-utils.js';
|
|
7
|
-
import {
|
|
7
|
+
import { toBase64Url } from './crypto/utils.js';
|
|
8
|
+
import { EXPORT_VERSION } from './crypto/constants.js';
|
|
9
|
+
import { computeEmailsHash } from './utils/hash.js';
|
|
8
10
|
import { TimeoutError, StrategyError } from './types/index.js';
|
|
9
11
|
const debug = createDebug('vaultsandbox:inbox');
|
|
10
12
|
/**
|
|
@@ -24,6 +26,7 @@ export class Inbox {
|
|
|
24
26
|
apiClient;
|
|
25
27
|
serverPublicKey;
|
|
26
28
|
strategy = null;
|
|
29
|
+
emailCache = new Map();
|
|
27
30
|
/**
|
|
28
31
|
* @internal
|
|
29
32
|
* Do not construct this class directly. Use `VaultSandboxClient.createInbox()` instead.
|
|
@@ -47,13 +50,13 @@ export class Inbox {
|
|
|
47
50
|
debug('Set delivery strategy for inbox %s', this.emailAddress);
|
|
48
51
|
}
|
|
49
52
|
/**
|
|
50
|
-
* Retrieves all emails from the inbox.
|
|
53
|
+
* Retrieves all emails from the inbox with full content.
|
|
51
54
|
*
|
|
52
55
|
* @returns A promise that resolves to an array of `Email` instances.
|
|
53
56
|
*/
|
|
54
57
|
async listEmails() {
|
|
55
58
|
debug('Listing emails for inbox %s', this.emailAddress);
|
|
56
|
-
const emailsData = await this.apiClient.listEmails(this.emailAddress);
|
|
59
|
+
const emailsData = await this.apiClient.listEmails(this.emailAddress, true);
|
|
57
60
|
debug('Retrieved %d raw email data entries', emailsData.length);
|
|
58
61
|
const emails = [];
|
|
59
62
|
for (const emailData of emailsData) {
|
|
@@ -63,6 +66,29 @@ export class Inbox {
|
|
|
63
66
|
debug('Successfully decrypted %d emails for inbox %s', emails.length, this.emailAddress);
|
|
64
67
|
return emails;
|
|
65
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Retrieves all emails from the inbox with metadata only (no content).
|
|
71
|
+
*
|
|
72
|
+
* @returns A promise that resolves to an array of email metadata.
|
|
73
|
+
*/
|
|
74
|
+
async listEmailsMetadataOnly() {
|
|
75
|
+
debug('Listing email metadata for inbox %s', this.emailAddress);
|
|
76
|
+
const emailsData = await this.apiClient.listEmails(this.emailAddress, false);
|
|
77
|
+
debug('Retrieved %d raw email data entries', emailsData.length);
|
|
78
|
+
const emails = [];
|
|
79
|
+
for (const emailData of emailsData) {
|
|
80
|
+
const metadata = await decryptMetadata(emailData.encryptedMetadata, this.keypair);
|
|
81
|
+
emails.push({
|
|
82
|
+
id: emailData.id,
|
|
83
|
+
from: metadata.from,
|
|
84
|
+
subject: metadata.subject,
|
|
85
|
+
receivedAt: new Date(metadata.receivedAt ?? emailData.receivedAt),
|
|
86
|
+
isRead: emailData.isRead,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
debug('Successfully decrypted %d email metadata for inbox %s', emails.length, this.emailAddress);
|
|
90
|
+
return emails;
|
|
91
|
+
}
|
|
66
92
|
/**
|
|
67
93
|
* Retrieves a specific email by its ID.
|
|
68
94
|
*
|
|
@@ -130,6 +156,7 @@ export class Inbox {
|
|
|
130
156
|
let subscription;
|
|
131
157
|
let timeoutTimer;
|
|
132
158
|
// Centralized cleanup to prevent memory leaks
|
|
159
|
+
/* istanbul ignore next 4 - defensive checks for race conditions */
|
|
133
160
|
const cleanup = () => {
|
|
134
161
|
if (timeoutTimer)
|
|
135
162
|
clearTimeout(timeoutTimer);
|
|
@@ -209,17 +236,17 @@ export class Inbox {
|
|
|
209
236
|
}
|
|
210
237
|
/**
|
|
211
238
|
* Exports this inbox, including its key material, for backup/sharing.
|
|
212
|
-
*
|
|
239
|
+
* See vaultsandbox-spec.md Section 9: Inbox Export Format
|
|
213
240
|
*/
|
|
214
241
|
export() {
|
|
215
242
|
debug('Exporting inbox %s with key material', this.emailAddress);
|
|
216
243
|
const exportedData = {
|
|
244
|
+
version: EXPORT_VERSION,
|
|
217
245
|
emailAddress: this.emailAddress,
|
|
218
246
|
expiresAt: this.expiresAt.toISOString(),
|
|
219
247
|
inboxHash: this.inboxHash,
|
|
220
248
|
serverSigPk: this.serverPublicKey,
|
|
221
|
-
|
|
222
|
-
secretKeyB64: toBase64(this.keypair.secretKey),
|
|
249
|
+
secretKey: toBase64Url(this.keypair.secretKey),
|
|
223
250
|
exportedAt: new Date().toISOString(),
|
|
224
251
|
};
|
|
225
252
|
debug('Successfully exported inbox %s', this.emailAddress);
|
|
@@ -239,5 +266,98 @@ export class Inbox {
|
|
|
239
266
|
debug('Sync status for inbox %s: %d emails, hash: %s', this.emailAddress, syncStatus.emailCount, syncStatus.emailsHash);
|
|
240
267
|
return syncStatus;
|
|
241
268
|
}
|
|
269
|
+
// ===== Email Cache Management =====
|
|
270
|
+
/**
|
|
271
|
+
* Gets all email IDs currently in the local cache.
|
|
272
|
+
*
|
|
273
|
+
* @returns An array of email IDs.
|
|
274
|
+
*/
|
|
275
|
+
getEmailIds() {
|
|
276
|
+
return Array.from(this.emailCache.keys());
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Gets the local email cache.
|
|
280
|
+
*
|
|
281
|
+
* @returns The email cache map.
|
|
282
|
+
* @internal
|
|
283
|
+
*/
|
|
284
|
+
getEmailCache() {
|
|
285
|
+
return this.emailCache;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Adds an email to the local cache.
|
|
289
|
+
*
|
|
290
|
+
* @param email - The email data to add.
|
|
291
|
+
* @returns `true` if the email was added, `false` if it already existed.
|
|
292
|
+
*/
|
|
293
|
+
addEmail(email) {
|
|
294
|
+
if (this.emailCache.has(email.id)) {
|
|
295
|
+
debug('Email %s already exists in cache for inbox %s', email.id, this.emailAddress);
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
this.emailCache.set(email.id, email);
|
|
299
|
+
debug('Added email %s to cache for inbox %s', email.id, this.emailAddress);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Removes an email from the local cache.
|
|
304
|
+
*
|
|
305
|
+
* @param emailId - The ID of the email to remove.
|
|
306
|
+
* @returns `true` if the email was removed, `false` if it didn't exist.
|
|
307
|
+
*/
|
|
308
|
+
removeEmail(emailId) {
|
|
309
|
+
const removed = this.emailCache.delete(emailId);
|
|
310
|
+
if (removed) {
|
|
311
|
+
debug('Removed email %s from cache for inbox %s', emailId, this.emailAddress);
|
|
312
|
+
}
|
|
313
|
+
return removed;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Checks if an email exists in the local cache.
|
|
317
|
+
*
|
|
318
|
+
* @param emailId - The ID of the email to check.
|
|
319
|
+
* @returns `true` if the email exists, `false` otherwise.
|
|
320
|
+
*/
|
|
321
|
+
hasEmail(emailId) {
|
|
322
|
+
return this.emailCache.has(emailId);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Computes the hash of the local email cache.
|
|
326
|
+
*
|
|
327
|
+
* This hash can be compared with the server's hash to detect changes.
|
|
328
|
+
* Uses the algorithm: BASE64URL(SHA256(SORT(emailIds).join(",")))
|
|
329
|
+
*
|
|
330
|
+
* @returns The computed hash of local email IDs.
|
|
331
|
+
*/
|
|
332
|
+
computeLocalHash() {
|
|
333
|
+
const hash = computeEmailsHash(this.getEmailIds());
|
|
334
|
+
debug('Computed local hash for inbox %s: %s', this.emailAddress, hash);
|
|
335
|
+
return hash;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Clears all emails from the local cache.
|
|
339
|
+
*/
|
|
340
|
+
clearEmailCache() {
|
|
341
|
+
this.emailCache.clear();
|
|
342
|
+
debug('Cleared email cache for inbox %s', this.emailAddress);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Gets the keypair for this inbox.
|
|
346
|
+
*
|
|
347
|
+
* @returns The keypair.
|
|
348
|
+
* @internal
|
|
349
|
+
*/
|
|
350
|
+
getKeypair() {
|
|
351
|
+
return this.keypair;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Gets the API client for this inbox.
|
|
355
|
+
*
|
|
356
|
+
* @returns The API client.
|
|
357
|
+
* @internal
|
|
358
|
+
*/
|
|
359
|
+
getApiClient() {
|
|
360
|
+
return this.apiClient;
|
|
361
|
+
}
|
|
242
362
|
}
|
|
243
363
|
//# sourceMappingURL=inbox.js.map
|
package/dist/inbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
export { VaultSandboxClient, InboxMonitor } from './client.js';
|
|
7
7
|
export { Inbox } from './inbox.js';
|
|
8
8
|
export { Email } from './email.js';
|
|
9
|
-
export type { ClientConfig, CreateInboxOptions, InboxData, SyncStatus, WaitOptions, WaitForCountOptions, IEmail, AttachmentData, RawEmail, SPFResult, DKIMResult, DMARCResult, ReverseDNSResult, AuthResultsData, AuthResults, AuthValidation, ServerInfo, Subscription, ExportedInboxData, } from './types/index.js';
|
|
9
|
+
export type { ClientConfig, CreateInboxOptions, InboxData, SyncStatus, WaitOptions, WaitForCountOptions, IEmail, IEmailMetadata, AttachmentData, RawEmail, SPFResult, DKIMResult, DMARCResult, ReverseDNSResult, AuthResultsData, AuthResults, AuthValidation, ServerInfo, Subscription, ExportedInboxData, } from './types/index.js';
|
|
10
10
|
export { VaultSandboxError, ApiError, NetworkError, TimeoutError, DecryptionError, SignatureVerificationError, InboxNotFoundError, EmailNotFoundError, InboxAlreadyExistsError, InvalidImportDataError, StrategyError, SSEError, } from './types/index.js';
|
|
11
11
|
export { generateKeypair } from './crypto/keypair.js';
|
|
12
12
|
export { decrypt, decryptMetadata, decryptParsed, decryptRaw } from './crypto/decrypt.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA0BnC,0EAA0E;AAC1E,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAE1B,wCAAwC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IEmail, WaitOptions, Subscription, Keypair } from '../types/index.js';
|
|
1
|
+
import type { IEmail, WaitOptions, Subscription, Keypair, EmailData } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* DeliveryStrategy defines the interface for email delivery mechanisms.
|
|
4
4
|
* Implementations include SSE (real-time) and Polling (fallback).
|
|
@@ -19,9 +19,11 @@ export interface DeliveryStrategy {
|
|
|
19
19
|
* @param inboxHash - The inbox hash for SSE subscription
|
|
20
20
|
* @param keypair - Keypair for decryption
|
|
21
21
|
* @param callback - Function to call when new email arrives
|
|
22
|
+
* @param emailCache - Optional local email cache for sync operations
|
|
23
|
+
* @param onEmailDeleted - Optional callback when email is deleted from server
|
|
22
24
|
* @returns Subscription object with unsubscribe method
|
|
23
25
|
*/
|
|
24
|
-
subscribe(emailAddress: string, inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void
|
|
26
|
+
subscribe(emailAddress: string, inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void): Subscription;
|
|
25
27
|
/**
|
|
26
28
|
* Close and cleanup resources
|
|
27
29
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* PollingStrategy - Smart polling implementation with exponential backoff
|
|
3
3
|
*/
|
|
4
4
|
import type { ApiClient } from '../http/api-client.js';
|
|
5
|
-
import type { Keypair, IEmail, WaitOptions, Subscription } from '../types/index.js';
|
|
5
|
+
import type { Keypair, EmailData, IEmail, WaitOptions, Subscription } from '../types/index.js';
|
|
6
6
|
import type { DeliveryStrategy } from './delivery-strategy.js';
|
|
7
7
|
export interface PollingConfig {
|
|
8
8
|
initialInterval?: number;
|
|
@@ -28,7 +28,7 @@ export declare class PollingStrategy implements DeliveryStrategy {
|
|
|
28
28
|
/**
|
|
29
29
|
* Subscribe to new email notifications (polling-based)
|
|
30
30
|
*/
|
|
31
|
-
subscribe(emailAddress: string, _inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void
|
|
31
|
+
subscribe(emailAddress: string, _inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void): Subscription;
|
|
32
32
|
/**
|
|
33
33
|
* Close and cleanup resources
|
|
34
34
|
*/
|
|
@@ -5,6 +5,7 @@ import createDebug from 'debug';
|
|
|
5
5
|
import { TimeoutError, InboxNotFoundError } from '../types/index.js';
|
|
6
6
|
import { decryptEmailData, findMatchingEmail } from '../utils/email-utils.js';
|
|
7
7
|
import { sleep } from '../utils/sleep.js';
|
|
8
|
+
import { syncInbox } from '../sync/inbox-sync.js';
|
|
8
9
|
const debug = createDebug('vaultsandbox:polling-strategy');
|
|
9
10
|
export class PollingStrategy {
|
|
10
11
|
apiClient;
|
|
@@ -23,6 +24,7 @@ export class PollingStrategy {
|
|
|
23
24
|
* Waits for an email matching the specified criteria using smart polling
|
|
24
25
|
*/
|
|
25
26
|
async waitForEmail(emailAddress, _inboxHash, keypair, options = {}) {
|
|
27
|
+
/* istanbul ignore next 2 - compile-time defaults, only one branch taken per execution */
|
|
26
28
|
const timeout = options.timeout ?? 30000;
|
|
27
29
|
const pollInterval = options.pollInterval ?? this.initialInterval;
|
|
28
30
|
const startTime = Date.now();
|
|
@@ -36,8 +38,8 @@ export class PollingStrategy {
|
|
|
36
38
|
if (lastHash === null || syncStatus.emailsHash !== lastHash) {
|
|
37
39
|
lastHash = syncStatus.emailsHash;
|
|
38
40
|
if (syncStatus.emailCount > 0) {
|
|
39
|
-
// Hash changed - fetch full email list
|
|
40
|
-
const emailsData = await this.apiClient.listEmails(emailAddress);
|
|
41
|
+
// Hash changed - fetch full email list with content
|
|
42
|
+
const emailsData = await this.apiClient.listEmails(emailAddress, true);
|
|
41
43
|
const emails = await this.decryptEmails(emailsData, keypair, emailAddress);
|
|
42
44
|
const matchingEmail = findMatchingEmail(emails, options);
|
|
43
45
|
if (matchingEmail) {
|
|
@@ -50,6 +52,7 @@ export class PollingStrategy {
|
|
|
50
52
|
// Calculate remaining time before timeout
|
|
51
53
|
const remainingTime = timeout - (Date.now() - startTime);
|
|
52
54
|
// If we've already exceeded timeout, exit immediately
|
|
55
|
+
/* istanbul ignore next - race condition guard between loop condition and remaining time calculation */
|
|
53
56
|
if (remainingTime <= 0) {
|
|
54
57
|
break;
|
|
55
58
|
}
|
|
@@ -61,6 +64,9 @@ export class PollingStrategy {
|
|
|
61
64
|
// Wait before next poll
|
|
62
65
|
await sleep(waitTime);
|
|
63
66
|
// Increase backoff for next iteration (if no changes detected)
|
|
67
|
+
// Note: This condition is always true when reached because lastHash is set to
|
|
68
|
+
// syncStatus.emailsHash above, or the if-block was skipped because they were equal
|
|
69
|
+
/* istanbul ignore else - false branch unreachable with current logic */
|
|
64
70
|
if (syncStatus.emailsHash === lastHash) {
|
|
65
71
|
currentBackoff = Math.min(currentBackoff * this.backoffMultiplier, this.maxBackoff);
|
|
66
72
|
}
|
|
@@ -92,30 +98,45 @@ export class PollingStrategy {
|
|
|
92
98
|
/**
|
|
93
99
|
* Subscribe to new email notifications (polling-based)
|
|
94
100
|
*/
|
|
95
|
-
subscribe(emailAddress, _inboxHash, keypair, callback) {
|
|
101
|
+
subscribe(emailAddress, _inboxHash, keypair, callback, emailCache, onEmailDeleted) {
|
|
96
102
|
let isActive = true;
|
|
103
|
+
const localCache = emailCache ?? new Map();
|
|
97
104
|
const seenEmails = new Set();
|
|
98
105
|
// Start polling loop
|
|
99
106
|
const poll = async () => {
|
|
100
107
|
while (isActive) {
|
|
101
108
|
try {
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
seenEmails.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
// Use hash-based sync to detect changes efficiently
|
|
110
|
+
const result = await syncInbox(this.apiClient, emailAddress, localCache);
|
|
111
|
+
if (!result.unchanged) {
|
|
112
|
+
// Process new emails
|
|
113
|
+
for (const emailData of result.added) {
|
|
114
|
+
if (!seenEmails.has(emailData.id)) {
|
|
115
|
+
seenEmails.add(emailData.id);
|
|
116
|
+
localCache.set(emailData.id, emailData);
|
|
117
|
+
try {
|
|
118
|
+
// Fetch full email content for new emails
|
|
119
|
+
const fullEmailData = await this.apiClient.getEmail(emailAddress, emailData.id);
|
|
120
|
+
const email = await decryptEmailData(fullEmailData, keypair, emailAddress, this.apiClient);
|
|
121
|
+
const callbackResult = callback(email);
|
|
122
|
+
// Handle case where callback returns a promise
|
|
123
|
+
if (callbackResult instanceof Promise) {
|
|
124
|
+
callbackResult.catch((error) => {
|
|
125
|
+
debug('Error in async subscription callback: %O', error);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
debug('Error processing new email %s: %O', emailData.id, error);
|
|
115
131
|
}
|
|
116
132
|
}
|
|
117
|
-
|
|
118
|
-
|
|
133
|
+
}
|
|
134
|
+
// Process deleted emails
|
|
135
|
+
for (const emailId of result.deleted) {
|
|
136
|
+
localCache.delete(emailId);
|
|
137
|
+
seenEmails.delete(emailId);
|
|
138
|
+
if (onEmailDeleted) {
|
|
139
|
+
onEmailDeleted(emailId);
|
|
119
140
|
}
|
|
120
141
|
}
|
|
121
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling-strategy.js","sourceRoot":"","sources":["../../src/strategies/polling-strategy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,OAAO,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"polling-strategy.js","sourceRoot":"","sources":["../../src/strategies/polling-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ApiClient } from '../http/api-client.js';
|
|
2
|
-
import type { Keypair, IEmail, WaitOptions, Subscription, SSEConfig } from '../types/index.js';
|
|
2
|
+
import type { Keypair, IEmail, WaitOptions, Subscription, SSEConfig, EmailData } from '../types/index.js';
|
|
3
3
|
import type { DeliveryStrategy } from './delivery-strategy.js';
|
|
4
4
|
export declare class SSEStrategy implements DeliveryStrategy {
|
|
5
5
|
private apiClient;
|
|
@@ -21,7 +21,7 @@ export declare class SSEStrategy implements DeliveryStrategy {
|
|
|
21
21
|
/**
|
|
22
22
|
* Subscribe to new email notifications for a specific inbox
|
|
23
23
|
*/
|
|
24
|
-
subscribe(emailAddress: string, inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void
|
|
24
|
+
subscribe(emailAddress: string, inboxHash: string, keypair: Keypair, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void): Subscription;
|
|
25
25
|
/**
|
|
26
26
|
* Connect to SSE endpoint
|
|
27
27
|
*/
|
|
@@ -34,6 +34,11 @@ export declare class SSEStrategy implements DeliveryStrategy {
|
|
|
34
34
|
* Handle connection error and attempt reconnection
|
|
35
35
|
*/
|
|
36
36
|
private handleConnectionError;
|
|
37
|
+
/**
|
|
38
|
+
* Sync all subscribed inboxes after reconnection.
|
|
39
|
+
* This catches any emails that arrived during the disconnect window.
|
|
40
|
+
*/
|
|
41
|
+
private syncAllInboxes;
|
|
37
42
|
/**
|
|
38
43
|
* Reconnect with updated inbox list
|
|
39
44
|
*/
|