@serve.zone/dcrouter 32.1.1 → 32.1.2
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/deno.json +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.js +2 -2
- package/dist_ts/config/classes.gateway-client-manager.js +1 -1
- package/dist_ts/db/documents/classes.cached.email.d.ts +0 -1
- package/dist_ts/db/documents/classes.cached.email.js +45 -48
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.js +61 -50
- package/dist_ts/db/documents/classes.gateway-client.doc.d.ts +9 -2
- package/dist_ts/db/documents/classes.gateway-client.doc.js +9 -11
- package/dist_ts/db/documents/classes.ip-intelligence.doc.d.ts +4 -3
- package/dist_ts/db/documents/classes.ip-intelligence.doc.js +27 -31
- package/dist_ts/db/documents/classes.ops-config-event.doc.d.ts +0 -2
- package/dist_ts/db/documents/classes.ops-config-event.doc.js +70 -68
- package/dist_ts/db/documents/classes.smartmta-storage.doc.d.ts +14 -0
- package/dist_ts/db/documents/classes.smartmta-storage.doc.js +17 -3
- package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-admission.doc.js +14 -5
- package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +1 -1
- package/dist_ts/db/documents/classes.webpush-binding.doc.js +45 -7
- package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-spool.doc.js +33 -5
- package/dist_ts/dns/manager.dns.js +7 -3
- package/dist_ts/email/classes.smartmta-storage-manager.d.ts +15 -3
- package/dist_ts/email/classes.smartmta-storage-manager.js +62 -36
- package/dist_ts/security/classes.security-policy-manager.js +11 -9
- package/dist_ts/webpush/classes.webpush-manager.d.ts +5 -1
- package/dist_ts/webpush/classes.webpush-manager.js +162 -232
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +3 -3
- package/readme.md +1 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +1 -1
- package/ts/config/classes.gateway-client-manager.ts +4 -2
- package/ts/db/documents/classes.cached.email.ts +51 -66
- package/ts/db/documents/classes.email-traffic-bucket.doc.ts +65 -59
- package/ts/db/documents/classes.gateway-client.doc.ts +38 -18
- package/ts/db/documents/classes.ip-intelligence.doc.ts +37 -40
- package/ts/db/documents/classes.ops-config-event.doc.ts +80 -77
- package/ts/db/documents/classes.smartmta-storage.doc.ts +16 -1
- package/ts/db/documents/classes.webpush-admission.doc.ts +14 -5
- package/ts/db/documents/classes.webpush-binding.doc.ts +53 -7
- package/ts/db/documents/classes.webpush-spool.doc.ts +39 -5
- package/ts/dns/manager.dns.ts +6 -2
- package/ts/email/classes.smartmta-storage-manager.ts +66 -50
- package/ts/security/classes.security-policy-manager.ts +10 -8
- package/ts/webpush/classes.webpush-manager.ts +175 -280
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -45,6 +45,7 @@ export declare class WebPushBindingDoc extends plugins.smartdata.SmartDataDbDoc<
|
|
|
45
45
|
ownerAppInstanceId: string;
|
|
46
46
|
enabled: boolean;
|
|
47
47
|
status: plugins.servezoneInterfaces.data.TWebPushBindingStatus;
|
|
48
|
+
/** `credential.id` is the compare-and-set anchor of credential rotation and a unique index. */
|
|
48
49
|
credential: IWebPushStoredCredential;
|
|
49
50
|
/** At most one still-valid overlap credential; expired entries are scrubbed. */
|
|
50
51
|
previousCredentials: IWebPushStoredCredential[];
|
|
@@ -60,6 +61,5 @@ export declare class WebPushBindingDoc extends plugins.smartdata.SmartDataDbDoc<
|
|
|
60
61
|
controllerFence?: IWebPushStoredControllerFence;
|
|
61
62
|
/** MUST BE ABSENT unless this owner-reserving binding is a deletion tombstone. */
|
|
62
63
|
deletedAt?: number;
|
|
63
|
-
static getNativeCollection(): plugins.smartdata.SmartdataCollection<WebPushBindingDoc>['mongoDbCollection'];
|
|
64
64
|
createSavableObject(): Promise<WebPushBindingDoc>;
|
|
65
65
|
}
|
|
@@ -35,8 +35,45 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from '../../plugins.js';
|
|
36
36
|
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
37
|
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
// Every index is declared under the exact name the released Web Push schema migration created
|
|
39
|
+
// it with (`ts_migrations/index.ts` via `ts/webpush/webpush-indexes.ts`), so model initialization
|
|
40
|
+
// verifies the existing topology instead of installing a second, differently named index over the
|
|
41
|
+
// same key. `test/test.webpush-persisted-bytes.node.ts` keeps both declarations in lockstep.
|
|
38
42
|
let WebPushBindingDoc = (() => {
|
|
39
|
-
let _classDecorators = [plugins.smartdata.
|
|
43
|
+
let _classDecorators = [plugins.smartdata.namedIndex({
|
|
44
|
+
name: 'web_push_binding_id_unique',
|
|
45
|
+
key: { id: 1 },
|
|
46
|
+
options: { unique: true },
|
|
47
|
+
}), plugins.smartdata.namedIndex({
|
|
48
|
+
name: 'web_push_binding_owner_unique',
|
|
49
|
+
key: { ownerGatewayClientType: 1, ownerGatewayClientId: 1, ownerAppInstanceId: 1 },
|
|
50
|
+
options: { unique: true },
|
|
51
|
+
}), plugins.smartdata.namedIndex({
|
|
52
|
+
name: 'web_push_binding_credential_unique',
|
|
53
|
+
key: { 'credential.id': 1 },
|
|
54
|
+
options: { unique: true },
|
|
55
|
+
}), plugins.smartdata.namedIndex({
|
|
56
|
+
name: 'web_push_binding_previous_credential_lookup',
|
|
57
|
+
key: { 'previousCredentials.id': 1 },
|
|
58
|
+
}), plugins.smartdata.namedIndex({
|
|
59
|
+
name: 'web_push_binding_previous_credential_cleanup',
|
|
60
|
+
key: { 'previousCredentials.validUntil': 1 },
|
|
61
|
+
}), plugins.smartdata.namedIndex({
|
|
62
|
+
name: 'web_push_binding_rotation_recovery_cleanup',
|
|
63
|
+
key: { 'credentialRotationRecovery.expiresAt': 1 },
|
|
64
|
+
}), plugins.smartdata.namedIndex({
|
|
65
|
+
name: 'web_push_binding_vapid_status_cleanup',
|
|
66
|
+
key: { 'vapidKeys.status': 1 },
|
|
67
|
+
}), plugins.smartdata.namedIndex({
|
|
68
|
+
name: 'web_push_binding_vapid_retire_after_cleanup',
|
|
69
|
+
key: { 'vapidKeys.retireAfter': 1 },
|
|
70
|
+
}), plugins.smartdata.namedIndex({
|
|
71
|
+
name: 'web_push_binding_disabled_cleanup',
|
|
72
|
+
key: { enabled: 1, lifecycleGeneration: 1 },
|
|
73
|
+
}), plugins.smartdata.namedIndex({
|
|
74
|
+
name: 'web_push_binding_deleted_cleanup',
|
|
75
|
+
key: { deletedAt: 1, lifecycleGeneration: 1 },
|
|
76
|
+
}), plugins.smartdata.Collection(() => getDb())];
|
|
40
77
|
let _classDescriptor;
|
|
41
78
|
let _classExtraInitializers = [];
|
|
42
79
|
let _classThis;
|
|
@@ -102,9 +139,12 @@ let WebPushBindingDoc = (() => {
|
|
|
102
139
|
_ownerAppInstanceId_decorators = [plugins.smartdata.svDb()];
|
|
103
140
|
_enabled_decorators = [plugins.smartdata.svDb()];
|
|
104
141
|
_status_decorators = [plugins.smartdata.svDb()];
|
|
105
|
-
_credential_decorators = [plugins.smartdata.svDb()];
|
|
142
|
+
_credential_decorators = [plugins.smartdata.svDb({ atomicPaths: ['id'] })];
|
|
106
143
|
_previousCredentials_decorators = [plugins.smartdata.svDb()];
|
|
107
|
-
_credentialRotationRecovery_decorators = [plugins.smartdata.svDb(
|
|
144
|
+
_credentialRotationRecovery_decorators = [plugins.smartdata.svDb({
|
|
145
|
+
// Expiry cleanup fences on the exact recovery record it observed.
|
|
146
|
+
atomicPaths: ['requestedCredentialId', 'resultingCredentialId', 'expiresAt'],
|
|
147
|
+
})];
|
|
108
148
|
_vapidKeys_decorators = [plugins.smartdata.svDb()];
|
|
109
149
|
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
110
150
|
_updatedAt_decorators = [plugins.smartdata.svDb()];
|
|
@@ -141,6 +181,7 @@ let WebPushBindingDoc = (() => {
|
|
|
141
181
|
ownerAppInstanceId = (__runInitializers(this, _ownerGatewayClientId_extraInitializers), __runInitializers(this, _ownerAppInstanceId_initializers, void 0));
|
|
142
182
|
enabled = (__runInitializers(this, _ownerAppInstanceId_extraInitializers), __runInitializers(this, _enabled_initializers, void 0));
|
|
143
183
|
status = (__runInitializers(this, _enabled_extraInitializers), __runInitializers(this, _status_initializers, void 0));
|
|
184
|
+
/** `credential.id` is the compare-and-set anchor of credential rotation and a unique index. */
|
|
144
185
|
credential = (__runInitializers(this, _status_extraInitializers), __runInitializers(this, _credential_initializers, void 0));
|
|
145
186
|
/** At most one still-valid overlap credential; expired entries are scrubbed. */
|
|
146
187
|
previousCredentials = (__runInitializers(this, _credential_extraInitializers), __runInitializers(this, _previousCredentials_initializers, []));
|
|
@@ -156,9 +197,6 @@ let WebPushBindingDoc = (() => {
|
|
|
156
197
|
controllerFence = (__runInitializers(this, _lifecycleGeneration_extraInitializers), __runInitializers(this, _controllerFence_initializers, void 0));
|
|
157
198
|
/** MUST BE ABSENT unless this owner-reserving binding is a deletion tombstone. */
|
|
158
199
|
deletedAt = (__runInitializers(this, _controllerFence_extraInitializers), __runInitializers(this, _deletedAt_initializers, void 0));
|
|
159
|
-
static getNativeCollection() {
|
|
160
|
-
return getDb().mongoDb.collection('WebPushBindingDoc');
|
|
161
|
-
}
|
|
162
200
|
async createSavableObject() {
|
|
163
201
|
const savable = await super.createSavableObject();
|
|
164
202
|
if (savable.credential.secretHash === undefined) {
|
|
@@ -202,4 +240,4 @@ let WebPushBindingDoc = (() => {
|
|
|
202
240
|
return WebPushBindingDoc = _classThis;
|
|
203
241
|
})();
|
|
204
242
|
export { WebPushBindingDoc };
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLWJpbmRpbmcuZG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZGIvZG9jdW1lbnRzL2NsYXNzZXMud2VicHVzaC1iaW5kaW5nLmRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUE4Q3ZELE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVyRCw4RkFBOEY7QUFDOUYsa0dBQWtHO0FBQ2xHLGtHQUFrRztBQUNsRyw2RkFBNkY7SUE2Q2hGLGlCQUFpQjs0QkE1QzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzVCLElBQUksRUFBRSw0QkFBNEI7WUFDbEMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7U0FDMUIsQ0FBQyxFQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzVCLElBQUksRUFBRSwrQkFBK0I7WUFDckMsR0FBRyxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUU7WUFDbEYsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtTQUMxQixDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDNUIsSUFBSSxFQUFFLG9DQUFvQztZQUMxQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFO1lBQzNCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFB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
|
|
@@ -38,6 +38,5 @@ export declare class WebPushSpoolDoc extends plugins.smartdata.SmartDataDbDoc<We
|
|
|
38
38
|
errorCode: string | null;
|
|
39
39
|
/** MUST BE ABSENT until terminal retention begins. */
|
|
40
40
|
purgeAt?: Date;
|
|
41
|
-
static getNativeCollection(): plugins.smartdata.SmartdataCollection<WebPushSpoolDoc>['mongoDbCollection'];
|
|
42
41
|
createSavableObject(): Promise<WebPushSpoolDoc>;
|
|
43
42
|
}
|
|
@@ -35,8 +35,39 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from '../../plugins.js';
|
|
36
36
|
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
37
|
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
// Every index is declared under the exact name the released Web Push schema migration created
|
|
39
|
+
// it with (`ts_migrations/index.ts` via `ts/webpush/webpush-indexes.ts`), so model initialization
|
|
40
|
+
// verifies the existing topology instead of installing a second, differently named index over the
|
|
41
|
+
// same key. `test/test.webpush-persisted-bytes.node.ts` keeps both declarations in lockstep.
|
|
38
42
|
let WebPushSpoolDoc = (() => {
|
|
39
|
-
let _classDecorators = [plugins.smartdata.
|
|
43
|
+
let _classDecorators = [plugins.smartdata.namedIndex({
|
|
44
|
+
name: 'web_push_spool_id_unique',
|
|
45
|
+
key: { id: 1 },
|
|
46
|
+
options: { unique: true },
|
|
47
|
+
}), plugins.smartdata.namedIndex({
|
|
48
|
+
name: 'web_push_spool_idempotency_unique',
|
|
49
|
+
key: { bindingId: 1, lifecycleGeneration: 1, credentialId: 1, idempotencyKeyDigest: 1 },
|
|
50
|
+
options: { unique: true },
|
|
51
|
+
}), plugins.smartdata.namedIndex({
|
|
52
|
+
name: 'web_push_spool_delivery_scan',
|
|
53
|
+
key: { state: 1, nextAttemptAt: 1, leaseExpiresAt: 1 },
|
|
54
|
+
}), plugins.smartdata.namedIndex({
|
|
55
|
+
name: 'web_push_spool_cancellation_scan',
|
|
56
|
+
key: { bindingId: 1, lifecycleGeneration: 1, subscriptionId: 1, state: 1 },
|
|
57
|
+
}), plugins.smartdata.namedIndex({
|
|
58
|
+
name: 'web_push_spool_cancelled_lease_scan',
|
|
59
|
+
key: { state: 1, cancelRequestedAt: 1, leaseExpiresAt: 1, id: 1 },
|
|
60
|
+
}), plugins.smartdata.namedIndex({
|
|
61
|
+
name: 'web_push_spool_lifecycle_drain_scan',
|
|
62
|
+
key: { bindingId: 1, lifecycleGeneration: 1, state: 1, leaseExpiresAt: 1 },
|
|
63
|
+
}), plugins.smartdata.namedIndex({
|
|
64
|
+
name: 'web_push_spool_vapid_retirement_scan',
|
|
65
|
+
key: { bindingId: 1, lifecycleGeneration: 1, vapidKeyId: 1, state: 1 },
|
|
66
|
+
}), plugins.smartdata.namedIndex({
|
|
67
|
+
name: 'web_push_spool_terminal_ttl',
|
|
68
|
+
key: { purgeAt: 1 },
|
|
69
|
+
options: { expireAfterSeconds: 0 },
|
|
70
|
+
}), plugins.smartdata.Collection(() => getDb())];
|
|
40
71
|
let _classDescriptor;
|
|
41
72
|
let _classExtraInitializers = [];
|
|
42
73
|
let _classThis;
|
|
@@ -237,9 +268,6 @@ let WebPushSpoolDoc = (() => {
|
|
|
237
268
|
errorCode = (__runInitializers(this, _pushServiceStatusCode_extraInitializers), __runInitializers(this, _errorCode_initializers, null));
|
|
238
269
|
/** MUST BE ABSENT until terminal retention begins. */
|
|
239
270
|
purgeAt = (__runInitializers(this, _errorCode_extraInitializers), __runInitializers(this, _purgeAt_initializers, void 0));
|
|
240
|
-
static getNativeCollection() {
|
|
241
|
-
return getDb().mongoDb.collection('WebPushSpoolDoc');
|
|
242
|
-
}
|
|
243
271
|
async createSavableObject() {
|
|
244
272
|
const savable = await super.createSavableObject();
|
|
245
273
|
for (const field of [
|
|
@@ -268,4 +296,4 @@ let WebPushSpoolDoc = (() => {
|
|
|
268
296
|
return WebPushSpoolDoc = _classThis;
|
|
269
297
|
})();
|
|
270
298
|
export { WebPushSpoolDoc };
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLXNwb29sLmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLndlYnB1c2gtc3Bvb2wuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQsOEZBQThGO0FBQzlGLGtHQUFrRztBQUNsRyxrR0FBa0c7QUFDbEcsNkZBQTZGO0lBcUNoRixlQUFlOzRCQXBDM0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDNUIsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtTQUMxQixDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDNUIsSUFBSSxFQUFFLG1DQUFtQztZQUN6QyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRTtZQUN2RixPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1NBQzFCLENBQUMsRUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM1QixJQUFJLEVBQUUsOEJBQThCO1lBQ3BDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFB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
|