@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.
Files changed (75) hide show
  1. package/.smartconfig.json +50 -0
  2. package/changelog.md +10 -0
  3. package/cli.js +4 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/classes.auth.d.ts +45 -0
  7. package/dist_ts/classes.auth.js +204 -0
  8. package/dist_ts/classes.config.d.ts +2 -0
  9. package/dist_ts/classes.config.js +72 -0
  10. package/dist_ts/classes.coremail.d.ts +41 -0
  11. package/dist_ts/classes.coremail.js +155 -0
  12. package/dist_ts/classes.desiredstate.d.ts +40 -0
  13. package/dist_ts/classes.desiredstate.js +382 -0
  14. package/dist_ts/classes.gateway.d.ts +62 -0
  15. package/dist_ts/classes.gateway.js +669 -0
  16. package/dist_ts/classes.inbound.d.ts +49 -0
  17. package/dist_ts/classes.inbound.js +702 -0
  18. package/dist_ts/classes.maintenance.d.ts +16 -0
  19. package/dist_ts/classes.maintenance.js +339 -0
  20. package/dist_ts/classes.models.d.ts +161 -0
  21. package/dist_ts/classes.models.js +595 -0
  22. package/dist_ts/classes.server.d.ts +40 -0
  23. package/dist_ts/classes.server.js +309 -0
  24. package/dist_ts/classes.storage.d.ts +32 -0
  25. package/dist_ts/classes.storage.js +317 -0
  26. package/dist_ts/classes.submissions.d.ts +33 -0
  27. package/dist_ts/classes.submissions.js +385 -0
  28. package/dist_ts/classes.transfer.d.ts +41 -0
  29. package/dist_ts/classes.transfer.js +289 -0
  30. package/dist_ts/coremail.cursor.d.ts +20 -0
  31. package/dist_ts/coremail.cursor.js +191 -0
  32. package/dist_ts/coremail.log.d.ts +3 -0
  33. package/dist_ts/coremail.log.js +11 -0
  34. package/dist_ts/coremail.mime.d.ts +8 -0
  35. package/dist_ts/coremail.mime.js +63 -0
  36. package/dist_ts/coremail.persistence.d.ts +148 -0
  37. package/dist_ts/coremail.persistence.js +695 -0
  38. package/dist_ts/coremail.quota.d.ts +29 -0
  39. package/dist_ts/coremail.quota.js +149 -0
  40. package/dist_ts/coremail.selectors.d.ts +3 -0
  41. package/dist_ts/coremail.selectors.js +21 -0
  42. package/dist_ts/coremail.validation.d.ts +9 -0
  43. package/dist_ts/coremail.validation.js +325 -0
  44. package/dist_ts/index.d.ts +4 -0
  45. package/dist_ts/index.js +39 -0
  46. package/dist_ts/interfaces.d.ts +92 -0
  47. package/dist_ts/interfaces.js +2 -0
  48. package/dist_ts/plugins.d.ts +11 -0
  49. package/dist_ts/plugins.js +12 -0
  50. package/license.md +19 -0
  51. package/package.json +48 -0
  52. package/readme.md +199 -0
  53. package/ts/00_commitinfo_data.ts +8 -0
  54. package/ts/classes.auth.ts +321 -0
  55. package/ts/classes.config.ts +104 -0
  56. package/ts/classes.coremail.ts +249 -0
  57. package/ts/classes.desiredstate.ts +508 -0
  58. package/ts/classes.gateway.ts +811 -0
  59. package/ts/classes.inbound.ts +898 -0
  60. package/ts/classes.maintenance.ts +335 -0
  61. package/ts/classes.models.ts +530 -0
  62. package/ts/classes.server.ts +444 -0
  63. package/ts/classes.storage.ts +448 -0
  64. package/ts/classes.submissions.ts +554 -0
  65. package/ts/classes.transfer.ts +379 -0
  66. package/ts/coremail.cursor.ts +328 -0
  67. package/ts/coremail.log.ts +21 -0
  68. package/ts/coremail.mime.ts +94 -0
  69. package/ts/coremail.persistence.ts +1156 -0
  70. package/ts/coremail.quota.ts +214 -0
  71. package/ts/coremail.selectors.ts +35 -0
  72. package/ts/coremail.validation.ts +446 -0
  73. package/ts/index.ts +38 -0
  74. package/ts/interfaces.ts +109 -0
  75. 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
+ };