@serve.zone/coremail 1.0.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/.smartconfig.json +50 -0
- package/changelog.md +10 -0
- package/cli.js +4 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.auth.d.ts +45 -0
- package/dist_ts/classes.auth.js +204 -0
- package/dist_ts/classes.config.d.ts +2 -0
- package/dist_ts/classes.config.js +72 -0
- package/dist_ts/classes.coremail.d.ts +41 -0
- package/dist_ts/classes.coremail.js +155 -0
- package/dist_ts/classes.desiredstate.d.ts +40 -0
- package/dist_ts/classes.desiredstate.js +382 -0
- package/dist_ts/classes.gateway.d.ts +62 -0
- package/dist_ts/classes.gateway.js +669 -0
- package/dist_ts/classes.inbound.d.ts +49 -0
- package/dist_ts/classes.inbound.js +702 -0
- package/dist_ts/classes.maintenance.d.ts +16 -0
- package/dist_ts/classes.maintenance.js +339 -0
- package/dist_ts/classes.models.d.ts +161 -0
- package/dist_ts/classes.models.js +595 -0
- package/dist_ts/classes.server.d.ts +40 -0
- package/dist_ts/classes.server.js +309 -0
- package/dist_ts/classes.storage.d.ts +32 -0
- package/dist_ts/classes.storage.js +317 -0
- package/dist_ts/classes.submissions.d.ts +33 -0
- package/dist_ts/classes.submissions.js +385 -0
- package/dist_ts/classes.transfer.d.ts +41 -0
- package/dist_ts/classes.transfer.js +289 -0
- package/dist_ts/coremail.cursor.d.ts +20 -0
- package/dist_ts/coremail.cursor.js +191 -0
- package/dist_ts/coremail.log.d.ts +3 -0
- package/dist_ts/coremail.log.js +11 -0
- package/dist_ts/coremail.mime.d.ts +8 -0
- package/dist_ts/coremail.mime.js +63 -0
- package/dist_ts/coremail.persistence.d.ts +148 -0
- package/dist_ts/coremail.persistence.js +695 -0
- package/dist_ts/coremail.quota.d.ts +29 -0
- package/dist_ts/coremail.quota.js +149 -0
- package/dist_ts/coremail.selectors.d.ts +3 -0
- package/dist_ts/coremail.selectors.js +21 -0
- package/dist_ts/coremail.validation.d.ts +9 -0
- package/dist_ts/coremail.validation.js +325 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +39 -0
- package/dist_ts/interfaces.d.ts +92 -0
- package/dist_ts/interfaces.js +2 -0
- package/dist_ts/plugins.d.ts +11 -0
- package/dist_ts/plugins.js +12 -0
- package/license.md +19 -0
- package/package.json +48 -0
- package/readme.md +199 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.auth.ts +321 -0
- package/ts/classes.config.ts +104 -0
- package/ts/classes.coremail.ts +249 -0
- package/ts/classes.desiredstate.ts +508 -0
- package/ts/classes.gateway.ts +811 -0
- package/ts/classes.inbound.ts +898 -0
- package/ts/classes.maintenance.ts +335 -0
- package/ts/classes.models.ts +530 -0
- package/ts/classes.server.ts +444 -0
- package/ts/classes.storage.ts +448 -0
- package/ts/classes.submissions.ts +554 -0
- package/ts/classes.transfer.ts +379 -0
- package/ts/coremail.cursor.ts +328 -0
- package/ts/coremail.log.ts +21 -0
- package/ts/coremail.mime.ts +94 -0
- package/ts/coremail.persistence.ts +1156 -0
- package/ts/coremail.quota.ts +214 -0
- package/ts/coremail.selectors.ts +35 -0
- package/ts/coremail.validation.ts +446 -0
- package/ts/index.ts +38 -0
- package/ts/interfaces.ts +109 -0
- package/ts/plugins.ts +11 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
|
|
3
|
+
export const coreMailLogger = plugins.smartlog.Smartlog.createForCommitinfo({
|
|
4
|
+
name: '@serve.zone/coremail',
|
|
5
|
+
version: '1.0.0',
|
|
6
|
+
description:
|
|
7
|
+
'Authenticated mail persistence and delivery orchestration for serve.zone workloads.',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
coreMailLogger.enableConsole();
|
|
11
|
+
|
|
12
|
+
export const logCoreMailFailure = async (
|
|
13
|
+
componentArg: 'desired-state' | 'gateway' | 'retention' | 'transfer' | 'worker',
|
|
14
|
+
codeArg: string,
|
|
15
|
+
): Promise<void> => {
|
|
16
|
+
await coreMailLogger.log(
|
|
17
|
+
'warn',
|
|
18
|
+
'CoreMail background operation failed.',
|
|
19
|
+
{ component: componentArg, code: codeArg },
|
|
20
|
+
);
|
|
21
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { ISubmissionPartRecord } from './interfaces.js';
|
|
3
|
+
|
|
4
|
+
type TMessage = plugins.serveZoneInterfaces.data.ICoreMailOutboundMessageDescriptor;
|
|
5
|
+
|
|
6
|
+
const encodeHeaderText = (valueArg: string): string =>
|
|
7
|
+
/^[\x20-\x7e]*$/.test(valueArg)
|
|
8
|
+
? valueArg
|
|
9
|
+
: `=?UTF-8?B?${Buffer.from(valueArg, 'utf8').toString('base64')}?=`;
|
|
10
|
+
|
|
11
|
+
const formatMailbox = (
|
|
12
|
+
mailboxArg: plugins.serveZoneInterfaces.data.ICoreMailMailbox,
|
|
13
|
+
): string => {
|
|
14
|
+
if (!mailboxArg.displayName) {
|
|
15
|
+
return `<${mailboxArg.address}>`;
|
|
16
|
+
}
|
|
17
|
+
const displayName = encodeHeaderText(mailboxArg.displayName);
|
|
18
|
+
const rendered = /^[A-Za-z0-9 ._-]+$/.test(displayName)
|
|
19
|
+
? displayName
|
|
20
|
+
: `"${displayName.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
|
|
21
|
+
return `${rendered} <${mailboxArg.address}>`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const foldBase64 = (bytesArg: Uint8Array): string =>
|
|
25
|
+
Buffer.from(bytesArg)
|
|
26
|
+
.toString('base64')
|
|
27
|
+
.match(/.{1,76}/g)
|
|
28
|
+
?.join('\r\n') ?? '';
|
|
29
|
+
|
|
30
|
+
const contentDisposition = (partArg: ISubmissionPartRecord): string => {
|
|
31
|
+
if (partArg.kind !== 'attachment') {
|
|
32
|
+
return 'inline';
|
|
33
|
+
}
|
|
34
|
+
if (!partArg.filename) {
|
|
35
|
+
return 'attachment';
|
|
36
|
+
}
|
|
37
|
+
const fallback = partArg.filename
|
|
38
|
+
.replace(/[^\x20-\x7e]/g, '_')
|
|
39
|
+
.replaceAll('\\', '\\\\')
|
|
40
|
+
.replaceAll('"', '\\"');
|
|
41
|
+
return `attachment; filename="${fallback}"; filename*=UTF-8''${
|
|
42
|
+
encodeURIComponent(partArg.filename)
|
|
43
|
+
}`;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const createCoreMailMime = (
|
|
47
|
+
submissionIdArg: string,
|
|
48
|
+
submissionDigestArg: plugins.serveZoneInterfaces.data.TCoreMailSha256,
|
|
49
|
+
createdAtArg: number,
|
|
50
|
+
messageArg: TMessage,
|
|
51
|
+
partsArg: Array<{ descriptor: ISubmissionPartRecord; bytes: Uint8Array }>,
|
|
52
|
+
): Uint8Array => {
|
|
53
|
+
const boundary = `coremail_${submissionDigestArg.slice('sha256:'.length, 48)}`;
|
|
54
|
+
const to = messageArg.recipients.to.map(formatMailbox).join(', ');
|
|
55
|
+
const cc = messageArg.recipients.cc?.map(formatMailbox).join(', ');
|
|
56
|
+
const headers = [
|
|
57
|
+
`Date: ${new Date(createdAtArg).toUTCString()}`,
|
|
58
|
+
`Message-ID: <${submissionIdArg}@coremail.serve.zone>`,
|
|
59
|
+
`From: ${formatMailbox(messageArg.sender)}`,
|
|
60
|
+
`To: ${to}`,
|
|
61
|
+
...(cc ? [`Cc: ${cc}`] : []),
|
|
62
|
+
...(messageArg.replyTo ? [`Reply-To: ${formatMailbox(messageArg.replyTo)}`] : []),
|
|
63
|
+
`Subject: ${encodeHeaderText(messageArg.subject)}`,
|
|
64
|
+
...(messageArg.headers ?? []).map((headerArg) =>
|
|
65
|
+
`${headerArg.name}: ${encodeHeaderText(headerArg.value)}`
|
|
66
|
+
),
|
|
67
|
+
'MIME-Version: 1.0',
|
|
68
|
+
`Content-Type: multipart/mixed; boundary="${boundary}"`,
|
|
69
|
+
'',
|
|
70
|
+
'This is a multipart message in MIME format.',
|
|
71
|
+
];
|
|
72
|
+
for (const part of partsArg) {
|
|
73
|
+
headers.push(
|
|
74
|
+
`--${boundary}`,
|
|
75
|
+
`Content-Type: ${part.descriptor.contentType}`,
|
|
76
|
+
'Content-Transfer-Encoding: base64',
|
|
77
|
+
`Content-Disposition: ${contentDisposition(part.descriptor)}`,
|
|
78
|
+
...(part.descriptor.contentId
|
|
79
|
+
? [`Content-ID: <${part.descriptor.contentId}>`]
|
|
80
|
+
: []),
|
|
81
|
+
'',
|
|
82
|
+
foldBase64(part.bytes),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
headers.push(`--${boundary}--`, '');
|
|
86
|
+
const encoded = new TextEncoder().encode(headers.join('\r\n'));
|
|
87
|
+
if (
|
|
88
|
+
encoded.byteLength >
|
|
89
|
+
plugins.serveZoneInterfaces.data.coreMailLimits.serializedMimeBytes
|
|
90
|
+
) {
|
|
91
|
+
throw new Error('CoreMail serialized MIME exceeds its byte budget.');
|
|
92
|
+
}
|
|
93
|
+
return encoded;
|
|
94
|
+
};
|