@serve.zone/dcrouter 17.2.4 → 17.4.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/deno.json +1 -1
- package/dist_serve/bundle.js +2024 -1758
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +11 -1
- package/dist_ts/classes.dcrouter.js +63 -3
- package/dist_ts/config/classes.api-token-manager.d.ts +20 -2
- package/dist_ts/config/classes.api-token-manager.js +201 -6
- package/dist_ts/config/classes.gateway-client-manager.d.ts +36 -2
- package/dist_ts/config/classes.gateway-client-manager.js +391 -27
- package/dist_ts/db/documents/classes.api-token.doc.d.ts +2 -1
- package/dist_ts/db/documents/classes.api-token.doc.js +8 -2
- package/dist_ts/db/documents/classes.cached.email.d.ts +10 -1
- package/dist_ts/db/documents/classes.cached.email.js +27 -2
- package/dist_ts/db/documents/classes.gateway-client.doc.d.ts +25 -0
- package/dist_ts/db/documents/classes.gateway-client.doc.js +73 -2
- package/dist_ts/db/documents/classes.ops-config-event.doc.d.ts +55 -0
- package/dist_ts/db/documents/classes.ops-config-event.doc.js +296 -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.gateway-route-dns-reconciler.d.ts +52 -0
- package/dist_ts/dns/classes.gateway-route-dns-reconciler.js +609 -0
- 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 +19 -0
- package/dist_ts/dns/manager.dns.js +25 -1
- package/dist_ts/email/classes.accepted-email-spool.d.ts +8 -1
- package/dist_ts/email/classes.accepted-email-spool.js +93 -1
- package/dist_ts/email/classes.smartmta-storage-manager.d.ts +7 -1
- package/dist_ts/email/classes.smartmta-storage-manager.js +46 -1
- package/dist_ts/email/smartmta-storage-policy.js +3 -1
- package/dist_ts/monitoring/classes.ops-event-manager.d.ts +32 -0
- package/dist_ts/monitoring/classes.ops-event-manager.js +71 -0
- package/dist_ts/monitoring/index.d.ts +1 -0
- package/dist_ts/monitoring/index.js +2 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
- package/dist_ts/opsserver/classes.opsserver.js +3 -1
- package/dist_ts/opsserver/handlers/certificate.handler.d.ts +1 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +35 -5
- package/dist_ts/opsserver/handlers/config-event.handler.d.ts +12 -0
- package/dist_ts/opsserver/handlers/config-event.handler.js +47 -0
- package/dist_ts/opsserver/handlers/dns-record.handler.d.ts +1 -0
- package/dist_ts/opsserver/handlers/dns-record.handler.js +82 -3
- package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.js +40 -9
- package/dist_ts/opsserver/handlers/gatewayclient.handler.d.ts +9 -1
- package/dist_ts/opsserver/handlers/gatewayclient.handler.js +714 -162
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts/opsserver/helpers/gateway-client-auth.d.ts +25 -0
- package/dist_ts/opsserver/helpers/gateway-client-auth.js +168 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts_apiclient/classes.gatewayclient.d.ts +13 -1
- package/dist_ts_apiclient/classes.gatewayclient.js +18 -2
- package/dist_ts_interfaces/data/config-events.d.ts +34 -0
- package/dist_ts_interfaces/data/config-events.js +8 -0
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/route-management.d.ts +28 -1
- package/dist_ts_interfaces/data/route-management.js +3 -1
- package/dist_ts_interfaces/data/workhoster.d.ts +1 -0
- package/dist_ts_interfaces/requests/config-events.d.ts +35 -0
- package/dist_ts_interfaces/requests/config-events.js +4 -0
- 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 +1 -1
- package/dist_ts_interfaces/requests/realtime.js +2 -1
- package/dist_ts_migrations/index.js +148 -9
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate/config-events.d.ts +19 -0
- package/dist_ts_web/appstate/config-events.js +68 -0
- package/dist_ts_web/appstate/runtime.js +7 -1
- package/dist_ts_web/appstate.d.ts +1 -0
- package/dist_ts_web/appstate.js +2 -1
- package/dist_ts_web/elements/ops-platform-events.d.ts +21 -0
- package/dist_ts_web/elements/ops-platform-events.js +361 -0
- package/dist_ts_web/elements/ops-view-logs.d.ts +4 -0
- package/dist_ts_web/elements/ops-view-logs.js +96 -9
- package/package.json +4 -4
- package/readme.plan.md +22 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +72 -2
- package/ts/config/classes.api-token-manager.ts +237 -4
- package/ts/config/classes.gateway-client-manager.ts +463 -19
- package/ts/db/documents/classes.api-token.doc.ts +8 -1
- package/ts/db/documents/classes.cached.email.ts +21 -1
- package/ts/db/documents/classes.gateway-client.doc.ts +86 -0
- package/ts/db/documents/classes.ops-config-event.doc.ts +257 -0
- package/ts/db/documents/index.ts +1 -0
- package/ts/dns/classes.gateway-route-dns-reconciler.ts +801 -0
- package/ts/dns/index.ts +1 -0
- package/ts/dns/manager.dns.ts +36 -0
- package/ts/email/classes.accepted-email-spool.ts +111 -0
- package/ts/email/classes.smartmta-storage-manager.ts +57 -1
- package/ts/email/smartmta-storage-policy.ts +2 -0
- package/ts/monitoring/classes.ops-event-manager.ts +99 -0
- package/ts/monitoring/index.ts +2 -1
- package/ts/opsserver/classes.opsserver.ts +2 -0
- package/ts/opsserver/handlers/certificate.handler.ts +51 -4
- package/ts/opsserver/handlers/config-event.handler.ts +62 -0
- package/ts/opsserver/handlers/dns-record.handler.ts +101 -2
- package/ts/opsserver/handlers/email-ops.handler.ts +42 -8
- package/ts/opsserver/handlers/gatewayclient.handler.ts +804 -136
- package/ts/opsserver/handlers/index.ts +1 -0
- package/ts/opsserver/helpers/gateway-client-auth.ts +198 -0
- package/ts/plugins.ts +2 -0
- package/ts_apiclient/classes.gatewayclient.ts +45 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate/config-events.ts +98 -0
- package/ts_web/appstate/runtime.ts +8 -1
- package/ts_web/appstate.ts +1 -0
- package/ts_web/elements/ops-platform-events.ts +315 -0
- package/ts_web/elements/ops-view-logs.ts +84 -7
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import * as plugins from '../../plugins.js';
|
|
36
|
+
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
|
+
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
/**
|
|
39
|
+
* Durable operator-facing platform configuration event (see
|
|
40
|
+
* ts_interfaces/data/config-events.ts). Unacknowledged events persist
|
|
41
|
+
* indefinitely; acknowledged events are pruned after a retention window.
|
|
42
|
+
*/
|
|
43
|
+
let OpsConfigEventDoc = (() => {
|
|
44
|
+
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
45
|
+
let _classDescriptor;
|
|
46
|
+
let _classExtraInitializers = [];
|
|
47
|
+
let _classThis;
|
|
48
|
+
let _classSuper = plugins.smartdata.SmartDataDbDoc;
|
|
49
|
+
let _id_decorators;
|
|
50
|
+
let _id_initializers = [];
|
|
51
|
+
let _id_extraInitializers = [];
|
|
52
|
+
let _severity_decorators;
|
|
53
|
+
let _severity_initializers = [];
|
|
54
|
+
let _severity_extraInitializers = [];
|
|
55
|
+
let _category_decorators;
|
|
56
|
+
let _category_initializers = [];
|
|
57
|
+
let _category_extraInitializers = [];
|
|
58
|
+
let _title_decorators;
|
|
59
|
+
let _title_initializers = [];
|
|
60
|
+
let _title_extraInitializers = [];
|
|
61
|
+
let _detail_decorators;
|
|
62
|
+
let _detail_initializers = [];
|
|
63
|
+
let _detail_extraInitializers = [];
|
|
64
|
+
let _context_decorators;
|
|
65
|
+
let _context_initializers = [];
|
|
66
|
+
let _context_extraInitializers = [];
|
|
67
|
+
let _createdAt_decorators;
|
|
68
|
+
let _createdAt_initializers = [];
|
|
69
|
+
let _createdAt_extraInitializers = [];
|
|
70
|
+
let _acknowledgedBy_decorators;
|
|
71
|
+
let _acknowledgedBy_initializers = [];
|
|
72
|
+
let _acknowledgedBy_extraInitializers = [];
|
|
73
|
+
let _acknowledgedAt_decorators;
|
|
74
|
+
let _acknowledgedAt_initializers = [];
|
|
75
|
+
let _acknowledgedAt_extraInitializers = [];
|
|
76
|
+
let _openDedupeKey_decorators;
|
|
77
|
+
let _openDedupeKey_initializers = [];
|
|
78
|
+
let _openDedupeKey_extraInitializers = [];
|
|
79
|
+
var OpsConfigEventDoc = class extends _classSuper {
|
|
80
|
+
static { _classThis = this; }
|
|
81
|
+
static {
|
|
82
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
83
|
+
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
84
|
+
_severity_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
85
|
+
_category_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
86
|
+
_title_decorators = [plugins.smartdata.svDb()];
|
|
87
|
+
_detail_decorators = [plugins.smartdata.svDb()];
|
|
88
|
+
_context_decorators = [plugins.smartdata.svDb()];
|
|
89
|
+
_createdAt_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
90
|
+
_acknowledgedBy_decorators = [plugins.smartdata.svDb()];
|
|
91
|
+
_acknowledgedAt_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
92
|
+
_openDedupeKey_decorators = [plugins.smartdata.index({ unique: true, sparse: true }), plugins.smartdata.svDb()];
|
|
93
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
94
|
+
__esDecorate(null, null, _severity_decorators, { kind: "field", name: "severity", static: false, private: false, access: { has: obj => "severity" in obj, get: obj => obj.severity, set: (obj, value) => { obj.severity = value; } }, metadata: _metadata }, _severity_initializers, _severity_extraInitializers);
|
|
95
|
+
__esDecorate(null, null, _category_decorators, { kind: "field", name: "category", static: false, private: false, access: { has: obj => "category" in obj, get: obj => obj.category, set: (obj, value) => { obj.category = value; } }, metadata: _metadata }, _category_initializers, _category_extraInitializers);
|
|
96
|
+
__esDecorate(null, null, _title_decorators, { kind: "field", name: "title", static: false, private: false, access: { has: obj => "title" in obj, get: obj => obj.title, set: (obj, value) => { obj.title = value; } }, metadata: _metadata }, _title_initializers, _title_extraInitializers);
|
|
97
|
+
__esDecorate(null, null, _detail_decorators, { kind: "field", name: "detail", static: false, private: false, access: { has: obj => "detail" in obj, get: obj => obj.detail, set: (obj, value) => { obj.detail = value; } }, metadata: _metadata }, _detail_initializers, _detail_extraInitializers);
|
|
98
|
+
__esDecorate(null, null, _context_decorators, { kind: "field", name: "context", static: false, private: false, access: { has: obj => "context" in obj, get: obj => obj.context, set: (obj, value) => { obj.context = value; } }, metadata: _metadata }, _context_initializers, _context_extraInitializers);
|
|
99
|
+
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
100
|
+
__esDecorate(null, null, _acknowledgedBy_decorators, { kind: "field", name: "acknowledgedBy", static: false, private: false, access: { has: obj => "acknowledgedBy" in obj, get: obj => obj.acknowledgedBy, set: (obj, value) => { obj.acknowledgedBy = value; } }, metadata: _metadata }, _acknowledgedBy_initializers, _acknowledgedBy_extraInitializers);
|
|
101
|
+
__esDecorate(null, null, _acknowledgedAt_decorators, { kind: "field", name: "acknowledgedAt", static: false, private: false, access: { has: obj => "acknowledgedAt" in obj, get: obj => obj.acknowledgedAt, set: (obj, value) => { obj.acknowledgedAt = value; } }, metadata: _metadata }, _acknowledgedAt_initializers, _acknowledgedAt_extraInitializers);
|
|
102
|
+
__esDecorate(null, null, _openDedupeKey_decorators, { kind: "field", name: "openDedupeKey", static: false, private: false, access: { has: obj => "openDedupeKey" in obj, get: obj => obj.openDedupeKey, set: (obj, value) => { obj.openDedupeKey = value; } }, metadata: _metadata }, _openDedupeKey_initializers, _openDedupeKey_extraInitializers);
|
|
103
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
104
|
+
OpsConfigEventDoc = _classThis = _classDescriptor.value;
|
|
105
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
106
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
107
|
+
}
|
|
108
|
+
id = __runInitializers(this, _id_initializers, void 0);
|
|
109
|
+
severity = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _severity_initializers, void 0));
|
|
110
|
+
category = (__runInitializers(this, _severity_extraInitializers), __runInitializers(this, _category_initializers, void 0));
|
|
111
|
+
title = (__runInitializers(this, _category_extraInitializers), __runInitializers(this, _title_initializers, void 0));
|
|
112
|
+
detail = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _detail_initializers, void 0));
|
|
113
|
+
context = (__runInitializers(this, _detail_extraInitializers), __runInitializers(this, _context_initializers, {}));
|
|
114
|
+
createdAt = (__runInitializers(this, _context_extraInitializers), __runInitializers(this, _createdAt_initializers, Date.now()));
|
|
115
|
+
acknowledgedBy = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _acknowledgedBy_initializers, void 0));
|
|
116
|
+
acknowledgedAt = (__runInitializers(this, _acknowledgedBy_extraInitializers), __runInitializers(this, _acknowledgedAt_initializers, void 0));
|
|
117
|
+
/** Sparse uniqueness authority for the current open occurrence. */
|
|
118
|
+
openDedupeKey = (__runInitializers(this, _acknowledgedAt_extraInitializers), __runInitializers(this, _openDedupeKey_initializers, void 0));
|
|
119
|
+
constructor() {
|
|
120
|
+
super();
|
|
121
|
+
__runInitializers(this, _openDedupeKey_extraInitializers);
|
|
122
|
+
}
|
|
123
|
+
toApiObject() {
|
|
124
|
+
return {
|
|
125
|
+
id: this.id,
|
|
126
|
+
severity: this.severity,
|
|
127
|
+
category: this.category,
|
|
128
|
+
title: this.title,
|
|
129
|
+
detail: this.detail,
|
|
130
|
+
context: this.context || {},
|
|
131
|
+
createdAt: this.createdAt,
|
|
132
|
+
acknowledgedBy: this.acknowledgedBy ?? undefined,
|
|
133
|
+
acknowledgedAt: this.acknowledgedAt ?? undefined,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async createSavableObject() {
|
|
137
|
+
const savable = await super.createSavableObject();
|
|
138
|
+
// Presence is the uniqueness authority for an open event. Acknowledged
|
|
139
|
+
// events must not leave a null-valued sparse-index key behind.
|
|
140
|
+
if (!this.openDedupeKey)
|
|
141
|
+
delete savable.openDedupeKey;
|
|
142
|
+
return savable;
|
|
143
|
+
}
|
|
144
|
+
static async getNativeCollection() {
|
|
145
|
+
const smartdataCollection = OpsConfigEventDoc.collection;
|
|
146
|
+
await smartdataCollection.init();
|
|
147
|
+
const probe = new OpsConfigEventDoc();
|
|
148
|
+
await smartdataCollection.markUniqueIndexes(probe.uniqueIndexes || []);
|
|
149
|
+
await smartdataCollection.createRegularIndexes(probe.regularIndexes || []);
|
|
150
|
+
return smartdataCollection.mongoDbCollection;
|
|
151
|
+
}
|
|
152
|
+
static hydrate(rawArg) {
|
|
153
|
+
return OpsConfigEventDoc.createInstanceFromMongoDbNativeDoc(rawArg);
|
|
154
|
+
}
|
|
155
|
+
static async upsertOpenEvent(optionsArg) {
|
|
156
|
+
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
157
|
+
const timestamp = new Date(optionsArg.createdAt).toISOString();
|
|
158
|
+
const result = await collection.updateOne({ openDedupeKey: optionsArg.openDedupeKey }, {
|
|
159
|
+
$set: {
|
|
160
|
+
severity: optionsArg.severity,
|
|
161
|
+
detail: optionsArg.detail,
|
|
162
|
+
context: optionsArg.context,
|
|
163
|
+
createdAt: optionsArg.createdAt,
|
|
164
|
+
_updatedAt: timestamp,
|
|
165
|
+
},
|
|
166
|
+
$setOnInsert: {
|
|
167
|
+
id: optionsArg.id,
|
|
168
|
+
category: optionsArg.category,
|
|
169
|
+
title: optionsArg.title,
|
|
170
|
+
openDedupeKey: optionsArg.openDedupeKey,
|
|
171
|
+
_createdAt: timestamp,
|
|
172
|
+
},
|
|
173
|
+
}, { upsert: true });
|
|
174
|
+
const raw = await collection.findOne({ openDedupeKey: optionsArg.openDedupeKey });
|
|
175
|
+
if (!raw)
|
|
176
|
+
throw new Error('Failed to read the recorded platform configuration event');
|
|
177
|
+
return {
|
|
178
|
+
event: OpsConfigEventDoc.hydrate(raw),
|
|
179
|
+
created: result.upsertedCount > 0,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
static async findFiltered(filter = {}) {
|
|
183
|
+
const selector = {};
|
|
184
|
+
if (filter.acknowledged === true)
|
|
185
|
+
selector.acknowledgedAt = { $gt: 0 };
|
|
186
|
+
if (filter.acknowledged === false)
|
|
187
|
+
selector.acknowledgedAt = null;
|
|
188
|
+
if (filter.severity)
|
|
189
|
+
selector.severity = filter.severity;
|
|
190
|
+
if (filter.category)
|
|
191
|
+
selector.category = filter.category;
|
|
192
|
+
const requestedLimit = Number.isSafeInteger(filter.limit) && filter.limit > 0
|
|
193
|
+
? filter.limit
|
|
194
|
+
: 100;
|
|
195
|
+
const limit = Math.min(requestedLimit, 200);
|
|
196
|
+
const countSelector = structuredClone(selector);
|
|
197
|
+
if (filter.cursor) {
|
|
198
|
+
if (!Number.isSafeInteger(filter.cursor.createdAt) || filter.cursor.createdAt < 0
|
|
199
|
+
|| typeof filter.cursor.id !== 'string' || !filter.cursor.id.trim()) {
|
|
200
|
+
throw new Error('Invalid platform configuration event cursor');
|
|
201
|
+
}
|
|
202
|
+
selector.$or = [
|
|
203
|
+
{ createdAt: { $lt: filter.cursor.createdAt } },
|
|
204
|
+
{ createdAt: filter.cursor.createdAt, id: { $lt: filter.cursor.id } },
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
208
|
+
const cursor = collection
|
|
209
|
+
.find(selector)
|
|
210
|
+
.sort({ createdAt: -1, id: -1 })
|
|
211
|
+
.limit(limit + 1);
|
|
212
|
+
try {
|
|
213
|
+
const [rawEvents, total] = await Promise.all([
|
|
214
|
+
cursor.toArray(),
|
|
215
|
+
collection.countDocuments(countSelector),
|
|
216
|
+
]);
|
|
217
|
+
const hasMore = rawEvents.length > limit;
|
|
218
|
+
const pageRows = rawEvents.slice(0, limit);
|
|
219
|
+
const lastRow = pageRows.at(-1);
|
|
220
|
+
return {
|
|
221
|
+
events: pageRows.map((rawArg) => OpsConfigEventDoc.hydrate(rawArg)),
|
|
222
|
+
total,
|
|
223
|
+
...(hasMore && lastRow ? {
|
|
224
|
+
nextCursor: {
|
|
225
|
+
createdAt: Number(lastRow.createdAt),
|
|
226
|
+
id: String(lastRow.id),
|
|
227
|
+
},
|
|
228
|
+
} : {}),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
await cursor.close();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
static async countUnacknowledged() {
|
|
236
|
+
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
237
|
+
return await collection.countDocuments({ acknowledgedAt: null });
|
|
238
|
+
}
|
|
239
|
+
/** Acknowledge the given event ids; returns how many were newly acknowledged. */
|
|
240
|
+
static async acknowledgeByIds(ids, userId) {
|
|
241
|
+
if (typeof userId !== 'string' || !userId.trim()) {
|
|
242
|
+
throw new Error('acknowledgeByIds requires a non-empty user id');
|
|
243
|
+
}
|
|
244
|
+
if (ids.length > 500 || ids.some((idArg) => typeof idArg !== 'string' || !idArg.trim())) {
|
|
245
|
+
throw new Error('acknowledgeByIds requires 0 to 500 non-empty event ids');
|
|
246
|
+
}
|
|
247
|
+
const uniqueIds = Array.from(new Set(ids));
|
|
248
|
+
if (uniqueIds.length === 0)
|
|
249
|
+
return 0;
|
|
250
|
+
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
251
|
+
const now = Date.now();
|
|
252
|
+
const result = await collection.updateMany({ id: { $in: uniqueIds }, acknowledgedAt: null }, {
|
|
253
|
+
$set: {
|
|
254
|
+
acknowledgedBy: userId,
|
|
255
|
+
acknowledgedAt: now,
|
|
256
|
+
_updatedAt: new Date(now).toISOString(),
|
|
257
|
+
},
|
|
258
|
+
$unset: { openDedupeKey: '' },
|
|
259
|
+
});
|
|
260
|
+
return result.modifiedCount;
|
|
261
|
+
}
|
|
262
|
+
/** Delete acknowledged events older than the retention window. */
|
|
263
|
+
static async pruneAcknowledged(maxAgeMs) {
|
|
264
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
265
|
+
let pruned = 0;
|
|
266
|
+
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
267
|
+
while (true) {
|
|
268
|
+
const cursor = collection
|
|
269
|
+
.find({ acknowledgedAt: { $lt: cutoff } }, { projection: { _id: 1 } })
|
|
270
|
+
.sort({ acknowledgedAt: 1, _id: 1 })
|
|
271
|
+
.limit(500);
|
|
272
|
+
let rows;
|
|
273
|
+
try {
|
|
274
|
+
rows = await cursor.toArray();
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
await cursor.close();
|
|
278
|
+
}
|
|
279
|
+
if (rows.length === 0)
|
|
280
|
+
break;
|
|
281
|
+
const deleteFilter = {
|
|
282
|
+
_id: { $in: rows.map((rowArg) => rowArg._id) },
|
|
283
|
+
acknowledgedAt: { $lt: cutoff },
|
|
284
|
+
};
|
|
285
|
+
const result = await collection.deleteMany(deleteFilter);
|
|
286
|
+
if (result.deletedCount === 0)
|
|
287
|
+
break;
|
|
288
|
+
pruned += result.deletedCount;
|
|
289
|
+
}
|
|
290
|
+
return pruned;
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
return OpsConfigEventDoc = _classThis;
|
|
294
|
+
})();
|
|
295
|
+
export { OpsConfigEventDoc };
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHMtY29uZmlnLWV2ZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLm9wcy1jb25maWctZXZlbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVF2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFVckQ7Ozs7R0FJRztJQUVVLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7OzhCQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtvQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDekIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7bUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFB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
|
|
@@ -34,4 +34,5 @@ export * from './classes.acme-config.doc.js';
|
|
|
34
34
|
export * from './classes.email-domain.doc.js';
|
|
35
35
|
export * from './classes.email-server-settings.doc.js';
|
|
36
36
|
export * from './classes.smartmta-storage.doc.js';
|
|
37
|
-
|
|
37
|
+
export * from './classes.ops-config-event.doc.js';
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx3Q0FBd0MsQ0FBQztBQUV2RCwwQkFBMEI7QUFDMUIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFFaEQsdUJBQXVCO0FBQ3ZCLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QywrQkFBK0I7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsK0JBQStCLENBQUM7QUFFOUMsa0NBQWtDO0FBQ2xDLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyw4Q0FBOEMsQ0FBQztBQUU3RCwwQkFBMEI7QUFDMUIsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHFDQUFxQyxDQUFDO0FBRXBELDJDQUEyQztBQUMzQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxpQ0FBaUM7QUFDakMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QywwQkFBMEI7QUFDMUIsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxtQ0FBbUMsQ0FBQyJ9
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { DcRouter } from '../classes.dcrouter.js';
|
|
3
|
+
export declare const GATEWAY_ROUTE_DNS_MANAGED_BY = "gateway-route-dns";
|
|
4
|
+
type TGatewayDnsResult = plugins.servezoneInterfaces.data.IGatewayRouteDnsResult;
|
|
5
|
+
export interface IGatewayRouteDnsReconcileOptions {
|
|
6
|
+
externalKey: string;
|
|
7
|
+
gatewayClientId: string;
|
|
8
|
+
hostname?: string;
|
|
9
|
+
mode?: plugins.servezoneInterfaces.data.TGatewayRouteDnsMode;
|
|
10
|
+
delete?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface IGatewayDnsActiveClaim {
|
|
13
|
+
gatewayClientId: string;
|
|
14
|
+
routeExternalKeys: string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function getActiveGatewayDnsClaims(dcRouterRefArg: Pick<DcRouter, 'routeConfigManager'>, hostnameArg: string): IGatewayDnsActiveClaim[];
|
|
17
|
+
export declare class GatewayRouteDnsReconciler {
|
|
18
|
+
private dcRouterRef;
|
|
19
|
+
private interval?;
|
|
20
|
+
private fullReconcilePromise?;
|
|
21
|
+
private lastAttemptByHostname;
|
|
22
|
+
private latestIntentByHostname;
|
|
23
|
+
private hostnameChains;
|
|
24
|
+
private intentGeneration;
|
|
25
|
+
constructor(dcRouterRef: DcRouter);
|
|
26
|
+
start(): Promise<void>;
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
reconcileRoute(optionsArg: IGatewayRouteDnsReconcileOptions): Promise<TGatewayDnsResult>;
|
|
29
|
+
private reconcileRouteWithExecution;
|
|
30
|
+
private reconcileRouteUnderHostnameLock;
|
|
31
|
+
runFullReconcile(force?: boolean): Promise<void>;
|
|
32
|
+
private reconcileAll;
|
|
33
|
+
private deleteOwnedRecords;
|
|
34
|
+
private getDesiredTargetIp;
|
|
35
|
+
private getRouteHostname;
|
|
36
|
+
private buildWorkKey;
|
|
37
|
+
private refreshProviderZone;
|
|
38
|
+
buildClaimOwnerId(gatewayClientIdArg: string, hostnameArg: string): string;
|
|
39
|
+
getActiveClaimsForHostname(hostnameArg: string): IGatewayDnsActiveClaim[];
|
|
40
|
+
private buildManagedRecordKey;
|
|
41
|
+
private getContributingRouteKeys;
|
|
42
|
+
private isAddressRecord;
|
|
43
|
+
private normalizeStoredHostname;
|
|
44
|
+
private toEvidence;
|
|
45
|
+
private snapshotRecord;
|
|
46
|
+
private restoreRecords;
|
|
47
|
+
private withHostnameLock;
|
|
48
|
+
private recordManualClaimEvent;
|
|
49
|
+
private successForZone;
|
|
50
|
+
private failureForZone;
|
|
51
|
+
}
|
|
52
|
+
export {};
|