@serve.zone/dcrouter 16.5.0 → 17.1.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 +5 -2
- package/deno.json +1 -1
- package/dist_serve/bundle.js +1316 -1151
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +6 -1
- package/dist_ts/classes.dcrouter.js +119 -41
- package/dist_ts/db/classes.cache.cleaner.d.ts +3 -0
- package/dist_ts/db/classes.cache.cleaner.js +7 -3
- package/dist_ts/db/classes.dcrouter-db.js +1 -2
- package/dist_ts/db/documents/classes.cached.email.d.ts +41 -4
- package/dist_ts/db/documents/classes.cached.email.js +36 -5
- package/dist_ts/db/documents/classes.dns-record.doc.js +3 -1
- package/dist_ts/db/documents/classes.smartmta-storage.doc.d.ts +8 -0
- package/dist_ts/db/documents/classes.smartmta-storage.doc.js +91 -0
- package/dist_ts/db/documents/index.d.ts +1 -0
- package/dist_ts/db/documents/index.js +2 -1
- package/dist_ts/dns/classes.dns-server-runtime.d.ts +0 -1
- package/dist_ts/dns/classes.dns-server-runtime.js +4 -36
- package/dist_ts/dns/index.d.ts +1 -0
- package/dist_ts/dns/index.js +2 -1
- package/dist_ts/dns/manager.dns.d.ts +1 -0
- package/dist_ts/dns/manager.dns.js +49 -14
- package/dist_ts/dns/providers/cloudflare.provider.js +19 -4
- package/dist_ts/dns/txt-record-presentation.d.ts +20 -0
- package/dist_ts/dns/txt-record-presentation.js +131 -0
- package/dist_ts/email/classes.accepted-email-spool.d.ts +32 -3
- package/dist_ts/email/classes.accepted-email-spool.js +174 -13
- package/dist_ts/email/classes.email-domain.manager.d.ts +14 -1
- package/dist_ts/email/classes.email-domain.manager.js +151 -8
- package/dist_ts/email/classes.email-settings.manager.js +2 -1
- package/dist_ts/email/classes.mail-dns-sync.d.ts +31 -5
- package/dist_ts/email/classes.mail-dns-sync.js +508 -117
- package/dist_ts/email/classes.smartmta-blob-storage-manager.d.ts +27 -0
- package/dist_ts/email/classes.smartmta-blob-storage-manager.js +110 -0
- package/dist_ts/email/classes.smartmta-storage-manager.d.ts +6 -8
- package/dist_ts/email/classes.smartmta-storage-manager.js +63 -86
- package/dist_ts/email/classes.workapp-mail-manager.d.ts +1 -0
- package/dist_ts/email/classes.workapp-mail-manager.js +31 -4
- package/dist_ts/email/index.d.ts +4 -0
- package/dist_ts/email/index.js +5 -1
- package/dist_ts/email/mail-dns-txt-policy.d.ts +18 -0
- package/dist_ts/email/mail-dns-txt-policy.js +466 -0
- package/dist_ts/email/reconcile-mail-dns-singleton.d.ts +47 -0
- package/dist_ts/email/reconcile-mail-dns-singleton.js +159 -0
- package/dist_ts/email/smartmta-storage-policy.d.ts +9 -0
- package/dist_ts/email/smartmta-storage-policy.js +58 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +8 -0
- package/dist_ts/opsserver/classes.opsserver.js +34 -1
- package/dist_ts/opsserver/handlers/certificate.handler.js +25 -4
- package/dist_ts/opsserver/handlers/config.handler.js +9 -5
- package/dist_ts/opsserver/handlers/dns-provider.handler.js +19 -2
- package/dist_ts/opsserver/handlers/dns-record.handler.js +25 -4
- package/dist_ts/opsserver/handlers/domain.handler.js +37 -3
- package/dist_ts/opsserver/handlers/email-domain.handler.js +5 -7
- package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +1 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.js +26 -7
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +1 -1
- package/dist_ts/opsserver/handlers/logs.handler.js +3 -3
- package/dist_ts/opsserver/handlers/realtime.handler.d.ts +37 -0
- package/dist_ts/opsserver/handlers/realtime.handler.js +154 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +22 -1
- package/dist_ts/opsserver/handlers/route-management.handler.js +47 -5
- package/dist_ts/opsserver/handlers/stats.handler.js +3 -5
- package/dist_ts/paths.d.ts +0 -11
- package/dist_ts/paths.js +1 -22
- package/dist_ts/plugins.d.ts +2 -35
- package/dist_ts/plugins.js +3 -63
- package/dist_ts_interfaces/data/email-domain.d.ts +14 -0
- package/dist_ts_interfaces/requests/config.d.ts +1 -1
- package/dist_ts_interfaces/requests/email-ops.d.ts +34 -1
- package/dist_ts_interfaces/requests/index.d.ts +1 -0
- package/dist_ts_interfaces/requests/index.js +2 -1
- package/dist_ts_interfaces/requests/realtime.d.ts +38 -0
- package/dist_ts_interfaces/requests/realtime.js +11 -0
- package/dist_ts_migrations/index.d.ts +8 -0
- package/dist_ts_migrations/index.js +489 -12
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate/certificates.js +9 -2
- package/dist_ts_web/appstate/domains.js +16 -5
- package/dist_ts_web/appstate/email-domains.d.ts +3 -0
- package/dist_ts_web/appstate/email-domains.js +47 -14
- package/dist_ts_web/appstate/email-ops.d.ts +1 -0
- package/dist_ts_web/appstate/email-ops.js +20 -2
- package/dist_ts_web/appstate/realtime.d.ts +27 -0
- package/dist_ts_web/appstate/realtime.js +71 -0
- package/dist_ts_web/appstate/remoteingress.js +9 -3
- package/dist_ts_web/appstate/routes.js +16 -5
- package/dist_ts_web/appstate/runtime.js +135 -7
- package/dist_ts_web/appstate.d.ts +1 -0
- package/dist_ts_web/appstate.js +2 -1
- package/dist_ts_web/elements/email/email-domain-creation-progress.d.ts +33 -0
- package/dist_ts_web/elements/email/email-domain-creation-progress.js +257 -0
- package/dist_ts_web/elements/email/ops-view-email-domains.js +233 -68
- package/dist_ts_web/elements/email/ops-view-emails.d.ts +4 -2
- package/dist_ts_web/elements/email/ops-view-emails.js +25 -13
- package/dist_ts_web/elements/overview/ops-view-config.js +5 -5
- package/package.json +23 -19
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +136 -44
- package/ts/db/classes.cache.cleaner.ts +18 -3
- package/ts/db/classes.dcrouter-db.ts +0 -2
- package/ts/db/documents/classes.cached.email.ts +78 -4
- package/ts/db/documents/classes.dns-record.doc.ts +1 -0
- package/ts/db/documents/classes.smartmta-storage.doc.ts +25 -0
- package/ts/db/documents/index.ts +1 -0
- package/ts/dns/classes.dns-server-runtime.ts +9 -45
- package/ts/dns/index.ts +1 -0
- package/ts/dns/manager.dns.ts +50 -16
- package/ts/dns/providers/cloudflare.provider.ts +21 -3
- package/ts/dns/txt-record-presentation.ts +134 -0
- package/ts/email/classes.accepted-email-spool.ts +220 -14
- package/ts/email/classes.email-domain.manager.ts +201 -7
- package/ts/email/classes.email-settings.manager.ts +1 -0
- package/ts/email/classes.mail-dns-sync.ts +588 -122
- package/ts/email/classes.smartmta-blob-storage-manager.ts +139 -0
- package/ts/email/classes.smartmta-storage-manager.ts +86 -83
- package/ts/email/classes.workapp-mail-manager.ts +47 -4
- package/ts/email/index.ts +4 -0
- package/ts/email/mail-dns-txt-policy.ts +505 -0
- package/ts/email/reconcile-mail-dns-singleton.ts +224 -0
- package/ts/email/smartmta-storage-policy.ts +73 -0
- package/ts/opsserver/classes.opsserver.ts +42 -0
- package/ts/opsserver/handlers/certificate.handler.ts +24 -3
- package/ts/opsserver/handlers/config.handler.ts +9 -5
- package/ts/opsserver/handlers/dns-provider.handler.ts +18 -1
- package/ts/opsserver/handlers/dns-record.handler.ts +24 -3
- package/ts/opsserver/handlers/domain.handler.ts +36 -2
- package/ts/opsserver/handlers/email-domain.handler.ts +4 -5
- package/ts/opsserver/handlers/email-ops.handler.ts +29 -6
- package/ts/opsserver/handlers/index.ts +1 -0
- package/ts/opsserver/handlers/logs.handler.ts +2 -2
- package/ts/opsserver/handlers/realtime.handler.ts +222 -0
- package/ts/opsserver/handlers/remoteingress.handler.ts +21 -0
- package/ts/opsserver/handlers/route-management.handler.ts +46 -4
- package/ts/opsserver/handlers/stats.handler.ts +2 -4
- package/ts/paths.ts +0 -25
- package/ts/plugins.ts +2 -69
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate/certificates.ts +6 -1
- package/ts_web/appstate/domains.ts +11 -4
- package/ts_web/appstate/email-domains.ts +68 -14
- package/ts_web/appstate/email-ops.ts +20 -1
- package/ts_web/appstate/realtime.ts +109 -0
- package/ts_web/appstate/remoteingress.ts +6 -2
- package/ts_web/appstate/routes.ts +11 -4
- package/ts_web/appstate/runtime.ts +176 -7
- package/ts_web/appstate.ts +1 -0
- package/ts_web/elements/email/email-domain-creation-progress.ts +340 -0
- package/ts_web/elements/email/ops-view-email-domains.ts +273 -74
- package/ts_web/elements/email/ops-view-emails.ts +23 -16
- package/ts_web/elements/overview/ops-view-config.ts +4 -4
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { IBlobStorageManager } from '@push.rocks/smartmta';
|
|
3
|
+
type TBlobBucket = Pick<plugins.smartbucket.Bucket, 'fastExists' | 'fastGet' | 'fastPut' | 'fastRemove' | 'listAllObjects'>;
|
|
4
|
+
export interface ISmartMtaBlobStorageConfig {
|
|
5
|
+
storageDescriptor: plugins.tsclass.storage.IStorageDescriptor;
|
|
6
|
+
bucketName: string;
|
|
7
|
+
objectPrefix?: string;
|
|
8
|
+
createBucketIfMissing?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SmartMTA blob persistence backed by a SmartBucket bucket.
|
|
12
|
+
*
|
|
13
|
+
* The adapter accepts only SmartMTA queue, attachment, and retained-message
|
|
14
|
+
* namespaces. Every key remains a SmartBucket object key.
|
|
15
|
+
*/
|
|
16
|
+
export declare class SmartMtaBlobStorageManager implements IBlobStorageManager {
|
|
17
|
+
private readonly bucketRef;
|
|
18
|
+
private readonly objectPrefix;
|
|
19
|
+
constructor(bucketRef: TBlobBucket, objectPrefix?: string);
|
|
20
|
+
static create(configArg: ISmartMtaBlobStorageConfig): Promise<SmartMtaBlobStorageManager>;
|
|
21
|
+
get(keyArg: string): Promise<Buffer | null>;
|
|
22
|
+
set(keyArg: string, valueArg: Buffer): Promise<void>;
|
|
23
|
+
list(prefixArg: string): Promise<string[]>;
|
|
24
|
+
delete(keyArg: string): Promise<void>;
|
|
25
|
+
private toObjectKey;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
const SMARTMTA_BLOB_NAMESPACES = [
|
|
3
|
+
'/email/queue/',
|
|
4
|
+
'/email/attachments/',
|
|
5
|
+
'/email/messages/',
|
|
6
|
+
];
|
|
7
|
+
const DEFAULT_OBJECT_PREFIX = 'dcrouter/smartmta/';
|
|
8
|
+
const MAX_STORAGE_KEY_BYTES = 1024;
|
|
9
|
+
function normalizeObjectPrefix(prefixArg = DEFAULT_OBJECT_PREFIX) {
|
|
10
|
+
const prefix = prefixArg.trim().replace(/^\/+|\/+$/g, '');
|
|
11
|
+
if (!prefix || prefix.includes('\\') || prefix.includes('\0')) {
|
|
12
|
+
throw new Error('SmartMTA blob objectPrefix must be a non-empty object-key prefix');
|
|
13
|
+
}
|
|
14
|
+
const segments = prefix.split('/');
|
|
15
|
+
if (segments.some((segment) => !segment || segment === '.' || segment === '..')) {
|
|
16
|
+
throw new Error('SmartMTA blob objectPrefix contains an invalid path segment');
|
|
17
|
+
}
|
|
18
|
+
return `${prefix}/`;
|
|
19
|
+
}
|
|
20
|
+
function normalizeBlobKey(keyArg, allowNamespaceRoot = false) {
|
|
21
|
+
if (typeof keyArg !== 'string' ||
|
|
22
|
+
!keyArg.startsWith('/') ||
|
|
23
|
+
keyArg.includes('\\') ||
|
|
24
|
+
keyArg.includes('\0') ||
|
|
25
|
+
Buffer.byteLength(keyArg, 'utf8') > MAX_STORAGE_KEY_BYTES) {
|
|
26
|
+
throw new Error('Invalid SmartMTA blob storage key');
|
|
27
|
+
}
|
|
28
|
+
const namespace = SMARTMTA_BLOB_NAMESPACES.find((candidate) => keyArg.startsWith(candidate));
|
|
29
|
+
if (!namespace) {
|
|
30
|
+
throw new Error(`Unsupported SmartMTA blob storage namespace: ${keyArg}`);
|
|
31
|
+
}
|
|
32
|
+
const remainder = keyArg.slice(namespace.length);
|
|
33
|
+
if (!allowNamespaceRoot && !remainder) {
|
|
34
|
+
throw new Error('SmartMTA blob storage key must identify an object');
|
|
35
|
+
}
|
|
36
|
+
if (remainder && remainder.split('/').some((segment) => !segment || segment === '.' || segment === '..')) {
|
|
37
|
+
throw new Error('SmartMTA blob storage key contains an invalid path segment');
|
|
38
|
+
}
|
|
39
|
+
return keyArg;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* SmartMTA blob persistence backed by a SmartBucket bucket.
|
|
43
|
+
*
|
|
44
|
+
* The adapter accepts only SmartMTA queue, attachment, and retained-message
|
|
45
|
+
* namespaces. Every key remains a SmartBucket object key.
|
|
46
|
+
*/
|
|
47
|
+
export class SmartMtaBlobStorageManager {
|
|
48
|
+
bucketRef;
|
|
49
|
+
objectPrefix;
|
|
50
|
+
constructor(bucketRef, objectPrefix = DEFAULT_OBJECT_PREFIX) {
|
|
51
|
+
this.bucketRef = bucketRef;
|
|
52
|
+
this.objectPrefix = normalizeObjectPrefix(objectPrefix);
|
|
53
|
+
}
|
|
54
|
+
static async create(configArg) {
|
|
55
|
+
const bucketName = configArg.bucketName?.trim();
|
|
56
|
+
if (!bucketName) {
|
|
57
|
+
throw new Error('SmartMTA blob storage requires a bucketName');
|
|
58
|
+
}
|
|
59
|
+
const smartBucket = new plugins.smartbucket.SmartBucket(configArg.storageDescriptor);
|
|
60
|
+
let bucket;
|
|
61
|
+
if (configArg.createBucketIfMissing) {
|
|
62
|
+
bucket = await smartBucket.bucketExists(bucketName)
|
|
63
|
+
? await smartBucket.getBucketByName(bucketName)
|
|
64
|
+
: await smartBucket.createBucket(bucketName);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
bucket = await smartBucket.getBucketByName(bucketName);
|
|
68
|
+
}
|
|
69
|
+
return new SmartMtaBlobStorageManager(bucket, configArg.objectPrefix);
|
|
70
|
+
}
|
|
71
|
+
async get(keyArg) {
|
|
72
|
+
const objectKey = this.toObjectKey(normalizeBlobKey(keyArg));
|
|
73
|
+
if (!(await this.bucketRef.fastExists({ path: objectKey }))) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return Buffer.from(await this.bucketRef.fastGet({ path: objectKey }));
|
|
77
|
+
}
|
|
78
|
+
async set(keyArg, valueArg) {
|
|
79
|
+
if (!Buffer.isBuffer(valueArg)) {
|
|
80
|
+
throw new TypeError('SmartMTA blob storage values must be Buffers');
|
|
81
|
+
}
|
|
82
|
+
const objectKey = this.toObjectKey(normalizeBlobKey(keyArg));
|
|
83
|
+
await this.bucketRef.fastPut({
|
|
84
|
+
path: objectKey,
|
|
85
|
+
contents: Buffer.from(valueArg),
|
|
86
|
+
overwrite: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async list(prefixArg) {
|
|
90
|
+
const prefix = normalizeBlobKey(prefixArg, true);
|
|
91
|
+
const objectPrefix = this.toObjectKey(prefix);
|
|
92
|
+
const keys = [];
|
|
93
|
+
for await (const objectKey of this.bucketRef.listAllObjects(objectPrefix)) {
|
|
94
|
+
if (!objectKey.startsWith(this.objectPrefix)) {
|
|
95
|
+
throw new Error(`SmartBucket returned an object outside the configured prefix: ${objectKey}`);
|
|
96
|
+
}
|
|
97
|
+
const key = `/${objectKey.slice(this.objectPrefix.length)}`;
|
|
98
|
+
keys.push(normalizeBlobKey(key));
|
|
99
|
+
}
|
|
100
|
+
return keys.sort();
|
|
101
|
+
}
|
|
102
|
+
async delete(keyArg) {
|
|
103
|
+
const objectKey = this.toObjectKey(normalizeBlobKey(keyArg));
|
|
104
|
+
await this.bucketRef.fastRemove({ path: objectKey });
|
|
105
|
+
}
|
|
106
|
+
toObjectKey(keyArg) {
|
|
107
|
+
return `${this.objectPrefix}${keyArg.slice(1)}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydG10YS1ibG9iLXN0b3JhZ2UtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2VtYWlsL2NsYXNzZXMuc21hcnRtdGEtYmxvYi1zdG9yYWdlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFHekMsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLGtCQUFrQjtDQUNWLENBQUM7QUFDWCxNQUFNLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0FBQ25ELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBY25DLFNBQVMscUJBQXFCLENBQUMsU0FBUyxHQUFHLHFCQUFxQjtJQUM5RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUM7QUFDdEIsQ0FBQztBQUVELFNB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
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
private readonly
|
|
5
|
-
constructor(
|
|
6
|
-
private
|
|
7
|
-
private resolvePathForKey;
|
|
8
|
-
private toStorageKey;
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { IStorageManager } from '@push.rocks/smartmta';
|
|
3
|
+
export declare class SmartMtaStorageManager implements IStorageManager {
|
|
4
|
+
private readonly collection;
|
|
5
|
+
constructor(smartdataDb: plugins.smartdata.SmartdataDb);
|
|
6
|
+
private validateDocument;
|
|
9
7
|
get(key: string): Promise<string | null>;
|
|
10
8
|
set(key: string, value: string): Promise<void>;
|
|
11
9
|
list(prefix: string): Promise<string[]>;
|
|
@@ -1,101 +1,78 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
+
import { getSmartMtaTextNamespace, hashSmartMtaStorageKey, normalizeSmartMtaStorageKey, validateSmartMtaTextValue, } from './smartmta-storage-policy.js';
|
|
2
3
|
export class SmartMtaStorageManager {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
this.rootDir = rootDir;
|
|
7
|
-
this.resolvedRootDir = plugins.path.resolve(rootDir);
|
|
8
|
-
plugins.fsUtils.ensureDirSync(this.resolvedRootDir);
|
|
4
|
+
collection;
|
|
5
|
+
constructor(smartdataDb) {
|
|
6
|
+
this.collection = smartdataDb.mongoDb.collection('SmartMtaStorageDoc');
|
|
9
7
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
throw new Error(`
|
|
8
|
+
validateDocument(document, expectedKey) {
|
|
9
|
+
const normalizedKey = normalizeSmartMtaStorageKey(document.key);
|
|
10
|
+
const expectedId = hashSmartMtaStorageKey(normalizedKey);
|
|
11
|
+
if (document._id !== expectedId
|
|
12
|
+
|| document.id !== expectedId
|
|
13
|
+
|| document.key !== normalizedKey
|
|
14
|
+
|| (expectedKey && document.key !== expectedKey)
|
|
15
|
+
|| typeof document.value !== 'string') {
|
|
16
|
+
throw new Error(`Corrupt SmartMTA storage document: ${document._id}`);
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
toStorageKey(filePath) {
|
|
23
|
-
const relativePath = plugins.path.relative(this.resolvedRootDir, filePath).split(plugins.path.sep).join('/');
|
|
24
|
-
return `/${relativePath}`;
|
|
18
|
+
validateSmartMtaTextValue(document.key, document.value);
|
|
19
|
+
return document;
|
|
25
20
|
}
|
|
26
21
|
async get(key) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (error.code === 'ENOENT') {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
22
|
+
const normalizedKey = normalizeSmartMtaStorageKey(key);
|
|
23
|
+
getSmartMtaTextNamespace(normalizedKey);
|
|
24
|
+
const id = hashSmartMtaStorageKey(normalizedKey);
|
|
25
|
+
const document = await this.collection.findOne({ _id: id });
|
|
26
|
+
return document ? this.validateDocument(document, normalizedKey).value : null;
|
|
37
27
|
}
|
|
38
28
|
async set(key, value) {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
const stat = await plugins.fs.promises.stat(prefixPath);
|
|
47
|
-
if (stat.isFile()) {
|
|
48
|
-
return [this.toStorageKey(prefixPath)];
|
|
49
|
-
}
|
|
29
|
+
const normalizedKey = normalizeSmartMtaStorageKey(key);
|
|
30
|
+
validateSmartMtaTextValue(normalizedKey, value);
|
|
31
|
+
const id = hashSmartMtaStorageKey(normalizedKey);
|
|
32
|
+
const existing = await this.collection.findOne({ _id: id });
|
|
33
|
+
if (existing) {
|
|
34
|
+
this.validateDocument(existing, normalizedKey);
|
|
50
35
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
36
|
+
const now = new Date().toISOString();
|
|
37
|
+
await this.collection.updateOne({ _id: id }, {
|
|
38
|
+
$set: {
|
|
39
|
+
id,
|
|
40
|
+
key: normalizedKey,
|
|
41
|
+
value,
|
|
42
|
+
updatedAt: now,
|
|
43
|
+
},
|
|
44
|
+
$setOnInsert: {
|
|
45
|
+
createdAt: now,
|
|
46
|
+
},
|
|
47
|
+
}, { upsert: true });
|
|
48
|
+
const stored = await this.collection.findOne({ _id: id });
|
|
49
|
+
if (!stored || this.validateDocument(stored, normalizedKey).value !== value) {
|
|
50
|
+
throw new Error(`SmartMTA storage write verification failed: ${normalizedKey}`);
|
|
56
51
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return results.sort();
|
|
52
|
+
}
|
|
53
|
+
async list(prefix) {
|
|
54
|
+
const normalizedPrefix = normalizeSmartMtaStorageKey(prefix);
|
|
55
|
+
getSmartMtaTextNamespace(normalizedPrefix);
|
|
56
|
+
const documents = await this.collection.find({
|
|
57
|
+
key: {
|
|
58
|
+
$gte: normalizedPrefix,
|
|
59
|
+
$lt: `${normalizedPrefix}\uffff`,
|
|
60
|
+
},
|
|
61
|
+
}).toArray();
|
|
62
|
+
return documents
|
|
63
|
+
.map((document) => this.validateDocument(document).key)
|
|
64
|
+
.filter((key) => key.startsWith(normalizedPrefix))
|
|
65
|
+
.sort();
|
|
72
66
|
}
|
|
73
67
|
async delete(key) {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
await plugins.fs.promises.unlink(targetPath);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
if (error.code === 'ENOENT') {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
let currentDir = plugins.path.dirname(targetPath);
|
|
91
|
-
while (currentDir.startsWith(this.resolvedRootDir) && currentDir !== this.resolvedRootDir) {
|
|
92
|
-
const entries = await plugins.fs.promises.readdir(currentDir);
|
|
93
|
-
if (entries.length > 0) {
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
await plugins.fs.promises.rmdir(currentDir);
|
|
97
|
-
currentDir = plugins.path.dirname(currentDir);
|
|
68
|
+
const normalizedKey = normalizeSmartMtaStorageKey(key);
|
|
69
|
+
getSmartMtaTextNamespace(normalizedKey);
|
|
70
|
+
const id = hashSmartMtaStorageKey(normalizedKey);
|
|
71
|
+
const existing = await this.collection.findOne({ _id: id });
|
|
72
|
+
if (existing) {
|
|
73
|
+
this.validateDocument(existing, normalizedKey);
|
|
74
|
+
await this.collection.deleteOne({ _id: id });
|
|
98
75
|
}
|
|
99
76
|
}
|
|
100
77
|
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydG10YS1zdG9yYWdlLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9lbWFpbC9jbGFzc2VzLnNtYXJ0bXRhLXN0b3JhZ2UtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IseUJBQXlCLEdBQzFCLE1BQU0sOEJBQThCLENBQUM7QUFXdEMsTUFBTSxPQUFPLHNCQUFzQjtJQUNoQixVQUFVLENBQU07SUFFakMsWUFBWSxXQUEwQztRQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVPLGdCQUFnQixDQUN0QixRQUFrQyxFQUNsQyxXQUFvQjtRQUVwQixNQUFNLGFBQWEsR0FBRywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQsSUFDRSxRQUFRLENBQUMsR0FBRyxLQUFLLFVBQVU7ZUFDeEIsUUFBUSxDQUFDLEVBQUUsS0FBSyxVQUFVO2VBQzFCLFFBQVEsQ0FBQyxHQUFHLEtBQUssYUFBYTtlQUM5QixDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQztlQUM3QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUNyQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FB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
|
|
@@ -104,6 +104,7 @@ export declare class WorkAppMailManager {
|
|
|
104
104
|
private getCanonicalInboundTarget;
|
|
105
105
|
private getCachedEmailById;
|
|
106
106
|
private buildMailDeliveryStatus;
|
|
107
|
+
private mapDeliveryAttempts;
|
|
107
108
|
private findQueueItemForCachedEmail;
|
|
108
109
|
private getQueueItemCachedEmailId;
|
|
109
110
|
private resolveCachedEmailOwner;
|