@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.
Files changed (48) hide show
  1. package/deno.json +1 -1
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.js +2 -2
  4. package/dist_ts/config/classes.gateway-client-manager.js +1 -1
  5. package/dist_ts/db/documents/classes.cached.email.d.ts +0 -1
  6. package/dist_ts/db/documents/classes.cached.email.js +45 -48
  7. package/dist_ts/db/documents/classes.email-traffic-bucket.doc.d.ts +0 -1
  8. package/dist_ts/db/documents/classes.email-traffic-bucket.doc.js +61 -50
  9. package/dist_ts/db/documents/classes.gateway-client.doc.d.ts +9 -2
  10. package/dist_ts/db/documents/classes.gateway-client.doc.js +9 -11
  11. package/dist_ts/db/documents/classes.ip-intelligence.doc.d.ts +4 -3
  12. package/dist_ts/db/documents/classes.ip-intelligence.doc.js +27 -31
  13. package/dist_ts/db/documents/classes.ops-config-event.doc.d.ts +0 -2
  14. package/dist_ts/db/documents/classes.ops-config-event.doc.js +70 -68
  15. package/dist_ts/db/documents/classes.smartmta-storage.doc.d.ts +14 -0
  16. package/dist_ts/db/documents/classes.smartmta-storage.doc.js +17 -3
  17. package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +0 -1
  18. package/dist_ts/db/documents/classes.webpush-admission.doc.js +14 -5
  19. package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +1 -1
  20. package/dist_ts/db/documents/classes.webpush-binding.doc.js +45 -7
  21. package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
  22. package/dist_ts/db/documents/classes.webpush-spool.doc.js +33 -5
  23. package/dist_ts/dns/manager.dns.js +7 -3
  24. package/dist_ts/email/classes.smartmta-storage-manager.d.ts +15 -3
  25. package/dist_ts/email/classes.smartmta-storage-manager.js +62 -36
  26. package/dist_ts/security/classes.security-policy-manager.js +11 -9
  27. package/dist_ts/webpush/classes.webpush-manager.d.ts +5 -1
  28. package/dist_ts/webpush/classes.webpush-manager.js +162 -232
  29. package/dist_ts_web/00_commitinfo_data.js +1 -1
  30. package/package.json +3 -3
  31. package/readme.md +1 -0
  32. package/ts/00_commitinfo_data.ts +1 -1
  33. package/ts/classes.dcrouter.ts +1 -1
  34. package/ts/config/classes.gateway-client-manager.ts +4 -2
  35. package/ts/db/documents/classes.cached.email.ts +51 -66
  36. package/ts/db/documents/classes.email-traffic-bucket.doc.ts +65 -59
  37. package/ts/db/documents/classes.gateway-client.doc.ts +38 -18
  38. package/ts/db/documents/classes.ip-intelligence.doc.ts +37 -40
  39. package/ts/db/documents/classes.ops-config-event.doc.ts +80 -77
  40. package/ts/db/documents/classes.smartmta-storage.doc.ts +16 -1
  41. package/ts/db/documents/classes.webpush-admission.doc.ts +14 -5
  42. package/ts/db/documents/classes.webpush-binding.doc.ts +53 -7
  43. package/ts/db/documents/classes.webpush-spool.doc.ts +39 -5
  44. package/ts/dns/manager.dns.ts +6 -2
  45. package/ts/email/classes.smartmta-storage-manager.ts +66 -50
  46. package/ts/security/classes.security-policy-manager.ts +10 -8
  47. package/ts/webpush/classes.webpush-manager.ts +175 -280
  48. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -155,11 +155,10 @@ let GatewayClientDoc = (() => {
155
155
  static async findById(id) {
156
156
  return await GatewayClientDoc.getInstance({ id });
157
157
  }
158
- static async getNativeCollection() {
159
- const smartdataCollection = GatewayClientDoc.collection;
160
- await smartdataCollection.init();
161
- return smartdataCollection.mongoDbCollection;
162
- }
158
+ /**
159
+ * Compare-and-set selector. Revision 0 also matches documents written before the
160
+ * revision field existed, so a first mutation fences them exactly once.
161
+ */
163
162
  static buildRevisionSelector(idArg, revisionArg) {
164
163
  if (revisionArg === 0) {
165
164
  return {
@@ -173,25 +172,24 @@ let GatewayClientDoc = (() => {
173
172
  return { id: idArg, mutationRevision: revisionArg };
174
173
  }
175
174
  static async compareAndSet(idArg, expectedRevisionArg, setArg, unsetArg = []) {
176
- const collection = await GatewayClientDoc.getNativeCollection();
177
175
  const update = {
178
176
  $set: {
179
177
  ...setArg,
180
178
  mutationRevision: expectedRevisionArg + 1,
181
- _updatedAt: new Date().toISOString(),
182
179
  },
183
180
  };
184
181
  if (unsetArg.length > 0) {
185
182
  update.$unset = Object.fromEntries(unsetArg.map((fieldArg) => [fieldArg, '']));
186
183
  }
187
- const result = await collection.updateOne(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg), update);
184
+ // One fenced write: a mismatched revision matches nothing and the caller learns the
185
+ // document changed concurrently.
186
+ const result = await GatewayClientDoc.atomicUpdate(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg), update);
188
187
  if (result.matchedCount !== 1)
189
188
  return null;
190
189
  return await GatewayClientDoc.findById(idArg);
191
190
  }
192
191
  static async deleteIfRevision(idArg, expectedRevisionArg) {
193
- const collection = await GatewayClientDoc.getNativeCollection();
194
- const result = await collection.deleteOne(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg));
192
+ const result = await GatewayClientDoc.atomicDelete(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg));
195
193
  return result.deletedCount === 1;
196
194
  }
197
195
  static async findAll() {
@@ -201,4 +199,4 @@ let GatewayClientDoc = (() => {
201
199
  return GatewayClientDoc = _classThis;
202
200
  })();
203
201
  export { GatewayClientDoc };
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBa0J2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFHeEMsZ0JBQWdCOzRCQUQ1QixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7OztzQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0NBQXhDLFNBQVEsV0FBb0U7Ozs7OEJBQ3ZHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7dUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzRDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7d0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO21DQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs0Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJ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
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBa0J2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUF1QnhDLGdCQUFnQjs0QkFENUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dDQUF4QyxTQUFRLFdBQW9FOzs7OzhCQUN2RyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3VDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs0Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7K0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFB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
@@ -30,9 +30,10 @@ export declare class IpIntelligenceDoc extends plugins.smartdata.SmartDataDbDoc<
30
30
  limit: number;
31
31
  }): Promise<IpIntelligenceDoc[]>;
32
32
  static countAll(): Promise<number>;
33
- static findOldestIds(options: {
33
+ /** Least recently seen records first; the identity is the deterministic tiebreaker. */
34
+ static findOldestIpAddresses(options: {
34
35
  lastSeenBefore?: number;
35
36
  limit: number;
36
- }): Promise<unknown[]>;
37
- static deleteByDocumentIds(documentIds: unknown[]): Promise<number>;
37
+ }): Promise<string[]>;
38
+ static deleteByIpAddresses(ipAddressesArg: string[]): Promise<number>;
38
39
  }
@@ -35,6 +35,7 @@ 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
+ const MAX_DELETE_BATCH_SIZE = 500;
38
39
  let IpIntelligenceDoc = (() => {
39
40
  let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
40
41
  let _classDescriptor;
@@ -199,10 +200,11 @@ let IpIntelligenceDoc = (() => {
199
200
  const filter = options.ipAddresses
200
201
  ? { ipAddress: { $in: options.ipAddresses } }
201
202
  : {};
202
- const collection = IpIntelligenceDoc.collection;
203
- const cursor = await collection.getCursor(filter, IpIntelligenceDoc);
204
- cursor.mongodbCursor.sort({ lastSeenAt: -1, _id: -1 });
205
- cursor.mongodbCursor.limit(options.limit);
203
+ const cursor = await IpIntelligenceDoc.getCursor(filter, {
204
+ // ipAddress is the immutable identity, so it is the deterministic tiebreaker.
205
+ sort: { lastSeenAt: -1, ipAddress: -1 },
206
+ limit: options.limit,
207
+ });
206
208
  try {
207
209
  return await cursor.toArray();
208
210
  }
@@ -211,51 +213,45 @@ let IpIntelligenceDoc = (() => {
211
213
  }
212
214
  }
213
215
  static async countAll() {
214
- return await DcRouterDb.getInstance()
215
- .getDb()
216
- .mongoDb
217
- .collection('IpIntelligenceDoc')
218
- .countDocuments({});
216
+ return await IpIntelligenceDoc.getCount({});
219
217
  }
220
- static async findOldestIds(options) {
218
+ /** Least recently seen records first; the identity is the deterministic tiebreaker. */
219
+ static async findOldestIpAddresses(options) {
221
220
  if (!Number.isSafeInteger(options.limit) || options.limit <= 0) {
222
- throw new Error('IpIntelligenceDoc.findOldestIds requires a positive integer limit');
221
+ throw new Error('IpIntelligenceDoc.findOldestIpAddresses requires a positive integer limit');
223
222
  }
224
- const collection = DcRouterDb.getInstance()
225
- .getDb()
226
- .mongoDb
227
- .collection('IpIntelligenceDoc');
228
223
  const filter = options.lastSeenBefore === undefined
229
224
  ? {}
230
225
  : { lastSeenAt: { $lt: options.lastSeenBefore } };
231
- const cursor = collection
232
- .find(filter, { projection: { _id: 1 } })
233
- .sort({ lastSeenAt: 1, _id: 1 })
234
- .limit(options.limit);
226
+ const cursor = await IpIntelligenceDoc.getCursor(filter, {
227
+ projection: { ipAddress: 1 },
228
+ sort: { lastSeenAt: 1, ipAddress: 1 },
229
+ limit: options.limit,
230
+ });
235
231
  try {
236
232
  const rows = await cursor.toArray();
237
- return rows.map((row) => row._id);
233
+ return rows.map((rowArg) => rowArg.ipAddress);
238
234
  }
239
235
  finally {
240
236
  await cursor.close();
241
237
  }
242
238
  }
243
- static async deleteByDocumentIds(documentIds) {
244
- if (documentIds.length === 0)
239
+ static async deleteByIpAddresses(ipAddressesArg) {
240
+ if (ipAddressesArg.length === 0)
245
241
  return 0;
246
- if (documentIds.length > 500 || documentIds.some((id) => id === undefined || id === null)) {
247
- throw new Error('IpIntelligenceDoc.deleteByDocumentIds requires 1 to 500 document ids');
242
+ if (ipAddressesArg.length > MAX_DELETE_BATCH_SIZE
243
+ || ipAddressesArg.some((ipArg) => typeof ipArg !== 'string' || !ipArg)) {
244
+ throw new Error(`IpIntelligenceDoc.deleteByIpAddresses requires 1 to ${MAX_DELETE_BATCH_SIZE} ip addresses`);
248
245
  }
249
- const deleteFilter = { _id: { $in: documentIds } };
250
- const result = await DcRouterDb.getInstance()
251
- .getDb()
252
- .mongoDb
253
- .collection('IpIntelligenceDoc')
254
- .deleteMany(deleteFilter);
246
+ // Each `$or` branch pins the immutable identity, which is the equality anchor a
247
+ // plural atomic delete requires.
248
+ const result = await IpIntelligenceDoc.atomicDeleteMany({
249
+ $or: ipAddressesArg.map((ipArg) => ({ ipAddress: ipArg })),
250
+ });
255
251
  return result.deletedCount;
256
252
  }
257
253
  };
258
254
  return IpIntelligenceDoc = _classThis;
259
255
  })();
260
256
  export { IpIntelligenceDoc };
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pcC1pbnRlbGxpZ2VuY2UuZG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZGIvZG9jdW1lbnRzL2NsYXNzZXMuaXAtaW50ZWxsaWdlbmNlLmRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNdkQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBR3hDLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7O3FDQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsrQkFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7a0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs2Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7d0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt3Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7bUNBR3hCLE9BQU8sQ0FBQyxTQUFT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
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pcC1pbnRlbGxpZ2VuY2UuZG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZGIvZG9jdW1lbnRzL2NsYXNzZXMuaXAtaW50ZWxsaWdlbmNlLmRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNdkQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRXJELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0lBR3JCLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7O3FDQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsrQkFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7a0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs2Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7d0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt3Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FB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
@@ -27,8 +27,6 @@ export declare class OpsConfigEventDoc extends plugins.smartdata.SmartDataDbDoc<
27
27
  constructor();
28
28
  toApiObject(): IOpsConfigEvent;
29
29
  createSavableObject(): Promise<OpsConfigEventDoc>;
30
- private static getNativeCollection;
31
- private static hydrate;
32
30
  static upsertOpenEvent(optionsArg: {
33
31
  id: string;
34
32
  openDedupeKey: string;
@@ -35,6 +35,16 @@ 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
+ const PRUNE_BATCH_SIZE = 500;
39
+ /**
40
+ * "Not acknowledged yet" as a typed predicate: the field is absent (how the ORM stores
41
+ * an unset optional field) or explicitly null (how older documents may carry it). This
42
+ * is exactly what the previous `{ acknowledgedAt: null }` selector matched.
43
+ */
44
+ const unacknowledgedBranches = () => [
45
+ { acknowledgedAt: { $exists: false } },
46
+ { acknowledgedAt: { $type: 'null' } },
47
+ ];
38
48
  /**
39
49
  * Durable operator-facing platform configuration event (see
40
50
  * ts_interfaces/data/config-events.ts). Unacknowledged events persist
@@ -141,50 +151,40 @@ let OpsConfigEventDoc = (() => {
141
151
  delete savable.openDedupeKey;
142
152
  return savable;
143
153
  }
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
154
  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 }, {
155
+ // Deduplication is arbitrated by the sparse unique `openDedupeKey` index: the filter
156
+ // anchors on that key, so two writers racing the same open occurrence either update
157
+ // it or lose the insert branch to the index. `$setOnInsert` seeds the `@unI()`
158
+ // identity on the insert branch only — the client refuses an identity seed without
159
+ // `upsert: true` and refuses a seed that contradicts an identity anchor in the
160
+ // filter, so the created event is addressable by `id` and immutable afterwards.
161
+ const result = await OpsConfigEventDoc.atomicUpdate({ openDedupeKey: optionsArg.openDedupeKey }, {
159
162
  $set: {
160
163
  severity: optionsArg.severity,
161
164
  detail: optionsArg.detail,
162
165
  context: optionsArg.context,
163
166
  createdAt: optionsArg.createdAt,
164
- _updatedAt: timestamp,
165
167
  },
166
168
  $setOnInsert: {
167
169
  id: optionsArg.id,
168
170
  category: optionsArg.category,
169
171
  title: optionsArg.title,
170
172
  openDedupeKey: optionsArg.openDedupeKey,
171
- _createdAt: timestamp,
172
173
  },
173
174
  }, { upsert: true });
174
- const raw = await collection.findOne({ openDedupeKey: optionsArg.openDedupeKey });
175
- if (!raw)
175
+ const event = await OpsConfigEventDoc.getInstance({
176
+ openDedupeKey: optionsArg.openDedupeKey,
177
+ });
178
+ if (!event)
176
179
  throw new Error('Failed to read the recorded platform configuration event');
177
- return {
178
- event: OpsConfigEventDoc.hydrate(raw),
179
- created: result.upsertedCount > 0,
180
- };
180
+ return { event, created: result.upsertedId !== null };
181
181
  }
182
182
  static async findFiltered(filter = {}) {
183
183
  const selector = {};
184
184
  if (filter.acknowledged === true)
185
185
  selector.acknowledgedAt = { $gt: 0 };
186
186
  if (filter.acknowledged === false)
187
- selector.acknowledgedAt = null;
187
+ Object.assign(selector, { $or: unacknowledgedBranches() });
188
188
  if (filter.severity)
189
189
  selector.severity = filter.severity;
190
190
  if (filter.category)
@@ -193,48 +193,42 @@ let OpsConfigEventDoc = (() => {
193
193
  ? filter.limit
194
194
  : 100;
195
195
  const limit = Math.min(requestedLimit, 200);
196
- const countSelector = structuredClone(selector);
197
196
  if (filter.cursor) {
198
197
  if (!Number.isSafeInteger(filter.cursor.createdAt) || filter.cursor.createdAt < 0
199
198
  || typeof filter.cursor.id !== 'string' || !filter.cursor.id.trim()) {
200
199
  throw new Error('Invalid platform configuration event cursor');
201
200
  }
202
- selector.$or = [
203
- { createdAt: { $lt: filter.cursor.createdAt } },
204
- { createdAt: filter.cursor.createdAt, id: { $lt: filter.cursor.id } },
205
- ];
206
201
  }
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 ? {
202
+ // Seek pagination over (createdAt, id) with the unique id as tiebreaker, plus the
203
+ // unpaged total for the same filter.
204
+ const page = await OpsConfigEventDoc.getPagedInstances({
205
+ filter: selector,
206
+ sortField: 'createdAt',
207
+ uniqueField: 'id',
208
+ sortDirection: 'desc',
209
+ limit,
210
+ withTotal: true,
211
+ ...(filter.cursor
212
+ ? { cursor: { sortValue: filter.cursor.createdAt, uniqueValue: filter.cursor.id } }
213
+ : {}),
214
+ });
215
+ return {
216
+ events: page.documents,
217
+ total: page.total ?? 0,
218
+ ...(page.nextCursor
219
+ ? {
224
220
  nextCursor: {
225
- createdAt: Number(lastRow.createdAt),
226
- id: String(lastRow.id),
221
+ createdAt: Number(page.nextCursor.sortValue),
222
+ id: String(page.nextCursor.uniqueValue),
227
223
  },
228
- } : {}),
229
- };
230
- }
231
- finally {
232
- await cursor.close();
233
- }
224
+ }
225
+ : {}),
226
+ };
234
227
  }
235
228
  static async countUnacknowledged() {
236
- const collection = await OpsConfigEventDoc.getNativeCollection();
237
- return await collection.countDocuments({ acknowledgedAt: null });
229
+ return await OpsConfigEventDoc.getCount({
230
+ $or: unacknowledgedBranches(),
231
+ });
238
232
  }
239
233
  /** Acknowledge the given event ids; returns how many were newly acknowledged. */
240
234
  static async acknowledgeByIds(ids, userId) {
@@ -247,14 +241,21 @@ let OpsConfigEventDoc = (() => {
247
241
  const uniqueIds = Array.from(new Set(ids));
248
242
  if (uniqueIds.length === 0)
249
243
  return 0;
250
- const collection = await OpsConfigEventDoc.getNativeCollection();
251
244
  const now = Date.now();
252
- const result = await collection.updateMany({ id: { $in: uniqueIds }, acknowledgedAt: null }, {
245
+ // The per-id `$or` is the equality anchor a plural atomic write requires; the second
246
+ // branch keeps the "only newly acknowledged rows count" guard.
247
+ const result = await OpsConfigEventDoc.atomicUpdateMany({
248
+ $and: [
249
+ { $or: uniqueIds.map((idArg) => ({ id: idArg })) },
250
+ { $or: unacknowledgedBranches() },
251
+ ],
252
+ }, {
253
253
  $set: {
254
254
  acknowledgedBy: userId,
255
255
  acknowledgedAt: now,
256
- _updatedAt: new Date(now).toISOString(),
257
256
  },
257
+ // Presence of openDedupeKey is the open-event uniqueness authority, so
258
+ // acknowledging must release it.
258
259
  $unset: { openDedupeKey: '' },
259
260
  });
260
261
  return result.modifiedCount;
@@ -263,12 +264,12 @@ let OpsConfigEventDoc = (() => {
263
264
  static async pruneAcknowledged(maxAgeMs) {
264
265
  const cutoff = Date.now() - maxAgeMs;
265
266
  let pruned = 0;
266
- const collection = await OpsConfigEventDoc.getNativeCollection();
267
267
  while (true) {
268
- const cursor = collection
269
- .find({ acknowledgedAt: { $lt: cutoff } }, { projection: { _id: 1 } })
270
- .sort({ acknowledgedAt: 1, _id: 1 })
271
- .limit(500);
268
+ const cursor = await OpsConfigEventDoc.getCursor({ acknowledgedAt: { $lt: cutoff } }, {
269
+ projection: { id: 1 },
270
+ sort: { acknowledgedAt: 1, id: 1 },
271
+ limit: PRUNE_BATCH_SIZE,
272
+ });
272
273
  let rows;
273
274
  try {
274
275
  rows = await cursor.toArray();
@@ -278,11 +279,12 @@ let OpsConfigEventDoc = (() => {
278
279
  }
279
280
  if (rows.length === 0)
280
281
  break;
281
- const deleteFilter = {
282
- _id: { $in: rows.map((rowArg) => rowArg._id) },
282
+ // Anchored on the scanned identities, with the retention guard re-evaluated
283
+ // server-side so an event acknowledged after the scan is never pruned early.
284
+ const result = await OpsConfigEventDoc.atomicDeleteMany({
285
+ $or: rows.map((rowArg) => ({ id: rowArg.id })),
283
286
  acknowledgedAt: { $lt: cutoff },
284
- };
285
- const result = await collection.deleteMany(deleteFilter);
287
+ });
286
288
  if (result.deletedCount === 0)
287
289
  break;
288
290
  pruned += result.deletedCount;
@@ -293,4 +295,4 @@ let OpsConfigEventDoc = (() => {
293
295
  return OpsConfigEventDoc = _classThis;
294
296
  })();
295
297
  export { OpsConfigEventDoc };
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHMtY29uZmlnLWV2ZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLm9wcy1jb25maWctZXZlbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVF2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFVckQ7Ozs7R0FJRztJQUVVLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7OzhCQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtvQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDekIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7bUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFB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
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHMtY29uZmlnLWV2ZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLm9wcy1jb25maWctZXZlbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVF2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0I7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsR0FFNUIsRUFBRSxDQUFDO0lBQ0osRUFBRSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDdEMsRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7Q0FDdEMsQ0FBQztBQVVGOzs7O0dBSUc7SUFFVSxpQkFBaUI7NEJBRDdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7O3NCQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQ0FBeEMsU0FBUSxXQUFzRTs7Ozs4QkFDMUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO29DQUd4QixPQUFPLENBQUMsU0FBUyxD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
@@ -1,4 +1,18 @@
1
1
  import * as plugins from '../../plugins.js';
2
+ /**
3
+ * SmartMTA's durable key/value space.
4
+ *
5
+ * Every document is content-addressed: `id` is `sha256(normalizedKey)` and owns the stored
6
+ * `_id`, so the primary key — not a secondary index — is the uniqueness authority that makes
7
+ * a write a single race-free upsert. That is what `identityAsDocumentId: 'id'` declares, and
8
+ * it holds for every row dcrouter ever wrote here, because the manager has always derived
9
+ * both `_id` and `id` from the same hash.
10
+ *
11
+ * The declaration is irreversible: from here on reads are answered through `_id`, so a row
12
+ * whose `_id` is not its identity would no longer resolve, and the client refuses a unique
13
+ * index on `id` because the primary key is the only uniqueness authority a document-id
14
+ * identity may have.
15
+ */
2
16
  export declare class SmartMtaStorageDoc extends plugins.smartdata.SmartDataDbDoc<SmartMtaStorageDoc, SmartMtaStorageDoc> {
3
17
  id: string;
4
18
  key: string;
@@ -35,8 +35,22 @@ 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
+ /**
39
+ * SmartMTA's durable key/value space.
40
+ *
41
+ * Every document is content-addressed: `id` is `sha256(normalizedKey)` and owns the stored
42
+ * `_id`, so the primary key — not a secondary index — is the uniqueness authority that makes
43
+ * a write a single race-free upsert. That is what `identityAsDocumentId: 'id'` declares, and
44
+ * it holds for every row dcrouter ever wrote here, because the manager has always derived
45
+ * both `_id` and `id` from the same hash.
46
+ *
47
+ * The declaration is irreversible: from here on reads are answered through `_id`, so a row
48
+ * whose `_id` is not its identity would no longer resolve, and the client refuses a unique
49
+ * index on `id` because the primary key is the only uniqueness authority a document-id
50
+ * identity may have.
51
+ */
38
52
  let SmartMtaStorageDoc = (() => {
39
- let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
53
+ let _classDecorators = [plugins.smartdata.Collection(() => getDb(), { identityAsDocumentId: 'id' })];
40
54
  let _classDescriptor;
41
55
  let _classExtraInitializers = [];
42
56
  let _classThis;
@@ -60,7 +74,7 @@ let SmartMtaStorageDoc = (() => {
60
74
  static { _classThis = this; }
61
75
  static {
62
76
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
63
- _id_decorators = [plugins.smartdata.svDb()];
77
+ _id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
64
78
  _key_decorators = [plugins.smartdata.svDb()];
65
79
  _value_decorators = [plugins.smartdata.svDb()];
66
80
  _createdAt_decorators = [plugins.smartdata.svDb()];
@@ -88,4 +102,4 @@ let SmartMtaStorageDoc = (() => {
88
102
  return SmartMtaStorageDoc = _classThis;
89
103
  })();
90
104
  export { SmartMtaStorageDoc };
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydG10YS1zdG9yYWdlLmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLnNtYXJ0bXRhLXN0b3JhZ2UuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFHeEMsa0JBQWtCOzRCQUQ5QixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7OztzQkFDSixPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBQXhDLFNBQVEsV0FHdkM7Ozs7OEJBQ0UsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7K0JBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBWHpCLHdKQUFPLEVBQUUsNkJBQUYsRUFBRSwrRUFBVTtZQUduQiwySkFBTyxHQUFHLDZCQUFILEdBQUcsaUZBQVU7WUFHcEIsaUtBQU8sS0FBSyw2QkFBTCxLQUFLLHFGQUFVO1lBR3RCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQiw2S0FBTyxTQUFTLDZCQUFULFNBQVMsNkZBQVU7WUFqQjVCLDZLQWtCQzs7O1lBbEJZLHVEQUFrQjs7UUFLdEIsRUFBRSxxREFBVTtRQUdaLEdBQUcsd0dBQVU7UUFHYixLQUFLLDJHQUFVO1FBR2YsU0FBUyxpSEFBVTtRQUduQixTQUFTLHFIQUFVOzs7Ozs7OztTQWpCZixrQkFBa0IifQ==
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydG10YS1zdG9yYWdlLmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLnNtYXJ0bXRhLXN0b3JhZ2UuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7Ozs7R0FhRztJQUVVLGtCQUFrQjs0QkFEOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7OztzQkFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7O2tDQUF4QyxTQUFRLFdBR3ZDOzs7OzhCQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytCQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtpQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtZQVh6Qix3SkFBTyxFQUFFLDZCQUFGLEVBQUUsK0VBQVU7WUFHbkIsMkpBQU8sR0FBRyw2QkFBSCxHQUFHLGlGQUFVO1lBR3BCLGlLQUFPLEtBQUssNkJBQUwsS0FBSyxxRkFBVTtZQUd0Qiw2S0FBTyxTQUFTLDZCQUFULFNBQVMsNkZBQVU7WUFHMUIsNktBQU8sU0FBUyw2QkFBVCxTQUFTLDZGQUFVO1lBbEI1Qiw2S0FtQkM7OztZQW5CWSx1REFBa0I7O1FBTXRCLEVBQUUscURBQVU7UUFHWixHQUFHLHdHQUFVO1FBR2IsS0FBSywyR0FBVTtRQUdmLFNBQVMsaUhBQVU7UUFHbkIsU0FBUyxxSEFBVTs7Ozs7Ozs7U0FsQmYsa0JBQWtCIn0=
@@ -15,5 +15,4 @@ export declare class WebPushAdmissionDoc extends plugins.smartdata.SmartDataDbDo
15
15
  revision: number;
16
16
  updatedAt: number;
17
17
  purgeAt: Date;
18
- static getNativeCollection(): plugins.smartdata.SmartdataCollection<WebPushAdmissionDoc>['mongoDbCollection'];
19
18
  }
@@ -41,8 +41,20 @@ const getDb = () => DcRouterDb.getInstance().getDb();
41
41
  * A credential rotation must not reset these counters, so the stable binding
42
42
  * id and lifecycle generation are the authority rather than a credential id.
43
43
  */
44
+ // Both indexes are declared under the exact names the released Web Push schema migration
45
+ // created them with (`ts_migrations/index.ts` via `ts/webpush/webpush-indexes.ts`), so model
46
+ // initialization verifies the existing topology instead of installing a second, differently
47
+ // named index over the same key.
44
48
  let WebPushAdmissionDoc = (() => {
45
- let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
49
+ let _classDecorators = [plugins.smartdata.namedIndex({
50
+ name: 'web_push_admission_binding_unique',
51
+ key: { bindingId: 1, lifecycleGeneration: 1 },
52
+ options: { unique: true },
53
+ }), plugins.smartdata.namedIndex({
54
+ name: 'web_push_admission_ttl',
55
+ key: { purgeAt: 1 },
56
+ options: { expireAfterSeconds: 0 },
57
+ }), plugins.smartdata.Collection(() => getDb())];
46
58
  let _classDescriptor;
47
59
  let _classExtraInitializers = [];
48
60
  let _classThis;
@@ -110,9 +122,6 @@ let WebPushAdmissionDoc = (() => {
110
122
  revision = (__runInitializers(this, _longWindowCount_extraInitializers), __runInitializers(this, _revision_initializers, void 0));
111
123
  updatedAt = (__runInitializers(this, _revision_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
112
124
  purgeAt = (__runInitializers(this, _updatedAt_extraInitializers), __runInitializers(this, _purgeAt_initializers, void 0));
113
- static getNativeCollection() {
114
- return getDb().mongoDb.collection('WebPushAdmissionDoc');
115
- }
116
125
  constructor() {
117
126
  super(...arguments);
118
127
  __runInitializers(this, _purgeAt_extraInitializers);
@@ -121,4 +130,4 @@ let WebPushAdmissionDoc = (() => {
121
130
  return WebPushAdmissionDoc = _classThis;
122
131
  })();
123
132
  export { WebPushAdmissionDoc };
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVyRDs7Ozs7R0FLRztJQUVVLG1CQUFtQjs0QkFEL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21DQUF4QyxTQUFRLFdBR3hDOzs7O3FDQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnREFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsyQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUF2QnpCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQiwyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQyw4TUFBTyxvQkFBb0IsNkJBQXBCLG9CQUFvQixtSEFBVTtZQUdyQyxrTUFBTyxnQkFBZ0IsNkJBQWhCLGdCQUFnQiwyR0FBVTtZQUdqQywyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQywrTEFBTyxlQUFlLDZCQUFmLGVBQWUseUdBQVU7WUFHaEMsMEtBQU8sUUFBUSw2QkFBUixRQUFRLDJGQUFVO1lBR3pCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQix1S0FBTyxPQUFPLDZCQUFQLE9BQU8seUZBQVE7WUE3QnhCLDZLQW1DQzs7O1lBbkNZLHVEQUFtQjs7UUFLdkIsU0FBUyw0REFBVTtRQUduQixtQkFBbUIsK0hBQVU7UUFHN0Isb0JBQW9CLDBJQUFVO1FBRzlCLGdCQUFnQix1SUFBVTtRQUcxQixtQkFBbUIsc0lBQVU7UUFHN0IsZUFBZSxxSUFBVTtRQUd6QixRQUFRLDBIQUFVO1FBR2xCLFNBQVMsb0hBQVU7UUFHbkIsT0FBTyxtSEFBUTtRQUVmLE1BQU0sQ0FBQyxtQkFBbUI7WUFFL0IsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDM0QsQ0FBQzs7Ozs7Ozs7U0FsQ1UsbUJBQW1CIn0=
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVyRDs7Ozs7R0FLRztBQUNILHlGQUF5RjtBQUN6Riw2RkFBNkY7QUFDN0YsNEZBQTRGO0FBQzVGLGlDQUFpQztJQVlwQixtQkFBbUI7NEJBWC9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzVCLElBQUksRUFBRSxtQ0FBbUM7WUFDekMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtTQUMxQixDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDNUIsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRTtTQUNuQyxDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21DQUF4QyxTQUFRLFdBR3hDOzs7O3FDQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnREFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsyQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUF2QnpCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQiwyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQyw4TUFBTyxvQkFBb0IsNkJBQXBCLG9CQUFvQixtSEFBVTtZQUdyQyxrTUFBTyxnQkFBZ0IsNkJBQWhCLGdCQUFnQiwyR0FBVTtZQUdqQywyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQywrTEFBTyxlQUFlLDZCQUFmLGVBQWUseUdBQVU7WUFHaEMsMEtBQU8sUUFBUSw2QkFBUixRQUFRLDJGQUFVO1lBR3pCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQix1S0FBTyxPQUFPLDZCQUFQLE9BQU8seUZBQVE7WUE3QnhCLDZLQThCQzs7O1lBOUJZLHVEQUFtQjs7UUFLdkIsU0FBUyw0REFBVTtRQUduQixtQkFBbUIsK0hBQVU7UUFHN0Isb0JBQW9CLDBJQUFVO1FBRzlCLGdCQUFnQix1SUFBVTtRQUcxQixtQkFBbUIsc0lBQVU7UUFHN0IsZUFBZSxxSUFBVTtRQUd6QixRQUFRLDBIQUFVO1FBR2xCLFNBQVMsb0hBQVU7UUFHbkIsT0FBTyxtSEFBUTs7Ozs7Ozs7U0E3QlgsbUJBQW1CIn0=