@serve.zone/platformclient 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.platformclient.d.ts +8 -0
- package/dist_ts/classes.platformclient.js +42 -1
- package/dist_ts/coremail/classes.coremailconnector.d.ts +66 -0
- package/dist_ts/coremail/classes.coremailconnector.js +184 -4
- package/dist_ts/email/classes.emailconnector.d.ts +86 -1
- package/dist_ts/email/classes.emailconnector.js +537 -1
- package/package.json +7 -5
- package/readme.md +34 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.platformclient.ts +40 -0
- package/ts/coremail/classes.coremailconnector.ts +215 -3
- package/ts/email/classes.emailconnector.ts +651 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SzCoreMailConnector, } from '../coremail/classes.coremailconnector.js';
|
|
1
2
|
import * as plugins from '../plugins.js';
|
|
2
3
|
import { logger } from '../logger.js';
|
|
3
4
|
export class ServiceMailSubmissionError extends Error {
|
|
@@ -7,12 +8,81 @@ export class ServiceMailSubmissionError extends Error {
|
|
|
7
8
|
this.name = 'ServiceMailSubmissionError';
|
|
8
9
|
}
|
|
9
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* CoreMail error codes that @serve.zone/interfaces 30.13.0 also carries in
|
|
13
|
+
* TMailSubmissionErrorCode. These pass through by identity, so an application
|
|
14
|
+
* branching on ServiceMailSubmissionError.code sees the code CoreMail actually
|
|
15
|
+
* produced. Both entries of each pair are spelled out and the array is typed on
|
|
16
|
+
* both unions, so dropping a member from either side is a compile error here
|
|
17
|
+
* rather than a silent downgrade to the generic failure at runtime.
|
|
18
|
+
*/
|
|
19
|
+
const coreMailPassThroughErrorCodes = [
|
|
20
|
+
'AUTHENTICATION_FAILED',
|
|
21
|
+
'CAPABILITY_DENIED',
|
|
22
|
+
'INVALID_REQUEST',
|
|
23
|
+
'INVALID_MAILBOX',
|
|
24
|
+
'INVALID_SENDER',
|
|
25
|
+
'INVALID_RECIPIENT',
|
|
26
|
+
'INVALID_HEADER',
|
|
27
|
+
'PAYLOAD_LIMIT_EXCEEDED',
|
|
28
|
+
'QUOTA_EXCEEDED',
|
|
29
|
+
'IDEMPOTENCY_CONFLICT',
|
|
30
|
+
'STATE_CONFLICT',
|
|
31
|
+
'NOT_FOUND',
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Deliberate departures from identity. Empty since interfaces 30.13.0: the
|
|
35
|
+
* only former entry was INVALID_HEADER -> REPLY_TO_FIELD_HEADER_CONFLICT, which
|
|
36
|
+
* existed solely because INVALID_HEADER had no member of its own. It now has
|
|
37
|
+
* one, and remapping would describe a generic invalid-header rejection as a
|
|
38
|
+
* reply-to conflict. Kept as the declared seam so that if the two unions ever
|
|
39
|
+
* diverge again the exception has a documented home instead of being open-coded.
|
|
40
|
+
*/
|
|
41
|
+
const coreMailRemappedErrorCodes = {};
|
|
42
|
+
/**
|
|
43
|
+
* Resolves one CoreMail code onto the app-facing union, or undefined when the
|
|
44
|
+
* code has no representation there (the transfer, delivery, gateway and
|
|
45
|
+
* reconciliation families). Those become a generic Error carrying the code.
|
|
46
|
+
*/
|
|
47
|
+
const resolveSubmissionErrorCode = (codeArg) => {
|
|
48
|
+
const remapped = coreMailRemappedErrorCodes[codeArg];
|
|
49
|
+
if (remapped)
|
|
50
|
+
return remapped;
|
|
51
|
+
return coreMailPassThroughErrorCodes.find((candidateArg) => candidateArg === codeArg);
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* TCoreMailSubmissionState -> TMailSpoolStatus.
|
|
55
|
+
* 'accepted' | 'queued' | 'delivering' | 'delivered' | 'deferred' | 'failed' |
|
|
56
|
+
* 'deadLettered' exist verbatim in both unions and pass through. CoreMail's
|
|
57
|
+
* three pre-acceptance states ('preparing' | 'uploading' | 'ready') have no
|
|
58
|
+
* spool counterpart and collapse onto 'queued'; the spool-only 'rejected' is
|
|
59
|
+
* never produced by CoreMail.
|
|
60
|
+
*/
|
|
61
|
+
const coreMailStateToSpoolStatus = {
|
|
62
|
+
preparing: 'queued',
|
|
63
|
+
uploading: 'queued',
|
|
64
|
+
ready: 'queued',
|
|
65
|
+
accepted: 'accepted',
|
|
66
|
+
queued: 'queued',
|
|
67
|
+
delivering: 'delivering',
|
|
68
|
+
delivered: 'delivered',
|
|
69
|
+
deferred: 'deferred',
|
|
70
|
+
failed: 'failed',
|
|
71
|
+
deadLettered: 'deadLettered',
|
|
72
|
+
};
|
|
10
73
|
export class SzEmailConnector {
|
|
11
74
|
constructor(platformClientRefArg) {
|
|
12
75
|
this.mailRouter = new plugins.typedrequest.TypedRouter();
|
|
13
76
|
this.restorationOperations = new Set();
|
|
14
77
|
this.inboundTypedHandlerRegistered = false;
|
|
15
78
|
this.inboundEndpointRegistrations = new Set();
|
|
79
|
+
this.coreMailInboundPollOptions = {};
|
|
80
|
+
/**
|
|
81
|
+
* Connectors this email connector created and therefore owns, keyed by the
|
|
82
|
+
* value-free binding identity. The client's shared connector is never in here
|
|
83
|
+
* — it is owned by SzPlatformClient and stopped there.
|
|
84
|
+
*/
|
|
85
|
+
this.ownedCoreMailConnectors = new Map();
|
|
16
86
|
this.platformClientRef = platformClientRefArg;
|
|
17
87
|
}
|
|
18
88
|
/**
|
|
@@ -65,6 +135,36 @@ export class SzEmailConnector {
|
|
|
65
135
|
const fromMissing = env.from ? [] : [missingPrefix ? `MAIL_${missingPrefix}_FROM` : 'MAIL_FROM'];
|
|
66
136
|
const typedReady = fromMissing.length === 0 && typedMissing.length === 0;
|
|
67
137
|
const smtpReady = fromMissing.length === 0 && smtpMissing.length === 0;
|
|
138
|
+
// CoreMail outranks the dcrouter-direct transports when its group resolves.
|
|
139
|
+
const coreMailToken = useDefaultEnv ? undefined : token;
|
|
140
|
+
const scopedCoreMail = coreMailToken ? await this.readCoreMailEnv(coreMailToken) : undefined;
|
|
141
|
+
const hasScopedCoreMail = Boolean(scopedCoreMail && Object.values(scopedCoreMail).some(Boolean));
|
|
142
|
+
const coreMailEnv = hasScopedCoreMail ? scopedCoreMail : await this.readCoreMailEnv();
|
|
143
|
+
const coreMailPresent = Object.values(coreMailEnv).some(Boolean);
|
|
144
|
+
const coreMailMissing = coreMailPresent
|
|
145
|
+
? this.listMissingCoreMailEnvNames(coreMailEnv, hasScopedCoreMail ? coreMailToken : undefined)
|
|
146
|
+
: [];
|
|
147
|
+
const coreMailReady = coreMailPresent
|
|
148
|
+
&& coreMailMissing.length === 0
|
|
149
|
+
&& fromMissing.length === 0;
|
|
150
|
+
if (coreMailPresent) {
|
|
151
|
+
return {
|
|
152
|
+
ready: coreMailReady,
|
|
153
|
+
from: env.from,
|
|
154
|
+
host: env.smtpHost,
|
|
155
|
+
port,
|
|
156
|
+
tlsMode,
|
|
157
|
+
typedUrl: env.typedUrl,
|
|
158
|
+
transport: coreMailReady ? 'coremail' : smtpReady ? 'smtp' : 'none',
|
|
159
|
+
usernameConfigured: Boolean(env.smtpUsername),
|
|
160
|
+
passwordConfigured: Boolean(env.smtpPassword),
|
|
161
|
+
typedCredentialConfigured: Boolean(env.apiCredentialId && env.apiCredentialSecret),
|
|
162
|
+
coreMailConfigured: coreMailReady,
|
|
163
|
+
coreMailEndpointUrl: coreMailEnv.url,
|
|
164
|
+
smtpReady,
|
|
165
|
+
missing: coreMailReady ? [] : [...fromMissing, ...coreMailMissing],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
68
168
|
return {
|
|
69
169
|
ready: typedReady,
|
|
70
170
|
from: env.from,
|
|
@@ -126,6 +226,10 @@ export class SzEmailConnector {
|
|
|
126
226
|
logger.log('info', `service mail debug send: ${optionsArg.subject} to ${this.listToArray(optionsArg.to).join(', ')}`);
|
|
127
227
|
return { messageId: 'debug' };
|
|
128
228
|
}
|
|
229
|
+
const coreMailCredentials = await this.getCoreMailCredentials(optionsArg.from);
|
|
230
|
+
if (coreMailCredentials) {
|
|
231
|
+
return await this.sendMailViaCoreMail(optionsArg, coreMailCredentials);
|
|
232
|
+
}
|
|
129
233
|
const credentials = await this.getServiceMailTypedCredentials(optionsArg.from);
|
|
130
234
|
const typedSocket = await this.getMailTypedSocket(credentials.typedUrl);
|
|
131
235
|
const request = typedSocket.createTypedRequest('enqueueMail');
|
|
@@ -168,11 +272,183 @@ export class SzEmailConnector {
|
|
|
168
272
|
response: result.message,
|
|
169
273
|
};
|
|
170
274
|
}
|
|
275
|
+
async createCoreMailSha256(bytesArg) {
|
|
276
|
+
const source = new Uint8Array(bytesArg.byteLength);
|
|
277
|
+
source.set(bytesArg);
|
|
278
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', source.buffer));
|
|
279
|
+
return `sha256:${Array.from(digest)
|
|
280
|
+
.map((byteArg) => byteArg.toString(16).padStart(2, '0'))
|
|
281
|
+
.join('')}`;
|
|
282
|
+
}
|
|
283
|
+
toCoreMailMailbox(addressArg) {
|
|
284
|
+
const address = String(addressArg || '').trim();
|
|
285
|
+
if (!address)
|
|
286
|
+
throw new Error('CoreMail recipients must be non-empty addresses');
|
|
287
|
+
return { address };
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Bodies and attachments become uploadable parts. CoreMail owns the MIME
|
|
291
|
+
* framing, so text/html/attachments are separate descriptors rather than one
|
|
292
|
+
* serialized message, and every descriptor carries a client-computed digest.
|
|
293
|
+
*/
|
|
294
|
+
async buildCoreMailParts(optionsArg) {
|
|
295
|
+
const limits = plugins.servezoneInterfaces.data.coreMailLimits;
|
|
296
|
+
const encoder = new TextEncoder();
|
|
297
|
+
const parts = [];
|
|
298
|
+
const pushPart = async (partIdArg, kindArg, contentTypeArg, bytesArg, filenameArg) => {
|
|
299
|
+
parts.push({
|
|
300
|
+
descriptor: {
|
|
301
|
+
partId: partIdArg,
|
|
302
|
+
kind: kindArg,
|
|
303
|
+
contentType: contentTypeArg,
|
|
304
|
+
...(filenameArg ? { filename: filenameArg } : {}),
|
|
305
|
+
sha256: await this.createCoreMailSha256(bytesArg),
|
|
306
|
+
lengthBytes: bytesArg.byteLength,
|
|
307
|
+
},
|
|
308
|
+
bytes: bytesArg,
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
if (optionsArg.text) {
|
|
312
|
+
const bytes = encoder.encode(optionsArg.text);
|
|
313
|
+
if (bytes.byteLength > limits.textPartBytes) {
|
|
314
|
+
throw new Error(`CoreMail text part exceeds ${limits.textPartBytes} bytes`);
|
|
315
|
+
}
|
|
316
|
+
await pushPart('text', 'text', 'text/plain; charset=utf-8', bytes);
|
|
317
|
+
}
|
|
318
|
+
if (optionsArg.html) {
|
|
319
|
+
const bytes = encoder.encode(optionsArg.html);
|
|
320
|
+
if (bytes.byteLength > limits.htmlPartBytes) {
|
|
321
|
+
throw new Error(`CoreMail html part exceeds ${limits.htmlPartBytes} bytes`);
|
|
322
|
+
}
|
|
323
|
+
await pushPart('html', 'html', 'text/html; charset=utf-8', bytes);
|
|
324
|
+
}
|
|
325
|
+
const attachments = optionsArg.attachments || [];
|
|
326
|
+
if (attachments.length > limits.attachmentCount) {
|
|
327
|
+
throw new Error(`CoreMail accepts at most ${limits.attachmentCount} attachments`);
|
|
328
|
+
}
|
|
329
|
+
let aggregateBytes = 0;
|
|
330
|
+
for (const [index, attachment] of attachments.entries()) {
|
|
331
|
+
const bytes = typeof attachment.content === 'string'
|
|
332
|
+
? encoder.encode(attachment.content)
|
|
333
|
+
: attachment.content;
|
|
334
|
+
if (bytes.byteLength > limits.attachmentBytes) {
|
|
335
|
+
throw new Error(`CoreMail attachment ${attachment.filename} exceeds ${limits.attachmentBytes} bytes`);
|
|
336
|
+
}
|
|
337
|
+
aggregateBytes += bytes.byteLength;
|
|
338
|
+
if (aggregateBytes > limits.aggregateAttachmentBytes) {
|
|
339
|
+
throw new Error(`CoreMail attachments exceed ${limits.aggregateAttachmentBytes} aggregate bytes`);
|
|
340
|
+
}
|
|
341
|
+
await pushPart(`attachment-${index}`, 'attachment', attachment.contentType || 'application/octet-stream', bytes, attachment.filename);
|
|
342
|
+
}
|
|
343
|
+
if (parts.length === 0) {
|
|
344
|
+
throw new Error('Either text or html is required for service mail');
|
|
345
|
+
}
|
|
346
|
+
return parts;
|
|
347
|
+
}
|
|
348
|
+
buildCoreMailDescriptor(optionsArg, credentialsArg, partsArg) {
|
|
349
|
+
const limits = plugins.servezoneInterfaces.data.coreMailLimits;
|
|
350
|
+
const to = this.listToArray(optionsArg.to).map((addressArg) => this.toCoreMailMailbox(addressArg));
|
|
351
|
+
const cc = optionsArg.cc
|
|
352
|
+
? this.listToArray(optionsArg.cc).map((addressArg) => this.toCoreMailMailbox(addressArg))
|
|
353
|
+
: undefined;
|
|
354
|
+
const bcc = optionsArg.bcc
|
|
355
|
+
? this.listToArray(optionsArg.bcc).map((addressArg) => this.toCoreMailMailbox(addressArg))
|
|
356
|
+
: undefined;
|
|
357
|
+
const recipientCount = to.length + (cc?.length || 0) + (bcc?.length || 0);
|
|
358
|
+
if (to.length === 0)
|
|
359
|
+
throw new Error('CoreMail requires at least one To recipient');
|
|
360
|
+
if (recipientCount > limits.recipientCount) {
|
|
361
|
+
throw new Error(`CoreMail accepts at most ${limits.recipientCount} recipients`);
|
|
362
|
+
}
|
|
363
|
+
// Ordered header list; CoreMail rejects transport-owned MIME headers itself.
|
|
364
|
+
const headers = optionsArg.headers
|
|
365
|
+
? Object.entries(optionsArg.headers).map(([nameArg, valueArg]) => ({
|
|
366
|
+
name: nameArg,
|
|
367
|
+
value: String(valueArg),
|
|
368
|
+
}))
|
|
369
|
+
: undefined;
|
|
370
|
+
return {
|
|
371
|
+
sender: this.toCoreMailMailbox(credentialsArg.from),
|
|
372
|
+
recipients: { to, ...(cc ? { cc } : {}), ...(bcc ? { bcc } : {}) },
|
|
373
|
+
...(optionsArg.replyTo !== undefined
|
|
374
|
+
? { replyTo: this.toCoreMailMailbox(optionsArg.replyTo) }
|
|
375
|
+
: {}),
|
|
376
|
+
subject: optionsArg.subject,
|
|
377
|
+
...(headers ? { headers } : {}),
|
|
378
|
+
parts: partsArg,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/** Re-throws a CoreMail failure on the app-facing error surface. */
|
|
382
|
+
translateCoreMailError(errorArg) {
|
|
383
|
+
const data = errorArg?.data;
|
|
384
|
+
const code = data?.code;
|
|
385
|
+
const message = errorArg?.message || 'CoreMail rejected the submission';
|
|
386
|
+
if (code) {
|
|
387
|
+
const mapped = resolveSubmissionErrorCode(code);
|
|
388
|
+
if (mapped)
|
|
389
|
+
throw new ServiceMailSubmissionError(mapped, message);
|
|
390
|
+
throw new Error(`CoreMail ${code}: ${message}`);
|
|
391
|
+
}
|
|
392
|
+
throw errorArg instanceof Error ? errorArg : new Error(message);
|
|
393
|
+
}
|
|
394
|
+
async sendMailViaCoreMail(optionsArg, credentialsArg) {
|
|
395
|
+
const connector = this.getConfiguredCoreMailConnector(credentialsArg);
|
|
396
|
+
const parts = await this.buildCoreMailParts(optionsArg);
|
|
397
|
+
const descriptor = this.buildCoreMailDescriptor(optionsArg, credentialsArg, parts.map((partArg) => partArg.descriptor));
|
|
398
|
+
try {
|
|
399
|
+
const prepared = await connector.prepareOutboundSubmission({
|
|
400
|
+
// CoreMail requires a replay key; IServiceMailSendOptions leaves it
|
|
401
|
+
// optional because the dcrouter path treats an omitted key as "no
|
|
402
|
+
// replay protection". A fresh random key per call reproduces exactly
|
|
403
|
+
// that semantic without weakening a key the caller did supply.
|
|
404
|
+
idempotencyKey: optionsArg.idempotencyKey || globalThis.crypto.randomUUID(),
|
|
405
|
+
message: descriptor,
|
|
406
|
+
});
|
|
407
|
+
let submission = prepared.submission;
|
|
408
|
+
if (!prepared.replayed) {
|
|
409
|
+
for (const part of parts) {
|
|
410
|
+
submission = await connector.uploadOutboundPart({
|
|
411
|
+
submissionId: submission.submissionId,
|
|
412
|
+
part: part.descriptor,
|
|
413
|
+
bytes: part.bytes,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
submission = await connector.finalizeOutboundSubmission(submission.submissionId);
|
|
417
|
+
}
|
|
418
|
+
const recipients = [
|
|
419
|
+
...this.listToArray(optionsArg.to),
|
|
420
|
+
...(optionsArg.cc ? this.listToArray(optionsArg.cc) : []),
|
|
421
|
+
...(optionsArg.bcc ? this.listToArray(optionsArg.bcc) : []),
|
|
422
|
+
];
|
|
423
|
+
return {
|
|
424
|
+
messageId: submission.submissionId,
|
|
425
|
+
spoolItemId: submission.submissionId,
|
|
426
|
+
accepted: recipients,
|
|
427
|
+
rejected: [],
|
|
428
|
+
response: submission.state,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
this.translateCoreMailError(error);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
171
435
|
async getMailDeliveryStatus(spoolItemIdArg, addressArg) {
|
|
172
436
|
const spoolItemId = String(spoolItemIdArg || '').trim();
|
|
173
437
|
if (!spoolItemId) {
|
|
174
438
|
throw new Error('spoolItemId is required');
|
|
175
439
|
}
|
|
440
|
+
const coreMailCredentials = await this.getCoreMailCredentials(addressArg);
|
|
441
|
+
if (coreMailCredentials) {
|
|
442
|
+
const connector = this.getConfiguredCoreMailConnector(coreMailCredentials);
|
|
443
|
+
let submission;
|
|
444
|
+
try {
|
|
445
|
+
submission = await connector.getOutboundSubmission(spoolItemId);
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
this.translateCoreMailError(error);
|
|
449
|
+
}
|
|
450
|
+
return this.toMailDeliveryStatus(submission, coreMailCredentials);
|
|
451
|
+
}
|
|
176
452
|
const credentials = await this.getServiceMailTypedCredentials(addressArg);
|
|
177
453
|
const typedSocket = await this.getMailTypedSocket(credentials.typedUrl);
|
|
178
454
|
const request = typedSocket.createTypedRequest('getMailDeliveryStatus');
|
|
@@ -184,8 +460,67 @@ export class SzEmailConnector {
|
|
|
184
460
|
spoolItemId,
|
|
185
461
|
});
|
|
186
462
|
}
|
|
463
|
+
/**
|
|
464
|
+
* Projects one CoreMail submission onto the dcrouter delivery-status shape.
|
|
465
|
+
* CoreMail keeps no per-attempt journal, so `attempts` carries at most one
|
|
466
|
+
* synthesized entry describing the current state, and `bounceEvents` stays
|
|
467
|
+
* empty; `spoolItem.attempts` is CoreMail's own attempt counter.
|
|
468
|
+
*/
|
|
469
|
+
toMailDeliveryStatus(submissionArg, credentialsArg) {
|
|
470
|
+
const status = coreMailStateToSpoolStatus[submissionArg.state];
|
|
471
|
+
// CoreMail fronts dcrouter, which performs the actual MTA relay; there is
|
|
472
|
+
// no 'coremail' member in TMailDeliveryTargetType.
|
|
473
|
+
const target = {
|
|
474
|
+
type: 'mtaRelay',
|
|
475
|
+
label: 'coremail',
|
|
476
|
+
url: credentialsArg.endpointUrl,
|
|
477
|
+
};
|
|
478
|
+
return {
|
|
479
|
+
spoolItem: {
|
|
480
|
+
id: submissionArg.submissionId,
|
|
481
|
+
direction: 'outbound',
|
|
482
|
+
status,
|
|
483
|
+
envelope: { mailFrom: credentialsArg.from, rcptTo: [] },
|
|
484
|
+
messageId: submissionArg.transportMessageId,
|
|
485
|
+
target,
|
|
486
|
+
attempts: submissionArg.attempts,
|
|
487
|
+
nextAttemptAt: submissionArg.nextAttemptAt,
|
|
488
|
+
lastError: submissionArg.error
|
|
489
|
+
? `CoreMail ${submissionArg.error.code}`
|
|
490
|
+
: undefined,
|
|
491
|
+
createdAt: submissionArg.createdAt,
|
|
492
|
+
updatedAt: submissionArg.updatedAt,
|
|
493
|
+
},
|
|
494
|
+
attempts: submissionArg.attempts > 0
|
|
495
|
+
? [{
|
|
496
|
+
id: `${submissionArg.submissionId}:${submissionArg.attempts}`,
|
|
497
|
+
spoolItemId: submissionArg.submissionId,
|
|
498
|
+
target,
|
|
499
|
+
status,
|
|
500
|
+
startedAt: submissionArg.acceptedAt || submissionArg.createdAt,
|
|
501
|
+
completedAt: submissionArg.deliveredAt || submissionArg.terminalAt,
|
|
502
|
+
response: submissionArg.error ? submissionArg.error.code : undefined,
|
|
503
|
+
}]
|
|
504
|
+
: [],
|
|
505
|
+
bounceEvents: [],
|
|
506
|
+
};
|
|
507
|
+
}
|
|
187
508
|
async registerInboundHandler(handlerArg, addressArg) {
|
|
188
509
|
this.inboundHandler = handlerArg;
|
|
510
|
+
const coreMailCredentials = await this.getCoreMailCredentials(addressArg);
|
|
511
|
+
if (coreMailCredentials) {
|
|
512
|
+
const connector = this.getConfiguredCoreMailConnector(coreMailCredentials);
|
|
513
|
+
connector.startInboundPolling(async (fetchedArg) => {
|
|
514
|
+
const message = this.normalizeInboundMessage(this.toInboundDeliveryPayload(fetchedArg));
|
|
515
|
+
const result = await handlerArg(message);
|
|
516
|
+
// A handler that declines must not acknowledge the delivery as processed.
|
|
517
|
+
if (result && result.accepted === false) {
|
|
518
|
+
throw new Error(result.message || 'Service mail inbound handler declined the delivery');
|
|
519
|
+
}
|
|
520
|
+
}, this.coreMailInboundPollOptions);
|
|
521
|
+
this.inboundEndpointRegistrations.add(coreMailCredentials.from);
|
|
522
|
+
return { success: true, addresses: [coreMailCredentials.from] };
|
|
523
|
+
}
|
|
189
524
|
this.ensureInboundTypedHandler();
|
|
190
525
|
const credentials = await this.getServiceMailTypedCredentials(addressArg);
|
|
191
526
|
const typedSocket = await this.getMailTypedSocket(credentials.typedUrl);
|
|
@@ -194,10 +529,83 @@ export class SzEmailConnector {
|
|
|
194
529
|
return result;
|
|
195
530
|
}
|
|
196
531
|
async stop() {
|
|
532
|
+
// The mail socket this connector owns is released first; the CoreMail pull
|
|
533
|
+
// loop is released afterwards so stopping order stays observable to callers.
|
|
197
534
|
await this.stopMailTypedSocket();
|
|
535
|
+
// The shared connector belongs to SzPlatformClient, so only its pull loop is
|
|
536
|
+
// released here; connectors this instance created are stopped outright.
|
|
537
|
+
await this.platformClientRef.coreMailConnector.stopInboundPolling();
|
|
538
|
+
const ownedConnectors = [...this.ownedCoreMailConnectors.values()];
|
|
539
|
+
this.ownedCoreMailConnectors.clear();
|
|
540
|
+
await Promise.allSettled(ownedConnectors.map((connectorArg) => connectorArg.stop()));
|
|
198
541
|
while (this.restorationOperations.size)
|
|
199
542
|
await Promise.allSettled([...this.restorationOperations]);
|
|
200
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* Tunes the CoreMail pull loop before registerInboundHandler starts it.
|
|
546
|
+
* CoreMail never pushes, so cadence is a client-side choice.
|
|
547
|
+
*/
|
|
548
|
+
setCoreMailInboundPollOptions(optionsArg) {
|
|
549
|
+
this.coreMailInboundPollOptions = { ...optionsArg };
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Projects one fetched CoreMail delivery onto the same payload shape dcrouter
|
|
553
|
+
* sends to deliverInboundMail, so both transports reach the app handler
|
|
554
|
+
* through normalizeInboundMessage unchanged.
|
|
555
|
+
*/
|
|
556
|
+
toInboundDeliveryPayload(fetchedArg) {
|
|
557
|
+
const rawMessage = new TextDecoder().decode(fetchedArg.bytes);
|
|
558
|
+
return {
|
|
559
|
+
spoolItemId: fetchedArg.delivery.deliveryId,
|
|
560
|
+
envelope: {
|
|
561
|
+
mailFrom: fetchedArg.delivery.envelope.mailFrom,
|
|
562
|
+
rcptTo: fetchedArg.delivery.envelope.rcptTo,
|
|
563
|
+
},
|
|
564
|
+
rawMessage,
|
|
565
|
+
sizeBytes: fetchedArg.delivery.rawMime.lengthBytes,
|
|
566
|
+
messageId: fetchedArg.delivery.messageId,
|
|
567
|
+
subject: fetchedArg.delivery.subject,
|
|
568
|
+
headers: this.extractInboundHeaders(rawMessage),
|
|
569
|
+
receivedAt: fetchedArg.delivery.receivedAt,
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* RFC 5322 header-block extraction over the fetched MIME. Mirrors the
|
|
574
|
+
* projection dcrouter performs before deliverInboundMail so both transports
|
|
575
|
+
* hand the app the same `headers` record: unfold continuation lines, repeat
|
|
576
|
+
* names collapse into an array. Bodies are not parsed — the inbound contract
|
|
577
|
+
* carries `rawMessage`, not decoded text/html/attachments.
|
|
578
|
+
*/
|
|
579
|
+
extractInboundHeaders(rawMessageArg) {
|
|
580
|
+
const headers = {};
|
|
581
|
+
const headerText = rawMessageArg.split(/\r?\n\r?\n/, 1)[0] || '';
|
|
582
|
+
let currentHeader = '';
|
|
583
|
+
for (const line of headerText.split(/\r?\n/)) {
|
|
584
|
+
if (/^[\t ]/.test(line) && currentHeader) {
|
|
585
|
+
const existing = headers[currentHeader];
|
|
586
|
+
const base = Array.isArray(existing) ? existing[existing.length - 1] : existing;
|
|
587
|
+
const folded = `${base || ''} ${line.trim()}`;
|
|
588
|
+
if (Array.isArray(existing))
|
|
589
|
+
existing[existing.length - 1] = folded;
|
|
590
|
+
else
|
|
591
|
+
headers[currentHeader] = folded;
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
const separatorIndex = line.indexOf(':');
|
|
595
|
+
if (separatorIndex < 1)
|
|
596
|
+
continue;
|
|
597
|
+
currentHeader = line.slice(0, separatorIndex).trim();
|
|
598
|
+
const value = line.slice(separatorIndex + 1).trim();
|
|
599
|
+
const existing = headers[currentHeader];
|
|
600
|
+
if (Array.isArray(existing))
|
|
601
|
+
existing.push(value);
|
|
602
|
+
else if (existing !== undefined)
|
|
603
|
+
headers[currentHeader] = [String(existing), value];
|
|
604
|
+
else
|
|
605
|
+
headers[currentHeader] = value;
|
|
606
|
+
}
|
|
607
|
+
return headers;
|
|
608
|
+
}
|
|
201
609
|
normalizeInboundMessage(payloadArg) {
|
|
202
610
|
const payload = this.asRecord(payloadArg);
|
|
203
611
|
const deliveryCandidate = this.asRecord(payload.delivery || payload.message || payload);
|
|
@@ -249,6 +657,134 @@ export class SzEmailConnector {
|
|
|
249
657
|
}
|
|
250
658
|
async sendNotification(optionsArg) { }
|
|
251
659
|
async sendActionLink(optionsArg) { }
|
|
660
|
+
/**
|
|
661
|
+
* Env names for one CoreMail binding. Unscoped names use the MAIL_COREMAIL_
|
|
662
|
+
* prefix; per-address names insert the same token readMailEnv uses.
|
|
663
|
+
*/
|
|
664
|
+
getCoreMailEnvNames(tokenArg) {
|
|
665
|
+
const prefix = tokenArg ? `MAIL_${tokenArg}_COREMAIL_` : 'MAIL_COREMAIL_';
|
|
666
|
+
return {
|
|
667
|
+
url: `${prefix}URL`,
|
|
668
|
+
bindingId: `${prefix}BINDING_ID`,
|
|
669
|
+
credentialId: `${prefix}CREDENTIAL_ID`,
|
|
670
|
+
credentialVersion: `${prefix}CREDENTIAL_VERSION`,
|
|
671
|
+
credentialSecret: `${prefix}CREDENTIAL_SECRET`,
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
async readCoreMailEnv(tokenArg) {
|
|
675
|
+
const names = this.getCoreMailEnvNames(tokenArg);
|
|
676
|
+
return {
|
|
677
|
+
url: await this.readMailEnvVar(names.url),
|
|
678
|
+
bindingId: await this.readMailEnvVar(names.bindingId),
|
|
679
|
+
credentialId: await this.readMailEnvVar(names.credentialId),
|
|
680
|
+
credentialVersion: await this.readMailEnvVar(names.credentialVersion),
|
|
681
|
+
credentialSecret: await this.readMailEnvVar(names.credentialSecret),
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
listMissingCoreMailEnvNames(envArg, tokenArg) {
|
|
685
|
+
const names = this.getCoreMailEnvNames(tokenArg);
|
|
686
|
+
const missing = [];
|
|
687
|
+
if (!envArg.url)
|
|
688
|
+
missing.push(names.url);
|
|
689
|
+
if (!envArg.bindingId)
|
|
690
|
+
missing.push(names.bindingId);
|
|
691
|
+
if (!envArg.credentialId)
|
|
692
|
+
missing.push(names.credentialId);
|
|
693
|
+
if (!envArg.credentialVersion)
|
|
694
|
+
missing.push(names.credentialVersion);
|
|
695
|
+
if (!envArg.credentialSecret)
|
|
696
|
+
missing.push(names.credentialSecret);
|
|
697
|
+
return missing;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Resolves the CoreMail group for one address. Scoped values win wholesale,
|
|
701
|
+
* exactly like readMailEnv: if any MAIL_<TOKEN>_COREMAIL_* value is present
|
|
702
|
+
* the scoped group is used on its own and the unscoped group is not consulted.
|
|
703
|
+
* Returns undefined when no CoreMail value is configured at all; a partially
|
|
704
|
+
* configured group throws instead of silently falling back to dcrouter.
|
|
705
|
+
*/
|
|
706
|
+
async getCoreMailCredentials(addressArg) {
|
|
707
|
+
const requestedAddress = addressArg?.trim().toLowerCase();
|
|
708
|
+
const requestedToken = requestedAddress ? this.getMailEnvToken(requestedAddress) : undefined;
|
|
709
|
+
const scopedCoreMail = requestedToken ? await this.readCoreMailEnv(requestedToken) : undefined;
|
|
710
|
+
const hasScopedCoreMail = Boolean(scopedCoreMail && Object.values(scopedCoreMail).some(Boolean));
|
|
711
|
+
const coreMailEnv = hasScopedCoreMail ? scopedCoreMail : await this.readCoreMailEnv();
|
|
712
|
+
if (!Object.values(coreMailEnv).some(Boolean))
|
|
713
|
+
return undefined;
|
|
714
|
+
const token = hasScopedCoreMail ? requestedToken : undefined;
|
|
715
|
+
const missing = this.listMissingCoreMailEnvNames(coreMailEnv, token);
|
|
716
|
+
if (missing.length > 0) {
|
|
717
|
+
throw new Error(`CoreMail service mail is partially configured. Missing: ${missing.join(', ')}`);
|
|
718
|
+
}
|
|
719
|
+
// The From address follows the same scoped-wins rule as the typed path.
|
|
720
|
+
const addressEnv = hasScopedCoreMail ? await this.readMailEnv(requestedToken) : undefined;
|
|
721
|
+
const env = addressEnv && Object.values(addressEnv).some(Boolean)
|
|
722
|
+
? addressEnv
|
|
723
|
+
: await this.readMailEnv();
|
|
724
|
+
const from = env.from?.trim().toLowerCase();
|
|
725
|
+
if (!from) {
|
|
726
|
+
throw new Error(`${token ? `MAIL_${token}_FROM` : 'MAIL_FROM'} is required for CoreMail service mail`);
|
|
727
|
+
}
|
|
728
|
+
if (requestedAddress && from !== requestedAddress) {
|
|
729
|
+
throw new Error(`No CoreMail service mail credentials are configured for ${requestedAddress}`);
|
|
730
|
+
}
|
|
731
|
+
const credentialVersion = Number(coreMailEnv.credentialVersion);
|
|
732
|
+
if (!Number.isSafeInteger(credentialVersion) || credentialVersion < 1) {
|
|
733
|
+
throw new Error(`${this.getCoreMailEnvNames(token).credentialVersion} must be a positive integer`);
|
|
734
|
+
}
|
|
735
|
+
return {
|
|
736
|
+
from,
|
|
737
|
+
endpointUrl: coreMailEnv.url,
|
|
738
|
+
bindingId: coreMailEnv.bindingId,
|
|
739
|
+
credentialId: coreMailEnv.credentialId,
|
|
740
|
+
credentialVersion,
|
|
741
|
+
credentialSecret: coreMailEnv.credentialSecret,
|
|
742
|
+
addressToken: token,
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
/** Value-free key identifying one CoreMail binding; never includes the secret. */
|
|
746
|
+
getCoreMailConnectorKey(bindingArg) {
|
|
747
|
+
return JSON.stringify([
|
|
748
|
+
bindingArg.endpointUrl,
|
|
749
|
+
bindingArg.bindingId,
|
|
750
|
+
bindingArg.credentialId,
|
|
751
|
+
bindingArg.credentialVersion,
|
|
752
|
+
]);
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Returns the connector that serves this address's binding.
|
|
756
|
+
*
|
|
757
|
+
* SzCoreMailConnector.configure() is one-shot, and a service may hold several
|
|
758
|
+
* bindings at once (an unscoped MAIL_COREMAIL_* group plus per-address
|
|
759
|
+
* MAIL_<TOKEN>_COREMAIL_* groups). One shared instance therefore cannot serve
|
|
760
|
+
* them all: the client's shared connector is reused only while it is still
|
|
761
|
+
* unconfigured or already configured for this exact binding, and every other
|
|
762
|
+
* binding gets a dedicated instance owned and stopped by this email connector.
|
|
763
|
+
*/
|
|
764
|
+
getConfiguredCoreMailConnector(credentialsArg) {
|
|
765
|
+
const options = {
|
|
766
|
+
endpointUrl: credentialsArg.endpointUrl,
|
|
767
|
+
bindingId: credentialsArg.bindingId,
|
|
768
|
+
credentialId: credentialsArg.credentialId,
|
|
769
|
+
credentialVersion: credentialsArg.credentialVersion,
|
|
770
|
+
credentialSecret: credentialsArg.credentialSecret,
|
|
771
|
+
};
|
|
772
|
+
const requestedKey = this.getCoreMailConnectorKey(options);
|
|
773
|
+
const shared = this.platformClientRef.coreMailConnector;
|
|
774
|
+
const sharedBinding = shared.configuredBinding;
|
|
775
|
+
if (!sharedBinding || this.getCoreMailConnectorKey(sharedBinding) === requestedKey) {
|
|
776
|
+
// Unconfigured: adopt it. Already this binding: configure() is a no-op.
|
|
777
|
+
shared.configure(options);
|
|
778
|
+
return shared;
|
|
779
|
+
}
|
|
780
|
+
const owned = this.ownedCoreMailConnectors.get(requestedKey);
|
|
781
|
+
if (owned)
|
|
782
|
+
return owned;
|
|
783
|
+
const connector = new SzCoreMailConnector();
|
|
784
|
+
connector.configure(options);
|
|
785
|
+
this.ownedCoreMailConnectors.set(requestedKey, connector);
|
|
786
|
+
return connector;
|
|
787
|
+
}
|
|
252
788
|
async readMailEnv(tokenArg) {
|
|
253
789
|
const prefix = tokenArg ? `MAIL_${tokenArg}_` : '';
|
|
254
790
|
return {
|
|
@@ -430,4 +966,4 @@ export class SzEmailConnector {
|
|
|
430
966
|
}
|
|
431
967
|
}
|
|
432
968
|
}
|
|
433
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWFpbGNvbm5lY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2VtYWlsL2NsYXNzZXMuZW1haWxjb25uZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQThEdEMsTUFBTSxPQUFPLDBCQUEyQixTQUFRLEtBQUs7SUFDbkQsWUFDa0IsSUFBcUMsRUFDckQsVUFBa0I7UUFFbEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBSEYsU0FBSSxHQUFKLElBQUksQ0FBaUM7UUFJckQsSUFBSSxDQUFDLElBQUksR0FBRyw0QkFBNEIsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE2QkQsTUFBTSxPQUFPLGdCQUFnQjtJQVkzQixZQUFZLG9CQUFzQztRQU5qQyxlQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BELDBCQUFxQixHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBRTFELGtDQUE2QixHQUFHLEtBQUssQ0FBQztRQUN0QyxpQ0FBNEIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBR3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsU0FBUyxDQUNwQixVQUFnRjtRQUVoRixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsVUFBVSxDQUFDLEtBQUssT0FBTyxVQUFVLENBQUMsRUFBRTs7VUFFOUUsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFB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
|
|
969
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWFpbGNvbm5lY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2VtYWlsL2NsYXNzZXMuZW1haWxjb25uZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLG1CQUFtQixHQUdwQixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUEwRXRDLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxLQUFLO0lBQ25ELFlBQ2tCLElBQXFDLEVBQ3JELFVBQWtCO1FBRWxCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUhGLFNBQUksR0FBSixJQUFJLENBQWlDO1FBSXJELElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sNkJBQTZCLEdBRy9CO0lBQ0YsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4QixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLGdCQUFnQjtJQUNoQixXQUFXO0NBQ1osQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLDBCQUEwQixHQUs1QixFQUFFLENBQUM7QUFFUDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyxPQUE0RCxFQUNXLEVBQUU7SUFDekUsTUFBTSxRQUFRLEdBQUcsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsT0FBTyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxP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
|