@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,40 @@
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 { ICoreMailReplicaRuntime } from './interfaces.js';
6
+ type TCoreMailDesiredState = plugins.serveZoneInterfaces.data.ICoreMailDesiredState;
7
+ type TCoreMailStatus = plugins.serveZoneInterfaces.data.ICoreMailReconciliationStatus;
8
+ export declare class CoreMailDesiredStateService {
9
+ private readonly database;
10
+ private readonly models;
11
+ private readonly storage;
12
+ private readonly transfers;
13
+ private readonly replica;
14
+ private readonly activeSessionCounts;
15
+ private readonly now;
16
+ private activeDesiredState;
17
+ private activeStatePointer;
18
+ private refreshTask;
19
+ constructor(database: plugins.smartdata.SmartdataDb, models: ICoreMailModels, storage: CoreMailStorage, transfers: CoreMailTransferService, replica: ICoreMailReplicaRuntime, activeSessionCounts: (bindingArg: plugins.serveZoneInterfaces.data.ICoreMailBindingDesiredState, configEpochArg: number) => Array<{
20
+ credentialId: string;
21
+ version: number;
22
+ count: number;
23
+ }>, now?: () => number);
24
+ private controlAuthority;
25
+ start(): Promise<void>;
26
+ getActiveDesiredState: () => Promise<TCoreMailDesiredState | null>;
27
+ private refresh;
28
+ private refreshFromPointer;
29
+ private loadDesiredState;
30
+ private parseDesiredState;
31
+ prepare(requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailPrepareDesiredStateUpload['request']): Promise<{
32
+ reconciliationId: string;
33
+ grant: plugins.serveZoneInterfaces.data.ICoreMailUploadGrant;
34
+ replayed: boolean;
35
+ }>;
36
+ apply(requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailApplyDesiredState['request']): Promise<TCoreMailStatus>;
37
+ getStatus(requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailGetReconciliationStatus['request']): Promise<TCoreMailStatus>;
38
+ private createStatus;
39
+ }
40
+ export {};
@@ -0,0 +1,382 @@
1
+ import * as plugins from './plugins.js';
2
+ import {} from './classes.models.js';
3
+ import { CoreMailStorage, createSha256 } from './classes.storage.js';
4
+ import { CoreMailTransferService } from './classes.transfer.js';
5
+ import { logCoreMailFailure } from './coremail.log.js';
6
+ import { withCoreMailTransaction } from './coremail.quota.js';
7
+ import { requireCoreMailSafeInteger, requireCoreMailUuid, } from './coremail.selectors.js';
8
+ const emptyStateDigest = createSha256('');
9
+ export class CoreMailDesiredStateService {
10
+ database;
11
+ models;
12
+ storage;
13
+ transfers;
14
+ replica;
15
+ activeSessionCounts;
16
+ now;
17
+ activeDesiredState = null;
18
+ activeStatePointer;
19
+ refreshTask = null;
20
+ constructor(database, models, storage, transfers, replica, activeSessionCounts, now = Date.now) {
21
+ this.database = database;
22
+ this.models = models;
23
+ this.storage = storage;
24
+ this.transfers = transfers;
25
+ this.replica = replica;
26
+ this.activeSessionCounts = activeSessionCounts;
27
+ this.now = now;
28
+ }
29
+ controlAuthority() {
30
+ return {
31
+ kind: 'control',
32
+ tenantId: '-',
33
+ serviceId: this.replica.serviceId,
34
+ bindingId: '-',
35
+ };
36
+ }
37
+ async start() {
38
+ const initialized = await this.models.State.exact.insert({
39
+ stateId: 'active',
40
+ appliedConfigEpoch: 0,
41
+ appliedDesiredStateDigest: emptyStateDigest,
42
+ snapshotId: '-',
43
+ updatedAt: this.now(),
44
+ });
45
+ const state = initialized.document;
46
+ if (!state) {
47
+ throw new Error('CoreMail could not initialize its desired-state pointer.');
48
+ }
49
+ this.activeStatePointer = state;
50
+ await this.refreshFromPointer(state);
51
+ }
52
+ getActiveDesiredState = async () => {
53
+ await this.refresh();
54
+ return this.activeDesiredState;
55
+ };
56
+ async refresh() {
57
+ if (this.refreshTask) {
58
+ await this.refreshTask;
59
+ return;
60
+ }
61
+ const task = (async () => {
62
+ const pointer = await this.models.State.exact.findStoredOne({
63
+ stateId: 'active',
64
+ });
65
+ if (!pointer) {
66
+ throw new Error('CoreMail desired-state pointer is unavailable.');
67
+ }
68
+ await this.refreshFromPointer(pointer);
69
+ })();
70
+ this.refreshTask = task;
71
+ try {
72
+ await task;
73
+ }
74
+ finally {
75
+ if (this.refreshTask === task) {
76
+ this.refreshTask = null;
77
+ }
78
+ }
79
+ }
80
+ async refreshFromPointer(pointerArg) {
81
+ if (pointerArg.appliedConfigEpoch === 0) {
82
+ this.activeStatePointer = pointerArg;
83
+ this.activeDesiredState = null;
84
+ return;
85
+ }
86
+ if (this.activeDesiredState?.configEpoch === pointerArg.appliedConfigEpoch
87
+ && this.activeStatePointer?.snapshotId === pointerArg.snapshotId
88
+ && this.activeStatePointer.appliedDesiredStateDigest
89
+ === pointerArg.appliedDesiredStateDigest) {
90
+ this.activeStatePointer = pointerArg;
91
+ return;
92
+ }
93
+ const desiredState = await this.loadDesiredState(pointerArg);
94
+ this.activeStatePointer = pointerArg;
95
+ this.activeDesiredState = desiredState;
96
+ }
97
+ async loadDesiredState(stateArg) {
98
+ const snapshot = await this.models.DesiredSnapshot.exact.findStoredOne({
99
+ snapshotId: stateArg.snapshotId,
100
+ configEpoch: stateArg.appliedConfigEpoch,
101
+ desiredStateDigest: stateArg.appliedDesiredStateDigest,
102
+ });
103
+ if (!snapshot
104
+ || (snapshot.state !== 'staged' && snapshot.state !== 'active')) {
105
+ throw new Error('CoreMail active desired-state snapshot is unavailable.');
106
+ }
107
+ const bytes = await this.storage.getVerifiedBytes(snapshot.objectKey, snapshot.lengthBytes, snapshot.desiredStateDigest, plugins.serveZoneInterfaces.data.coreMailLimits.desiredStateBytes);
108
+ const desiredState = await this.parseDesiredState(bytes, snapshot.configEpoch, snapshot.desiredStateDigest);
109
+ if (snapshot.state === 'staged') {
110
+ await this.models.DesiredSnapshot.exact.transition({
111
+ current: snapshot,
112
+ change: (modelArg) => {
113
+ modelArg.state = 'active';
114
+ modelArg.activatedAt = stateArg.updatedAt;
115
+ },
116
+ }).catch(async () => {
117
+ await logCoreMailFailure('desired-state', 'SNAPSHOT_REPAIR_FAILED')
118
+ .catch(() => undefined);
119
+ });
120
+ }
121
+ return desiredState;
122
+ }
123
+ async parseDesiredState(bytesArg, configEpochArg, digestArg) {
124
+ let parsed;
125
+ try {
126
+ parsed = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytesArg));
127
+ }
128
+ catch {
129
+ throw new Error('CoreMail desired state is not canonical UTF-8 JSON.');
130
+ }
131
+ const desiredState = plugins.serveZoneInterfaces.data.normalizeCoreMailDesiredState(parsed);
132
+ if (desiredState.configEpoch !== configEpochArg
133
+ || !await plugins.serveZoneInterfaces.data.verifyCoreMailDesiredStateDigest(desiredState, digestArg)) {
134
+ throw new Error('CoreMail desired-state digest or epoch does not match.');
135
+ }
136
+ const canonical = plugins.serveZoneInterfaces.data.canonicalizeCoreMailDesiredState(desiredState);
137
+ if (!Buffer.from(bytesArg).equals(Buffer.from(canonical, 'utf8'))) {
138
+ throw new Error('CoreMail desired-state bytes are not canonical.');
139
+ }
140
+ return desiredState;
141
+ }
142
+ async prepare(requestArg) {
143
+ await this.refresh();
144
+ const desiredStateDigest = plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(requestArg.desiredStateDigest);
145
+ const expectedAppliedConfigEpoch = requireCoreMailSafeInteger(requestArg.expectedAppliedConfigEpoch, 'expectedAppliedConfigEpoch');
146
+ const configEpoch = requireCoreMailSafeInteger(requestArg.configEpoch, 'configEpoch', 1);
147
+ if (configEpoch <= expectedAppliedConfigEpoch
148
+ || !Number.isSafeInteger(requestArg.lengthBytes)
149
+ || requestArg.lengthBytes < 2
150
+ || requestArg.lengthBytes >
151
+ plugins.serveZoneInterfaces.data.coreMailLimits.desiredStateBytes) {
152
+ throw new Error('CoreMail desired-state preparation is invalid.');
153
+ }
154
+ const current = await this.models.State.exact.findStoredOne({
155
+ stateId: 'active',
156
+ appliedConfigEpoch: expectedAppliedConfigEpoch,
157
+ });
158
+ if (!current || current.appliedConfigEpoch !== this.activeStatePointer.appliedConfigEpoch) {
159
+ throw new Error('CoreMail desired-state compare-and-set fence changed.');
160
+ }
161
+ let snapshot = await this.models.DesiredSnapshot.exact.findStoredOne({
162
+ configEpoch,
163
+ desiredStateDigest,
164
+ });
165
+ let replayed = Boolean(snapshot);
166
+ if (snapshot) {
167
+ if (snapshot.expectedAppliedConfigEpoch !== expectedAppliedConfigEpoch
168
+ || snapshot.lengthBytes !== requestArg.lengthBytes
169
+ || (snapshot.state !== 'staged' && snapshot.state !== 'active')) {
170
+ throw new Error('CoreMail desired-state replay conflicts with persisted intent.');
171
+ }
172
+ }
173
+ else {
174
+ const snapshotId = plugins.nodeCrypto.randomUUID();
175
+ const createdAt = this.now();
176
+ const candidate = {
177
+ snapshotId,
178
+ reconciliationId: plugins.nodeCrypto.randomUUID(),
179
+ expectedAppliedConfigEpoch,
180
+ configEpoch,
181
+ desiredStateDigest,
182
+ lengthBytes: requestArg.lengthBytes,
183
+ objectKey: `desired-state/${snapshotId}.json`,
184
+ state: 'staged',
185
+ createdAt,
186
+ updatedAt: createdAt,
187
+ };
188
+ try {
189
+ const inserted = await this.models.DesiredSnapshot.exact.insert(candidate);
190
+ if (inserted.status === 'conflict') {
191
+ throw new Error('CoreMail desired-state preparation conflicts with persisted intent.');
192
+ }
193
+ snapshot = inserted.document;
194
+ }
195
+ catch (error) {
196
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError)
197
+ || error.code !== 'unique_conflict') {
198
+ throw error;
199
+ }
200
+ const concurrent = await this.models.DesiredSnapshot.exact.findStoredOne({
201
+ configEpoch,
202
+ desiredStateDigest,
203
+ });
204
+ if (!concurrent
205
+ || concurrent.expectedAppliedConfigEpoch
206
+ !== expectedAppliedConfigEpoch
207
+ || concurrent.lengthBytes !== requestArg.lengthBytes
208
+ || (concurrent.state !== 'staged' && concurrent.state !== 'active')) {
209
+ throw new Error('CoreMail desired-state preparation conflicts with persisted intent.');
210
+ }
211
+ snapshot = concurrent;
212
+ replayed = true;
213
+ }
214
+ }
215
+ if (snapshot.state === 'staged') {
216
+ const touchedAt = this.now();
217
+ const touch = await this.models.DesiredSnapshot.exact.transition({
218
+ current: snapshot,
219
+ change: (modelArg) => {
220
+ modelArg.updatedAt = touchedAt;
221
+ },
222
+ });
223
+ if (touch.status !== 'transitioned') {
224
+ throw new Error('CoreMail desired-state preparation fence changed.');
225
+ }
226
+ snapshot = touch.document;
227
+ }
228
+ const grant = await this.transfers.issueGrant({
229
+ authority: this.controlAuthority(),
230
+ purpose: 'desired-state-upload',
231
+ method: 'PUT',
232
+ expectedSha256: snapshot.desiredStateDigest,
233
+ lengthBytes: snapshot.lengthBytes,
234
+ contentType: 'application/json',
235
+ objectKey: snapshot.objectKey,
236
+ });
237
+ return {
238
+ reconciliationId: snapshot.reconciliationId,
239
+ grant: grant,
240
+ replayed,
241
+ };
242
+ }
243
+ async apply(requestArg) {
244
+ await this.refresh();
245
+ const desiredStateDigest = plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(requestArg.desiredStateDigest);
246
+ const reconciliationId = requireCoreMailUuid(requestArg.reconciliationId, 'reconciliationId');
247
+ const grantId = requireCoreMailUuid(requestArg.grantId, 'grantId');
248
+ const lengthBytes = requireCoreMailSafeInteger(requestArg.lengthBytes, 'lengthBytes', 2);
249
+ const snapshot = await this.models.DesiredSnapshot.exact.findStoredOne({
250
+ reconciliationId,
251
+ desiredStateDigest,
252
+ lengthBytes,
253
+ });
254
+ if (!snapshot || (snapshot.state !== 'staged' && snapshot.state !== 'active')) {
255
+ throw new Error('CoreMail desired-state reconciliation is unavailable.');
256
+ }
257
+ await this.transfers.assertConsumed({
258
+ grantId,
259
+ authority: this.controlAuthority(),
260
+ purpose: 'desired-state-upload',
261
+ expectedSha256: desiredStateDigest,
262
+ lengthBytes,
263
+ objectKey: snapshot.objectKey,
264
+ });
265
+ const bytes = await this.storage.getVerifiedBytes(snapshot.objectKey, snapshot.lengthBytes, snapshot.desiredStateDigest, plugins.serveZoneInterfaces.data.coreMailLimits.desiredStateBytes);
266
+ const desiredState = await this.parseDesiredState(bytes, snapshot.configEpoch, snapshot.desiredStateDigest);
267
+ if (snapshot.state === 'active'
268
+ && this.activeStatePointer.snapshotId === snapshot.snapshotId) {
269
+ return await this.createStatus('ready', desiredState);
270
+ }
271
+ const activatedAt = this.now();
272
+ const activation = await withCoreMailTransaction(this.database, async (transactionArg) => {
273
+ const transactionSnapshot = await this.models.DesiredSnapshot.exact.findStoredOne({
274
+ snapshotId: snapshot.snapshotId,
275
+ reconciliationId: snapshot.reconciliationId,
276
+ state: 'staged',
277
+ }, { session: transactionArg });
278
+ const current = await this.models.State.exact.findStoredOne({
279
+ stateId: 'active',
280
+ appliedConfigEpoch: snapshot.expectedAppliedConfigEpoch,
281
+ }, { session: transactionArg });
282
+ if (!transactionSnapshot
283
+ || !current
284
+ || snapshot.configEpoch <= current.appliedConfigEpoch
285
+ || current.snapshotId !== this.activeStatePointer.snapshotId
286
+ || current.appliedDesiredStateDigest
287
+ !== this.activeStatePointer.appliedDesiredStateDigest) {
288
+ throw new Error('CoreMail desired-state anti-rollback fence changed.');
289
+ }
290
+ const snapshotActivation = await this.models.DesiredSnapshot.exact.transition({
291
+ current: transactionSnapshot,
292
+ change: (modelArg) => {
293
+ modelArg.state = 'active';
294
+ modelArg.activatedAt = activatedAt;
295
+ modelArg.updatedAt = activatedAt;
296
+ },
297
+ }, { session: transactionArg });
298
+ if (snapshotActivation.status !== 'transitioned') {
299
+ throw new Error('CoreMail desired-state snapshot activation was contended.');
300
+ }
301
+ if (current.snapshotId !== '-') {
302
+ const prior = await this.models.DesiredSnapshot.exact.findStoredOne({
303
+ snapshotId: current.snapshotId,
304
+ }, { session: transactionArg });
305
+ if (!prior) {
306
+ throw new Error('CoreMail prior desired-state snapshot is unavailable.');
307
+ }
308
+ const superseded = await this.models.DesiredSnapshot.exact.transition({
309
+ current: prior,
310
+ change: (modelArg) => {
311
+ modelArg.state = 'superseded';
312
+ modelArg.activatedAt ??= current.updatedAt;
313
+ modelArg.updatedAt = activatedAt;
314
+ },
315
+ }, { session: transactionArg });
316
+ if (superseded.status !== 'transitioned') {
317
+ throw new Error('CoreMail prior desired-state snapshot was contended.');
318
+ }
319
+ }
320
+ const pointerActivation = await this.models.State.exact.transition({
321
+ current,
322
+ change: (modelArg) => {
323
+ modelArg.appliedConfigEpoch = snapshot.configEpoch;
324
+ modelArg.appliedDesiredStateDigest = snapshot.desiredStateDigest;
325
+ modelArg.snapshotId = snapshot.snapshotId;
326
+ modelArg.updatedAt = activatedAt;
327
+ },
328
+ }, { session: transactionArg });
329
+ if (pointerActivation.status !== 'transitioned') {
330
+ throw new Error('CoreMail desired-state activation was contended.');
331
+ }
332
+ return pointerActivation.document;
333
+ });
334
+ this.activeStatePointer = activation;
335
+ this.activeDesiredState = desiredState;
336
+ return await this.createStatus('ready', desiredState);
337
+ }
338
+ async getStatus(requestArg) {
339
+ await this.refresh();
340
+ if (this.activeStatePointer.appliedConfigEpoch === 0) {
341
+ throw new Error('CoreMail has no applied desired state.');
342
+ }
343
+ const digest = plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(requestArg.desiredStateDigest);
344
+ if (this.activeDesiredState?.configEpoch === requestArg.configEpoch
345
+ && this.activeStatePointer.appliedDesiredStateDigest === digest) {
346
+ return await this.createStatus('ready', this.activeDesiredState);
347
+ }
348
+ const snapshot = await this.models.DesiredSnapshot.exact.findStoredOne({
349
+ configEpoch: requestArg.configEpoch,
350
+ desiredStateDigest: digest,
351
+ });
352
+ return await this.createStatus(snapshot?.state === 'staged' ? 'applying' : 'failed', this.activeDesiredState, snapshot?.errorCode ?? 'RECONCILIATION_FENCE_MISMATCH');
353
+ }
354
+ async createStatus(stateArg, desiredStateArg, errorCodeArg) {
355
+ const bindings = await Promise.all((desiredStateArg?.bindings ?? []).map(async (bindingArg) => ({
356
+ bindingId: bindingArg.bindingId,
357
+ revision: bindingArg.revision,
358
+ state: bindingArg.state,
359
+ pendingInboundCount: await this.models.InboundDelivery.exact.count({
360
+ tenantId: bindingArg.tenantId,
361
+ serviceId: bindingArg.serviceId,
362
+ bindingId: bindingArg.bindingId,
363
+ bindingRevision: bindingArg.revision,
364
+ state: {
365
+ $in: [...plugins.serveZoneInterfaces.data.coreMailQuotaPolicy
366
+ .pendingInboundStates],
367
+ },
368
+ }),
369
+ activeSessionsByCredential: this.activeSessionCounts(bindingArg, desiredStateArg.configEpoch),
370
+ })));
371
+ return {
372
+ replica: { ...this.replica },
373
+ state: stateArg,
374
+ appliedConfigEpoch: this.activeStatePointer.appliedConfigEpoch,
375
+ appliedDesiredStateDigest: this.activeStatePointer.appliedDesiredStateDigest,
376
+ bindings,
377
+ updatedAt: this.now(),
378
+ ...(errorCodeArg ? { errorCode: errorCodeArg } : {}),
379
+ };
380
+ }
381
+ }
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kZXNpcmVkc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmRlc2lyZWRzdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUs5RCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLG1CQUFtQixHQUNwQixNQUFNLHlCQUF5QixDQUFDO0FBU2pDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTFDLE1BQU0sT0FBTywyQkFBMkI7SUFNbkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBSUE7SUFkWCxrQkFBa0IsR0FBaUMsSUFBSSxDQUFDO0lBQ3hELGtCQUFrQixDQUFnQjtJQUNsQyxXQUFXLEdBQXlCLElBQUksQ0FBQztJQUVqRCxZQUNtQixRQUF1QyxFQUN2QyxNQUF1QixFQUN2QixPQUF3QixFQUN4QixTQUFrQyxFQUNsQyxPQUFnQyxFQUNoQyxtQkFHbUQsRUFDbkQsTUFBb0IsSUFBSSxDQUFDLEdBQUc7UUFUNUIsYUFBUSxHQUFSLFFBQVEsQ0FBK0I7UUFDdkMsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsY0FBUyxHQUFULFNBQVMsQ0FBeUI7UUFDbEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDaEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUdnQztR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
@@ -0,0 +1,62 @@
1
+ import * as plugins from './plugins.js';
2
+ import { type ICoreMailModels } from './classes.models.js';
3
+ import { CoreMailTransferService } from './classes.transfer.js';
4
+ import type { CoreMailInboundService } from './classes.inbound.js';
5
+ import type { ICoreMailConfig } from './interfaces.js';
6
+ import type { ICoreMailSubmissionRecord } from './coremail.persistence.js';
7
+ type TDesiredState = plugins.serveZoneInterfaces.data.ICoreMailDesiredState;
8
+ type TGatewayStatus = plugins.serveZoneInterfaces.data.ICoreMailGatewayOutboundStatus;
9
+ type TStoredSubmission = plugins.smartdata.TStoredDocument<ICoreMailSubmissionRecord>;
10
+ export declare const requireMatchingCoreMailTransferOrigin: (valueArg: unknown, expectedArg: string) => string;
11
+ export declare class CoreMailGateway {
12
+ private readonly config;
13
+ private readonly models;
14
+ private readonly transfers;
15
+ private readonly inbound;
16
+ private readonly getDesiredState;
17
+ private readonly now;
18
+ private socket;
19
+ private socketSignature;
20
+ private authenticatedSignature;
21
+ private transferOrigin;
22
+ private readonly stopController;
23
+ private reconcileTask;
24
+ private statusSubscription;
25
+ private authenticationTask;
26
+ private authenticatingSignature;
27
+ constructor(config: ICoreMailConfig, models: ICoreMailModels, transfers: CoreMailTransferService, inbound: CoreMailInboundService, getDesiredState: () => Promise<TDesiredState | null>, now?: () => number);
28
+ start(): void;
29
+ stop(): Promise<void>;
30
+ isReady(): boolean;
31
+ getTransferOrigin(): string | null;
32
+ private runReconciliationLoop;
33
+ private connect;
34
+ private queueAuthentication;
35
+ private requireAuthenticated;
36
+ private disconnect;
37
+ prepareOutbound(submissionArg: ICoreMailSubmissionRecord, grantArg: plugins.serveZoneInterfaces.data.ICoreMailDownloadGrant): Promise<{
38
+ transportMessageId: string;
39
+ status: TGatewayStatus;
40
+ replayed: boolean;
41
+ }>;
42
+ getOutboundStatus(transportMessageIdArg: string): Promise<TGatewayStatus>;
43
+ private completeOutboundHandoff;
44
+ persistStatus(initialSubmissionArg: TStoredSubmission, statusArg: TGatewayStatus, leaseTokenArg?: string): Promise<TStoredSubmission>;
45
+ }
46
+ export declare class CoreMailOutboundWorker {
47
+ private readonly models;
48
+ private readonly transfers;
49
+ private readonly gateway;
50
+ private readonly replicaTaskId;
51
+ private readonly serviceId;
52
+ private readonly now;
53
+ private readonly stopController;
54
+ private workerTask;
55
+ constructor(models: ICoreMailModels, transfers: CoreMailTransferService, gateway: CoreMailGateway, replicaTaskId: string, serviceId: string, now?: () => number);
56
+ start(): void;
57
+ stop(): Promise<void>;
58
+ private run;
59
+ private processBatch;
60
+ private processClaimed;
61
+ }
62
+ export {};