@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,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 {};
|