@vaultsandbox/client 0.8.5 → 0.9.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.
@@ -4,6 +4,14 @@
4
4
  import axios from 'axios';
5
5
  import { ApiError, NetworkError, InboxNotFoundError, EmailNotFoundError, WebhookNotFoundError, } from '../types/index.js';
6
6
  import { sleep } from '../utils/sleep.js';
7
+ /** Default HTTP request timeout in milliseconds */
8
+ const DEFAULT_HTTP_TIMEOUT_MS = 30000;
9
+ /** Default maximum number of retry attempts for failed requests */
10
+ const DEFAULT_MAX_RETRIES = 3;
11
+ /** Default delay between retries in milliseconds (used as base for exponential backoff) */
12
+ const DEFAULT_RETRY_DELAY_MS = 1000;
13
+ /** Default HTTP status codes that trigger automatic retry */
14
+ const DEFAULT_RETRY_STATUS_CODES = [408, 429, 500, 502, 503, 504];
7
15
  /**
8
16
  * HTTP API client for interacting with the VaultSandbox Gateway server.
9
17
  * Handles all API communication including inbox management, email operations,
@@ -24,7 +32,7 @@ export class ApiClient {
24
32
  'X-API-Key': config.apiKey,
25
33
  'Content-Type': 'application/json',
26
34
  },
27
- timeout: 30000,
35
+ timeout: DEFAULT_HTTP_TIMEOUT_MS,
28
36
  });
29
37
  // Setup retry logic
30
38
  this.setupRetry();
@@ -37,9 +45,9 @@ export class ApiClient {
37
45
  setupRetry() {
38
46
  this.client.interceptors.response.use((response) => response, async (error) => {
39
47
  const config = error.config;
40
- const maxRetries = this.config.maxRetries ?? 3;
41
- const retryDelay = this.config.retryDelay ?? 1000;
42
- const retryOn = this.config.retryOn ?? [408, 429, 500, 502, 503, 504];
48
+ const maxRetries = this.config.maxRetries ?? DEFAULT_MAX_RETRIES;
49
+ const retryDelay = this.config.retryDelay ?? DEFAULT_RETRY_DELAY_MS;
50
+ const retryOn = this.config.retryOn ?? DEFAULT_RETRY_STATUS_CODES;
43
51
  // Early return if no config
44
52
  if (!config) {
45
53
  throw error;
@@ -70,16 +78,30 @@ export class ApiClient {
70
78
  return new NetworkError(error.message || 'Network error occurred');
71
79
  }
72
80
  const status = error.response.status;
81
+ const data = error.response.data;
73
82
  /* istanbul ignore next - defensive fallback when server doesn't return error message */
74
- const message = error.response.data?.error || error.message;
83
+ const message = data?.error || error.message;
84
+ // Prefer structured error type if available
85
+ if (data?.errorType) {
86
+ switch (data.errorType) {
87
+ case 'inbox_not_found':
88
+ return new InboxNotFoundError(message);
89
+ case 'email_not_found':
90
+ return new EmailNotFoundError(message);
91
+ case 'webhook_not_found':
92
+ return new WebhookNotFoundError(message);
93
+ }
94
+ }
95
+ // Fallback to message-based detection for backwards compatibility
75
96
  if (status === 404) {
76
- if (message.toLowerCase().includes('webhook')) {
97
+ const lowerMessage = message.toLowerCase();
98
+ if (lowerMessage.includes('webhook')) {
77
99
  return new WebhookNotFoundError(message);
78
100
  }
79
- if (message.toLowerCase().includes('inbox')) {
101
+ if (lowerMessage.includes('inbox')) {
80
102
  return new InboxNotFoundError(message);
81
103
  }
82
- if (message.toLowerCase().includes('email')) {
104
+ if (lowerMessage.includes('email')) {
83
105
  return new EmailNotFoundError(message);
84
106
  }
85
107
  }
@@ -115,11 +137,12 @@ export class ApiClient {
115
137
  * @param emailAuth - Optional flag to enable email authentication checks
116
138
  * @param encryption - Optional encryption preference ('encrypted' or 'plain')
117
139
  * @param spamAnalysis - Optional flag to enable spam analysis for the inbox
140
+ * @param chaos - Optional chaos engineering configuration for the inbox
118
141
  * @returns Promise resolving to the created inbox data including email address
119
142
  * @throws {NetworkError} If network communication fails
120
143
  * @throws {ApiError} If the server returns an error response
121
144
  */
122
- async createInbox(publicKey, ttl, emailAddress, emailAuth, encryption, spamAnalysis) {
145
+ async createInbox(publicKey, ttl, emailAddress, emailAuth, encryption, spamAnalysis, chaos) {
123
146
  const payload = {};
124
147
  if (publicKey !== undefined && publicKey !== null) {
125
148
  payload.clientKemPk = publicKey;
@@ -139,6 +162,9 @@ export class ApiClient {
139
162
  if (spamAnalysis !== undefined) {
140
163
  payload.spamAnalysis = spamAnalysis;
141
164
  }
165
+ if (chaos !== undefined) {
166
+ payload.chaos = chaos;
167
+ }
142
168
  const response = await this.client.post('/api/inboxes', payload);
143
169
  return response.data;
144
170
  }
@@ -342,6 +368,43 @@ export class ApiClient {
342
368
  const response = await this.client.post(`/api/inboxes/${encodeURIComponent(emailAddress)}/webhooks/${webhookId}/rotate-secret`);
343
369
  return response.data;
344
370
  }
371
+ // ===== Chaos Configuration =====
372
+ /**
373
+ * Gets the chaos configuration for an inbox.
374
+ * @param emailAddress - The email address of the inbox
375
+ * @returns Promise resolving to the chaos configuration
376
+ * @throws {NetworkError} If network communication fails
377
+ * @throws {InboxNotFoundError} If the inbox does not exist
378
+ * @throws {ApiError} If chaos is disabled globally (403) or other error
379
+ */
380
+ async getChaosConfig(emailAddress) {
381
+ const response = await this.client.get(`/api/inboxes/${encodeURIComponent(emailAddress)}/chaos`);
382
+ return response.data;
383
+ }
384
+ /**
385
+ * Sets or updates the chaos configuration for an inbox.
386
+ * @param emailAddress - The email address of the inbox
387
+ * @param config - The chaos configuration to apply
388
+ * @returns Promise resolving to the updated chaos configuration
389
+ * @throws {NetworkError} If network communication fails
390
+ * @throws {InboxNotFoundError} If the inbox does not exist
391
+ * @throws {ApiError} If chaos is disabled globally (403), validation fails (400), or other error
392
+ */
393
+ async setChaosConfig(emailAddress, config) {
394
+ const response = await this.client.post(`/api/inboxes/${encodeURIComponent(emailAddress)}/chaos`, config);
395
+ return response.data;
396
+ }
397
+ /**
398
+ * Disables all chaos for an inbox.
399
+ * @param emailAddress - The email address of the inbox
400
+ * @returns Promise that resolves when chaos is disabled
401
+ * @throws {NetworkError} If network communication fails
402
+ * @throws {InboxNotFoundError} If the inbox does not exist
403
+ * @throws {ApiError} If chaos is disabled globally (403) or other error
404
+ */
405
+ async disableChaos(emailAddress) {
406
+ await this.client.delete(`/api/inboxes/${encodeURIComponent(emailAddress)}/chaos`);
407
+ }
345
408
  // ===== Utility =====
346
409
  /**
347
410
  * Gets the base URL of the VaultSandbox Gateway server.
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/http/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/http/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAwD,MAAM,OAAO,CAAC;AAiB7E,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,mDAAmD;AACnD,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC,mEAAmE;AACnE,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,2FAA2F;AAC3F,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,6DAA6D;AAC7D,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AASlE;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACZ,MAAM,CAAgB;IACtB,MAAM,CAAe;IAE7B;;;OAGG;IACH,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC,GAAG;YACnB,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;QAEH,oBAAoB;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACK,UAAU;QAChB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,KAAK,EAAE,KAAiB,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,sBAAsB,CAAC;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC;YAElE,4BAA4B;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,CAAC;YACd,CAAC;YAED,8DAA8D;YAC9D,MAAM,aAAa,GAAgC,MAAM,CAAC;YAE1D,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;gBAChC,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC;YAC9C,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEzG,IAAI,WAAW,EAAE,CAAC;gBAChB,aAAa,CAAC,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;gBAC5C,MAAM,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;gBAClD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,WAAW,CAAC,KAAiB;QACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAA0D,CAAC;QACvF,wFAAwF;QACxF,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;QAE7C,4CAA4C;QAC5C,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;YACpB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,KAAK,iBAAiB;oBACpB,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACzC,KAAK,iBAAiB;oBACpB,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACzC,KAAK,mBAAmB;oBACtB,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,0BAA0B;IAE1B;;;;;OAKG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAa,kBAAkB,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAkB,gBAAgB,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1B,CAAC;IAED,+BAA+B;IAE/B;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,WAAW,CACf,SAAkB,EAClB,GAAY,EACZ,YAAqB,EACrB,SAAmB,EACnB,UAAkC,EAClC,YAAsB,EACtB,KAA0B;QAE1B,MAAM,OAAO,GAQT,EAAE,CAAC;QACP,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;QAClC,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QACpB,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;QACtC,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;QAClC,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAY,cAAc,EAAE,OAAO,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB;QACpC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;OAKG;IACH,0FAA0F;IAC1F,KAAK,CAAC,gBAAgB;QACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAsB,cAAc,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAa,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5G,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,+BAA+B;IAE/B;;;;;;;;OAQG;IACH,sEAAsE;IACtE,KAAK,CAAC,UAAU,CAAC,YAAoB,EAAE,cAAc,GAAG,KAAK;QAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,UAAU,KAAK,EAAE,CAClE,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,CAAC,YAAoB,EAAE,OAAe;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,OAAO,EAAE,CACrE,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,OAAe;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,OAAO,MAAM,CACzE,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,eAAe,CAAC,YAAoB,EAAE,OAAe;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,OAAO,OAAO,CAAC,CAAC;IACrG,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,OAAe;QACrD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,6BAA6B;IAE7B;;;;;;;;OAQG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB,EAAE,OAA6B;QAC1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,EAC3D,OAAO,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,WAAW,CAC5D,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,eAAe,CAAC,YAAoB,EAAE,SAAiB;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,aAAa,SAAS,EAAE,CACzE,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,kBAAkB,CACtB,YAAoB,EACpB,SAAiB,EACjB,OAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACtC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,aAAa,SAAS,EAAE,EACxE,OAAO,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB,EAAE,SAAiB;QAC9D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACrG,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,SAAiB;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,aAAa,SAAS,OAAO,CAC9E,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,wBAAwB,CAAC,YAAoB,EAAE,SAAiB;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,aAAa,SAAS,gBAAgB,CACvF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,kCAAkC;IAElC;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAAC,YAAoB;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CACzD,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,cAAc,CAAC,YAAoB,EAAE,MAA0B;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,QAAQ,EACxD,MAAM,CACP,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAAC,YAAoB;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC;IAED,sBAAsB;IAEtB;;;OAGG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
package/dist/inbox.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Inbox class - manages email retrieval and decryption for a single inbox
3
3
  */
4
- import type { InboxData, Keypair, WaitOptions, WaitForCountOptions, SyncStatus, RawEmail, Subscription, IEmail, IEmailMetadata, ExportedInboxData, EmailData, CreateWebhookOptions, UpdateWebhookOptions, WebhookData, WebhookListResponse, TestWebhookResponse, RotateSecretResponse } from './types/index.js';
4
+ import type { InboxData, Keypair, WaitOptions, WaitForCountOptions, SyncStatus, RawEmail, Subscription, IEmail, IEmailMetadata, ExportedInboxData, EmailData, CreateWebhookOptions, UpdateWebhookOptions, WebhookData, WebhookListResponse, TestWebhookResponse, RotateSecretResponse, ChaosConfigRequest, ChaosConfigResponse } from './types/index.js';
5
5
  import type { ApiClient } from './http/api-client.js';
6
6
  import type { DeliveryStrategy } from './strategies/delivery-strategy.js';
7
7
  /**
@@ -28,6 +28,7 @@ export declare class Inbox {
28
28
  private serverPublicKey;
29
29
  private strategy;
30
30
  private emailCache;
31
+ private activeSubscriptions;
31
32
  /**
32
33
  * @internal
33
34
  * Do not construct this class directly. Use `VaultSandboxClient.createInbox()` instead.
@@ -39,6 +40,12 @@ export declare class Inbox {
39
40
  * @param strategy - The delivery strategy to use.
40
41
  */
41
42
  setStrategy(strategy: DeliveryStrategy): void;
43
+ /**
44
+ * Validates that a keypair exists for encrypted operations.
45
+ * @returns The validated keypair
46
+ * @throws DecryptionError if keypair is null
47
+ */
48
+ private requireKeypair;
42
49
  /**
43
50
  * Retrieves all emails from the inbox with full content.
44
51
  *
@@ -96,6 +103,13 @@ export declare class Inbox {
96
103
  * @returns A `Subscription` object with an `unsubscribe` method.
97
104
  */
98
105
  onNewEmail(callback: (email: IEmail) => void | Promise<void>): Subscription;
106
+ /**
107
+ * Unsubscribes from all active email subscriptions for this inbox.
108
+ *
109
+ * This method is called during client shutdown to ensure clean cleanup.
110
+ * It is safe to call multiple times.
111
+ */
112
+ unsubscribeAll(): void;
99
113
  /**
100
114
  * Marks a specific email as read.
101
115
  *
@@ -240,4 +254,26 @@ export declare class Inbox {
240
254
  * @returns A promise that resolves to the new secret and validity period of the old secret.
241
255
  */
242
256
  rotateWebhookSecret(webhookId: string): Promise<RotateSecretResponse>;
257
+ /**
258
+ * Gets the chaos configuration for this inbox.
259
+ *
260
+ * @returns A promise that resolves to the chaos configuration.
261
+ * @throws {ApiError} If chaos is disabled globally on the server (403).
262
+ */
263
+ getChaosConfig(): Promise<ChaosConfigResponse>;
264
+ /**
265
+ * Sets or updates the chaos configuration for this inbox.
266
+ *
267
+ * @param config - The chaos configuration to apply.
268
+ * @returns A promise that resolves to the updated chaos configuration.
269
+ * @throws {ApiError} If chaos is disabled globally on the server (403) or validation fails (400).
270
+ */
271
+ setChaosConfig(config: ChaosConfigRequest): Promise<ChaosConfigResponse>;
272
+ /**
273
+ * Disables all chaos for this inbox.
274
+ *
275
+ * @returns A promise that resolves when chaos is disabled.
276
+ * @throws {ApiError} If chaos is disabled globally on the server (403).
277
+ */
278
+ disableChaos(): Promise<void>;
243
279
  }
package/dist/inbox.js CHANGED
@@ -7,7 +7,7 @@ import { decryptEmailData, decodeBase64EmailData, isEncryptedEmailData } from '.
7
7
  import { toBase64Url } from './crypto/utils.js';
8
8
  import { EXPORT_VERSION } from './crypto/constants.js';
9
9
  import { computeEmailsHash } from './utils/hash.js';
10
- import { TimeoutError, StrategyError } from './types/index.js';
10
+ import { TimeoutError, StrategyError, DecryptionError } from './types/index.js';
11
11
  const debug = createDebug('vaultsandbox:inbox');
12
12
  /**
13
13
  * Represents a single email inbox.
@@ -33,6 +33,7 @@ export class Inbox {
33
33
  serverPublicKey;
34
34
  strategy = null;
35
35
  emailCache = new Map();
36
+ activeSubscriptions = new Set();
36
37
  /**
37
38
  * @internal
38
39
  * Do not construct this class directly. Use `VaultSandboxClient.createInbox()` instead.
@@ -58,6 +59,17 @@ export class Inbox {
58
59
  this.strategy = strategy;
59
60
  debug('Set delivery strategy for inbox %s', this.emailAddress);
60
61
  }
62
+ /**
63
+ * Validates that a keypair exists for encrypted operations.
64
+ * @returns The validated keypair
65
+ * @throws DecryptionError if keypair is null
66
+ */
67
+ requireKeypair() {
68
+ if (!this.keypair) {
69
+ throw new DecryptionError(`Encrypted operation requires keypair but inbox ${this.emailAddress} has none`);
70
+ }
71
+ return this.keypair;
72
+ }
61
73
  /**
62
74
  * Retrieves all emails from the inbox with full content.
63
75
  *
@@ -70,7 +82,7 @@ export class Inbox {
70
82
  const emails = [];
71
83
  for (const emailData of emailsData) {
72
84
  const email = isEncryptedEmailData(emailData)
73
- ? await decryptEmailData(emailData, this.keypair, this.emailAddress, this.apiClient)
85
+ ? await decryptEmailData(emailData, this.requireKeypair(), this.emailAddress, this.apiClient)
74
86
  : decodeBase64EmailData(emailData, this.emailAddress, this.apiClient);
75
87
  emails.push(email);
76
88
  }
@@ -90,7 +102,7 @@ export class Inbox {
90
102
  for (const emailData of emailsData) {
91
103
  let metadata;
92
104
  if (isEncryptedEmailData(emailData)) {
93
- metadata = await decryptMetadata(emailData.encryptedMetadata, this.keypair);
105
+ metadata = await decryptMetadata(emailData.encryptedMetadata, this.requireKeypair());
94
106
  }
95
107
  else {
96
108
  // Plain email - decode base64 metadata
@@ -118,7 +130,7 @@ export class Inbox {
118
130
  debug('Retrieving email %s from inbox %s', emailId, this.emailAddress);
119
131
  const emailData = await this.apiClient.getEmail(this.emailAddress, emailId);
120
132
  const email = isEncryptedEmailData(emailData)
121
- ? await decryptEmailData(emailData, this.keypair, this.emailAddress, this.apiClient)
133
+ ? await decryptEmailData(emailData, this.requireKeypair(), this.emailAddress, this.apiClient)
122
134
  : decodeBase64EmailData(emailData, this.emailAddress, this.apiClient);
123
135
  debug('Successfully retrieved and processed email %s', emailId);
124
136
  return email;
@@ -134,7 +146,7 @@ export class Inbox {
134
146
  const rawEmailData = await this.apiClient.getRawEmail(this.emailAddress, emailId);
135
147
  let raw;
136
148
  if (rawEmailData.encryptedRaw) {
137
- raw = await decryptRaw(rawEmailData.encryptedRaw, this.keypair);
149
+ raw = await decryptRaw(rawEmailData.encryptedRaw, this.requireKeypair());
138
150
  }
139
151
  else if (rawEmailData.raw) {
140
152
  // Plain email - decode base64
@@ -186,6 +198,7 @@ export class Inbox {
186
198
  return new Promise((resolve, reject) => {
187
199
  let subscription;
188
200
  let timeoutTimer;
201
+ let resolved = false;
189
202
  // Centralized cleanup to prevent memory leaks
190
203
  /* istanbul ignore next 4 - defensive checks for race conditions */
191
204
  const cleanup = () => {
@@ -195,24 +208,36 @@ export class Inbox {
195
208
  subscription.unsubscribe();
196
209
  };
197
210
  timeoutTimer = setTimeout(() => {
211
+ /* istanbul ignore next - race condition guard */
212
+ if (resolved)
213
+ return;
214
+ resolved = true;
198
215
  cleanup();
199
216
  debug('Timeout reached while waiting for %d emails in inbox %s', count, this.emailAddress);
200
217
  reject(new TimeoutError(`Inbox did not receive ${count} emails within timeout`));
201
218
  }, timeout);
202
219
  subscription = this.onNewEmail(async () => {
220
+ /* istanbul ignore next - race condition guard */
221
+ if (resolved)
222
+ return;
203
223
  try {
204
224
  const syncStatus = await this.getSyncStatus();
205
225
  debug('Current email count in inbox %s: %d', this.emailAddress, syncStatus.emailCount);
206
226
  if (syncStatus.emailCount >= count) {
227
+ resolved = true;
207
228
  cleanup();
208
229
  debug('Target email count %d reached in inbox %s', count, this.emailAddress);
209
230
  resolve();
210
231
  }
211
232
  }
212
233
  catch (error) {
213
- cleanup();
214
- debug('Error checking sync status: %O', error);
215
- reject(error);
234
+ /* istanbul ignore next - race condition guard */
235
+ if (!resolved) {
236
+ resolved = true;
237
+ cleanup();
238
+ debug('Error checking sync status: %O', error);
239
+ reject(error);
240
+ }
216
241
  }
217
242
  });
218
243
  });
@@ -231,7 +256,34 @@ export class Inbox {
231
256
  throw new StrategyError('No delivery strategy set. Call setStrategy() first.');
232
257
  }
233
258
  debug('Subscribing to new emails for inbox %s', this.emailAddress);
234
- return this.strategy.subscribe(this.emailAddress, this.inboxHash, this.keypair, callback);
259
+ const subscription = this.strategy.subscribe(this.emailAddress, this.inboxHash, this.keypair, callback);
260
+ // Track the subscription and wrap unsubscribe to remove from tracking
261
+ const trackedSubscription = {
262
+ unsubscribe: () => {
263
+ subscription.unsubscribe();
264
+ this.activeSubscriptions.delete(trackedSubscription);
265
+ },
266
+ };
267
+ this.activeSubscriptions.add(trackedSubscription);
268
+ return trackedSubscription;
269
+ }
270
+ /**
271
+ * Unsubscribes from all active email subscriptions for this inbox.
272
+ *
273
+ * This method is called during client shutdown to ensure clean cleanup.
274
+ * It is safe to call multiple times.
275
+ */
276
+ unsubscribeAll() {
277
+ debug('Unsubscribing all %d subscriptions for inbox %s', this.activeSubscriptions.size, this.emailAddress);
278
+ for (const subscription of this.activeSubscriptions) {
279
+ try {
280
+ subscription.unsubscribe();
281
+ }
282
+ catch (error) {
283
+ debug('Error unsubscribing: %O', error);
284
+ }
285
+ }
286
+ this.activeSubscriptions.clear();
235
287
  }
236
288
  /**
237
289
  * Marks a specific email as read.
@@ -479,5 +531,42 @@ export class Inbox {
479
531
  debug('Successfully rotated secret for webhook %s', webhookId);
480
532
  return result;
481
533
  }
534
+ // ===== Chaos Configuration =====
535
+ /**
536
+ * Gets the chaos configuration for this inbox.
537
+ *
538
+ * @returns A promise that resolves to the chaos configuration.
539
+ * @throws {ApiError} If chaos is disabled globally on the server (403).
540
+ */
541
+ async getChaosConfig() {
542
+ debug('Getting chaos config for inbox %s', this.emailAddress);
543
+ const config = await this.apiClient.getChaosConfig(this.emailAddress);
544
+ debug('Successfully retrieved chaos config for inbox %s', this.emailAddress);
545
+ return config;
546
+ }
547
+ /**
548
+ * Sets or updates the chaos configuration for this inbox.
549
+ *
550
+ * @param config - The chaos configuration to apply.
551
+ * @returns A promise that resolves to the updated chaos configuration.
552
+ * @throws {ApiError} If chaos is disabled globally on the server (403) or validation fails (400).
553
+ */
554
+ async setChaosConfig(config) {
555
+ debug('Setting chaos config for inbox %s: enabled=%s', this.emailAddress, config.enabled);
556
+ const result = await this.apiClient.setChaosConfig(this.emailAddress, config);
557
+ debug('Successfully set chaos config for inbox %s', this.emailAddress);
558
+ return result;
559
+ }
560
+ /**
561
+ * Disables all chaos for this inbox.
562
+ *
563
+ * @returns A promise that resolves when chaos is disabled.
564
+ * @throws {ApiError} If chaos is disabled globally on the server (403).
565
+ */
566
+ async disableChaos() {
567
+ debug('Disabling chaos for inbox %s', this.emailAddress);
568
+ await this.apiClient.disableChaos(this.emailAddress);
569
+ debug('Successfully disabled chaos for inbox %s', this.emailAddress);
570
+ }
482
571
  }
483
572
  //# 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":"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"}
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, IEmailMetadata, AttachmentData, RawEmail, SPFResult, DKIMResult, DMARCResult, ReverseDNSResult, AuthResultsData, AuthResults, AuthValidation, ServerInfo, Subscription, ExportedInboxData, EncryptionPolicy, EmailData, EncryptedEmailData, PlainEmailData, SpamAction, SpamSymbol, SpamAnalysisResult, WebhookEventType, FilterRule, FilterConfig, CustomTemplate, CreateWebhookOptions, UpdateWebhookOptions, WebhookStats, WebhookData, WebhookListResponse, TestWebhookResponse, RotateSecretResponse, } from './types/index.js';
9
+ export type { ClientConfig, CloseOptions, CreateInboxOptions, InboxData, SyncStatus, WaitOptions, WaitForCountOptions, IEmail, IEmailMetadata, AttachmentData, RawEmail, SPFResult, DKIMResult, DMARCResult, ReverseDNSResult, AuthResultsData, AuthResults, AuthValidation, ServerInfo, Subscription, ExportedInboxData, EncryptionPolicy, EmailData, EncryptedEmailData, PlainEmailData, SpamAction, SpamSymbol, SpamAnalysisResult, WebhookEventType, FilterRule, FilterConfig, CustomTemplate, CreateWebhookOptions, UpdateWebhookOptions, WebhookStats, WebhookData, WebhookListResponse, TestWebhookResponse, RotateSecretResponse, GreylistTrackBy, ChaosErrorType, LatencyConfig, ConnectionDropConfig, RandomErrorConfig, GreylistConfig, BlackholeConfig, ChaosConfigRequest, ChaosConfigResponse, } from './types/index.js';
10
10
  export { VaultSandboxError, ApiError, NetworkError, TimeoutError, DecryptionError, SignatureVerificationError, InboxNotFoundError, EmailNotFoundError, InboxAlreadyExistsError, InvalidImportDataError, StrategyError, SSEError, WebhookNotFoundError, } 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;AA8CnC,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,EACR,oBAAoB,GACrB,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;AAE/D,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,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;AAyDnC,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,EACR,oBAAoB,GACrB,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;AAE/D,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -21,9 +21,10 @@ export interface DeliveryStrategy {
21
21
  * @param callback - Function to call when new email arrives
22
22
  * @param emailCache - Optional local email cache for sync operations
23
23
  * @param onEmailDeleted - Optional callback when email is deleted from server
24
+ * @param onError - Optional callback when an error occurs during processing
24
25
  * @returns Subscription object with unsubscribe method
25
26
  */
26
- subscribe(emailAddress: string, inboxHash: string, keypair: Keypair | null, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void): Subscription;
27
+ subscribe(emailAddress: string, inboxHash: string, keypair: Keypair | null, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void, onError?: (error: Error) => void): Subscription;
27
28
  /**
28
29
  * Close and cleanup resources
29
30
  */
@@ -17,6 +17,14 @@ export declare class PollingStrategy implements DeliveryStrategy {
17
17
  private backoffMultiplier;
18
18
  private jitterFactor;
19
19
  constructor(apiClient: ApiClient, config?: PollingConfig);
20
+ /**
21
+ * Validates that a keypair exists for encrypted email operations.
22
+ * @param keypair - The keypair to validate
23
+ * @param emailAddress - The email address for error context
24
+ * @returns The validated keypair
25
+ * @throws DecryptionError if keypair is null
26
+ */
27
+ private validateKeypair;
20
28
  /**
21
29
  * Waits for an email matching the specified criteria using smart polling
22
30
  */
@@ -28,7 +36,7 @@ export declare class PollingStrategy implements DeliveryStrategy {
28
36
  /**
29
37
  * Subscribe to new email notifications (polling-based)
30
38
  */
31
- subscribe(emailAddress: string, _inboxHash: string, keypair: Keypair | null, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void): Subscription;
39
+ subscribe(emailAddress: string, _inboxHash: string, keypair: Keypair | null, callback: (email: IEmail) => void | Promise<void>, emailCache?: Map<string, EmailData>, onEmailDeleted?: (emailId: string) => void, onError?: (error: Error) => void): Subscription;
32
40
  /**
33
41
  * Close and cleanup resources
34
42
  */
@@ -2,7 +2,7 @@
2
2
  * PollingStrategy - Smart polling implementation with exponential backoff
3
3
  */
4
4
  import createDebug from 'debug';
5
- import { TimeoutError, InboxNotFoundError } from '../types/index.js';
5
+ import { TimeoutError, InboxNotFoundError, DecryptionError } from '../types/index.js';
6
6
  import { decryptEmailData, decodeBase64EmailData, isEncryptedEmailData, findMatchingEmail, } from '../utils/email-utils.js';
7
7
  import { sleep } from '../utils/sleep.js';
8
8
  import { syncInbox } from '../sync/inbox-sync.js';
@@ -20,6 +20,19 @@ export class PollingStrategy {
20
20
  this.backoffMultiplier = config.backoffMultiplier ?? 1.5;
21
21
  this.jitterFactor = config.jitterFactor ?? 0.3;
22
22
  }
23
+ /**
24
+ * Validates that a keypair exists for encrypted email operations.
25
+ * @param keypair - The keypair to validate
26
+ * @param emailAddress - The email address for error context
27
+ * @returns The validated keypair
28
+ * @throws DecryptionError if keypair is null
29
+ */
30
+ validateKeypair(keypair, emailAddress) {
31
+ if (!keypair) {
32
+ throw new DecryptionError(`Received encrypted email for inbox ${emailAddress} but no keypair available`);
33
+ }
34
+ return keypair;
35
+ }
23
36
  /**
24
37
  * Waits for an email matching the specified criteria using smart polling
25
38
  */
@@ -56,9 +69,10 @@ export class PollingStrategy {
56
69
  if (remainingTime <= 0) {
57
70
  break;
58
71
  }
59
- // Calculate wait time with exponential backoff and jitter
60
- const jitter = Math.random() * this.jitterFactor * currentBackoff;
61
- const desiredWaitTime = Math.min(currentBackoff + jitter, this.maxBackoff);
72
+ // Calculate wait time with exponential backoff and bidirectional jitter
73
+ // Apply jitter as +/- percentage of current backoff, with floor at pollInterval
74
+ const jitter = this.jitterFactor * currentBackoff * (Math.random() - 0.5) * 2;
75
+ const desiredWaitTime = Math.max(pollInterval, Math.min(currentBackoff + jitter, this.maxBackoff));
62
76
  // Limit sleep to remaining time to avoid overshooting timeout
63
77
  const waitTime = Math.min(desiredWaitTime, remainingTime);
64
78
  // Wait before next poll
@@ -91,7 +105,7 @@ export class PollingStrategy {
91
105
  const emails = [];
92
106
  for (const emailData of emailsData) {
93
107
  const email = isEncryptedEmailData(emailData)
94
- ? await decryptEmailData(emailData, keypair, emailAddress, this.apiClient)
108
+ ? await decryptEmailData(emailData, this.validateKeypair(keypair, emailAddress), emailAddress, this.apiClient)
95
109
  : decodeBase64EmailData(emailData, emailAddress, this.apiClient);
96
110
  emails.push(email);
97
111
  }
@@ -100,7 +114,7 @@ export class PollingStrategy {
100
114
  /**
101
115
  * Subscribe to new email notifications (polling-based)
102
116
  */
103
- subscribe(emailAddress, _inboxHash, keypair, callback, emailCache, onEmailDeleted) {
117
+ subscribe(emailAddress, _inboxHash, keypair, callback, emailCache, onEmailDeleted, onError) {
104
118
  let isActive = true;
105
119
  const localCache = emailCache ?? new Map();
106
120
  const seenEmails = new Set();
@@ -120,7 +134,7 @@ export class PollingStrategy {
120
134
  // Fetch full email content for new emails
121
135
  const fullEmailData = await this.apiClient.getEmail(emailAddress, emailData.id);
122
136
  const email = isEncryptedEmailData(fullEmailData)
123
- ? await decryptEmailData(fullEmailData, keypair, emailAddress, this.apiClient)
137
+ ? await decryptEmailData(fullEmailData, this.validateKeypair(keypair, emailAddress), emailAddress, this.apiClient)
124
138
  : decodeBase64EmailData(fullEmailData, emailAddress, this.apiClient);
125
139
  const callbackResult = callback(email);
126
140
  // Handle case where callback returns a promise
@@ -147,6 +161,14 @@ export class PollingStrategy {
147
161
  }
148
162
  catch (error) {
149
163
  debug('Error polling for emails: %O', error);
164
+ if (onError) {
165
+ try {
166
+ onError(error instanceof Error ? error : new Error(String(error)));
167
+ }
168
+ catch (e) {
169
+ debug('Error in error callback: %O', e);
170
+ }
171
+ }
150
172
  }
151
173
  if (isActive) {
152
174
  await sleep(this.initialInterval);