@serve.zone/platformclient 2.4.0 → 3.0.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.
@@ -0,0 +1,663 @@
1
+ import * as plugins from '../plugins.js';
2
+ class CoreMailTransferError extends Error {
3
+ constructor(messageArg, ambiguous) {
4
+ super(messageArg);
5
+ this.ambiguous = ambiguous;
6
+ this.name = 'CoreMailTransferError';
7
+ }
8
+ }
9
+ const identifierRegex = /^[A-Za-z0-9](?:[A-Za-z0-9._:-]{0,126}[A-Za-z0-9])?$/;
10
+ export class SzCoreMailConnector {
11
+ constructor() {
12
+ this.stopped = false;
13
+ this.generation = 0;
14
+ this.stopController = new AbortController();
15
+ this.activeOperations = new Set();
16
+ }
17
+ get isConfigured() {
18
+ return Boolean(this.options);
19
+ }
20
+ configure(optionsArg) {
21
+ if (this.stopped) {
22
+ throw new Error('CoreMail connector has stopped.');
23
+ }
24
+ const options = this.normalizeOptions(optionsArg);
25
+ if (this.options) {
26
+ if (!this.optionsEqual(this.options, options)) {
27
+ throw new Error('CoreMail connector configuration is one-shot.');
28
+ }
29
+ return;
30
+ }
31
+ this.options = Object.freeze(options);
32
+ }
33
+ async init() {
34
+ await this.getAuthenticatedConnection();
35
+ }
36
+ async prepareOutboundSubmission(requestArg) {
37
+ const response = await this.fire('coreMailPrepareOutboundSubmission', {
38
+ idempotencyKey: requestArg.idempotencyKey,
39
+ message: plugins.servezoneInterfaces.data
40
+ .normalizeCoreMailOutboundMessageDescriptor(requestArg.message),
41
+ });
42
+ if (typeof response.replayed !== 'boolean') {
43
+ throw new Error('CoreMail returned an invalid replay state.');
44
+ }
45
+ return {
46
+ submission: plugins.servezoneInterfaces.data
47
+ .normalizeCoreMailSubmission(response.submission),
48
+ replayed: response.replayed,
49
+ };
50
+ }
51
+ async uploadOutboundPart(optionsArg) {
52
+ return await this.trackOperation(this.uploadOutboundPartInner(optionsArg));
53
+ }
54
+ async finalizeOutboundSubmission(submissionIdArg) {
55
+ const response = await this.fire('coreMailFinalizeOutboundSubmission', { submissionId: submissionIdArg });
56
+ return plugins.servezoneInterfaces.data
57
+ .normalizeCoreMailSubmission(response.submission);
58
+ }
59
+ async getOutboundSubmission(submissionIdArg) {
60
+ const response = await this.fire('coreMailGetOutboundSubmission', { submissionId: submissionIdArg });
61
+ return plugins.servezoneInterfaces.data
62
+ .normalizeCoreMailSubmission(response.submission);
63
+ }
64
+ async listInboundDeliveries(requestArg) {
65
+ const response = await this.fire('coreMailListInboundDeliveries', requestArg);
66
+ return plugins.servezoneInterfaces.data
67
+ .normalizeCoreMailInboundDeliveryPage(response);
68
+ }
69
+ async fetchInboundDelivery(deliveryArg) {
70
+ return await this.trackOperation(this.fetchInboundDeliveryInner(deliveryArg));
71
+ }
72
+ async acknowledgeInboundDelivery(requestArg) {
73
+ const response = await this.fire('coreMailAcknowledgeInboundDelivery', requestArg);
74
+ if (typeof response.replayed !== 'boolean') {
75
+ throw new Error('CoreMail returned an invalid acknowledgement replay state.');
76
+ }
77
+ return {
78
+ delivery: plugins.servezoneInterfaces.data
79
+ .normalizeCoreMailInboundDelivery(response.delivery),
80
+ replayed: response.replayed,
81
+ };
82
+ }
83
+ stop() {
84
+ this.stopPromise ??= this.stopInner();
85
+ return this.stopPromise;
86
+ }
87
+ normalizeOptions(optionsArg) {
88
+ const endpointUrl = new URL(optionsArg.endpointUrl);
89
+ if (optionsArg.endpointUrl.trim() !== optionsArg.endpointUrl
90
+ || endpointUrl.protocol !== 'https:'
91
+ || endpointUrl.username
92
+ || endpointUrl.password
93
+ || endpointUrl.search
94
+ || endpointUrl.hash
95
+ || endpointUrl.pathname !== '/socket'
96
+ || endpointUrl.toString() !== optionsArg.endpointUrl) {
97
+ throw new Error('CoreMail endpointUrl must be one canonical HTTPS /socket URL.');
98
+ }
99
+ for (const [name, value] of [
100
+ ['bindingId', optionsArg.bindingId],
101
+ ['credentialId', optionsArg.credentialId],
102
+ ]) {
103
+ if (typeof value !== 'string' || !identifierRegex.test(value)) {
104
+ throw new Error(`CoreMail ${name} must be canonical.`);
105
+ }
106
+ }
107
+ if (!Number.isSafeInteger(optionsArg.credentialVersion)
108
+ || optionsArg.credentialVersion < 1) {
109
+ throw new Error('CoreMail credentialVersion must be a positive integer.');
110
+ }
111
+ if (typeof optionsArg.credentialSecret !== 'string'
112
+ || optionsArg.credentialSecret.length < 32
113
+ || optionsArg.credentialSecret.length > 512) {
114
+ throw new Error('CoreMail credentialSecret must contain 32 to 512 characters.');
115
+ }
116
+ return {
117
+ endpointUrl: optionsArg.endpointUrl,
118
+ bindingId: optionsArg.bindingId,
119
+ credentialId: optionsArg.credentialId,
120
+ credentialVersion: optionsArg.credentialVersion,
121
+ credentialSecret: optionsArg.credentialSecret,
122
+ };
123
+ }
124
+ optionsEqual(leftArg, rightArg) {
125
+ return leftArg.endpointUrl === rightArg.endpointUrl
126
+ && leftArg.bindingId === rightArg.bindingId
127
+ && leftArg.credentialId === rightArg.credentialId
128
+ && leftArg.credentialVersion === rightArg.credentialVersion
129
+ && leftArg.credentialSecret === rightArg.credentialSecret;
130
+ }
131
+ requireOptions() {
132
+ if (this.stopped) {
133
+ throw this.createAbortError();
134
+ }
135
+ if (!this.options) {
136
+ throw new Error('CoreMail connector is not configured.');
137
+ }
138
+ return this.options;
139
+ }
140
+ async getAuthenticatedConnection() {
141
+ this.requireOptions();
142
+ if (this.connection
143
+ && this.connection.socket.getStatus() === 'connected') {
144
+ return this.connection;
145
+ }
146
+ if (this.pendingConnection) {
147
+ return await this.pendingConnection.promise;
148
+ }
149
+ const generation = ++this.generation;
150
+ const promise = this.connectAndAuthenticate(generation);
151
+ this.pendingConnection = { generation, promise };
152
+ try {
153
+ return await promise;
154
+ }
155
+ finally {
156
+ if (this.pendingConnection?.promise === promise) {
157
+ this.pendingConnection = undefined;
158
+ }
159
+ }
160
+ }
161
+ async connectAndAuthenticate(generationArg) {
162
+ const options = this.requireOptions();
163
+ let socket;
164
+ let statusSubscription;
165
+ let socketInvalidated = false;
166
+ try {
167
+ socket = await this.createSocket(options.endpointUrl);
168
+ this.assertGeneration(generationArg);
169
+ statusSubscription = socket.statusSubject.subscribe((statusArg) => {
170
+ if (statusArg !== 'connected') {
171
+ socketInvalidated = true;
172
+ this.invalidateConnection(socket, generationArg, statusSubscription);
173
+ }
174
+ });
175
+ const response = await this.trackOperation(socket.createTypedRequest('coreMailAuthenticateWorkload', undefined, {
176
+ timeoutMs: 4_500,
177
+ abortSignal: this.stopController.signal,
178
+ }).fire({
179
+ bindingId: options.bindingId,
180
+ credentialId: options.credentialId,
181
+ credentialVersion: options.credentialVersion,
182
+ credentialSecret: options.credentialSecret,
183
+ }));
184
+ this.assertGeneration(generationArg);
185
+ if (socket.getStatus() !== 'connected') {
186
+ throw new Error('CoreMail disconnected during authentication.');
187
+ }
188
+ const connection = {
189
+ generation: generationArg,
190
+ socket,
191
+ statusSubscription,
192
+ session: this.normalizeAuthenticationResponse(response, options),
193
+ };
194
+ this.connection = connection;
195
+ return connection;
196
+ }
197
+ catch (error) {
198
+ statusSubscription?.unsubscribe();
199
+ if (!socketInvalidated) {
200
+ await socket?.stop().catch(() => undefined);
201
+ }
202
+ throw error;
203
+ }
204
+ }
205
+ async createSocket(endpointUrlArg) {
206
+ return await plugins.typedsocket.TypedSocket.createClient(new plugins.typedrequest.TypedRouter(), endpointUrlArg, {
207
+ autoReconnect: false,
208
+ maxRetries: 0,
209
+ abortSignal: this.stopController.signal,
210
+ });
211
+ }
212
+ normalizeAuthenticationResponse(responseArg, optionsArg) {
213
+ if (!responseArg
214
+ || typeof responseArg !== 'object'
215
+ || Array.isArray(responseArg)
216
+ || JSON.stringify(Object.keys(responseArg).sort()) !== JSON.stringify([
217
+ 'allowedOperations',
218
+ 'authenticated',
219
+ 'bindingState',
220
+ 'capabilities',
221
+ 'coreMailTransferOrigin',
222
+ 'credentialId',
223
+ 'credentialVersion',
224
+ ])
225
+ || responseArg.authenticated !== true
226
+ || responseArg.credentialId !== optionsArg.credentialId
227
+ || responseArg.credentialVersion !== optionsArg.credentialVersion
228
+ || (responseArg.bindingState !== 'active' && responseArg.bindingState !== 'draining')
229
+ || !Array.isArray(responseArg.capabilities)
230
+ || responseArg.capabilities.some((entryArg) => entryArg !== 'outbound' && entryArg !== 'inbound')
231
+ || new Set(responseArg.capabilities).size !== responseArg.capabilities.length
232
+ || !Array.isArray(responseArg.allowedOperations)) {
233
+ throw new Error('CoreMail returned invalid workload authentication authority.');
234
+ }
235
+ const expectedOperations = plugins.servezoneInterfaces.data.resolveCoreMailWorkloadOperations(responseArg.bindingState, responseArg.capabilities);
236
+ if (JSON.stringify(responseArg.allowedOperations)
237
+ !== JSON.stringify(expectedOperations)) {
238
+ throw new Error('CoreMail returned inconsistent workload operations.');
239
+ }
240
+ return Object.freeze({
241
+ bindingState: responseArg.bindingState,
242
+ capabilities: Object.freeze([...responseArg.capabilities]),
243
+ allowedOperations: Object.freeze([...responseArg.allowedOperations]),
244
+ transferOrigin: this.normalizeTransferOrigin(responseArg.coreMailTransferOrigin),
245
+ });
246
+ }
247
+ normalizeTransferOrigin(valueArg) {
248
+ if (typeof valueArg !== 'string') {
249
+ throw new Error('CoreMail returned an invalid transfer origin.');
250
+ }
251
+ const url = new URL(valueArg);
252
+ if (url.protocol !== 'https:'
253
+ || url.username
254
+ || url.password
255
+ || url.search
256
+ || url.hash
257
+ || url.pathname !== '/'
258
+ || url.origin !== valueArg) {
259
+ throw new Error('CoreMail returned a noncanonical transfer origin.');
260
+ }
261
+ return valueArg;
262
+ }
263
+ async fire(methodArg, requestArg) {
264
+ const connection = await this.getAuthenticatedConnection();
265
+ if (!connection.session.allowedOperations.includes(methodArg)) {
266
+ throw new Error(`CoreMail operation ${methodArg} is unavailable.`);
267
+ }
268
+ const response = await this.trackOperation(connection.socket.createTypedRequest(methodArg, undefined, {
269
+ timeoutMs: 30_000,
270
+ abortSignal: this.stopController.signal,
271
+ }).fire(requestArg));
272
+ this.assertGeneration(connection.generation);
273
+ return response;
274
+ }
275
+ async prepareUploadGrant(submissionIdArg, partIdArg) {
276
+ const connection = await this.getAuthenticatedConnection();
277
+ const method = 'coreMailPrepareOutboundPartUpload';
278
+ if (!connection.session.allowedOperations.includes(method)) {
279
+ throw new Error(`CoreMail operation ${method} is unavailable.`);
280
+ }
281
+ const response = await this.trackOperation(connection.socket.createTypedRequest(method, undefined, {
282
+ timeoutMs: 30_000,
283
+ abortSignal: this.stopController.signal,
284
+ }).fire({ submissionId: submissionIdArg, partId: partIdArg }));
285
+ this.assertGeneration(connection.generation);
286
+ return {
287
+ grant: plugins.servezoneInterfaces.data.normalizeCoreMailUploadGrant(response.grant),
288
+ connection,
289
+ };
290
+ }
291
+ async uploadOutboundPartInner(optionsArg) {
292
+ if (!(optionsArg.bytes instanceof Uint8Array)) {
293
+ throw new Error('CoreMail outbound part bytes must be a Uint8Array.');
294
+ }
295
+ const expectedSha256 = plugins.servezoneInterfaces.data
296
+ .normalizeCoreMailSha256(optionsArg.part.sha256);
297
+ const actualSha256 = await this.createSha256(optionsArg.bytes);
298
+ if (optionsArg.bytes.byteLength !== optionsArg.part.lengthBytes
299
+ || actualSha256 !== expectedSha256) {
300
+ throw new Error('CoreMail outbound part bytes do not match their descriptor.');
301
+ }
302
+ let lastError;
303
+ for (let grantAttempt = 0; grantAttempt < 2; grantAttempt++) {
304
+ const { grant, connection } = await this.prepareUploadGrant(optionsArg.submissionId, optionsArg.part.partId);
305
+ this.assertUploadGrantContext(grant, optionsArg.part, connection);
306
+ let uploadError;
307
+ try {
308
+ await this.putTransfer(grant, connection.session.transferOrigin, optionsArg.bytes);
309
+ }
310
+ catch (errorArg) {
311
+ uploadError = errorArg;
312
+ }
313
+ let completionError;
314
+ for (let completionAttempt = 0; completionAttempt < 2; completionAttempt++) {
315
+ try {
316
+ const response = await this.fire('coreMailCompleteOutboundPartUpload', {
317
+ submissionId: optionsArg.submissionId,
318
+ partId: optionsArg.part.partId,
319
+ grantId: grant.grantId,
320
+ sha256: expectedSha256,
321
+ lengthBytes: optionsArg.bytes.byteLength,
322
+ });
323
+ return plugins.servezoneInterfaces.data
324
+ .normalizeCoreMailSubmission(response.submission);
325
+ }
326
+ catch (errorArg) {
327
+ completionError = errorArg;
328
+ if (!this.hasCoreMailErrorCode(errorArg, 'INVALID_REQUEST')) {
329
+ throw uploadError ?? errorArg;
330
+ }
331
+ if (completionAttempt === 0) {
332
+ await this.waitForDelay(25);
333
+ }
334
+ }
335
+ }
336
+ const current = await this.getOutboundSubmission(optionsArg.submissionId);
337
+ const part = current.parts.find((entryArg) => entryArg.partId === optionsArg.part.partId);
338
+ if (part?.state === 'complete') {
339
+ return current;
340
+ }
341
+ lastError = uploadError ?? completionError;
342
+ const uploadWasAmbiguous = uploadError instanceof CoreMailTransferError
343
+ && uploadError.ambiguous;
344
+ if (grantAttempt === 0
345
+ && (uploadWasAmbiguous || !uploadError)
346
+ && this.hasCoreMailErrorCode(completionError, 'INVALID_REQUEST')) {
347
+ continue;
348
+ }
349
+ throw lastError;
350
+ }
351
+ throw lastError ?? new Error('CoreMail outbound part upload failed.');
352
+ }
353
+ assertUploadGrantContext(grantArg, partArg, connectionArg) {
354
+ this.assertGeneration(connectionArg.generation);
355
+ this.resolveTransferUrl(grantArg, connectionArg.session.transferOrigin);
356
+ if (grantArg.method !== 'PUT'
357
+ || grantArg.sha256 !== partArg.sha256
358
+ || grantArg.lengthBytes !== partArg.lengthBytes
359
+ || grantArg.contentType !== partArg.contentType) {
360
+ throw new Error('CoreMail upload grant does not match the prepared part.');
361
+ }
362
+ }
363
+ async putTransfer(grantArg, transferOriginArg, bytesArg) {
364
+ await this.trackOperation(this.putTransferInner(grantArg, transferOriginArg, bytesArg));
365
+ }
366
+ async putTransferInner(grantArg, transferOriginArg, bytesArg) {
367
+ const deadline = this.createTransferDeadline(plugins.servezoneInterfaces.data.coreMailLimits.transferOverallTimeoutMs);
368
+ try {
369
+ let response;
370
+ try {
371
+ response = await this.fetchTransfer(this.resolveTransferUrl(grantArg, transferOriginArg), {
372
+ method: 'PUT',
373
+ headers: {
374
+ Authorization: `Bearer ${grantArg.bearerToken}`,
375
+ 'Content-Type': grantArg.contentType,
376
+ },
377
+ body: this.copyBytesToArrayBuffer(bytesArg),
378
+ cache: 'no-store',
379
+ credentials: 'omit',
380
+ redirect: 'error',
381
+ signal: deadline.controller.signal,
382
+ });
383
+ }
384
+ catch (error) {
385
+ if (deadline.controller.signal.aborted) {
386
+ throw deadline.controller.signal.reason || error;
387
+ }
388
+ throw new CoreMailTransferError('CoreMail upload response is ambiguous.', true);
389
+ }
390
+ if (response.status !== 204) {
391
+ await response.body?.cancel().catch(() => undefined);
392
+ throw new CoreMailTransferError(`CoreMail upload failed with HTTP ${response.status}.`, false);
393
+ }
394
+ }
395
+ finally {
396
+ deadline.cleanup();
397
+ }
398
+ }
399
+ async fetchInboundDeliveryInner(deliveryArg) {
400
+ const delivery = plugins.servezoneInterfaces.data
401
+ .normalizeCoreMailInboundDelivery(deliveryArg);
402
+ const connection = await this.getAuthenticatedConnection();
403
+ const method = 'coreMailPrepareInboundFetch';
404
+ if (!connection.session.allowedOperations.includes(method)) {
405
+ throw new Error(`CoreMail operation ${method} is unavailable.`);
406
+ }
407
+ const response = await this.trackOperation(connection.socket.createTypedRequest(method, undefined, {
408
+ timeoutMs: 30_000,
409
+ abortSignal: this.stopController.signal,
410
+ }).fire({ deliveryId: delivery.deliveryId }));
411
+ this.assertGeneration(connection.generation);
412
+ const grant = plugins.servezoneInterfaces.data
413
+ .normalizeCoreMailDownloadGrant(response.grant);
414
+ this.assertDownloadGrantContext(grant, delivery, connection);
415
+ const bytes = await this.getTransfer(grant, connection.session.transferOrigin);
416
+ const completed = await this.completeInboundFetchWithRetry(delivery, grant);
417
+ return { delivery: completed, bytes };
418
+ }
419
+ assertDownloadGrantContext(grantArg, deliveryArg, connectionArg) {
420
+ this.assertGeneration(connectionArg.generation);
421
+ this.resolveTransferUrl(grantArg, connectionArg.session.transferOrigin);
422
+ if (grantArg.method !== 'GET'
423
+ || grantArg.sha256 !== deliveryArg.rawMime.sha256
424
+ || grantArg.lengthBytes !== deliveryArg.rawMime.lengthBytes
425
+ || grantArg.contentType !== deliveryArg.rawMime.contentType) {
426
+ throw new Error('CoreMail download grant does not match the selected delivery.');
427
+ }
428
+ }
429
+ async getTransfer(grantArg, transferOriginArg) {
430
+ return await this.trackOperation(this.getTransferInner(grantArg, transferOriginArg));
431
+ }
432
+ async getTransferInner(grantArg, transferOriginArg) {
433
+ const deadline = this.createTransferDeadline(plugins.servezoneInterfaces.data.coreMailLimits.transferOverallTimeoutMs);
434
+ let headerTimeout = setTimeout(() => {
435
+ deadline.controller.abort(new Error('CoreMail transfer header timeout.'));
436
+ }, plugins.servezoneInterfaces.data.coreMailLimits.transferHeaderTimeoutMs);
437
+ let responseBody;
438
+ let reader;
439
+ let idleTimeout;
440
+ try {
441
+ const response = await this.fetchTransfer(this.resolveTransferUrl(grantArg, transferOriginArg), {
442
+ method: 'GET',
443
+ headers: { Authorization: `Bearer ${grantArg.bearerToken}` },
444
+ cache: 'no-store',
445
+ credentials: 'omit',
446
+ redirect: 'error',
447
+ signal: deadline.controller.signal,
448
+ });
449
+ clearTimeout(headerTimeout);
450
+ headerTimeout = undefined;
451
+ responseBody = response.body || undefined;
452
+ if (response.status !== 200
453
+ || response.headers.get('content-type') !== grantArg.contentType
454
+ || response.headers.get('content-length') !== String(grantArg.lengthBytes)
455
+ || response.headers.get('cache-control') !== 'no-store'
456
+ || response.headers.get('x-content-type-options') !== 'nosniff'
457
+ || !responseBody) {
458
+ throw new Error('CoreMail download response metadata is invalid.');
459
+ }
460
+ reader = responseBody.getReader();
461
+ const chunks = [];
462
+ let totalLength = 0;
463
+ const resetIdleTimeout = () => {
464
+ if (idleTimeout)
465
+ clearTimeout(idleTimeout);
466
+ idleTimeout = setTimeout(() => {
467
+ deadline.controller.abort(new Error('CoreMail transfer idle timeout.'));
468
+ }, plugins.servezoneInterfaces.data.coreMailLimits.transferIdleTimeoutMs);
469
+ };
470
+ resetIdleTimeout();
471
+ while (true) {
472
+ const result = await reader.read();
473
+ if (result.done)
474
+ break;
475
+ resetIdleTimeout();
476
+ totalLength += result.value.byteLength;
477
+ if (totalLength > grantArg.lengthBytes) {
478
+ throw new Error('CoreMail download exceeds its declared length.');
479
+ }
480
+ chunks.push(result.value);
481
+ }
482
+ if (idleTimeout)
483
+ clearTimeout(idleTimeout);
484
+ if (totalLength !== grantArg.lengthBytes) {
485
+ throw new Error('CoreMail download length does not match its grant.');
486
+ }
487
+ const bytes = new Uint8Array(totalLength);
488
+ let offset = 0;
489
+ for (const chunk of chunks) {
490
+ bytes.set(chunk, offset);
491
+ offset += chunk.byteLength;
492
+ }
493
+ if (await this.createSha256(bytes) !== grantArg.sha256) {
494
+ throw new Error('CoreMail download digest does not match its grant.');
495
+ }
496
+ return bytes;
497
+ }
498
+ catch (error) {
499
+ if (reader) {
500
+ await reader.cancel().catch(() => undefined);
501
+ }
502
+ else {
503
+ await responseBody?.cancel().catch(() => undefined);
504
+ }
505
+ throw error;
506
+ }
507
+ finally {
508
+ clearTimeout(headerTimeout);
509
+ if (idleTimeout)
510
+ clearTimeout(idleTimeout);
511
+ deadline.cleanup();
512
+ }
513
+ }
514
+ async completeInboundFetchWithRetry(deliveryArg, grantArg) {
515
+ let lastError;
516
+ for (let attempt = 0; attempt < 4; attempt++) {
517
+ try {
518
+ const response = await this.fire('coreMailCompleteInboundFetch', {
519
+ deliveryId: deliveryArg.deliveryId,
520
+ grantId: grantArg.grantId,
521
+ sha256: grantArg.sha256,
522
+ lengthBytes: grantArg.lengthBytes,
523
+ });
524
+ const delivery = plugins.servezoneInterfaces.data
525
+ .normalizeCoreMailInboundDelivery(response.delivery);
526
+ if (delivery.deliveryId !== deliveryArg.deliveryId) {
527
+ throw new Error('CoreMail completed another inbound delivery.');
528
+ }
529
+ return delivery;
530
+ }
531
+ catch (errorArg) {
532
+ lastError = errorArg;
533
+ if (attempt === 3
534
+ || !this.hasCoreMailErrorCode(errorArg, 'INVALID_REQUEST')) {
535
+ throw errorArg;
536
+ }
537
+ await this.waitForDelay(25 * (2 ** attempt));
538
+ }
539
+ }
540
+ throw lastError;
541
+ }
542
+ resolveTransferUrl(grantArg, transferOriginArg) {
543
+ const url = new URL(grantArg.path, transferOriginArg);
544
+ if (url.origin !== transferOriginArg
545
+ || url.pathname !== grantArg.path
546
+ || url.search
547
+ || url.hash) {
548
+ throw new Error('CoreMail transfer grant escapes its authenticated origin.');
549
+ }
550
+ return url.toString();
551
+ }
552
+ async createSha256(bytesArg) {
553
+ const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', this.copyBytesToArrayBuffer(bytesArg)));
554
+ return `sha256:${Array.from(digest)
555
+ .map((byteArg) => byteArg.toString(16).padStart(2, '0'))
556
+ .join('')}`;
557
+ }
558
+ copyBytesToArrayBuffer(bytesArg) {
559
+ const bytes = new Uint8Array(bytesArg.byteLength);
560
+ bytes.set(bytesArg);
561
+ return bytes.buffer;
562
+ }
563
+ async fetchTransfer(inputArg, initArg) {
564
+ return await globalThis.fetch(inputArg, initArg);
565
+ }
566
+ createTransferDeadline(timeoutMsArg) {
567
+ const controller = new AbortController();
568
+ const onStop = () => controller.abort(this.stopController.signal.reason);
569
+ if (this.stopController.signal.aborted) {
570
+ onStop();
571
+ }
572
+ else {
573
+ this.stopController.signal.addEventListener('abort', onStop, { once: true });
574
+ }
575
+ const timeout = setTimeout(() => {
576
+ controller.abort(new Error('CoreMail transfer overall timeout.'));
577
+ }, timeoutMsArg);
578
+ return {
579
+ controller,
580
+ cleanup: () => {
581
+ clearTimeout(timeout);
582
+ this.stopController.signal.removeEventListener('abort', onStop);
583
+ },
584
+ };
585
+ }
586
+ hasCoreMailErrorCode(errorArg, codeArg) {
587
+ if (!(errorArg instanceof plugins.typedrequest.TypedResponseError)) {
588
+ return false;
589
+ }
590
+ try {
591
+ return plugins.servezoneInterfaces.data
592
+ .normalizeCoreMailErrorData(errorArg.errorData).code === codeArg;
593
+ }
594
+ catch {
595
+ return false;
596
+ }
597
+ }
598
+ async waitForDelay(delayMsArg) {
599
+ if (this.stopController.signal.aborted)
600
+ throw this.createAbortError();
601
+ await this.trackOperation(new Promise((resolveArg, rejectArg) => {
602
+ const timeout = setTimeout(() => {
603
+ this.stopController.signal.removeEventListener('abort', onAbort);
604
+ resolveArg();
605
+ }, delayMsArg);
606
+ const onAbort = () => {
607
+ clearTimeout(timeout);
608
+ rejectArg(this.createAbortError());
609
+ };
610
+ this.stopController.signal.addEventListener('abort', onAbort, { once: true });
611
+ }));
612
+ }
613
+ invalidateConnection(socketArg, generationArg, subscriptionArg) {
614
+ const ownsConnection = this.connection?.socket === socketArg
615
+ && this.connection.generation === generationArg;
616
+ const ownsPending = this.pendingConnection?.generation === generationArg;
617
+ if (!ownsConnection && !ownsPending)
618
+ return;
619
+ this.generation++;
620
+ if (ownsConnection)
621
+ this.connection = undefined;
622
+ if (ownsPending)
623
+ this.pendingConnection = undefined;
624
+ subscriptionArg.unsubscribe();
625
+ void socketArg.stop().catch(() => undefined);
626
+ }
627
+ assertGeneration(generationArg) {
628
+ if (this.stopped || generationArg !== this.generation) {
629
+ throw this.createAbortError();
630
+ }
631
+ }
632
+ trackOperation(promiseArg) {
633
+ this.activeOperations.add(promiseArg);
634
+ return promiseArg.finally(() => {
635
+ this.activeOperations.delete(promiseArg);
636
+ });
637
+ }
638
+ async stopInner() {
639
+ this.stopped = true;
640
+ this.generation++;
641
+ this.stopController.abort(this.createAbortError());
642
+ const connection = this.connection;
643
+ const pendingConnection = this.pendingConnection;
644
+ this.connection = undefined;
645
+ this.pendingConnection = undefined;
646
+ connection?.statusSubscription.unsubscribe();
647
+ await Promise.allSettled([
648
+ connection?.socket.stop(),
649
+ pendingConnection?.promise.then(async (resultArg) => {
650
+ resultArg.statusSubscription.unsubscribe();
651
+ await resultArg.socket.stop();
652
+ }),
653
+ ...this.activeOperations,
654
+ ].filter(Boolean));
655
+ this.options = undefined;
656
+ }
657
+ createAbortError() {
658
+ const error = new Error('CoreMail connector operation aborted.');
659
+ error.name = 'AbortError';
660
+ return error;
661
+ }
662
+ }
663
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb3JlbWFpbGNvbm5lY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvcmVtYWlsL2NsYXNzZXMuY29yZW1haWxjb25uZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFtRHpDLE1BQU0scUJBQXNCLFNBQVEsS0FBSztJQUN2QyxZQUNFLFVBQWtCLEVBQ0YsU0FBa0I7UUFFbEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRkYsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUdsQyxJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVELE1BQU0sZUFBZSxHQUFHLHFEQUFxRCxDQUFDO0FBRTlFLE1BQU0sT0FBTyxtQkFBbUI7SUFBaEM7UUFFVSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFHTixtQkFBYyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDdkMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUE0MUJsRSxDQUFDO0lBejFCQyxJQUFXLFlBQVk7UUFDckIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBdUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFB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