equipped 5.1.0 → 5.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 (81) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/audit/events.cjs +21 -8
  3. package/dist/cjs/audit/events.cjs.map +1 -1
  4. package/dist/cjs/audit/events.min.cjs +1 -1
  5. package/dist/cjs/audit/events.min.cjs.map +1 -1
  6. package/dist/cjs/audit/index.cjs +1 -5
  7. package/dist/cjs/audit/index.cjs.map +1 -1
  8. package/dist/cjs/audit/index.min.cjs +1 -1
  9. package/dist/cjs/audit/index.min.cjs.map +1 -1
  10. package/dist/cjs/dbs/mongo/changes.cjs +5 -14
  11. package/dist/cjs/dbs/mongo/changes.cjs.map +1 -1
  12. package/dist/cjs/dbs/mongo/changes.min.cjs +1 -1
  13. package/dist/cjs/dbs/mongo/changes.min.cjs.map +1 -1
  14. package/dist/cjs/dbs/mongo/db.cjs +3 -2
  15. package/dist/cjs/dbs/mongo/db.cjs.map +1 -1
  16. package/dist/cjs/dbs/mongo/db.min.cjs +1 -1
  17. package/dist/cjs/dbs/mongo/db.min.cjs.map +1 -1
  18. package/dist/cjs/events/pipes.cjs +0 -1
  19. package/dist/cjs/events/pipes.cjs.map +1 -1
  20. package/dist/cjs/events/pipes.min.cjs +1 -1
  21. package/dist/cjs/events/pipes.min.cjs.map +1 -1
  22. package/dist/cjs/events/types/kafka.cjs +10 -13
  23. package/dist/cjs/events/types/kafka.cjs.map +1 -1
  24. package/dist/cjs/events/types/kafka.min.cjs +1 -1
  25. package/dist/cjs/events/types/kafka.min.cjs.map +1 -1
  26. package/dist/cjs/server/openapi.cjs +2 -2
  27. package/dist/cjs/server/openapi.cjs.map +1 -1
  28. package/dist/cjs/server/openapi.min.cjs +2 -2
  29. package/dist/cjs/server/openapi.min.cjs.map +1 -1
  30. package/dist/cjs/types/index.cjs.map +1 -1
  31. package/dist/cjs/types/index.min.cjs.map +1 -1
  32. package/dist/esm/audit/events.min.mjs +1 -1
  33. package/dist/esm/audit/events.min.mjs.map +1 -1
  34. package/dist/esm/audit/events.mjs +20 -7
  35. package/dist/esm/audit/events.mjs.map +1 -1
  36. package/dist/esm/audit/index.min.mjs +1 -1
  37. package/dist/esm/audit/index.min.mjs.map +1 -1
  38. package/dist/esm/audit/index.mjs +1 -5
  39. package/dist/esm/audit/index.mjs.map +1 -1
  40. package/dist/esm/dbs/mongo/changes.min.mjs +1 -1
  41. package/dist/esm/dbs/mongo/changes.min.mjs.map +1 -1
  42. package/dist/esm/dbs/mongo/changes.mjs +4 -13
  43. package/dist/esm/dbs/mongo/changes.mjs.map +1 -1
  44. package/dist/esm/dbs/mongo/db.min.mjs +1 -1
  45. package/dist/esm/dbs/mongo/db.min.mjs.map +1 -1
  46. package/dist/esm/dbs/mongo/db.mjs +3 -2
  47. package/dist/esm/dbs/mongo/db.mjs.map +1 -1
  48. package/dist/esm/events/pipes.min.mjs +1 -1
  49. package/dist/esm/events/pipes.min.mjs.map +1 -1
  50. package/dist/esm/events/pipes.mjs +0 -1
  51. package/dist/esm/events/pipes.mjs.map +1 -1
  52. package/dist/esm/events/types/kafka.min.mjs +1 -1
  53. package/dist/esm/events/types/kafka.min.mjs.map +1 -1
  54. package/dist/esm/events/types/kafka.mjs +10 -13
  55. package/dist/esm/events/types/kafka.mjs.map +1 -1
  56. package/dist/esm/server/openapi.min.mjs +2 -2
  57. package/dist/esm/server/openapi.min.mjs.map +1 -1
  58. package/dist/esm/server/openapi.mjs +2 -2
  59. package/dist/esm/server/openapi.mjs.map +1 -1
  60. package/dist/esm/types/index.min.mjs.map +1 -1
  61. package/dist/esm/types/index.mjs.map +1 -1
  62. package/dist/types/audit/events.js +20 -7
  63. package/dist/types/audit/index.d.ts +17 -4
  64. package/dist/types/audit/index.js +1 -5
  65. package/dist/types/{core-BuPovjLX.d.ts → core-BWUHISEy.d.ts} +1 -1
  66. package/dist/types/{db-Bh0mF2ja.d.ts → db-DEiImw1Z.d.ts} +1 -1
  67. package/dist/types/{db-B3v890eW.d.ts → db-vKGTnGlO.d.ts} +2 -2
  68. package/dist/types/dbs/index.d.ts +5 -5
  69. package/dist/types/dbs/mongo/changes.js +4 -13
  70. package/dist/types/dbs/mongo/db.js +3 -2
  71. package/dist/types/events/index.d.ts +2 -2
  72. package/dist/types/events/pipes.js +0 -1
  73. package/dist/types/events/types/kafka.js +10 -13
  74. package/dist/types/{fastify-gQShnQHf.d.ts → fastify-B7Edsl8N.d.ts} +1 -1
  75. package/dist/types/index.d.ts +5 -5
  76. package/dist/types/instance/index.d.ts +5 -6
  77. package/dist/types/{kafka-zsC3c8ar.d.ts → kafka-DCpqW_YM.d.ts} +0 -2
  78. package/dist/types/server/index.d.ts +3 -3
  79. package/dist/types/server/openapi.js +2 -2
  80. package/dist/types/types/index.d.ts +0 -1
  81. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [5.1.2](https://github.com/kevinand11/equipped/compare/v5.1.1...v5.1.2) (2025-11-11)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * type export ([4af5503](https://github.com/kevinand11/equipped/commit/4af55034020e44e66cb569873bf1fc841c7686fa))
11
+
12
+ ### [5.1.1](https://github.com/kevinand11/equipped/compare/v5.1.0...v5.1.1) (2025-11-11)
13
+
14
+
15
+ ### Features
16
+
17
+ * start audit queue in instance hooks ([1be0c79](https://github.com/kevinand11/equipped/commit/1be0c791a68a6c6482816ce434e560f19ff5373c))
18
+ * upgrade scalar version ([9b988a0](https://github.com/kevinand11/equipped/commit/9b988a0963d683bef5194243a3ba43ea5d5f60c0))
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * mongo session resuses same session for nested calls ([68a446f](https://github.com/kevinand11/equipped/commit/68a446fc9ffb69997c28a9fd5ecc6a68eb95fd61))
24
+ * starting db changes ([7de81c0](https://github.com/kevinand11/equipped/commit/7de81c021a15d2ed253843ae7d63f5452188500c))
25
+
5
26
  ## [5.1.0](https://github.com/kevinand11/equipped/compare/v5.0.35...v5.1.0) (2025-10-04)
6
27
 
7
28
  ### [5.0.35](https://github.com/kevinand11/equipped/compare/v5.0.34...v5.0.35) (2025-10-03)
@@ -6,7 +6,7 @@ function createStep(step) {
6
6
  return step;
7
7
  }
8
8
  class EventAudit {
9
- constructor(db, dbName) {;EventAudit.prototype.__init.call(this);
9
+ constructor(db, dbName) {;EventAudit.prototype.__init.call(this);EventAudit.prototype.__init2.call(this);
10
10
  this.db = db;
11
11
  this.table = db.use({
12
12
  db: dbName,
@@ -14,9 +14,17 @@ class EventAudit {
14
14
  mapper: (model) => ({ ...model, toJSON: () => model }),
15
15
  options: { skipAudit: true }
16
16
  });
17
+ _indexcjs5.Instance.on("start", () => {
18
+ setInterval(async () => {
19
+ const queue = [...this.asyncQueue];
20
+ this.asyncQueue = [];
21
+ await Promise.all(queue.map((job) => job()));
22
+ }, 200);
23
+ }, 4);
17
24
  }
18
25
 
19
26
  __init() {this.definitions = {}}
27
+ __init2() {this.asyncQueue = []}
20
28
  async #createEvent(name, payload, context) {
21
29
  const def = this.definitions[name];
22
30
  if (!def) throw new (0, _indexcjs3.EquippedError)("audit definition not found", { name, payload });
@@ -52,13 +60,18 @@ class EventAudit {
52
60
  const result = await def.handle(event.body, context);
53
61
  await _optionalChain([def, 'access', _ => _.sync, 'optionalCall', _2 => _2(result, event.body, context)]);
54
62
  await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "sync", ts: Date.now() }) } });
55
- const asyncHandle = Promise.try(() => _optionalChain([def, 'access', _3 => _3.async, 'optionalCall', _4 => _4(result, event.body, context)])).then(async () => {
56
- await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "async", ts: Date.now() }) } });
57
- }).catch(async (err) => {
58
- const error = err instanceof Error ? err.message : String(err);
59
- await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
60
- });
61
- if (callbackWait) await asyncHandle;
63
+ const asyncHandle = async () => {
64
+ try {
65
+ await _optionalChain([def, 'access', _3 => _3.async, 'optionalCall', _4 => _4(result, event.body, context)]);
66
+ await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "async", ts: Date.now() }) } });
67
+ } catch (err) {
68
+ const error = err instanceof Error ? err.message : String(err);
69
+ await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
70
+ }
71
+ ;
72
+ };
73
+ if (callbackWait) await asyncHandle();
74
+ else this.asyncQueue.push(asyncHandle);
62
75
  return result;
63
76
  } catch (err) {
64
77
  const error = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/audit/events.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs"],"names":[],"mappings":"AAAA,qtBAA+C;AAE/C,4CAAuD;AACvD,gDAA8B;AAC9B,kDAAyB;AAyBzB,SAAS,UAAA,CAAY,IAAA,EAAiC;AACrD,EAAA,OAAO,IAAA;AACR;AAEO,MAAM,WAAW;AAAA,EAIvB,WAAA,CACS,EAAA,EACR,MAAA,EACC;AAFO,IAAA,IAAA,CAAA,GAAA,EAAA,EAAA;AAGR,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,GAAA,CAAI;AAAA,MACnB,EAAA,EAAI,MAAA;AAAA,MACJ,GAAA,EAAK,UAAA;AAAA,MACL,MAAA,EAAQ,CAAC,KAAA,EAAA,GAAA,CAAW,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAA,GAAM,MAAiC,CAAA,CAAA;AAAA,MAC/E,OAAA,EAAS,EAAE,SAAA,EAAW,KAAK;AAAA,IAC5B,CAAC,CAAA;AAAA,EACF;AAAA,EAbQ;AAAA,iBACA,YAAA,EAAyD,CAAC,EAAA;AAAA,EAclE,MAAM,CAAA,WAAA,CAAa,IAAA,EAAc,OAAA,EAAkB,OAAA,EAAkB;AACpE,IAAA,MAAM,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,6BAAA,CAAc,4BAAA,EAA8B,EAAE,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEjF,IAAA,MAAM,UAAA,EAAY,WAAA,CAAE,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,MAAM,GAAA,mBAAK,OAAA,CAAQ,EAAA,0BAAM,IAAI,IAAA,CAAK,GAAA;AAClC,IAAA,MAAM,IAAA,EAAM,mBAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AAEhC,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA,MACvB;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,EAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,CAAA;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,EAAA,EAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA,EAAO,CAAC;AAAA,MACT,CAAA;AAAA,MACA,EAAE,OAAA,EAAS,CAAA,EAAA,GAAM,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAA,GAAM,IAAI;AAAA,IACxC,CAAA;AAAA,EACD;AAAA,EAEA,MAAM,CAAA,YAAA,CAAiB,KAAA,EAAiB,YAAA,EAAuB;AAC9D,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,MAAA,CAAA,EAAA,GAAY;AAClC,MAAA,MAAM,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,6BAAA,CAAc,4BAAA,EAA8B,EAAE,MAAM,CAAC,CAAA;AACzE,MAAA,IAAI;AACH,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA,UAChB,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAAA,UACjB,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAC,EAAE,EAAE;AAAA,QACtE,CAAA;AACA,QAAA,MAAM,QAAA,EAAwB;AAAA,UAC7B,GAAA,EAAK,KAAA,CAAM,GAAA;AAAA,UACX,EAAA,EAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAA,EAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAE;AAAA,QACxB,CAAA;AACA,QAAA,MAAM,OAAA,EAAS,MAAM,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AACnD,QAAA,sBAAM,GAAA,mBAAI,IAAA,0BAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,OAAO,GAAA;AAC5C,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAEnH,QAAA,MAAM,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,mBAAM,GAAA,qBAAI,KAAA,0BAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,OAAO,GAAC,CAAA,CAC5E,IAAA,CAAK,MAAA,CAAA,EAAA,GAAY;AACjB,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAAA,QACrH,CAAC,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,GAAA,EAAA,GAAQ;AACvB,UAAA,MAAM,MAAA,EAAQ,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA;AAC7D,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAAA,QAC5H,CAAC,CAAA;AACF,QAAA,GAAA,CAAI,YAAA,EAAc,MAAM,WAAA;AACxB,QAAA,OAAO,MAAA;AAAA,MACR,EAAA,MAAA,CAAS,GAAA,EAAK;AACb,QAAA,MAAM,MAAA,EAAQ,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA;AAC7D,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAC3H,QAAA,MAAM,GAAA;AAAA,MACP;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAa;AACzB,IAAA,MAAM,EAAE,OAAA,EAAS,OAAO,EAAA,EAAI,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,MAC5C,uCAAA;AAAgB,QACf,KAAA,EAAO,CAAC,GAAI,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,SAAA,EAAW,oBAAA,CAAW,IAAI,CAAC,EAAA,EAAI,CAAC,CAAE,CAAA;AAAA,QAC5F,IAAA,EAAM,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACnC,GAAA,EAAK;AAAA,MACN,CAAC;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAA,MAAW,MAAA,GAAS,MAAA,EAAQ,MAAM,IAAA,CAAK,CAAA,YAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,KAAA,CAAM,GAAA,EAAa;AACxB,IAAA,MAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,EAAE,IAAI,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,IAAI,6BAAA,CAAc,uBAAA,EAAyB,EAAE,IAAI,CAAC,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,CAAA,YAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAsC,IAAA,EAAc,GAAA,EAA4B;AAC/E,IAAA,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG,MAAM,IAAI,6BAAA,CAAc,CAAA,EAAA;AAC3B,IAAA;AACP,IAAA;AACuC,IAAA;AACZ,MAAA;AACH,MAAA;AAC1C,IAAA;AACD,EAAA;AACD;ACrCyD;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs","sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t}).catch(async (err) => {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t})\n\t\t\t\tif (callbackWait) await asyncHandle\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../src/audit/events.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs"],"names":[],"mappings":"AAAA,qtBAA+C;AAE/C,4CAAuD;AACvD,gDAA8B;AAC9B,kDAAyB;AAyBzB,SAAS,UAAA,CAAY,IAAA,EAAiC;AACrD,EAAA,OAAO,IAAA;AACR;AAEO,MAAM,WAAW;AAAA,EAKvB,WAAA,CACS,EAAA,EACR,MAAA,EACC;AAFO,IAAA,IAAA,CAAA,GAAA,EAAA,EAAA;AAGR,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,GAAA,CAAI;AAAA,MACnB,EAAA,EAAI,MAAA;AAAA,MACJ,GAAA,EAAK,UAAA;AAAA,MACL,MAAA,EAAQ,CAAC,KAAA,EAAA,GAAA,CAAW,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAA,GAAM,MAAiC,CAAA,CAAA;AAAA,MAC/E,OAAA,EAAS,EAAE,SAAA,EAAW,KAAK;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,mBAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,EAAA,GAAM;AAC1B,MAAA,WAAA,CAAY,MAAA,CAAA,EAAA,GAAY;AACvB,QAAA,MAAM,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AACjC,QAAA,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AACnB,QAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,EAAA,GAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MAC5C,CAAA,EAAG,GAAG,CAAA;AAAA,IACP,CAAA,EAAG,CAAC,CAAA;AAAA,EACL;AAAA,EAtBQ;AAAA,iBACA,YAAA,EAAyD,CAAC,EAAA;AAAA,kBAC1D,WAAA,EAAsC,CAAC,EAAA;AAAA,EAsB/C,MAAM,CAAA,WAAA,CAAa,IAAA,EAAc,OAAA,EAAkB,OAAA,EAAkB;AACpE,IAAA,MAAM,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,6BAAA,CAAc,4BAAA,EAA8B,EAAE,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEjF,IAAA,MAAM,UAAA,EAAY,WAAA,CAAE,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,MAAM,GAAA,mBAAK,OAAA,CAAQ,EAAA,0BAAM,IAAI,IAAA,CAAK,GAAA;AAClC,IAAA,MAAM,IAAA,EAAM,mBAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AAEhC,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA,MACvB;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,EAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,CAAA;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,EAAA,EAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA,EAAO,CAAC;AAAA,MACT,CAAA;AAAA,MACA,EAAE,OAAA,EAAS,CAAA,EAAA,GAAM,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAA,GAAM,IAAI;AAAA,IACxC,CAAA;AAAA,EACD;AAAA,EAEA,MAAM,CAAA,YAAA,CAAiB,KAAA,EAAiB,YAAA,EAAuB;AAC9D,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,MAAA,CAAA,EAAA,GAAY;AAClC,MAAA,MAAM,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,6BAAA,CAAc,4BAAA,EAA8B,EAAE,MAAM,CAAC,CAAA;AACzE,MAAA,IAAI;AACH,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA,UAChB,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAAA,UACjB,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAC,EAAE,EAAE;AAAA,QACtE,CAAA;AACA,QAAA,MAAM,QAAA,EAAwB;AAAA,UAC7B,GAAA,EAAK,KAAA,CAAM,GAAA;AAAA,UACX,EAAA,EAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAA,EAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAE;AAAA,QACxB,CAAA;AACA,QAAA,MAAM,OAAA,EAAS,MAAM,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AACnD,QAAA,sBAAM,GAAA,mBAAI,IAAA,0BAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,OAAO,GAAA;AAC5C,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAEnH,QAAA,MAAM,YAAA,EAAc,MAAA,CAAA,EAAA,GAAY;AAC/B,UAAA,IAAI;AACH,YAAA,sBAAM,GAAA,qBAAI,KAAA,0BAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,OAAO,GAAA;AAC7C,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAAA,UACrH,EAAA,MAAA,CAAQ,GAAA,EAAK;AACZ,YAAA,MAAM,MAAA,EAAQ,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA;AAC7D,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAAA,UAC5H;AAAC,UAAA;AAAA,QACF,CAAA;AACA,QAAA,GAAA,CAAI,YAAA,EAAc,MAAM,WAAA,CAAY,CAAA;AAAA,QAAA,KAC/B,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AACrC,QAAA,OAAO,MAAA;AAAA,MACR,EAAA,MAAA,CAAS,GAAA,EAAK;AACb,QAAA,MAAM,MAAA,EAAQ,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA;AAC7D,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAC3H,QAAA,MAAM,GAAA;AAAA,MACP;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAa;AACzB,IAAA,MAAM,EAAE,OAAA,EAAS,OAAO,EAAA,EAAI,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,MAC5C,uCAAA;AAAgB,QACf,KAAA,EAAO,CAAC,GAAI,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,SAAA,EAAW,oBAAA,CAAW,IAAI,CAAC,EAAA,EAAI,CAAC,CAAE,CAAA;AAAA,QAC5F,IAAA,EAAM,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACnC,GAAA,EAAK;AAAA,MACN,CAAC;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAA,MAAW,MAAA,GAAS,MAAA,EAAQ,MAAM,IAAA,CAAK,CAAA,YAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,KAAA,CAAM,GAAA,EAAa;AACxB,IAAA,MAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,EAAE,IAAI,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,IAAI,6BAAA,CAAc,uBAAA,EAAyB,EAAE,IAAI,CAAC,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,CAAA,YAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAsC,IAAA,EAAc,GAAA,EAA4B;AAC/E,IAAA,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG,MAAM,IAAI,6BAAA,CAAc,CAAA,EAAA;AAC3B,IAAA;AACP,IAAA;AACuC,IAAA;AACZ,MAAA;AACH,MAAA;AAC1C,IAAA;AACD,EAAA;AACD;ACpCyD;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs","sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');var _indexmincjs5 = require('../instance/index.min.cjs');function m(p){return p}class v{constructor(t,e){;v.prototype.__init.call(this);this.db=t;this.table=t.use({db:e,col:"__audits",mapper:n=>({...n,toJSON:()=>n}),options:{skipAudit:!0}})}__init() {this.definitions={}}async#e(t,e,n){const s=this.definitions[t];if(!s)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{name:t,payload:e});const i=_valleyed.v.assert(s.pipe,e),r=_nullishCoalesce(n.at, () => (new Date)),a=_indexmincjs5.Instance.createId(r);return await this.table.insertOne({key:a,name:t,ts:r.getTime(),body:i,by:n.by,steps:[]},{getTime:()=>r,makeId:()=>a})}async#t(t,e){return this.db.session(async()=>{const n=this.definitions[t.name];if(!n)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{steps:[{status:"start",ts:Date.now()}]}});const s={key:t.key,by:t.by,date:new Date(t.ts)},i=await n.handle(t.body,s);await _optionalChain([n, 'access', _ => _.sync, 'optionalCall', _2 => _2(i,t.body,s)]),await this.table.updateOne({key:t.key},{$push:{steps:{status:"sync",ts:Date.now()}}});const r=Promise.try(()=>_optionalChain([n, 'access', _3 => _3.async, 'optionalCall', _4 => _4(i,t.body,s)])).then(async()=>{await this.table.updateOne({key:t.key},{$push:{steps:{status:"async",ts:Date.now()}}})}).catch(async a=>{const u=a instanceof Error?a.message:String(a);await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:u,ts:Date.now()}}})});return e&&await r,i}catch(s){const i=s instanceof Error?s.message:String(s);throw await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:i,ts:Date.now()}}}),s}})}async replay(t){const{results:e}=await this.table.query(_indexmincjs.wrapQueryParams.call(void 0, {where:[...t?[{field:"ts",value:t.getTime(),condition:_indexmincjs.Conditions.gte}]:[]],sort:[{field:"ts",desc:!1}],all:!0}));for(const n of e)await this.#t(n,!0)}async rerun(t){const e=await this.table.findOne({key:t});if(!e)throw new (0, _indexmincjs3.EquippedError)("audit event not found",{key:t});await this.#t(e,!0)}register(t,e){if(this.definitions[t])throw new (0, _indexmincjs3.EquippedError)(`${t} already has a registered handler`,{});return this.definitions[t]=e,_valleyed.v.compile(e.pipe),async(n,s)=>{const i=await this.#e(t,n,s);return this.#t(i,!1)}}}exports.EventAudit = v;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');var _indexmincjs5 = require('../instance/index.min.cjs');function E(u){return u}class m{constructor(t,s){;m.prototype.__init.call(this);m.prototype.__init2.call(this);this.db=t;this.table=t.use({db:s,col:"__audits",mapper:e=>({...e,toJSON:()=>e}),options:{skipAudit:!0}}),_indexmincjs5.Instance.on("start",()=>{setInterval(async()=>{const e=[...this.asyncQueue];this.asyncQueue=[],await Promise.all(e.map(n=>n()))},200)},4)}__init() {this.definitions={}}__init2() {this.asyncQueue=[]}async#e(t,s,e){const n=this.definitions[t];if(!n)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{name:t,payload:s});const a=_valleyed.v.assert(n.pipe,s),i=_nullishCoalesce(e.at, () => (new Date)),r=_indexmincjs5.Instance.createId(i);return await this.table.insertOne({key:r,name:t,ts:i.getTime(),body:a,by:e.by,steps:[]},{getTime:()=>i,makeId:()=>r})}async#t(t,s){return this.db.session(async()=>{const e=this.definitions[t.name];if(!e)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{steps:[{status:"start",ts:Date.now()}]}});const n={key:t.key,by:t.by,date:new Date(t.ts)},a=await e.handle(t.body,n);await _optionalChain([e, 'access', _ => _.sync, 'optionalCall', _2 => _2(a,t.body,n)]),await this.table.updateOne({key:t.key},{$push:{steps:{status:"sync",ts:Date.now()}}});const i=async()=>{try{await _optionalChain([e, 'access', _3 => _3.async, 'optionalCall', _4 => _4(a,t.body,n)]),await this.table.updateOne({key:t.key},{$push:{steps:{status:"async",ts:Date.now()}}})}catch(r){const c=r instanceof Error?r.message:String(r);await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:c,ts:Date.now()}}})}};return s?await i():this.asyncQueue.push(i),a}catch(n){const a=n instanceof Error?n.message:String(n);throw await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:a,ts:Date.now()}}}),n}})}async replay(t){const{results:s}=await this.table.query(_indexmincjs.wrapQueryParams.call(void 0, {where:[...t?[{field:"ts",value:t.getTime(),condition:_indexmincjs.Conditions.gte}]:[]],sort:[{field:"ts",desc:!1}],all:!0}));for(const e of s)await this.#t(e,!0)}async rerun(t){const s=await this.table.findOne({key:t});if(!s)throw new (0, _indexmincjs3.EquippedError)("audit event not found",{key:t});await this.#t(s,!0)}register(t,s){if(this.definitions[t])throw new (0, _indexmincjs3.EquippedError)(`${t} already has a registered handler`,{});return this.definitions[t]=s,_valleyed.v.compile(s.pipe),async(e,n)=>{const a=await this.#e(t,e,n);return this.#t(a,!1)}}}exports.EventAudit = m;
2
2
  //# sourceMappingURL=events.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/audit/events.ts"],"names":["db","model","#createEvent","name","def","EquippedError","payload","context","key","ts","validBody","#processEvent","callbackWait","event","result","asyncHandle","err","error","from","events","wrapQueryParams"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.min.cjs","sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t}).catch(async (err) => {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t})\n\t\t\t\tif (callbackWait) await asyncHandle\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/audit/events.ts"],"names":["db","model","Instance","queue","job","#createEvent","name","payload","EquippedError","context","key","ts","validBody","#processEvent","callbackWait","def","event","result","asyncHandle","err","error","from","events","wrapQueryParams"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.min.cjs","sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"]}
@@ -1,6 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _eventscjs = require('./events.cjs');
2
-
3
-
4
-
5
- exports.EventAudit = _eventscjs.EventAudit; exports.EventDefinition = _eventscjs.EventDefinition;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _eventscjs = require('./events.cjs'); _createStarExport(_eventscjs);
6
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/audit/index.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs"],"names":[],"mappings":"AAAA,kHAA4C;ACC5C;AACE;AACA;AACF,iGAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs","sourcesContent":["export { EventAudit, EventDefinition } from './events'\n",null]}
1
+ {"version":3,"sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,yaAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs","sourcesContent":["export * from './events'\n"]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _eventsmincjs = require('./events.min.cjs');exports.EventAudit = _eventsmincjs.EventAudit; exports.EventDefinition = _eventsmincjs.EventDefinition;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _eventsmincjs = require('./events.min.cjs'); _createStarExport(_eventsmincjs);
2
2
  //# sourceMappingURL=index.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,yHAA4C,uGAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.min.cjs","sourcesContent":["export { EventAudit, EventDefinition } from './events'\n"]}
1
+ {"version":3,"sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,mbAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.min.cjs","sourcesContent":["export * from './events'\n"]}
@@ -1,5 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _mongodb = require('mongodb');
2
- var _valleyed = require('valleyed');
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');
3
2
  var _indexcjs = require('../../errors/index.cjs');
4
3
  var _indexcjs3 = require('../../instance/index.cjs');
5
4
  var _indexcjs5 = require('../../utilities/index.cjs');
@@ -10,14 +9,13 @@ class MongoDbChange extends _changescjs.DbChange {
10
9
  super(change, callbacks, mapper);
11
10
  const hydrate = (data) => data._id ? {
12
11
  ...data,
13
- _id: makeId(_nullishCoalesce(data._id["$oid"], () => ( data._id)))
12
+ _id: _nullishCoalesce(data._id["$oid"], () => ( data._id))
14
13
  } : void 0;
15
14
  const dbName = collection.dbName;
16
15
  const colName = collection.collectionName;
17
16
  const dbColName = `${dbName}.${colName}`;
18
17
  const topic = `${_changescjs.TopicPrefix}.${dbColName}`;
19
- const hexId = "5f5f65717569707065645f5f";
20
- const TestId = makeId(hexId);
18
+ const TestId = "5f5f65717569707065645f5f";
21
19
  const condition = { _id: TestId };
22
20
  change.eventBus.createStream(topic, { skipScope: true }).subscribe(async (data) => {
23
21
  const op = data.op;
@@ -25,7 +23,7 @@ class MongoDbChange extends _changescjs.DbChange {
25
23
  let after = JSON.parse(_nullishCoalesce(data.after, () => ( "null")));
26
24
  if (before) before = hydrate(before);
27
25
  if (after) after = hydrate(after);
28
- if (_optionalChain([before, 'optionalAccess', _ => _.__id]) === TestId || _optionalChain([after, 'optionalAccess', _2 => _2.__id]) === TestId) return;
26
+ if (_optionalChain([before, 'optionalAccess', _ => _._id]) === TestId || _optionalChain([after, 'optionalAccess', _2 => _2._id]) === TestId) return;
29
27
  if (op === "c" && this.callbacks.created && after)
30
28
  await this.callbacks.created({
31
29
  before: null,
@@ -64,20 +62,13 @@ class MongoDbChange extends _changescjs.DbChange {
64
62
  return { done: false };
65
63
  },
66
64
  6,
67
- 1e4
65
+ 3e4
68
66
  ).catch((err) => _indexcjs3.Instance.crash(new (0, _indexcjs.EquippedError)(`Failed to start db changes`, { dbColName }, err)));
69
67
  },
70
68
  10
71
69
  );
72
70
  }
73
71
  }
74
- const makeId = (id) => {
75
- try {
76
- return new (0, _mongodb.ObjectId)(id);
77
- } catch (e) {
78
- return id;
79
- }
80
- };
81
72
 
82
73
 
83
74
  exports.MongoDbChange = MongoDbChange;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AAAA,mtBAA6C;AAC7C,oCAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AAK/B,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,EAAK,MAAA,kBAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK,KAAG;AAAA,IACzC,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEH,IAAA;AACC,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAQ+B;AAC1B,EAAA;AACQ,IAAA;AACJ,EAAA;AACA,IAAA;AACR,EAAA;AACD;AC/BuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, Filter, ObjectId } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { DbChangeConfig } from '../base/types'\nimport { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: makeId(data._id['$oid'] ?? data._id),\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?.__id === TestId || after?.__id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t10_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AACA,qtBAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AAK/B,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,mBAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK;AAAA,IAC/B,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEF,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACzBuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { DbChangeConfig } from '../base/types'\nimport { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _mongodb = require('mongodb');var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');class z extends _changesmincjs.DbChange{#e=!1;constructor(h,d,r,g,C){super(d,g,C);const l=e=>e._id?{...e,_id:b(_nullishCoalesce(e._id.$oid, () => (e._id)))}:void 0,_=r.dbName,f=r.collectionName,n=`${_}.${f}`,m=`${_changesmincjs.TopicPrefix}.${n}`,i=b("5f5f65717569707065645f5f"),p={_id:i};d.eventBus.createStream(m,{skipScope:!0}).subscribe(async e=>{const s=e.op;let t=JSON.parse(_nullishCoalesce(e.before, () => ("null"))),o=JSON.parse(_nullishCoalesce(e.after, () => ("null")));t&&(t=l(t)),o&&(o=l(o)),!(_optionalChain([t, 'optionalAccess', _2 => _2.__id])===i||_optionalChain([o, 'optionalAccess', _3 => _3.__id])===i)&&(s==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):s==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:_valleyed.differ.from(_valleyed.differ.diff(t,o))}):s==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),_indexmincjs3.Instance.on("start",async()=>{this.#e||(this.#e=!0,await _indexmincjs5.retry.call(void 0, async()=>await this.configureConnector(m,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":h.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:f}},{upsert:!0}),await r.findOneAndDelete(p),_indexmincjs3.Instance.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,1e4).catch(e=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Failed to start db changes",{dbColName:n},e))))},10)}}const b=a=>{try{return new (0, _mongodb.ObjectId)(a)}catch (e2){return a}};exports.MongoDbChange = z;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');class T extends _changesmincjs.DbChange{#e=!1;constructor(u,c,r,b,g){super(c,b,g);const l=e=>e._id?{...e,_id:_nullishCoalesce(e._id.$oid, () => (e._id))}:void 0,h=r.dbName,d=r.collectionName,n=`${h}.${d}`,f=`${_changesmincjs.TopicPrefix}.${n}`,i="5f5f65717569707065645f5f",m={_id:i};c.eventBus.createStream(f,{skipScope:!0}).subscribe(async e=>{const a=e.op;let t=JSON.parse(_nullishCoalesce(e.before, () => ("null"))),o=JSON.parse(_nullishCoalesce(e.after, () => ("null")));t&&(t=l(t)),o&&(o=l(o)),!(_optionalChain([t, 'optionalAccess', _2 => _2._id])===i||_optionalChain([o, 'optionalAccess', _3 => _3._id])===i)&&(a==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):a==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:_valleyed.differ.from(_valleyed.differ.diff(t,o))}):a==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),_indexmincjs3.Instance.on("start",async()=>{this.#e||(this.#e=!0,await _indexmincjs5.retry.call(void 0, async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":u.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(m,{$set:{colName:d}},{upsert:!0}),await r.findOneAndDelete(m),_indexmincjs3.Instance.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,3e4).catch(e=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Failed to start db changes",{dbColName:n},e))))},10)}}exports.MongoDbChange = T;
2
2
  //# sourceMappingURL=changes.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","colName","collection","topic","dbColName","TestId"],"mappings":"AAAA,mtBAA6C,oCACtB,yDAGd,4DACa,6DACgB,wDAe9BA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACYA,CAAAA,CAAK,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,KAAQ,CACzC,CAAA,CACC,CAAA,CAAA,CAAA,CAAA,CAAA,MAEsB,CAAA,CAAA,CAAA,EAAA,CAAA,CACpBC,GAAUC,CAAW,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,GACT,CAAA,IAAS,SAAA,CAAID,CAAO,KAChCE,CAAAA,CAAQ,CAAA,KAAc,CAAA,CAAIC,CAAS,CAAA,CAAA,CAGnCC,MADQ,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, Filter, ObjectId } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { DbChangeConfig } from '../base/types'\nimport { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: makeId(data._id['$oid'] ?? data._id),\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?.__id === TestId || after?.__id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t10_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","dbName","colName","collection","dbColName","topic","TestId","condition"],"mappings":"AACA,qtBAAuB,yDAGd,4DACa,6DACgB,wDAe9BA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACU,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,CAAAA,CAAK,KAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEEC,CAAAA,MAAoB,CAAA,CAAA,CAAA,EACpBC,CAAUC,CAAAA,GAAW,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAA,CAAA,CACrBC,GAAY,CAAA,IAAS,SAAIF,CAAO,CAAA,KAChCG,CAAQ,CAAA,KAAc,CAAA,CAAID,CAAS,CAAA,CAAA,CAEnCE,MAAS,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CACTC,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { DbChangeConfig } from '../base/types'\nimport { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _nodeasync_hooks = require('node:async_hooks');
2
2
  var _mongodb = require('mongodb');
3
- var _changescjs = require('./changes.cjs');
4
- var _querycjs = require('./query.cjs');
5
3
  var _indexcjs = require('../../errors/index.cjs');
6
4
  var _indexcjs3 = require('../../instance/index.cjs');
7
5
  var _dbcjs = require('../base/db.cjs');
6
+ var _changescjs = require('./changes.cjs');
7
+ var _querycjs = require('./query.cjs');
8
8
  const idKey = "_id";
9
9
  const sessionStore = new (0, _nodeasync_hooks.AsyncLocalStorage)(void 0);
10
10
  class MongoDb extends _dbcjs.Db {
@@ -45,6 +45,7 @@ class MongoDb extends _dbcjs.Db {
45
45
 
46
46
  #cols = [];
47
47
  async session(callback) {
48
+ if (sessionStore.getStore()) return callback();
48
49
  return this.client.withSession(async (session) => sessionStore.run(session, callback));
49
50
  }
50
51
  id() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/db.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { ClientSession, Collection, CollectionInfo, MongoClient, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport { DbConfig } from '../base/types'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\treturn this.client.withSession(async (session) => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/db.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { ClientSession, Collection, CollectionInfo, MongoClient, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport { DbConfig } from '../base/types'\nimport { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\treturn this.client.withSession(async (session) => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _nodeasync_hooks = require('node:async_hooks');var _mongodb = require('mongodb');var _changesmincjs = require('./changes.min.cjs');var _querymincjs = require('./query.min.cjs');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _dbmincjs = require('../base/db.min.cjs');const m="_id",u=new (0, _nodeasync_hooks.AsyncLocalStorage)(void 0);class H extends _dbmincjs.Db{constructor(o,a){super(a);this.mongoConfig=o;this.client=new (0, _mongodb.MongoClient)(o.uri),_indexmincjs3.Instance.on("start",async()=>{await this.client.connect();const p=this.#e.reduce((d,l)=>(d[l.db]||(d[l.db]=[]),d[l.db].push(l.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(p).map(async([d,l])=>{const i=this.client.db(d),e=await i.listCollections().toArray();return l.map(async t=>{const n=e.find(r=>r.name===t);n?_optionalChain([n, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==y.changeStreamPreAndPostImages.enabled&&await i.command({collMod:t,...y}):await i.createCollection(t,y)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.client.close(),1)}#e=[];async session(o){return this.client.withSession(async a=>u.run(a,o))}id(){return new _mongodb.ObjectId}use(o){const a=this.getScopedDb(o.db);return this.#e.push({db:a,col:o.col}),this.#t(o,this.client.db(a).collection(o.col))}#t(o,a){async function p(e){const n=(Array.isArray(e)?e:[e]).map(r=>o.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[m]:t,..._optionalChain([o, 'access', _4 => _4.options, 'optionalAccess', _5 => _5.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!_optionalChain([o, 'access', _6 => _6.options, 'optionalAccess', _7 => _7.skipAudit])?{updatedAt:t.getTime()}:{}}}}const l=this,i={config:o,extras:{collection:a},query:async e=>{const t=await _querymincjs.parseMongodbQueryParams.call(void 0, a,e);return{...t,results:await p(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:u.getStore(),limit:t.limit,sort:r}).toArray();return p(s)},findOne:async e=>await _asyncNullishCoalesce((await i.findMany(e,{limit:1})).at(0), async () => (null)),findById:async e=>await i.findOne({[m]:e}),insertMany:async(e,t={})=>{const n=_nullishCoalesce(_optionalChain([t, 'access', _8 => _8.getTime, 'optionalCall', _9 => _9()]), () => (new Date)),r=e.map((c,f)=>y(c,_nullishCoalesce(_optionalChain([t, 'access', _10 => _10.makeId, 'optionalCall', _11 => _11(f)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await a.insertMany(r,{session:u.getStore()}),(await Promise.all(r.map(async c=>await i.findById(c[m])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await i.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _12 => _12.getTime, 'optionalCall', _13 => _13()]), () => (new Date)),s=u.getStore(),f=(await a.find(e,{session:s,projection:{[m]:1}}).toArray()).map(I=>I[m]),M={[m]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),i.findMany(M)},updateOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _14 => _14.getTime, 'optionalCall', _15 => _15()]), () => (new Date)),s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:u.getStore()});return s?p(s):null},updateById:async(e,t,n={})=>await i.updateOne({[m]:e},t,n),upsertOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _16 => _16.getTime, 'optionalCall', _17 => _17()]), () => (new Date)),s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,_nullishCoalesce(_optionalChain([n, 'access', _18 => _18.makeId, 'optionalCall', _19 => _19()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:u.getStore(),upsert:!0});return p(s)},deleteMany:async(e,t={})=>{const n=await i.findMany(e,t);return await a.deleteMany(e,{session:u.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:u.getStore()});return t?p(t):null},deleteById:async e=>await i.deleteOne({[m]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:u.getStore()}),r=_nullishCoalesce(_optionalChain([t, 'access', _20 => _20.getTime, 'optionalCall', _21 => _21()]), () => (new Date));e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _24 => _24.makeId, 'optionalCall', _25 => _25(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:u.getStore()})},watch(e){return l.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:o})),new (0, _changesmincjs.MongoDbChange)(l.mongoConfig,l.config.changes,a,e,o.mapper)}};return i}}exports.MongoDb = H;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _nodeasync_hooks = require('node:async_hooks');var _mongodb = require('mongodb');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _dbmincjs = require('../base/db.min.cjs');var _changesmincjs = require('./changes.min.cjs');var _querymincjs = require('./query.min.cjs');const m="_id",l=new (0, _nodeasync_hooks.AsyncLocalStorage)(void 0);class H extends _dbmincjs.Db{constructor(o,a){super(a);this.mongoConfig=o;this.client=new (0, _mongodb.MongoClient)(o.uri),_indexmincjs3.Instance.on("start",async()=>{await this.client.connect();const p=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(p).map(async([d,u])=>{const i=this.client.db(d),e=await i.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?_optionalChain([n, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==y.changeStreamPreAndPostImages.enabled&&await i.command({collMod:t,...y}):await i.createCollection(t,y)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.client.close(),1)}#e=[];async session(o){return l.getStore()?o():this.client.withSession(async a=>l.run(a,o))}id(){return new _mongodb.ObjectId}use(o){const a=this.getScopedDb(o.db);return this.#e.push({db:a,col:o.col}),this.#t(o,this.client.db(a).collection(o.col))}#t(o,a){async function p(e){const n=(Array.isArray(e)?e:[e]).map(r=>o.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[m]:t,..._optionalChain([o, 'access', _4 => _4.options, 'optionalAccess', _5 => _5.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!_optionalChain([o, 'access', _6 => _6.options, 'optionalAccess', _7 => _7.skipAudit])?{updatedAt:t.getTime()}:{}}}}const u=this,i={config:o,extras:{collection:a},query:async e=>{const t=await _querymincjs.parseMongodbQueryParams.call(void 0, a,e);return{...t,results:await p(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return p(s)},findOne:async e=>await _asyncNullishCoalesce((await i.findMany(e,{limit:1})).at(0), async () => (null)),findById:async e=>await i.findOne({[m]:e}),insertMany:async(e,t={})=>{const n=_nullishCoalesce(_optionalChain([t, 'access', _8 => _8.getTime, 'optionalCall', _9 => _9()]), () => (new Date)),r=e.map((c,f)=>y(c,_nullishCoalesce(_optionalChain([t, 'access', _10 => _10.makeId, 'optionalCall', _11 => _11(f)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await i.findById(c[m])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await i.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _12 => _12.getTime, 'optionalCall', _13 => _13()]), () => (new Date)),s=l.getStore(),f=(await a.find(e,{session:s,projection:{[m]:1}}).toArray()).map(I=>I[m]),M={[m]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),i.findMany(M)},updateOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _14 => _14.getTime, 'optionalCall', _15 => _15()]), () => (new Date)),s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?p(s):null},updateById:async(e,t,n={})=>await i.updateOne({[m]:e},t,n),upsertOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _16 => _16.getTime, 'optionalCall', _17 => _17()]), () => (new Date)),s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,_nullishCoalesce(_optionalChain([n, 'access', _18 => _18.makeId, 'optionalCall', _19 => _19()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return p(s)},deleteMany:async(e,t={})=>{const n=await i.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?p(t):null},deleteById:async e=>await i.deleteOne({[m]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=_nullishCoalesce(_optionalChain([t, 'access', _20 => _20.getTime, 'optionalCall', _21 => _21()]), () => (new Date));e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _24 => _24.makeId, 'optionalCall', _25 => _25(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:l.getStore()})},watch(e){return u.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:o})),new (0, _changesmincjs.MongoDbChange)(u.mongoConfig,u.config.changes,a,e,o.mapper)}};return i}}exports.MongoDb = H;
2
2
  //# sourceMappingURL=db.min.cjs.map