@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
|
@@ -2,6 +2,7 @@ import createDebug from 'debug';
|
|
|
2
2
|
import { EventSource } from 'eventsource';
|
|
3
3
|
import { TimeoutError, SSEError } from '../types/index.js';
|
|
4
4
|
import { decryptEmailData, matchesFilters } from '../utils/email-utils.js';
|
|
5
|
+
import { syncInbox } from '../sync/inbox-sync.js';
|
|
5
6
|
const debug = createDebug('vaultsandbox:sse-strategy');
|
|
6
7
|
export class SSEStrategy {
|
|
7
8
|
apiClient;
|
|
@@ -19,26 +20,28 @@ export class SSEStrategy {
|
|
|
19
20
|
this.apiClient = apiClient;
|
|
20
21
|
this.url = config.url;
|
|
21
22
|
this.apiKey = config.apiKey;
|
|
22
|
-
this.reconnectInterval = config.reconnectInterval ??
|
|
23
|
+
this.reconnectInterval = config.reconnectInterval ?? 2000;
|
|
23
24
|
this.maxReconnectAttempts = config.maxReconnectAttempts ?? 10;
|
|
24
25
|
this.backoffMultiplier = config.backoffMultiplier ?? 2;
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
28
|
* Wait for an email matching the specified criteria using SSE
|
|
28
29
|
*/
|
|
29
|
-
async waitForEmail(emailAddress, inboxHash, keypair,
|
|
30
|
-
|
|
30
|
+
async waitForEmail(emailAddress, inboxHash, keypair,
|
|
31
|
+
/* istanbul ignore next - default parameter */ options = {}) {
|
|
32
|
+
const timeout = options.timeout ?? /* istanbul ignore next - default timeout */ 30000;
|
|
31
33
|
const startTime = Date.now();
|
|
32
34
|
return new Promise((resolve, reject) => {
|
|
33
35
|
let resolved = false;
|
|
34
36
|
const timeoutTimer = setTimeout(() => {
|
|
37
|
+
/* istanbul ignore else - resolved is false unless race condition */
|
|
35
38
|
if (!resolved) {
|
|
36
39
|
subscription.unsubscribe();
|
|
37
40
|
reject(new TimeoutError('No matching email received within timeout'));
|
|
38
41
|
}
|
|
39
42
|
}, timeout);
|
|
40
43
|
const subscription = this.subscribe(emailAddress, inboxHash, keypair, async (email) => {
|
|
41
|
-
if (resolved)
|
|
44
|
+
/* istanbul ignore if - race condition guard */ if (resolved)
|
|
42
45
|
return;
|
|
43
46
|
// Check if email matches filters
|
|
44
47
|
if (matchesFilters(email, options)) {
|
|
@@ -60,7 +63,7 @@ export class SSEStrategy {
|
|
|
60
63
|
/**
|
|
61
64
|
* Subscribe to new email notifications for a specific inbox
|
|
62
65
|
*/
|
|
63
|
-
subscribe(emailAddress, inboxHash, keypair, callback) {
|
|
66
|
+
subscribe(emailAddress, inboxHash, keypair, callback, emailCache, onEmailDeleted) {
|
|
64
67
|
// Get or create subscription entry
|
|
65
68
|
let subscription = this.subscriptions.get(emailAddress);
|
|
66
69
|
if (!subscription) {
|
|
@@ -69,9 +72,17 @@ export class SSEStrategy {
|
|
|
69
72
|
inboxHash,
|
|
70
73
|
keypair,
|
|
71
74
|
callbacks: new Set(),
|
|
75
|
+
seenEmailIds: new Set(),
|
|
76
|
+
emailCache: emailCache ?? new Map(),
|
|
77
|
+
onEmailDeleted,
|
|
72
78
|
};
|
|
73
79
|
this.subscriptions.set(emailAddress, subscription);
|
|
74
80
|
}
|
|
81
|
+
else if (emailCache) {
|
|
82
|
+
// Update email cache if provided
|
|
83
|
+
subscription.emailCache = emailCache;
|
|
84
|
+
subscription.onEmailDeleted = onEmailDeleted;
|
|
85
|
+
}
|
|
75
86
|
// Add callback
|
|
76
87
|
subscription.callbacks.add(callback);
|
|
77
88
|
// Connect or reconnect with updated inbox list
|
|
@@ -122,7 +133,9 @@ export class SSEStrategy {
|
|
|
122
133
|
}
|
|
123
134
|
const sseUrl = `${this.url}/api/events?inboxes=${inboxHashes}`;
|
|
124
135
|
debug('Connecting to SSE endpoint: %s', sseUrl);
|
|
125
|
-
debug('Using API key: %s', this.apiKey
|
|
136
|
+
debug('Using API key: %s', this.apiKey
|
|
137
|
+
? `${this.apiKey.substring(0, 10)}...`
|
|
138
|
+
: /* istanbul ignore next - API key always provided */ 'MISSING');
|
|
126
139
|
try {
|
|
127
140
|
// Use custom fetch to add authentication headers
|
|
128
141
|
const eventSourceOptions = {
|
|
@@ -131,7 +144,7 @@ export class SSEStrategy {
|
|
|
131
144
|
return fetch(input, {
|
|
132
145
|
...init,
|
|
133
146
|
headers: {
|
|
134
|
-
...(init?.headers || {}),
|
|
147
|
+
...(init?.headers || /* istanbul ignore next - init.headers always provided by EventSource */ {}),
|
|
135
148
|
'X-API-Key': this.apiKey,
|
|
136
149
|
},
|
|
137
150
|
});
|
|
@@ -141,6 +154,7 @@ export class SSEStrategy {
|
|
|
141
154
|
// DOM EventSource typings don't include it; cast through unknown for Node-only usage.
|
|
142
155
|
this.eventSource = new EventSource(sseUrl, eventSourceOptions);
|
|
143
156
|
debug('EventSource created successfully with custom fetch');
|
|
157
|
+
/* istanbul ignore else - eventSource always set after new EventSource */
|
|
144
158
|
if (this.eventSource) {
|
|
145
159
|
this.eventSource.onopen = () => {
|
|
146
160
|
debug('SSE connection established');
|
|
@@ -150,7 +164,7 @@ export class SSEStrategy {
|
|
|
150
164
|
try {
|
|
151
165
|
await this.handleMessage(event.data);
|
|
152
166
|
}
|
|
153
|
-
catch (error) {
|
|
167
|
+
catch (error) /* istanbul ignore next - defensive catch for unexpected SSE message errors */ {
|
|
154
168
|
debug('Error handling SSE message: %O', error);
|
|
155
169
|
}
|
|
156
170
|
};
|
|
@@ -160,7 +174,7 @@ export class SSEStrategy {
|
|
|
160
174
|
};
|
|
161
175
|
}
|
|
162
176
|
}
|
|
163
|
-
catch (error) {
|
|
177
|
+
catch (error) /* istanbul ignore next - defensive catch for EventSource creation failures */ {
|
|
164
178
|
debug('Failed to create EventSource: %O', error);
|
|
165
179
|
this.handleConnectionError();
|
|
166
180
|
}
|
|
@@ -173,7 +187,7 @@ export class SSEStrategy {
|
|
|
173
187
|
debug('Received message: %s', data.substring(0, 200));
|
|
174
188
|
const messageData = JSON.parse(data);
|
|
175
189
|
debug('Parsed message data: %s', JSON.stringify(messageData, null, 2).substring(0, 500));
|
|
176
|
-
const { inboxId, emailId
|
|
190
|
+
const { inboxId, emailId } = messageData;
|
|
177
191
|
debug('Looking for subscription with inboxId: %s', inboxId);
|
|
178
192
|
debug('Available subscriptions: %O', Array.from(this.subscriptions.keys()));
|
|
179
193
|
// Find matching subscription by inboxHash (which matches inboxId from server)
|
|
@@ -183,14 +197,17 @@ export class SSEStrategy {
|
|
|
183
197
|
debug('Available inbox hashes: %O', Array.from(this.subscriptions.values()).map((s) => s.inboxHash));
|
|
184
198
|
return;
|
|
185
199
|
}
|
|
186
|
-
//
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
200
|
+
// Duplicate check - skip if we've already seen this email
|
|
201
|
+
if (subscription.seenEmailIds.has(emailId)) {
|
|
202
|
+
debug('Skipping duplicate email %s for inbox %s', emailId, subscription.emailAddress);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Mark as seen before processing to prevent race conditions
|
|
206
|
+
subscription.seenEmailIds.add(emailId);
|
|
207
|
+
// SSE notification only contains metadata, fetch full email from API
|
|
208
|
+
const emailData = await this.apiClient.getEmail(subscription.emailAddress, emailId);
|
|
209
|
+
// Add to email cache
|
|
210
|
+
subscription.emailCache.set(emailId, emailData);
|
|
194
211
|
// Decrypt email
|
|
195
212
|
const email = await decryptEmailData(emailData, subscription.keypair, subscription.emailAddress, this.apiClient);
|
|
196
213
|
// Notify all callbacks for this inbox
|
|
@@ -198,13 +215,15 @@ export class SSEStrategy {
|
|
|
198
215
|
try {
|
|
199
216
|
const result = callback(email);
|
|
200
217
|
// Handle case where callback returns a promise
|
|
218
|
+
/* istanbul ignore else - else branch is sync callback that returns void */
|
|
201
219
|
if (result instanceof Promise) {
|
|
202
|
-
result.catch(
|
|
220
|
+
result.catch(
|
|
221
|
+
/* istanbul ignore next - defensive for async callback errors */ (error) => {
|
|
203
222
|
debug('Error in async subscription callback: %O', error);
|
|
204
223
|
});
|
|
205
224
|
}
|
|
206
225
|
}
|
|
207
|
-
catch (error) {
|
|
226
|
+
catch (error) /* istanbul ignore next - defensive for sync callback errors */ {
|
|
208
227
|
debug('Error in subscription callback: %O', error);
|
|
209
228
|
}
|
|
210
229
|
});
|
|
@@ -224,9 +243,12 @@ export class SSEStrategy {
|
|
|
224
243
|
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
225
244
|
const backoffDelay = this.reconnectInterval * Math.pow(this.backoffMultiplier, this.reconnectAttempts);
|
|
226
245
|
debug('Reconnecting in %dms (attempt %d/%d)', backoffDelay, this.reconnectAttempts + 1, this.maxReconnectAttempts);
|
|
227
|
-
this.reconnectTimer = setTimeout(
|
|
246
|
+
this.reconnectTimer = setTimeout(
|
|
247
|
+
/* istanbul ignore next - async reconnection timer tested via integration */ async () => {
|
|
228
248
|
this.reconnectAttempts++;
|
|
229
249
|
this.connect();
|
|
250
|
+
// Sync all inboxes after reconnection to catch missed emails
|
|
251
|
+
await this.syncAllInboxes();
|
|
230
252
|
}, backoffDelay);
|
|
231
253
|
}
|
|
232
254
|
else {
|
|
@@ -234,6 +256,67 @@ export class SSEStrategy {
|
|
|
234
256
|
throw new SSEError('Failed to establish SSE connection after maximum retry attempts');
|
|
235
257
|
}
|
|
236
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Sync all subscribed inboxes after reconnection.
|
|
261
|
+
* This catches any emails that arrived during the disconnect window.
|
|
262
|
+
*/
|
|
263
|
+
async syncAllInboxes() {
|
|
264
|
+
debug('Syncing all inboxes after reconnection');
|
|
265
|
+
const syncPromises = Array.from(this.subscriptions.values()).map(async (subscription) => {
|
|
266
|
+
try {
|
|
267
|
+
const result = await syncInbox(this.apiClient, subscription.emailAddress, subscription.emailCache);
|
|
268
|
+
if (!result.unchanged) {
|
|
269
|
+
// Process new emails
|
|
270
|
+
for (const metadataOnly of result.added) {
|
|
271
|
+
// Skip if already seen
|
|
272
|
+
if (subscription.seenEmailIds.has(metadataOnly.id)) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
subscription.seenEmailIds.add(metadataOnly.id);
|
|
276
|
+
// Fetch full email content (sync only returned metadata for speed)
|
|
277
|
+
try {
|
|
278
|
+
const fullEmailData = await this.apiClient.getEmail(subscription.emailAddress, metadataOnly.id);
|
|
279
|
+
subscription.emailCache.set(metadataOnly.id, fullEmailData);
|
|
280
|
+
// Decrypt and notify
|
|
281
|
+
const email = await decryptEmailData(fullEmailData, subscription.keypair, subscription.emailAddress, this.apiClient);
|
|
282
|
+
/* istanbul ignore next - callback execution after successful decryption */
|
|
283
|
+
subscription.callbacks.forEach((callback) => {
|
|
284
|
+
try {
|
|
285
|
+
const callbackResult = callback(email);
|
|
286
|
+
if (callbackResult instanceof Promise) {
|
|
287
|
+
callbackResult.catch(
|
|
288
|
+
/* istanbul ignore next - defensive for async callback errors */ (error) => {
|
|
289
|
+
debug('Error in async subscription callback during sync: %O', error);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch (error) /* istanbul ignore next - defensive for sync callback errors */ {
|
|
294
|
+
debug('Error in subscription callback during sync: %O', error);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
debug('Error fetching/decrypting email %s during sync: %O', metadataOnly.id, error);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Process deleted emails
|
|
303
|
+
for (const emailId of result.deleted) {
|
|
304
|
+
subscription.emailCache.delete(emailId);
|
|
305
|
+
subscription.seenEmailIds.delete(emailId);
|
|
306
|
+
if (subscription.onEmailDeleted) {
|
|
307
|
+
subscription.onEmailDeleted(emailId);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
debug('Sync complete for inbox %s: %d added, %d deleted', subscription.emailAddress, result.added.length, result.deleted.length);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
debug('Error syncing inbox %s: %O', subscription.emailAddress, error);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
await Promise.all(syncPromises);
|
|
318
|
+
debug('All inbox syncs complete');
|
|
319
|
+
}
|
|
237
320
|
/**
|
|
238
321
|
* Reconnect with updated inbox list
|
|
239
322
|
*/
|
|
@@ -253,6 +336,10 @@ export class SSEStrategy {
|
|
|
253
336
|
this.eventSource.close();
|
|
254
337
|
this.eventSource = null;
|
|
255
338
|
}
|
|
339
|
+
// Clear seen email IDs on disconnect - sync will repopulate on reconnect
|
|
340
|
+
for (const subscription of this.subscriptions.values()) {
|
|
341
|
+
subscription.seenEmailIds.clear();
|
|
342
|
+
}
|
|
256
343
|
}
|
|
257
344
|
/**
|
|
258
345
|
* Close strategy and cleanup resources
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-strategy.js","sourceRoot":"","sources":["../../src/strategies/sse-strategy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sse-strategy.js","sourceRoot":"","sources":["../../src/strategies/sse-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW1C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,MAAM,KAAK,GAAG,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAyBvD,MAAM,OAAO,WAAW;IACd,SAAS,CAAY;IACrB,GAAG,CAAS;IACZ,MAAM,CAAS;IACf,iBAAiB,CAAS;IAC1B,oBAAoB,CAAS;IAC7B,iBAAiB,CAAS;IAE1B,WAAW,GAAuB,IAAI,CAAC;IACvC,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,iBAAiB,GAAG,CAAC,CAAC;IACtB,cAAc,GAA0B,IAAI,CAAC;IAC7C,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,SAAoB,EAAE,MAAiB;QACjD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC1D,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,YAAoB,EACpB,SAAiB,EACjB,OAAgB;IAChB,8CAA8C,CAAC,UAAuB,EAAE;QAExE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,4CAA4C,CAAC,KAAK,CAAC;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBACnC,oEAAoE;gBACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,MAAM,CAAC,IAAI,YAAY,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpF,+CAA+C,CAAC,IAAI,QAAQ;oBAAE,OAAO;gBAErE,iCAAiC;gBACjC,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;oBACnC,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,CAAC,YAAY,CAAC,CAAC;oBAC3B,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,wDAAwD;YACxD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;gBACtC,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,YAAY,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CACP,YAAoB,EACpB,SAAiB,EACjB,OAAgB,EAChB,QAAiD,EACjD,UAAmC,EACnC,cAA0C;QAE1C,mCAAmC;QACnC,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG;gBACb,YAAY;gBACZ,SAAS;gBACT,OAAO;gBACP,SAAS,EAAE,IAAI,GAAG,EAAE;gBACpB,YAAY,EAAE,IAAI,GAAG,EAAE;gBACvB,UAAU,EAAE,UAAU,IAAI,IAAI,GAAG,EAAE;gBACnC,cAAc;aACf,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,iCAAiC;YACjC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;YACrC,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC;QAC/C,CAAC;QAED,eAAe;QACf,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAErC,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC3D,aAAa;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAED,8BAA8B;QAC9B,OAAO;YACL,WAAW,EAAE,GAAG,EAAE;gBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACjD,IAAI,GAAG,EAAE,CAAC;oBACR,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC/B,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;wBACxC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;4BAClC,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,CAAC;6BAAM,CAAC;4BACN,oCAAoC;4BACpC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,OAAO;QACb,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAE1C,0BAA0B;QAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;aACxD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;aAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,0BAA0B;aACjD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,uBAAuB,WAAW,EAAE,CAAC;QAE/D,KAAK,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;QAChD,KAAK,CACH,mBAAmB,EACnB,IAAI,CAAC,MAAM;YACT,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;YACtC,CAAC,CAAC,oDAAoD,CAAC,SAAS,CACnE,CAAC;QAEF,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,kBAAkB,GAA6B;gBACnD,KAAK,EAAE,CAAC,KAAwB,EAAE,IAAkB,EAAE,EAAE;oBACtD,KAAK,CAAC,kCAAkC,CAAC,CAAC;oBAC1C,OAAO,KAAK,CAAC,KAAK,EAAE;wBAClB,GAAG,IAAI;wBACP,OAAO,EAAE;4BACP,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,wEAAwE,CAAC,EAAE,CAAC;4BACjG,WAAW,EAAE,IAAI,CAAC,MAAM;yBACzB;qBACF,CAAC,CAAC;gBACL,CAAC;aACF,CAAC;YACF,4EAA4E;YAC5E,sFAAsF;YACtF,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,kBAAgD,CAAC,CAAC;YAE7F,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAE5D,yEAAyE;YACzE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE;oBAC7B,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBACpC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,0BAA0B;gBACxD,CAAC,CAAC;gBAEF,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,EAAE,KAAsB,EAAE,EAAE;oBAC5D,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,CAAC;oBAAC,OAAO,KAAK,EAAE,8EAA8E,CAAC,CAAC;wBAC9F,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE;oBAC5C,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;oBACzC,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC/B,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,8EAA8E,CAAC,CAAC;YAC9F,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,IAAY;QACtC,IAAI,CAAC;YACH,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACtD,MAAM,WAAW,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACzF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAEzC,KAAK,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;YAC5D,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAE5E,8EAA8E;YAC9E,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;YAEtG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,KAAK,CAAC,wCAAwC,EAAE,OAAO,CAAC,CAAC;gBACzD,KAAK,CACH,4BAA4B,EAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAChE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,0DAA0D;YAC1D,IAAI,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,0CAA0C,EAAE,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,4DAA4D;YAC5D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEvC,qEAAqE;YACrE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpF,qBAAqB;YACrB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAEhD,gBAAgB;YAChB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEjH,sCAAsC;YACtC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC1C,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC/B,+CAA+C;oBAC/C,2EAA2E;oBAC3E,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;wBAC9B,MAAM,CAAC,KAAK;wBACV,gEAAgE,CAAC,CAAC,KAAY,EAAE,EAAE;4BAChF,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;wBAC3D,CAAC,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,+DAA+D,CAAC,CAAC;oBAC/E,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,QAAQ,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEvG,KAAK,CACH,sCAAsC,EACtC,YAAY,EACZ,IAAI,CAAC,iBAAiB,GAAG,CAAC,EAC1B,IAAI,CAAC,oBAAoB,CAC1B,CAAC;YAEF,IAAI,CAAC,cAAc,GAAG,UAAU;YAC9B,4EAA4E,CAAC,KAAK,IAAI,EAAE;gBACtF,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAC;gBAEf,6DAA6D;gBAC7D,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC,EACD,YAAY,CACb,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC3C,MAAM,IAAI,QAAQ,CAAC,iEAAiE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc;QAC1B,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAEhD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;YACtF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEnG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,qBAAqB;oBACrB,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxC,uBAAuB;wBACvB,IAAI,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;4BACnD,SAAS;wBACX,CAAC;wBAED,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAE/C,mEAAmE;wBACnE,IAAI,CAAC;4BACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;4BAChG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;4BAE5D,qBAAqB;4BACrB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAClC,aAAa,EACb,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,YAAY,EACzB,IAAI,CAAC,SAAS,CACf,CAAC;4BAEF,2EAA2E;4BAC3E,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gCAC1C,IAAI,CAAC;oCACH,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;oCACvC,IAAI,cAAc,YAAY,OAAO,EAAE,CAAC;wCACtC,cAAc,CAAC,KAAK;wCAClB,gEAAgE,CAAC,CAAC,KAAY,EAAE,EAAE;4CAChF,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;wCACvE,CAAC,CACF,CAAC;oCACJ,CAAC;gCACH,CAAC;gCAAC,OAAO,KAAK,EAAE,+DAA+D,CAAC,CAAC;oCAC/E,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;gCACjE,CAAC;4BACH,CAAC,CAAC,CAAC;wBACL,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,KAAK,CAAC,oDAAoD,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;wBACtF,CAAC;oBACH,CAAC;oBAED,yBAAyB;oBACzB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACrC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBACxC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAE1C,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;4BAChC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,KAAK,CACH,kDAAkD,EAClD,YAAY,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,MAAM,EACnB,MAAM,CAAC,OAAO,CAAC,MAAM,CACtB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,4BAA4B,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,SAAS;QACf,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,yEAAyE;QACzE,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbox synchronization utilities for hash-based sync with deletion handling
|
|
3
|
+
*/
|
|
4
|
+
import type { ApiClient } from '../http/api-client.js';
|
|
5
|
+
import type { EmailData } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Result of a sync operation.
|
|
8
|
+
*/
|
|
9
|
+
export interface SyncResult {
|
|
10
|
+
/** Emails that exist on the server but not locally */
|
|
11
|
+
added: EmailData[];
|
|
12
|
+
/** Email IDs that exist locally but not on the server */
|
|
13
|
+
deleted: string[];
|
|
14
|
+
/** Whether the inbox was already in sync (no changes) */
|
|
15
|
+
unchanged: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Synchronizes the local email cache with the server using hash comparison.
|
|
19
|
+
*
|
|
20
|
+
* This implements the spec's hash-based sync algorithm:
|
|
21
|
+
* 1. Compute local hash from current email IDs
|
|
22
|
+
* 2. Get server hash via /sync endpoint
|
|
23
|
+
* 3. If hashes match, no sync needed
|
|
24
|
+
* 4. If hashes differ, fetch full email list and reconcile
|
|
25
|
+
*
|
|
26
|
+
* @param apiClient - The API client for server communication
|
|
27
|
+
* @param emailAddress - The inbox email address
|
|
28
|
+
* @param localEmails - Map of local email IDs to EmailData
|
|
29
|
+
* @returns Promise resolving to sync result with added/deleted emails
|
|
30
|
+
*/
|
|
31
|
+
export declare function syncInbox(apiClient: ApiClient, emailAddress: string, localEmails: Map<string, EmailData>): Promise<SyncResult>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbox synchronization utilities for hash-based sync with deletion handling
|
|
3
|
+
*/
|
|
4
|
+
import createDebug from 'debug';
|
|
5
|
+
import { computeEmailsHash } from '../utils/hash.js';
|
|
6
|
+
const debug = createDebug('vaultsandbox:sync');
|
|
7
|
+
/**
|
|
8
|
+
* Synchronizes the local email cache with the server using hash comparison.
|
|
9
|
+
*
|
|
10
|
+
* This implements the spec's hash-based sync algorithm:
|
|
11
|
+
* 1. Compute local hash from current email IDs
|
|
12
|
+
* 2. Get server hash via /sync endpoint
|
|
13
|
+
* 3. If hashes match, no sync needed
|
|
14
|
+
* 4. If hashes differ, fetch full email list and reconcile
|
|
15
|
+
*
|
|
16
|
+
* @param apiClient - The API client for server communication
|
|
17
|
+
* @param emailAddress - The inbox email address
|
|
18
|
+
* @param localEmails - Map of local email IDs to EmailData
|
|
19
|
+
* @returns Promise resolving to sync result with added/deleted emails
|
|
20
|
+
*/
|
|
21
|
+
export async function syncInbox(apiClient, emailAddress, localEmails) {
|
|
22
|
+
debug('Starting sync for inbox %s', emailAddress);
|
|
23
|
+
// Step 1: Compute local hash from current email IDs
|
|
24
|
+
const localIds = Array.from(localEmails.keys());
|
|
25
|
+
const localHash = computeEmailsHash(localIds);
|
|
26
|
+
debug('Computed local hash: %s (from %d emails)', localHash, localIds.length);
|
|
27
|
+
// Step 2: Get server hash
|
|
28
|
+
const syncStatus = await apiClient.getSyncStatus(emailAddress);
|
|
29
|
+
debug('Server hash: %s (with %d emails)', syncStatus.emailsHash, syncStatus.emailCount);
|
|
30
|
+
// Step 3: Compare hashes
|
|
31
|
+
if (localHash === syncStatus.emailsHash) {
|
|
32
|
+
debug('Hashes match - inbox %s is in sync', emailAddress);
|
|
33
|
+
return { added: [], deleted: [], unchanged: true };
|
|
34
|
+
}
|
|
35
|
+
debug('Hash mismatch detected for inbox %s - fetching full email list', emailAddress);
|
|
36
|
+
// Step 4: Fetch full email list from server
|
|
37
|
+
const serverEmails = await apiClient.listEmails(emailAddress, false);
|
|
38
|
+
const serverIds = new Set(serverEmails.map((e) => e.id));
|
|
39
|
+
const localIdSet = new Set(localIds);
|
|
40
|
+
// Step 5: Find new emails (on server but not local)
|
|
41
|
+
const newEmails = serverEmails.filter((e) => !localIdSet.has(e.id));
|
|
42
|
+
debug('Found %d new emails on server', newEmails.length);
|
|
43
|
+
// Step 6: Find deleted emails (local but not on server)
|
|
44
|
+
const deletedIds = localIds.filter((id) => !serverIds.has(id));
|
|
45
|
+
debug('Found %d emails deleted from server', deletedIds.length);
|
|
46
|
+
return {
|
|
47
|
+
added: newEmails,
|
|
48
|
+
deleted: deletedIds,
|
|
49
|
+
unchanged: false,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=inbox-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-sync.js","sourceRoot":"","sources":["../../src/sync/inbox-sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC;AAc/C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAoB,EACpB,YAAoB,EACpB,WAAmC;IAEnC,KAAK,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;IAElD,oDAAoD;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,KAAK,CAAC,0CAA0C,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9E,0BAA0B;IAC1B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/D,KAAK,CAAC,kCAAkC,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAExF,yBAAyB;IACzB,IAAI,SAAS,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;QACxC,KAAK,CAAC,oCAAoC,EAAE,YAAY,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,gEAAgE,EAAE,YAAY,CAAC,CAAC;IAEtF,4CAA4C;IAC5C,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAErC,oDAAoD;IACpD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,+BAA+B,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAEzD,wDAAwD;IACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,KAAK,CAAC,qCAAqC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -11,11 +11,10 @@ export interface ClientConfig {
|
|
|
11
11
|
apiKey: string;
|
|
12
12
|
/**
|
|
13
13
|
* The email delivery strategy to use.
|
|
14
|
-
* - `sse`: Use Server-Sent Events for real-time updates.
|
|
14
|
+
* - `sse`: Use Server-Sent Events for real-time updates (default).
|
|
15
15
|
* - `polling`: Use traditional polling.
|
|
16
|
-
* - `auto`: Use SSE if available, otherwise fall back to polling (default).
|
|
17
16
|
*/
|
|
18
|
-
strategy?: 'sse' | 'polling'
|
|
17
|
+
strategy?: 'sse' | 'polling';
|
|
19
18
|
/** The base interval for polling in milliseconds (default: 2000). */
|
|
20
19
|
pollingInterval?: number;
|
|
21
20
|
/** The maximum number of retries for failed HTTP requests (default: 3). */
|
|
@@ -41,21 +40,22 @@ export interface CreateInboxOptions {
|
|
|
41
40
|
/**
|
|
42
41
|
* Exported inbox data structure for sharing or backup purposes.
|
|
43
42
|
* Contains all necessary information to import and access an inbox.
|
|
43
|
+
* See vaultsandbox-spec.md Section 9: Inbox Export Format
|
|
44
44
|
*/
|
|
45
45
|
export interface ExportedInboxData {
|
|
46
|
-
/**
|
|
46
|
+
/** Export format version. MUST be 1. */
|
|
47
|
+
version: number;
|
|
48
|
+
/** The email address for this inbox. MUST contain @. */
|
|
47
49
|
emailAddress: string;
|
|
48
|
-
/** ISO timestamp when the inbox expires */
|
|
50
|
+
/** ISO 8601 timestamp when the inbox expires */
|
|
49
51
|
expiresAt: string;
|
|
50
52
|
/** Unique hash identifier for the inbox */
|
|
51
53
|
inboxHash: string;
|
|
52
|
-
/** Server's public
|
|
54
|
+
/** Server's ML-DSA-65 public key (base64url encoded, 1952 bytes decoded) */
|
|
53
55
|
serverSigPk: string;
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
secretKeyB64: string;
|
|
58
|
-
/** ISO timestamp when the inbox was exported */
|
|
56
|
+
/** ML-KEM-768 secret key (base64url encoded, 2400 bytes decoded) */
|
|
57
|
+
secretKey: string;
|
|
58
|
+
/** ISO 8601 timestamp when the export was created */
|
|
59
59
|
exportedAt: string;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -253,6 +253,16 @@ export interface AuthValidation {
|
|
|
253
253
|
/** An array of strings describing any failures. */
|
|
254
254
|
failures: string[];
|
|
255
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Interface for email metadata (without content).
|
|
258
|
+
*/
|
|
259
|
+
export interface IEmailMetadata {
|
|
260
|
+
id: string;
|
|
261
|
+
from: string;
|
|
262
|
+
subject: string;
|
|
263
|
+
receivedAt: Date;
|
|
264
|
+
isRead: boolean;
|
|
265
|
+
}
|
|
256
266
|
/**
|
|
257
267
|
* Interface for the Email class.
|
|
258
268
|
*/
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import type { Keypair, EmailData, IEmail, WaitOptions } from '../types/index.js'
|
|
|
5
5
|
import type { ApiClient } from '../http/api-client.js';
|
|
6
6
|
/**
|
|
7
7
|
* Decrypts an EmailData object into an Email instance.
|
|
8
|
-
*
|
|
8
|
+
* Expects full email data with encryptedParsed content.
|
|
9
9
|
* IMPORTANT: Signature verification happens BEFORE decryption for security
|
|
10
10
|
*/
|
|
11
11
|
export declare function decryptEmailData(emailData: EmailData, keypair: Keypair, emailAddress: string, apiClient: ApiClient): Promise<IEmail>;
|
|
@@ -7,21 +7,20 @@ import { verifySignature } from '../crypto/signature.js';
|
|
|
7
7
|
import { fromBase64 } from '../crypto/utils.js';
|
|
8
8
|
/**
|
|
9
9
|
* Decrypts an EmailData object into an Email instance.
|
|
10
|
-
*
|
|
10
|
+
* Expects full email data with encryptedParsed content.
|
|
11
11
|
* IMPORTANT: Signature verification happens BEFORE decryption for security
|
|
12
12
|
*/
|
|
13
13
|
export async function decryptEmailData(emailData, keypair, emailAddress, apiClient) {
|
|
14
|
-
const fullEmailData = emailData.encryptedParsed ? emailData : await apiClient.getEmail(emailAddress, emailData.id);
|
|
15
14
|
// Verify signature FIRST (before decryption) - signature includes server public key
|
|
16
|
-
verifySignature(
|
|
15
|
+
verifySignature(emailData.encryptedMetadata);
|
|
17
16
|
// Decrypt metadata
|
|
18
|
-
const metadata = await decryptMetadata(
|
|
17
|
+
const metadata = await decryptMetadata(emailData.encryptedMetadata, keypair);
|
|
19
18
|
// Decrypt parsed content if available
|
|
20
19
|
let parsed = null;
|
|
21
|
-
if (
|
|
20
|
+
if (emailData.encryptedParsed) {
|
|
22
21
|
// Verify signature for parsed content too
|
|
23
|
-
verifySignature(
|
|
24
|
-
parsed = await decryptParsed(
|
|
22
|
+
verifySignature(emailData.encryptedParsed);
|
|
23
|
+
parsed = await decryptParsed(emailData.encryptedParsed, keypair);
|
|
25
24
|
// Transform attachment content from base64 strings to Uint8Array
|
|
26
25
|
// The server returns attachment content as base64-encoded strings, but our type expects Uint8Array
|
|
27
26
|
if (parsed?.attachments) {
|
|
@@ -38,7 +37,7 @@ export async function decryptEmailData(emailData, keypair, emailAddress, apiClie
|
|
|
38
37
|
});
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
|
-
return new Email(
|
|
40
|
+
return new Email(emailData, metadata, parsed, emailAddress, apiClient, keypair);
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
43
|
* Finds the first email matching the specified criteria
|
|
@@ -57,6 +56,7 @@ export function findMatchingEmail(emails, options) {
|
|
|
57
56
|
export function matchesFilters(email, options) {
|
|
58
57
|
// Check subject filter
|
|
59
58
|
if (options.subject) {
|
|
59
|
+
/* istanbul ignore else - defensive check for non-TypeScript callers */
|
|
60
60
|
if (typeof options.subject === 'string') {
|
|
61
61
|
if (!email.subject.includes(options.subject)) {
|
|
62
62
|
return false;
|
|
@@ -70,6 +70,7 @@ export function matchesFilters(email, options) {
|
|
|
70
70
|
}
|
|
71
71
|
// Check from filter
|
|
72
72
|
if (options.from) {
|
|
73
|
+
/* istanbul ignore else - defensive check for non-TypeScript callers */
|
|
73
74
|
if (typeof options.from === 'string') {
|
|
74
75
|
if (!email.from.includes(options.from)) {
|
|
75
76
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-utils.js","sourceRoot":"","sources":["../../src/utils/email-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAoB,EACpB,OAAgB,EAChB,YAAoB,EACpB,SAAoB;IAEpB,
|
|
1
|
+
{"version":3,"file":"email-utils.js","sourceRoot":"","sources":["../../src/utils/email-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAoB,EACpB,OAAgB,EAChB,YAAoB,EACpB,SAAoB;IAEpB,oFAAoF;IACpF,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAE7C,mBAAmB;IACnB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAoB,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAEhG,sCAAsC;IACtC,IAAI,MAAM,GAA2B,IAAI,CAAC;IAC1C,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;QAC9B,0CAA0C;QAC1C,eAAe,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,GAAG,MAAM,aAAa,CAAkB,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAElF,iEAAiE;QACjE,mGAAmG;QACnG,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;YACxB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClD,2DAA2D;gBAC3D,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACnD,OAAO;wBACL,GAAG,GAAG;wBACN,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;qBACjC,CAAC;gBACJ,CAAC;gBACD,6CAA6C;gBAC7C,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgB,EAAE,OAAoB;IACtE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,OAAoB;IAChE,uBAAuB;IACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,uEAAuE;QACvE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,YAAY,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,uEAAuE;QACvE,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash utilities for email synchronization
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Computes the emails hash using the spec algorithm:
|
|
6
|
+
* BASE64URL(SHA256(SORT(emailIds).join(",")))
|
|
7
|
+
*
|
|
8
|
+
* This hash is used to efficiently detect changes between
|
|
9
|
+
* the local and server email lists without transferring
|
|
10
|
+
* the full list.
|
|
11
|
+
*
|
|
12
|
+
* @param emailIds - Array of email IDs to hash
|
|
13
|
+
* @returns Base64URL encoded SHA-256 hash (no padding)
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeEmailsHash(emailIds: string[]): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash utilities for email synchronization
|
|
3
|
+
*/
|
|
4
|
+
import { createHash } from 'crypto';
|
|
5
|
+
/**
|
|
6
|
+
* Computes the emails hash using the spec algorithm:
|
|
7
|
+
* BASE64URL(SHA256(SORT(emailIds).join(",")))
|
|
8
|
+
*
|
|
9
|
+
* This hash is used to efficiently detect changes between
|
|
10
|
+
* the local and server email lists without transferring
|
|
11
|
+
* the full list.
|
|
12
|
+
*
|
|
13
|
+
* @param emailIds - Array of email IDs to hash
|
|
14
|
+
* @returns Base64URL encoded SHA-256 hash (no padding)
|
|
15
|
+
*/
|
|
16
|
+
export function computeEmailsHash(emailIds) {
|
|
17
|
+
const sorted = [...emailIds].sort();
|
|
18
|
+
const joined = sorted.join(',');
|
|
19
|
+
const hash = createHash('sha256').update(joined).digest();
|
|
20
|
+
return base64UrlEncode(hash);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Encodes a buffer as Base64URL (RFC 4648 §5) without padding.
|
|
24
|
+
*
|
|
25
|
+
* @param buffer - The buffer to encode
|
|
26
|
+
* @returns Base64URL encoded string without padding
|
|
27
|
+
*/
|
|
28
|
+
function base64UrlEncode(buffer) {
|
|
29
|
+
return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaultsandbox/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Node.js SDK for VaultSandbox Gateway — quantum-safe email testing with zero crypto knowledge required. Create isolated inboxes, validate SPF/DKIM/DMARC, and test your full email stack in CI/CD pipelines.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/vaultsandbox/client-node",
|