@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,309 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { CoreMailAuthenticationError, CoreMailAuthorizationError, CoreMailCapabilityDeniedError, CoreMailAuth, coreMailPreAuthDeadlineKey, coreMailSessionKey, } from './classes.auth.js';
|
|
3
|
+
import { CoreMailQuotaExceededError } from './coremail.quota.js';
|
|
4
|
+
const privacySafeError = (errorArg) => {
|
|
5
|
+
let code = 'INVALID_REQUEST';
|
|
6
|
+
let retryable = false;
|
|
7
|
+
if (errorArg instanceof CoreMailAuthenticationError) {
|
|
8
|
+
code = 'AUTHENTICATION_FAILED';
|
|
9
|
+
}
|
|
10
|
+
else if (errorArg instanceof CoreMailCapabilityDeniedError) {
|
|
11
|
+
code = 'CAPABILITY_DENIED';
|
|
12
|
+
}
|
|
13
|
+
else if (errorArg instanceof CoreMailAuthorizationError) {
|
|
14
|
+
code = 'AUTHORITY_REVOKED';
|
|
15
|
+
}
|
|
16
|
+
else if (errorArg instanceof CoreMailQuotaExceededError) {
|
|
17
|
+
return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
|
|
18
|
+
code: 'QUOTA_EXCEEDED',
|
|
19
|
+
retryable: true,
|
|
20
|
+
...(errorArg.retryAfterMs === undefined
|
|
21
|
+
? {}
|
|
22
|
+
: { retryAfterMs: errorArg.retryAfterMs }),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else if (errorArg instanceof Error
|
|
26
|
+
&& errorArg.message.includes('gateway')
|
|
27
|
+
&& errorArg.message.includes('unavailable')) {
|
|
28
|
+
code = 'GATEWAY_UNAVAILABLE';
|
|
29
|
+
retryable = true;
|
|
30
|
+
}
|
|
31
|
+
else if (errorArg instanceof Error
|
|
32
|
+
&& errorArg.message.includes('idempotency')) {
|
|
33
|
+
code = 'IDEMPOTENCY_CONFLICT';
|
|
34
|
+
}
|
|
35
|
+
else if (errorArg instanceof Error
|
|
36
|
+
&& errorArg.message.includes('fence')) {
|
|
37
|
+
code = 'STATE_CONFLICT';
|
|
38
|
+
retryable = true;
|
|
39
|
+
}
|
|
40
|
+
else if (errorArg instanceof Error
|
|
41
|
+
&& (errorArg.message.includes('byte budget')
|
|
42
|
+
|| errorArg.message.includes('content budget')
|
|
43
|
+
|| errorArg.message.includes('exceeds'))) {
|
|
44
|
+
code = 'PAYLOAD_LIMIT_EXCEEDED';
|
|
45
|
+
}
|
|
46
|
+
return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
|
|
47
|
+
code,
|
|
48
|
+
retryable,
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
const asPeer = (toolsArg) => {
|
|
52
|
+
const peer = toolsArg?.localData?.peer;
|
|
53
|
+
if (!peer
|
|
54
|
+
|| typeof peer.id !== 'string'
|
|
55
|
+
|| !(peer.data instanceof Map)
|
|
56
|
+
|| typeof peer.close !== 'function'
|
|
57
|
+
|| typeof peer.terminate !== 'function') {
|
|
58
|
+
throw new CoreMailAuthenticationError();
|
|
59
|
+
}
|
|
60
|
+
return peer;
|
|
61
|
+
};
|
|
62
|
+
export const countCoreMailActiveSessions = (sessionsArg, bindingArg, configEpochArg) => {
|
|
63
|
+
const counts = new Map();
|
|
64
|
+
for (const session of sessionsArg) {
|
|
65
|
+
if (session?.kind === 'workload'
|
|
66
|
+
&& session.tenantId === bindingArg.tenantId
|
|
67
|
+
&& session.serviceId === bindingArg.serviceId
|
|
68
|
+
&& session.bindingId === bindingArg.bindingId
|
|
69
|
+
&& session.bindingRevision === bindingArg.revision
|
|
70
|
+
&& session.configEpoch === configEpochArg) {
|
|
71
|
+
const key = `${session.credentialId}\u0000${session.credentialVersion}`;
|
|
72
|
+
const count = counts.get(key);
|
|
73
|
+
counts.set(key, count
|
|
74
|
+
? { ...count, count: count.count + 1 }
|
|
75
|
+
: {
|
|
76
|
+
credentialId: session.credentialId,
|
|
77
|
+
version: session.credentialVersion,
|
|
78
|
+
count: 1,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...counts.values()].sort((leftArg, rightArg) => leftArg.version - rightArg.version
|
|
83
|
+
|| leftArg.credentialId.localeCompare(rightArg.credentialId));
|
|
84
|
+
};
|
|
85
|
+
export class CoreMailServer {
|
|
86
|
+
config;
|
|
87
|
+
database;
|
|
88
|
+
storage;
|
|
89
|
+
transfers;
|
|
90
|
+
desiredState;
|
|
91
|
+
auth;
|
|
92
|
+
submissions;
|
|
93
|
+
inbound;
|
|
94
|
+
gateway;
|
|
95
|
+
now;
|
|
96
|
+
router = new plugins.typedrequest.TypedRouter();
|
|
97
|
+
typedServer;
|
|
98
|
+
preAuthSweepTimer = null;
|
|
99
|
+
constructor(config, database, storage, transfers, desiredState, auth, submissions, inbound, gateway, now = Date.now) {
|
|
100
|
+
this.config = config;
|
|
101
|
+
this.database = database;
|
|
102
|
+
this.storage = storage;
|
|
103
|
+
this.transfers = transfers;
|
|
104
|
+
this.desiredState = desiredState;
|
|
105
|
+
this.auth = auth;
|
|
106
|
+
this.submissions = submissions;
|
|
107
|
+
this.inbound = inbound;
|
|
108
|
+
this.gateway = gateway;
|
|
109
|
+
this.now = now;
|
|
110
|
+
this.registerHandlers();
|
|
111
|
+
this.typedServer = new plugins.typedserver.TypedServer({
|
|
112
|
+
port: config.port,
|
|
113
|
+
cors: false,
|
|
114
|
+
authorityValidation: 'strict',
|
|
115
|
+
connectionTimeout: 15_000,
|
|
116
|
+
headersTimeout: 10_000,
|
|
117
|
+
requestTimeout: 2 * 60_000,
|
|
118
|
+
websocketMaxPayloadBytes: plugins.serveZoneInterfaces.data.coreMailLimits.controlMessageBytes,
|
|
119
|
+
healthzEndpoint: false,
|
|
120
|
+
noCache: true,
|
|
121
|
+
compression: false,
|
|
122
|
+
surfaces: [{
|
|
123
|
+
name: 'coremail',
|
|
124
|
+
match: {
|
|
125
|
+
hostnames: config.hostnames,
|
|
126
|
+
pathPrefixes: ['/'],
|
|
127
|
+
websocketPathPrefixes: ['/socket'],
|
|
128
|
+
},
|
|
129
|
+
typedRequestPath: false,
|
|
130
|
+
websocketTypedRouter: this.router,
|
|
131
|
+
cors: false,
|
|
132
|
+
noCache: true,
|
|
133
|
+
includeBuiltinTypedHandlers: false,
|
|
134
|
+
websocketAdmission: (contextArg) => {
|
|
135
|
+
if (contextArg.path !== '/socket') {
|
|
136
|
+
return new Response('Not Found', { status: 404 });
|
|
137
|
+
}
|
|
138
|
+
contextArg.state[coreMailPreAuthDeadlineKey] = this.now() + 5_000;
|
|
139
|
+
return true;
|
|
140
|
+
},
|
|
141
|
+
httpHandler: async (contextArg) => {
|
|
142
|
+
const transferResponse = await this.transfers.handleHttp(contextArg);
|
|
143
|
+
if (transferResponse) {
|
|
144
|
+
return transferResponse;
|
|
145
|
+
}
|
|
146
|
+
if ((contextArg.method === 'GET' || contextArg.method === 'HEAD')
|
|
147
|
+
&& contextArg.path === '/live') {
|
|
148
|
+
return new Response(contextArg.method === 'HEAD' ? null : JSON.stringify({ live: true }), {
|
|
149
|
+
status: 200,
|
|
150
|
+
headers: {
|
|
151
|
+
'Content-Type': 'application/json',
|
|
152
|
+
'Cache-Control': 'no-store',
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if ((contextArg.method === 'GET' || contextArg.method === 'HEAD')
|
|
157
|
+
&& contextArg.path === '/ready') {
|
|
158
|
+
const readiness = await this.getReadiness();
|
|
159
|
+
const ready = Object.values(readiness).every(Boolean);
|
|
160
|
+
return new Response(contextArg.method === 'HEAD' ? null : JSON.stringify(readiness), {
|
|
161
|
+
status: ready ? 200 : 503,
|
|
162
|
+
headers: {
|
|
163
|
+
'Content-Type': 'application/json',
|
|
164
|
+
'Cache-Control': 'no-store',
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
},
|
|
170
|
+
securityHeaders: {
|
|
171
|
+
xFrameOptions: 'DENY',
|
|
172
|
+
xContentTypeOptions: true,
|
|
173
|
+
referrerPolicy: 'no-referrer',
|
|
174
|
+
permissionsPolicy: {},
|
|
175
|
+
crossOriginOpenerPolicy: 'same-origin',
|
|
176
|
+
crossOriginResourcePolicy: 'same-origin',
|
|
177
|
+
},
|
|
178
|
+
}],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async start() {
|
|
182
|
+
await this.typedServer.start();
|
|
183
|
+
this.preAuthSweepTimer = setInterval(() => {
|
|
184
|
+
const now = this.now();
|
|
185
|
+
for (const peer of this.typedServer.smartServe.getWebSocketConnections()) {
|
|
186
|
+
const deadline = Number(peer.context.state[coreMailPreAuthDeadlineKey]);
|
|
187
|
+
if (!peer.data.has(coreMailSessionKey)
|
|
188
|
+
&& (!Number.isSafeInteger(deadline) || deadline < now)) {
|
|
189
|
+
peer.terminate();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, 250);
|
|
193
|
+
this.preAuthSweepTimer.unref?.();
|
|
194
|
+
}
|
|
195
|
+
async stop() {
|
|
196
|
+
if (this.preAuthSweepTimer) {
|
|
197
|
+
clearInterval(this.preAuthSweepTimer);
|
|
198
|
+
this.preAuthSweepTimer = null;
|
|
199
|
+
}
|
|
200
|
+
await this.typedServer.stop();
|
|
201
|
+
}
|
|
202
|
+
activeSessionCounts(bindingArg, configEpochArg) {
|
|
203
|
+
if (!this.typedServer.smartServe) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
return countCoreMailActiveSessions(this.typedServer.smartServe.getWebSocketConnections().map((peerArg) => peerArg.data.get(coreMailSessionKey)), bindingArg, configEpochArg);
|
|
207
|
+
}
|
|
208
|
+
async getReadiness() {
|
|
209
|
+
const [database, objectStorage, desiredState] = await Promise.all([
|
|
210
|
+
this.database.checkReadiness({ timeoutMs: 1_500 })
|
|
211
|
+
.then((resultArg) => resultArg.ready)
|
|
212
|
+
.catch(() => false),
|
|
213
|
+
this.storage.checkReadiness().catch(() => false),
|
|
214
|
+
this.desiredState.getActiveDesiredState().catch(() => null),
|
|
215
|
+
]);
|
|
216
|
+
return {
|
|
217
|
+
live: true,
|
|
218
|
+
database,
|
|
219
|
+
objectStorage,
|
|
220
|
+
exactUpload: objectStorage,
|
|
221
|
+
exactPurge: objectStorage,
|
|
222
|
+
controlBootstrap: true,
|
|
223
|
+
gateway: Boolean(desiredState) && this.gateway.isReady(),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
registerHandlers() {
|
|
227
|
+
this.addHandler('coreMailAuthenticateControl', async (requestArg, toolsArg) => {
|
|
228
|
+
const peer = asPeer(toolsArg);
|
|
229
|
+
const session = await this.auth.authenticateControl(peer, requestArg);
|
|
230
|
+
return {
|
|
231
|
+
authenticated: true,
|
|
232
|
+
credentialId: session.credentialId,
|
|
233
|
+
replica: { ...this.config.replica },
|
|
234
|
+
credentialVersion: session.credentialVersion,
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
this.addHandler('coreMailAuthenticateWorkload', async (requestArg, toolsArg) => {
|
|
238
|
+
const session = await this.auth.authenticateWorkload(asPeer(toolsArg), requestArg);
|
|
239
|
+
return {
|
|
240
|
+
authenticated: true,
|
|
241
|
+
credentialId: session.credentialId,
|
|
242
|
+
credentialVersion: session.credentialVersion,
|
|
243
|
+
bindingState: session.bindingState,
|
|
244
|
+
capabilities: [...session.capabilities],
|
|
245
|
+
allowedOperations: [...session.allowedOperations],
|
|
246
|
+
coreMailTransferOrigin: session.coreMailTransferOrigin,
|
|
247
|
+
};
|
|
248
|
+
});
|
|
249
|
+
this.addHandler('coreMailPrepareDesiredStateUpload', async (requestArg, toolsArg) => {
|
|
250
|
+
this.auth.requireControlSession(asPeer(toolsArg));
|
|
251
|
+
return await this.desiredState.prepare(requestArg);
|
|
252
|
+
});
|
|
253
|
+
this.addHandler('coreMailApplyDesiredState', async (requestArg, toolsArg) => {
|
|
254
|
+
this.auth.requireControlSession(asPeer(toolsArg));
|
|
255
|
+
return { status: await this.desiredState.apply(requestArg) };
|
|
256
|
+
});
|
|
257
|
+
this.addHandler('coreMailGetReconciliationStatus', async (requestArg, toolsArg) => {
|
|
258
|
+
this.auth.requireControlSession(asPeer(toolsArg));
|
|
259
|
+
return { status: await this.desiredState.getStatus(requestArg) };
|
|
260
|
+
});
|
|
261
|
+
this.addHandler('coreMailPrepareOutboundSubmission', async (requestArg, toolsArg) => {
|
|
262
|
+
const { session, binding } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareOutboundSubmission');
|
|
263
|
+
return await this.submissions.prepare(session, binding, requestArg);
|
|
264
|
+
});
|
|
265
|
+
this.addHandler('coreMailPrepareOutboundPartUpload', async (requestArg, toolsArg) => {
|
|
266
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareOutboundPartUpload');
|
|
267
|
+
return await this.submissions.preparePartUpload(session, requestArg);
|
|
268
|
+
});
|
|
269
|
+
this.addHandler('coreMailCompleteOutboundPartUpload', async (requestArg, toolsArg) => {
|
|
270
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailCompleteOutboundPartUpload');
|
|
271
|
+
return await this.submissions.completePartUpload(session, requestArg);
|
|
272
|
+
});
|
|
273
|
+
this.addHandler('coreMailFinalizeOutboundSubmission', async (requestArg, toolsArg) => {
|
|
274
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailFinalizeOutboundSubmission');
|
|
275
|
+
return await this.submissions.finalize(session, requestArg);
|
|
276
|
+
});
|
|
277
|
+
this.addHandler('coreMailGetOutboundSubmission', async (requestArg, toolsArg) => {
|
|
278
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailGetOutboundSubmission');
|
|
279
|
+
return await this.submissions.get(session, requestArg);
|
|
280
|
+
});
|
|
281
|
+
this.addHandler('coreMailListInboundDeliveries', async (requestArg, toolsArg) => {
|
|
282
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailListInboundDeliveries');
|
|
283
|
+
return await this.inbound.listDeliveries(session, requestArg);
|
|
284
|
+
});
|
|
285
|
+
this.addHandler('coreMailPrepareInboundFetch', async (requestArg, toolsArg) => {
|
|
286
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareInboundFetch');
|
|
287
|
+
return await this.inbound.prepareFetch(session, requestArg);
|
|
288
|
+
});
|
|
289
|
+
this.addHandler('coreMailCompleteInboundFetch', async (requestArg, toolsArg) => {
|
|
290
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailCompleteInboundFetch');
|
|
291
|
+
return await this.inbound.completeFetch(session, requestArg);
|
|
292
|
+
});
|
|
293
|
+
this.addHandler('coreMailAcknowledgeInboundDelivery', async (requestArg, toolsArg) => {
|
|
294
|
+
const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailAcknowledgeInboundDelivery');
|
|
295
|
+
return await this.inbound.acknowledge(session, requestArg);
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
addHandler(methodArg, handlerArg) {
|
|
299
|
+
this.router.addTypedHandler(new plugins.typedrequest.TypedHandler(methodArg, async (requestArg, toolsArg) => {
|
|
300
|
+
try {
|
|
301
|
+
return await handlerArg(requestArg, toolsArg);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
throw privacySafeError(error);
|
|
305
|
+
}
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0IsWUFBWSxFQUNaLDBCQUEwQixFQUMxQixrQkFBa0IsR0FDbkIsTUFBTSxtQkFBbUIsQ0FBQztBQWEzQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFqRSxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLFFBQWlCLEVBQ3dCLEVBQUU7SUFDM0MsSUFBSSxJQUFJLEdBQWUsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksUUFBUSxZQUFZLDJCQUEyQixFQUFFLENBQUM7UUFDcEQsSUFBSSxHQUFHLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7U0FBTSxJQUFJLFFBQVEsWUFBWSw2QkFBNkIsRUFBRSxDQUFDO1FBQzdELElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO1NBQU0sSUFBSSxRQUFRLFlBQVksMEJBQTBCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksUUFBUSxZQUFZLDBCQUEwQixFQUFFLENBQUM7UUFDMUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLEVBQUU7WUFDL0UsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixTQUFTLEVBQUUsSUFBSTtZQUNmLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVM7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFO2dCQUNKLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLENB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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
type TCoreMailSha256 = plugins.serveZoneInterfaces.data.TCoreMailSha256;
|
|
3
|
+
export declare class CoreMailStorage {
|
|
4
|
+
readonly bucketName: string;
|
|
5
|
+
readonly smartBucket: plugins.smartbucket.SmartBucket;
|
|
6
|
+
bucket: plugins.smartbucket.Bucket;
|
|
7
|
+
private exactUploadCapability?;
|
|
8
|
+
private exactPurgeCapability?;
|
|
9
|
+
constructor(storageDescriptorArg: Record<string, unknown>, bucketName: string);
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
checkReadiness(): Promise<boolean>;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
purgeExact(objectKeyArg: string, signalArg?: AbortSignal): Promise<void>;
|
|
14
|
+
putExact(objectKeyArg: string, streamArg: ReadableStream<Uint8Array>, lengthBytesArg: number, sha256Arg: TCoreMailSha256, contentTypeArg: string, maximumBytesArg: number, signalArg?: AbortSignal): Promise<void>;
|
|
15
|
+
putBytesExact(objectKeyArg: string, bytesArg: Uint8Array, contentTypeArg: string, maximumBytesArg: number, signalArg?: AbortSignal): Promise<{
|
|
16
|
+
lengthBytes: number;
|
|
17
|
+
sha256: TCoreMailSha256;
|
|
18
|
+
}>;
|
|
19
|
+
getVerifiedStream(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, signalArg?: AbortSignal): Promise<{
|
|
20
|
+
stream: ReadableStream<Uint8Array>;
|
|
21
|
+
completion: Promise<{
|
|
22
|
+
lengthBytes: number;
|
|
23
|
+
sha256: TCoreMailSha256;
|
|
24
|
+
}>;
|
|
25
|
+
cancel: (reasonArg?: unknown) => Promise<void>;
|
|
26
|
+
}>;
|
|
27
|
+
getVerifiedBytes(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number): Promise<Uint8Array>;
|
|
28
|
+
verifyObject(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, signalArg?: AbortSignal): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare const createSha256: (valueArg: Uint8Array | string) => TCoreMailSha256;
|
|
31
|
+
export declare const createOpaqueToken: () => string;
|
|
32
|
+
export {};
|