@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,317 @@
1
+ import * as plugins from './plugins.js';
2
+ const digestBuffer = (bufferArg) => plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(`sha256:${plugins.nodeCrypto.createHash('sha256').update(bufferArg).digest('hex')}`);
3
+ const hashAndBoundStream = (streamArg, maximumBytesArg, expectedLengthArg, expectedSha256Arg, signalArg, idleTimeoutMsArg) => {
4
+ const hash = plugins.nodeCrypto.createHash('sha256');
5
+ let lengthBytes = 0;
6
+ let resolveCompletion;
7
+ let rejectCompletion;
8
+ const completion = new Promise((resolveArg, rejectArg) => {
9
+ resolveCompletion = resolveArg;
10
+ rejectCompletion = rejectArg;
11
+ });
12
+ const reader = streamArg.getReader();
13
+ let settled = false;
14
+ let readerReleased = false;
15
+ let idleTimer = null;
16
+ const releaseReader = () => {
17
+ if (!readerReleased) {
18
+ try {
19
+ reader.releaseLock();
20
+ readerReleased = true;
21
+ }
22
+ catch {
23
+ // A pending read releases the lock after cancellation settles.
24
+ }
25
+ }
26
+ };
27
+ const cancelReader = async (reasonArg) => {
28
+ const cancellation = reader.cancel(reasonArg).catch(() => undefined);
29
+ releaseReader();
30
+ const timeout = new Promise((resolveArg) => {
31
+ const timer = setTimeout(resolveArg, 1_000);
32
+ timer.unref?.();
33
+ void cancellation.finally(() => clearTimeout(timer));
34
+ });
35
+ await Promise.race([cancellation, timeout]);
36
+ releaseReader();
37
+ void cancellation.finally(releaseReader);
38
+ };
39
+ const settleError = (errorArg) => {
40
+ if (!settled) {
41
+ settled = true;
42
+ rejectCompletion(errorArg);
43
+ }
44
+ };
45
+ const cancel = async (reasonArg) => {
46
+ signalArg?.removeEventListener('abort', onAbort);
47
+ if (settled) {
48
+ releaseReader();
49
+ return;
50
+ }
51
+ const error = reasonArg instanceof Error
52
+ ? reasonArg
53
+ : new Error('CoreMail transfer was cancelled.');
54
+ settleError(error);
55
+ if (idleTimer) {
56
+ clearTimeout(idleTimer);
57
+ idleTimer = null;
58
+ }
59
+ await cancelReader(error);
60
+ };
61
+ const onAbort = () => {
62
+ void cancel(signalArg?.reason);
63
+ };
64
+ if (signalArg) {
65
+ if (signalArg.aborted) {
66
+ void cancel(signalArg.reason);
67
+ }
68
+ else {
69
+ signalArg.addEventListener('abort', onAbort, { once: true });
70
+ }
71
+ }
72
+ const stream = new ReadableStream({
73
+ async pull(controllerArg) {
74
+ try {
75
+ signalArg?.throwIfAborted();
76
+ if (idleTimeoutMsArg !== undefined) {
77
+ idleTimer = setTimeout(() => {
78
+ void cancel(new Error('CoreMail transfer exceeded its idle deadline.'));
79
+ }, idleTimeoutMsArg);
80
+ idleTimer.unref?.();
81
+ }
82
+ const next = await reader.read();
83
+ if (idleTimer) {
84
+ clearTimeout(idleTimer);
85
+ idleTimer = null;
86
+ }
87
+ if (!next.done) {
88
+ if (!(next.value instanceof Uint8Array)) {
89
+ throw new Error('CoreMail transfer emitted a non-byte chunk.');
90
+ }
91
+ lengthBytes += next.value.byteLength;
92
+ if (lengthBytes > maximumBytesArg) {
93
+ throw new Error('CoreMail transfer exceeded its byte budget.');
94
+ }
95
+ hash.update(next.value);
96
+ controllerArg.enqueue(next.value);
97
+ return;
98
+ }
99
+ const sha256 = plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(`sha256:${hash.digest('hex')}`);
100
+ if ((expectedLengthArg !== undefined && lengthBytes !== expectedLengthArg)
101
+ || (expectedSha256Arg !== undefined && sha256 !== expectedSha256Arg)) {
102
+ throw new Error('CoreMail object integrity verification failed.');
103
+ }
104
+ settled = true;
105
+ resolveCompletion({ lengthBytes, sha256 });
106
+ controllerArg.close();
107
+ signalArg?.removeEventListener('abort', onAbort);
108
+ releaseReader();
109
+ }
110
+ catch (error) {
111
+ const normalized = error instanceof Error ? error : new Error(String(error));
112
+ if (idleTimer) {
113
+ clearTimeout(idleTimer);
114
+ idleTimer = null;
115
+ }
116
+ settleError(normalized);
117
+ controllerArg.error(normalized);
118
+ await cancelReader(normalized);
119
+ signalArg?.removeEventListener('abort', onAbort);
120
+ }
121
+ },
122
+ async cancel(reasonArg) {
123
+ signalArg?.removeEventListener('abort', onAbort);
124
+ await cancel(reasonArg);
125
+ },
126
+ });
127
+ void completion.catch(() => undefined);
128
+ return {
129
+ stream,
130
+ completion,
131
+ cancel,
132
+ };
133
+ };
134
+ export class CoreMailStorage {
135
+ bucketName;
136
+ smartBucket;
137
+ bucket;
138
+ exactUploadCapability;
139
+ exactPurgeCapability;
140
+ constructor(storageDescriptorArg, bucketName) {
141
+ this.bucketName = bucketName;
142
+ this.smartBucket = new plugins.smartbucket.SmartBucket(storageDescriptorArg);
143
+ }
144
+ async start() {
145
+ try {
146
+ const readiness = await this.smartBucket.checkReadiness(this.bucketName, {
147
+ timeoutMs: 5_000,
148
+ });
149
+ if (!readiness.ready) {
150
+ throw new Error(`CoreMail object storage is unavailable: ${readiness.reason}`);
151
+ }
152
+ this.bucket = await this.smartBucket.getBucketByName(this.bucketName);
153
+ const exactUpload = await this.bucket.probeExactUploadCapability({
154
+ signal: AbortSignal.timeout(30_000),
155
+ });
156
+ if (!exactUpload.supported) {
157
+ throw new Error(`CoreMail requires exact object publication: ${exactUpload.reason}`);
158
+ }
159
+ this.exactUploadCapability = exactUpload.capability;
160
+ const exactPurge = await this.bucket.probeExactPathPurgeCapability({
161
+ signal: AbortSignal.timeout(30_000),
162
+ });
163
+ if (!exactPurge.supported) {
164
+ throw new Error(`CoreMail requires exact object retention: ${exactPurge.reason}`);
165
+ }
166
+ this.exactPurgeCapability = exactPurge.capability;
167
+ }
168
+ catch (error) {
169
+ await this.smartBucket.close().catch(() => undefined);
170
+ throw error;
171
+ }
172
+ }
173
+ async checkReadiness() {
174
+ const readiness = await this.smartBucket.checkReadiness(this.bucketName, {
175
+ timeoutMs: 1_500,
176
+ });
177
+ return readiness.ready
178
+ && Boolean(this.exactUploadCapability)
179
+ && Boolean(this.exactPurgeCapability);
180
+ }
181
+ async stop() {
182
+ await this.smartBucket.close();
183
+ }
184
+ async purgeExact(objectKeyArg, signalArg) {
185
+ if (!this.exactPurgeCapability
186
+ || !/^[A-Za-z0-9][A-Za-z0-9._/-]{0,1023}$/.test(objectKeyArg)
187
+ || objectKeyArg.startsWith('/')
188
+ || objectKeyArg.includes('//')
189
+ || objectKeyArg.split('/').some((partArg) => partArg === '..')) {
190
+ throw new Error('CoreMail exact purge capability or object key is invalid.');
191
+ }
192
+ await this.bucket.purgeExactPath({
193
+ capability: this.exactPurgeCapability,
194
+ path: objectKeyArg,
195
+ timeoutMs: 30_000,
196
+ signal: signalArg,
197
+ });
198
+ }
199
+ async putExact(objectKeyArg, streamArg, lengthBytesArg, sha256Arg, contentTypeArg, maximumBytesArg, signalArg) {
200
+ if (!this.exactUploadCapability) {
201
+ throw new Error('CoreMail exact upload capability is unavailable.');
202
+ }
203
+ if (!Number.isSafeInteger(lengthBytesArg)
204
+ || lengthBytesArg < 0
205
+ || lengthBytesArg > maximumBytesArg) {
206
+ throw new Error('CoreMail exact upload length is outside its byte budget.');
207
+ }
208
+ const monitored = hashAndBoundStream(streamArg, maximumBytesArg, lengthBytesArg, sha256Arg, signalArg, plugins.serveZoneInterfaces.data.coreMailLimits.transferIdleTimeoutMs);
209
+ let uploadError;
210
+ try {
211
+ await this.bucket.fastPutStreamExact({
212
+ capability: this.exactUploadCapability,
213
+ path: objectKeyArg,
214
+ readableStream: monitored.stream,
215
+ contentLength: lengthBytesArg,
216
+ nativeMetadata: {
217
+ 'coremail-sha256': sha256Arg.slice('sha256:'.length),
218
+ },
219
+ nativeObjectProperties: {
220
+ contentType: contentTypeArg,
221
+ },
222
+ requestedPartSize: 5 * 1024 * 1024,
223
+ requestedConcurrency: 2,
224
+ failureSettlementTimeoutMs: 30_000,
225
+ signal: signalArg,
226
+ });
227
+ await monitored.completion;
228
+ }
229
+ catch (error) {
230
+ uploadError = error;
231
+ await monitored.cancel(error);
232
+ await monitored.completion.catch(() => undefined);
233
+ }
234
+ if (uploadError) {
235
+ try {
236
+ await this.verifyObject(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg);
237
+ return;
238
+ }
239
+ catch {
240
+ throw uploadError;
241
+ }
242
+ }
243
+ await this.verifyObject(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg);
244
+ }
245
+ async putBytesExact(objectKeyArg, bytesArg, contentTypeArg, maximumBytesArg, signalArg) {
246
+ if (bytesArg.byteLength > maximumBytesArg) {
247
+ throw new Error('CoreMail object exceeds its byte budget.');
248
+ }
249
+ const sha256 = digestBuffer(bytesArg);
250
+ await this.putExact(objectKeyArg, new ReadableStream({
251
+ start(controllerArg) {
252
+ controllerArg.enqueue(bytesArg);
253
+ controllerArg.close();
254
+ },
255
+ }), bytesArg.byteLength, sha256, contentTypeArg, maximumBytesArg, signalArg);
256
+ return { lengthBytes: bytesArg.byteLength, sha256 };
257
+ }
258
+ async getVerifiedStream(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg) {
259
+ signalArg?.throwIfAborted();
260
+ const stat = await this.bucket.fastStat({
261
+ path: objectKeyArg,
262
+ signal: signalArg,
263
+ });
264
+ if (stat.ContentLength !== lengthBytesArg || lengthBytesArg > maximumBytesArg) {
265
+ throw new Error('CoreMail object length does not match persisted integrity.');
266
+ }
267
+ return hashAndBoundStream(await this.bucket.fastGetStream({
268
+ path: objectKeyArg,
269
+ signal: signalArg,
270
+ }, 'webstream'), maximumBytesArg, lengthBytesArg, sha256Arg, signalArg, plugins.serveZoneInterfaces.data.coreMailLimits.transferIdleTimeoutMs);
271
+ }
272
+ async getVerifiedBytes(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg) {
273
+ const verified = await this.getVerifiedStream(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, AbortSignal.timeout(plugins.serveZoneInterfaces.data.coreMailLimits.transferOverallTimeoutMs));
274
+ const reader = verified.stream.getReader();
275
+ const chunks = [];
276
+ let total = 0;
277
+ try {
278
+ while (true) {
279
+ const next = await reader.read();
280
+ if (next.done)
281
+ break;
282
+ chunks.push(next.value);
283
+ total += next.value.byteLength;
284
+ }
285
+ await verified.completion;
286
+ }
287
+ finally {
288
+ await reader.cancel().catch(() => undefined);
289
+ reader.releaseLock();
290
+ }
291
+ const result = new Uint8Array(total);
292
+ let offset = 0;
293
+ for (const chunk of chunks) {
294
+ result.set(chunk, offset);
295
+ offset += chunk.byteLength;
296
+ }
297
+ return result;
298
+ }
299
+ async verifyObject(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg) {
300
+ signalArg?.throwIfAborted();
301
+ const verified = await this.getVerifiedStream(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg);
302
+ const reader = verified.stream.getReader();
303
+ try {
304
+ while (!(await reader.read()).done) {
305
+ signalArg?.throwIfAborted();
306
+ }
307
+ await verified.completion;
308
+ }
309
+ finally {
310
+ await reader.cancel().catch(() => undefined);
311
+ reader.releaseLock();
312
+ }
313
+ }
314
+ }
315
+ export const createSha256 = (valueArg) => plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(`sha256:${plugins.nodeCrypto.createHash('sha256').update(valueArg).digest('hex')}`);
316
+ export const createOpaqueToken = () => plugins.nodeCrypto.randomBytes(32).toString('base64url');
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBcUIsRUFBbUIsRUFBRSxDQUM5RCxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUN0RCxVQUFVLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztBQUVKLE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsU0FBcUMsRUFDckMsZUFBdUIsRUFDdkIsaUJBQTBCLEVBQzFCLGlCQUFtQyxFQUNuQyxTQUF1QixFQUN2QixnQkFBeUIsRUFLekIsRUFBRTtJQUNGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLGlCQUdNLENBQUM7SUFDWCxJQUFJLGdCQUE0QyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUczQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUMzQixpQkFBaUIsR0FBRyxVQUFVLENBQUM7UUFDL0IsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDM0IsSUFBSSxTQUFTLEdBQXlDLElBQUksQ0FBQztJQUMzRCxNQUFN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
@@ -0,0 +1,33 @@
1
+ import * as plugins from './plugins.js';
2
+ import { type ICoreMailModels } from './classes.models.js';
3
+ import { CoreMailStorage } from './classes.storage.js';
4
+ import { CoreMailTransferService } from './classes.transfer.js';
5
+ import type { ICoreMailWorkloadSession } from './interfaces.js';
6
+ type TBinding = plugins.serveZoneInterfaces.data.ICoreMailBindingDesiredState;
7
+ type TSubmission = plugins.serveZoneInterfaces.data.ICoreMailSubmission;
8
+ export declare class CoreMailSubmissionService {
9
+ private readonly database;
10
+ private readonly models;
11
+ private readonly storage;
12
+ private readonly transfers;
13
+ private readonly now;
14
+ constructor(database: plugins.smartdata.SmartdataDb, models: ICoreMailModels, storage: CoreMailStorage, transfers: CoreMailTransferService, now?: () => number);
15
+ prepare(sessionArg: ICoreMailWorkloadSession, bindingArg: TBinding, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailPrepareOutboundSubmission['request']): Promise<{
16
+ submission: TSubmission;
17
+ replayed: boolean;
18
+ }>;
19
+ preparePartUpload(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailPrepareOutboundPartUpload['request']): Promise<{
20
+ grant: plugins.serveZoneInterfaces.data.ICoreMailUploadGrant;
21
+ }>;
22
+ completePartUpload(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailCompleteOutboundPartUpload['request']): Promise<{
23
+ submission: TSubmission;
24
+ }>;
25
+ finalize(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailFinalizeOutboundSubmission['request']): Promise<{
26
+ submission: TSubmission;
27
+ }>;
28
+ get(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailGetOutboundSubmission['request']): Promise<{
29
+ submission: TSubmission;
30
+ }>;
31
+ private requireSubmission;
32
+ }
33
+ export {};