equipped 5.3.1 → 5.3.3

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 (203) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
  3. package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
  4. package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
  5. package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
  6. package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
  7. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
  8. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
  9. package/dist/cjs/dbs/index.cjs +181 -179
  10. package/dist/cjs/dbs/index.cjs.map +1 -1
  11. package/dist/cjs/dbs/index.min.cjs +3 -3
  12. package/dist/cjs/dbs/index.min.cjs.map +1 -1
  13. package/dist/cjs/errors/index.cjs +11 -0
  14. package/dist/cjs/errors/index.cjs.map +1 -1
  15. package/dist/cjs/errors/index.min.cjs +1 -1
  16. package/dist/cjs/errors/index.min.cjs.map +1 -1
  17. package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
  18. package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
  19. package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
  20. package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
  21. package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
  22. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
  23. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
  24. package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
  25. package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
  26. package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
  27. package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
  28. package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
  29. package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
  30. package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
  31. package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
  32. package/dist/cjs/server/adapters/express/index.cjs +292 -225
  33. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  34. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  35. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
  37. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  38. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  39. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  40. package/dist/cjs/server/index.cjs +82 -15
  41. package/dist/cjs/server/index.cjs.map +1 -1
  42. package/dist/cjs/server/index.min.cjs +7 -7
  43. package/dist/cjs/server/index.min.cjs.map +1 -1
  44. package/dist/cjs/utilities/index.cjs +0 -5
  45. package/dist/cjs/utilities/index.cjs.map +1 -1
  46. package/dist/cjs/utilities/index.min.cjs +2 -2
  47. package/dist/cjs/utilities/index.min.cjs.map +1 -1
  48. package/dist/cjs/validations/index.cjs +1 -0
  49. package/dist/cjs/validations/index.cjs.map +1 -1
  50. package/dist/cjs/validations/index.min.cjs +1 -1
  51. package/dist/cjs/validations/index.min.cjs.map +1 -1
  52. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  53. package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
  54. package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
  55. package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
  56. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  57. package/dist/esm/cache/adapters/redis/index.mjs +5 -3
  58. package/dist/esm/cache/index.min.mjs +1 -1
  59. package/dist/esm/cache/index.mjs +2 -2
  60. package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
  61. package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
  62. package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
  63. package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
  64. package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
  65. package/dist/esm/chunk-A332TTED.mjs +135 -0
  66. package/dist/esm/chunk-A332TTED.mjs.map +1 -0
  67. package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
  68. package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
  69. package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
  70. package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
  71. package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
  72. package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
  73. package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
  74. package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
  75. package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
  76. package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
  77. package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
  78. package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
  79. package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
  80. package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
  81. package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
  82. package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
  83. package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
  84. package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
  85. package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
  86. package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
  87. package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
  88. package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
  89. package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
  90. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  91. package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
  92. package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
  93. package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
  94. package/dist/esm/dbs/index.min.mjs +1 -1
  95. package/dist/esm/dbs/index.mjs +5 -3
  96. package/dist/esm/errors/index.min.mjs +1 -1
  97. package/dist/esm/errors/index.mjs +3 -1
  98. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  99. package/dist/esm/events/adapters/kafka/index.mjs +4 -2
  100. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  101. package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
  102. package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
  103. package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
  104. package/dist/esm/index.min.mjs +1 -1
  105. package/dist/esm/index.mjs +1 -1
  106. package/dist/esm/instance/index.min.mjs +1 -1
  107. package/dist/esm/instance/index.mjs +1 -1
  108. package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
  109. package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
  110. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  111. package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
  112. package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
  113. package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
  114. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  115. package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
  116. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  117. package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
  118. package/dist/esm/orm/adapters/json/index.mjs +6 -5
  119. package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
  120. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  121. package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
  122. package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
  123. package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
  124. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  125. package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
  126. package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
  127. package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
  128. package/dist/esm/orm/index.min.mjs +1 -1
  129. package/dist/esm/orm/index.mjs +3 -3
  130. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  131. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  132. package/dist/esm/server/adapters/express/index.mjs +7 -3
  133. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  134. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  135. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  136. package/dist/esm/server/adapters/fastify/index.mjs +7 -3
  137. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  138. package/dist/esm/server/index.min.mjs +1 -1
  139. package/dist/esm/server/index.mjs +1 -1
  140. package/dist/esm/utilities/index.min.mjs +1 -1
  141. package/dist/esm/utilities/index.mjs +5 -4
  142. package/dist/esm/validations/index.min.mjs +1 -1
  143. package/dist/esm/validations/index.mjs +1 -1
  144. package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
  145. package/dist/types/cache/adapters/in-memory/index.js +6 -3
  146. package/dist/types/cache/adapters/redis/index.js +5 -3
  147. package/dist/types/cache/index.js +2 -2
  148. package/dist/types/chunk-7MXHWHRV.js +134 -0
  149. package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
  150. package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
  151. package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
  152. package/dist/types/chunk-PPD4WDG6.js +143 -0
  153. package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
  154. package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
  155. package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
  156. package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
  157. package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
  158. package/dist/types/dbs/adapters/mongodb/index.js +8 -5
  159. package/dist/types/dbs/index.js +5 -3
  160. package/dist/types/errors/index.d.ts +8 -3
  161. package/dist/types/errors/index.js +3 -1
  162. package/dist/types/events/adapters/kafka/index.js +4 -2
  163. package/dist/types/events/adapters/rabbitmq/index.js +7 -3
  164. package/dist/types/index.js +1 -1
  165. package/dist/types/instance/index.js +1 -1
  166. package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
  167. package/dist/types/jobs/adapters/redis/index.js +10 -6
  168. package/dist/types/orm/adapters/in-memory/index.js +4 -3
  169. package/dist/types/orm/adapters/json/index.js +6 -5
  170. package/dist/types/orm/adapters/mongodb/index.js +6 -4
  171. package/dist/types/orm/adapters/postgresql/index.js +8 -5
  172. package/dist/types/orm/index.js +3 -3
  173. package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
  174. package/dist/types/server/adapters/express/index.d.ts +2 -2
  175. package/dist/types/server/adapters/express/index.js +7 -3
  176. package/dist/types/server/adapters/fastify/index.d.ts +3 -3
  177. package/dist/types/server/adapters/fastify/index.js +7 -3
  178. package/dist/types/server/index.d.ts +4 -4
  179. package/dist/types/server/index.js +1 -1
  180. package/dist/types/utilities/index.d.ts +1 -2
  181. package/dist/types/utilities/index.js +5 -4
  182. package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
  183. package/dist/types/validations/index.d.ts +4 -4
  184. package/dist/types/validations/index.js +1 -1
  185. package/package.json +1 -1
  186. package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
  187. package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
  188. package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
  189. package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
  190. package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
  191. package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
  192. /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
  193. /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
  194. /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
  195. /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
  196. /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
  197. /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
  198. /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
  199. /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
  200. /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
  201. /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
  202. /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
  203. /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-ZUQYVEFC.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/dbs/adapters/mongodb/index.ts","../../../../../src/dbs/adapters/mongodb/changes.ts","../../../../../src/errors/equippedError.ts","../../../../../src/events/adapters/base.ts","../../../../../src/instance/index.ts","../../../../../src/instance/hooks.ts","../../../../../src/instance/settings.ts","../../../../../src/utilities/configurable.ts","../../../../../src/utilities/json.ts","../../../../../src/utilities/random.ts","../../../../../src/utilities/retry.ts","../../../../../src/dbs/adapters/base/changes.ts","../../../../../src/dbs/adapters/base/types.ts","../../../../../src/events/adapters/kafka/index.ts","../../../../../src/dbs/adapters/mongodb/db.ts","../../../../../src/dbs/adapters/mongodb/pipes.ts","../../../../../src/dbs/adapters/mongodb/query.ts","../../../../../src/dbs/pipes.ts","../../../../../src/dbs/adapters/base/db.ts"],"sourcesContent":["export * from './changes'\nexport * from './db'\nexport * from './pipes'\n","import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport type { MongoDbConfig } from './pipes'\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 type { DbChangeConfig } from '../base/types'\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.stream(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('start', async () => {\n\t\t\tif (this.#started) return\n\t\t\tthis.#started = true\n\n\t\t\tawait retry(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t})\n\n\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\treturn { done: false }\n\t\t\t\t},\n\t\t\t\t6,\n\t\t\t\t30_000,\n\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t})\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n","export class EquippedError extends Error {\n\tconstructor(\n\t\tpublic readonly message: string,\n\t\tpublic readonly context: Record<string, unknown>,\n\t\tpublic readonly cause?: unknown,\n\t) {\n\t\tsuper(message, { cause })\n\t}\n}\n","import type { Events } from '../../types'\n\nexport type StreamOptions = { skipScope?: boolean; fanout: boolean }\n\nexport type Stream<EventData> = {\n\tpublish: (data: EventData) => Promise<boolean>\n\tsubscribe: (onMessage: (data: EventData) => Promise<void>) => void\n}\n\nexport abstract class EventBus {\n\tabstract stream<Event extends Events[keyof Events]>(topic: Event['topic'], options?: Partial<StreamOptions>): Stream<Event['data']>\n}\n","import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type Pipe, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type ClassRef, type HookCb, type HookEvent, type HookOptions, type HookRecord, registerHook, runHooks } from './hooks'\nimport { instanceSettingsPipe, type Settings, type SettingsInput } from './settings'\n\nexport type { ClassRef, HookCb, HookEvent, HookOptions }\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance | undefined\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic maybeGet() {\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, options?: HookOptions) {\n\t\tInstance.#hooks[event] ??= []\n\t\tconst record: HookRecord = { cb, class: options?.class, after: options?.after ?? [] }\n\t\tregisterHook(Instance.#hooks[event], record)\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {}, true)\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n","export type HookEvent = 'setup' | 'start' | 'close'\nexport type HookCb = Promise<unknown | void> | (() => void | unknown | Promise<void | unknown>)\n\nexport type ClassRef = Function & { prototype: unknown; name: string }\nexport type HookOptions = {\n\tclass?: ClassRef\n\tafter?: ClassRef[]\n}\nexport type HookRecord = { cb: HookCb; class?: ClassRef; after: ClassRef[] }\n\nexport function registerHook(hooks: HookRecord[], record: HookRecord): void {\n\tfor (const dep of record.after) {\n\t\tif (!hooks.some((h) => h.class === dep)) {\n\t\t\tconst depName = dep.name || 'unknown'\n\t\t\tconst ownerName = record.class?.name || 'anonymous'\n\t\t\tthrow new Error(`Missing dependency: ${ownerName} declares after: [${depName}], but ${depName} is not registered`)\n\t\t}\n\t}\n\n\tif (record.class) {\n\t\tconst tentative = [...hooks, record]\n\t\tdetectCycle(tentative)\n\t}\n\n\thooks.push(record)\n}\n\nfunction detectCycle(hooks: HookRecord[]): void {\n\tconst classToAfter = new Map<ClassRef, ClassRef[]>()\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tconst existing = classToAfter.get(h.class)\n\t\tif (existing) {\n\t\t\tfor (const dep of h.after) {\n\t\t\t\tif (!existing.includes(dep)) existing.push(dep)\n\t\t\t}\n\t\t} else {\n\t\t\tclassToAfter.set(h.class, [...h.after])\n\t\t}\n\t}\n\n\tconst visited = new Set<ClassRef>()\n\tconst stack = new Set<ClassRef>()\n\n\tfunction visit(cls: ClassRef, path: ClassRef[]): void {\n\t\tif (stack.has(cls)) {\n\t\t\tconst cycleStart = path.indexOf(cls)\n\t\t\tconst cycle = [...path.slice(cycleStart), cls]\n\t\t\tconst names = cycle.map((c) => c.name || 'unknown')\n\t\t\tthrow new Error(`Cycle detected: ${names.join(' → ')}`)\n\t\t}\n\t\tif (visited.has(cls)) return\n\t\tstack.add(cls)\n\t\tpath.push(cls)\n\t\tfor (const dep of classToAfter.get(cls) ?? []) {\n\t\t\tvisit(dep, path)\n\t\t}\n\t\tpath.pop()\n\t\tstack.delete(cls)\n\t\tvisited.add(cls)\n\t}\n\n\tfor (const cls of classToAfter.keys()) {\n\t\tvisit(cls, [])\n\t}\n}\n\nexport type HookLayer = HookRecord[]\n\nexport function resolveHookDAG(hooks: HookRecord[], invert: boolean = false): HookLayer[] {\n\tif (hooks.length === 0) return []\n\n\tconst classToHooks = new Map<ClassRef, HookRecord[]>()\n\tconst anonymous: HookRecord[] = []\n\n\tfor (const h of hooks) {\n\t\tif (h.class) {\n\t\t\tconst list = classToHooks.get(h.class)\n\t\t\tif (list) list.push(h)\n\t\t\telse classToHooks.set(h.class, [h])\n\t\t} else {\n\t\t\tanonymous.push(h)\n\t\t}\n\t}\n\n\tconst classes = [...classToHooks.keys()]\n\n\tconst inDegree = new Map<ClassRef, number>()\n\tconst graph = new Map<ClassRef, ClassRef[]>()\n\n\tfor (const cls of classes) {\n\t\tinDegree.set(cls, 0)\n\t\tgraph.set(cls, [])\n\t}\n\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tfor (const dep of h.after) {\n\t\t\tconst [from, to] = invert ? [h.class, dep] : [dep, h.class]\n\t\t\tconst edges = graph.get(from)!\n\t\t\tif (!edges.includes(to)) {\n\t\t\t\tedges.push(to)\n\t\t\t\tinDegree.set(to, inDegree.get(to)! + 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst layers: HookLayer[] = []\n\tlet queue = classes.filter((c) => inDegree.get(c) === 0)\n\n\twhile (queue.length > 0) {\n\t\tconst layer: HookRecord[] = []\n\t\tconst next: ClassRef[] = []\n\n\t\tfor (const cls of queue) {\n\t\t\tlayer.push(...(classToHooks.get(cls) ?? []))\n\t\t}\n\t\tlayers.push(layer)\n\n\t\tfor (const cls of queue) {\n\t\t\tfor (const neighbor of graph.get(cls) ?? []) {\n\t\t\t\tconst d = inDegree.get(neighbor)! - 1\n\t\t\t\tinDegree.set(neighbor, d)\n\t\t\t\tif (d === 0) next.push(neighbor)\n\t\t\t}\n\t\t}\n\n\t\tqueue = next\n\t}\n\n\tif (anonymous.length > 0) {\n\t\tconst anonWithDeps = anonymous.filter((h) => h.after.length > 0)\n\t\tconst anonWithoutDeps = anonymous.filter((h) => h.after.length === 0)\n\n\t\tif (anonWithDeps.length > 0) {\n\t\t\tlet maxLayer = -1\n\t\t\tfor (const h of anonWithDeps) {\n\t\t\t\tfor (const dep of h.after) {\n\t\t\t\t\tconst depLayer = layers.findIndex((l) => l.some((r) => r.class === dep))\n\t\t\t\t\tif (depLayer > maxLayer) maxLayer = depLayer\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst insertAt = maxLayer + 1\n\t\t\tif (insertAt < layers.length) {\n\t\t\t\tlayers[insertAt].push(...anonWithDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithDeps)\n\t\t\t}\n\t\t}\n\n\t\tif (anonWithoutDeps.length > 0) {\n\t\t\tif (layers.length > 0) {\n\t\t\t\tlayers[layers.length - 1].push(...anonWithoutDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithoutDeps)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn layers\n}\n\nexport async function runHooks(\n\thooks: HookRecord[],\n\tonError: (error: Error) => void = (error) => {\n\t\tthrow error\n\t},\n\tinvert: boolean = false,\n) {\n\tconst layers = resolveHookDAG(hooks, invert)\n\tfor (const layer of layers)\n\t\tawait Promise.all(\n\t\t\tlayer.map(async (h) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof h.cb === 'function') return await h.cb()\n\t\t\t\t\treturn await h.cb\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn onError(error instanceof Error ? error : new Error(`${error}`))\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect } = import.meta.vitest\n\n\tclass A {}\n\tclass B {}\n\tclass C {}\n\tclass D {}\n\n\tconst noop = () => {}\n\n\tdescribe('registerHook', () => {\n\t\ttest('registers a hook with no dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\texpect(hooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: B, after: [A] })).toThrow(/Missing dependency.*B.*A/)\n\t\t})\n\n\t\ttest('throws on cycle: A→B→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [B] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('throws on transitive cycle: A→B→C→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\tregisterHook(hooks, { cb: noop, class: C, after: [B] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [C] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('allows anonymous hooks with dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, after: [A] })\n\t\t\texpect(hooks).toHaveLength(2)\n\t\t})\n\n\t\ttest('anonymous hook throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, after: [A] })).toThrow(/Missing dependency.*anonymous.*A/)\n\t\t})\n\t})\n\n\tdescribe('resolveHookDAG', () => {\n\t\ttest('linear chain: A → B → C', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === C)).toBe(true)\n\t\t})\n\n\t\ttest('fan-out: A → B, A → C (B and C are parallel)', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\tconst secondClasses = layers[1].map((h) => h.class)\n\t\t\texpect(secondClasses).toContain(B)\n\t\t\texpect(secondClasses).toContain(C)\n\t\t})\n\n\t\ttest('fan-in: B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: B, after: [] },\n\t\t\t\t{ cb: noop, class: C, after: [] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === D)).toBe(true)\n\t\t})\n\n\t\ttest('diamond: A → B, A → C, B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0][0].class).toBe(A)\n\t\t\tconst midClasses = layers[1].map((h) => h.class)\n\t\t\texpect(midClasses).toContain(B)\n\t\t\texpect(midClasses).toContain(C)\n\t\t\texpect(layers[2][0].class).toBe(D)\n\t\t})\n\n\t\ttest('close-event inversion reverses the graph', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === C)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('close inversion: fan-out becomes fan-in', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('multiple hooks per class are all in the same layer', () => {\n\t\t\tconst cb1 = () => {}\n\t\t\tconst cb2 = () => {}\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: cb1, class: A, after: [] },\n\t\t\t\t{ cb: cb2, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0]).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks without deps run at deepest level', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, after: [] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst lastLayer = layers[layers.length - 1]\n\t\t\texpect(lastLayer.some((h) => h.class === undefined)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks with deps run after their dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t\t{ cb: noop, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\tconst anonLayer = layers.findIndex((l) => l.some((h) => h.class === undefined))\n\t\t\tconst aLayer = layers.findIndex((l) => l.some((h) => h.class === A))\n\t\t\texpect(anonLayer).toBeGreaterThan(aLayer)\n\t\t})\n\n\t\ttest('empty hooks returns empty layers', () => {\n\t\t\texpect(resolveHookDAG([])).toEqual([])\n\t\t})\n\t})\n\n\tdescribe('runHooks', () => {\n\t\ttest('same-depth siblings observably overlap', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('B-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('C-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('C-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: C,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log[0]).toBe('B-start')\n\t\t\texpect(log[1]).toBe('C-start')\n\t\t})\n\n\t\ttest('different depths run sequentially', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('A')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [A],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toEqual(['A', 'B'])\n\t\t})\n\n\t\ttest('close inversion runs hooks in reverse dependency order', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: async () => log.push('A'), class: A, after: [] },\n\t\t\t\t{ cb: async () => log.push('B'), class: B, after: [A] },\n\t\t\t\t{ cb: async () => log.push('C'), class: C, after: [B] },\n\t\t\t]\n\t\t\tawait runHooks(hooks, undefined, true)\n\t\t\texpect(log).toEqual(['C', 'B', 'A'])\n\t\t})\n\n\t\ttest('errors are routed to onError handler', async () => {\n\t\t\tconst errors: Error[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: () => {\n\t\t\t\t\t\tthrow new Error('boom')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks, (e) => {\n\t\t\t\terrors.push(e)\n\t\t\t})\n\t\t\texpect(errors).toHaveLength(1)\n\t\t\texpect(errors[0].message).toBe('boom')\n\t\t})\n\n\t\ttest('raw promise callbacks are awaited', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: Promise.resolve().then(() => log.push('resolved')),\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toContain('resolved')\n\t\t})\n\t})\n}\n","import { type ConditionalObjectKeys, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nexport const instanceSettingsPipe = () =>\n\tv.object({\n\t\tapp: v.object({\n\t\t\tname: v.string(),\n\t\t}),\n\t\tlog: v.defaults(\n\t\t\tv.object({\n\t\t\t\tlevel: v.defaults(v.in(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'] as const), 'info'),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t\tutils: v.defaults(\n\t\t\tv.object({\n\t\t\t\thashSaltRounds: v.defaults(v.number(), 10),\n\t\t\t\tpaginationDefaultLimit: v.defaults(v.number(), 100),\n\t\t\t\tmaxFileUploadSizeInMb: v.defaults(v.number(), 500),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t})\n\nexport type Settings = PipeOutput<ReturnType<typeof instanceSettingsPipe>>\nexport type SettingsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof instanceSettingsPipe>>>\n","import { v, type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput } from 'valleyed'\n\ntype CtorParams<T> = ConstructorParameters<T & (abstract new (...args: any[]) => any)>\ntype BaseCtorParams<T> = T extends abstract new (...args: infer A) => any ? A : never\n\nexport function configurable<P extends Pipe<any, any>, Base extends abstract new (...args: any[]) => any>(pipeFn: () => P, base: Base) {\n\tconst pipe = pipeFn()\n\tv.compile(pipe)\n\n\tabstract class Configurable extends (base as unknown as new (...args: any[]) => any) {\n\t\tdeclare static readonly Config: PipeOutput<P>\n\n\t\tprotected constructor (protected readonly config: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) {\n\t\t\t// eslint-disable-next-line constructor-super\n\t\t\tsuper(...baseArgs)\n\t\t}\n\n\t\tstatic create<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype'] {\n\t\t\tconst r = v.validate(pipe, input)\n\t\t\tif (!r.valid) throw r.error\n\t\t\treturn new (this as any)(r.value, ...args) as This['prototype']\n\t\t}\n\t}\n\n\treturn Configurable as unknown as (abstract new (validated: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) => InstanceType<Base> & { readonly config: PipeOutput<P> }) & {\n\t\treadonly Config: PipeOutput<P>\n\t\tcreate<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype']\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\tconst { v } = await import('valleyed')\n\n\tconst testPipe = () =>\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.number(),\n\t\t})\n\n\ttype TestConfig = PipeOutput<ReturnType<typeof testPipe>>\n\n\tclass TestBase {\n\t\tbaseValue: string\n\t\tconstructor() {\n\t\t\tthis.baseValue = 'base'\n\t\t}\n\t}\n\n\tclass TestBaseWithArgs {\n\t\tlabel: string\n\t\tconstructor(label: string) {\n\t\t\tthis.label = label\n\t\t}\n\t}\n\n\tdescribe('configurable', () => {\n\t\ttest('validation runs in static create before constructor body executes', () => {\n\t\t\tlet constructorRan = false\n\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tconstructorRan = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpect(() => MyClass.create({ host: 123, port: 'bad' } as any)).toThrow()\n\t\t\texpect(constructorRan).toBe(false)\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(constructorRan).toBe(true)\n\t\t})\n\n\t\ttest('constructor receives validated value', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tlet receivedConfig: unknown\n\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\treceivedConfig = this.config\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\n\t\t\texpect(receivedConfig).toEqual({ host: 'localhost', port: 3000 })\n\t\t})\n\n\t\ttest('external new is a compile error', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new MyClass({ host: 'localhost', port: 3000 }))\n\t\t})\n\n\t\ttest('static Config resolves to PipeOutput<P> at the type level', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpectTypeOf<typeof MyClass.Config>().toEqualTypeOf<TestConfig>()\n\t\t\texpect(MyClass.create).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\textra: number\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, extra: number) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tthis.extra = extra\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 42)\n\n\t\t\texpect(instance.extra).toBe(42)\n\t\t\texpectTypeOf(instance).toHaveProperty('extra')\n\t\t\texpectTypeOf(instance.extra).toEqualTypeOf<number>()\n\n\t\t\t// @ts-expect-error — wrong extra type\n\t\t\tvoid (() => MyClass.create({ host: 'localhost', port: 3000 }, 'not-a-number'))\n\t\t})\n\n\t\ttest('base-args forwarding works for non-zero-arg bases', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBaseWithArgs)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, label: string) {\n\t\t\t\t\tsuper(config, label)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 'test-label')\n\n\t\t\texpect(instance.label).toBe('test-label')\n\t\t})\n\n\t\ttest('config is accessible as protected readonly on instances', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\n\t\t\t\tgetHost() {\n\t\t\t\t\treturn this.config.host\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.getHost()).toBe('localhost')\n\t\t})\n\n\t\ttest('accepts an abstract base class', () => {\n\t\t\tabstract class AbstractBase {\n\t\t\t\tabstract greet(): string\n\t\t\t}\n\n\t\t\tconst Wrapped = configurable(testPipe, AbstractBase)\n\t\t\tclass Concrete extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof Concrete.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t\tgreet() {\n\t\t\t\t\treturn `hello from ${this.config.host}`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = Concrete.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.greet()).toBe('hello from localhost')\n\t\t\texpectTypeOf(instance).toHaveProperty('config')\n\t\t})\n\t})\n}\n","export const parseJSONValue = (data: any) => {\n\ttry {\n\t\tif (data?.constructor?.name !== 'String') return data\n\t\treturn JSON.parse(data)\n\t} catch {\n\t\treturn data\n\t}\n}\n\nexport function parseJSONObject<T extends object>(data: T) {\n\treturn Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)])) as T\n}\n","import crypto from 'crypto'\n\nexport function string(length = 20) {\n\treturn crypto.randomBytes(length).toString('hex').slice(0, length)\n}\n\nexport function number(min = 0, max = 2 ** 48 - 1) {\n\treturn crypto.randomInt(min, max)\n}\n","import { EquippedError } from '../errors'\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const retry = async <T>(cb: () => Promise<{ done: true; value: T } | { done: false }>, tries: number, waitTimeInMs: number) => {\n\tif (tries <= 0) throw new EquippedError('out of tries', { tries, waitTimeInMs })\n\tconst result = await cb()\n\tif (result.done === true) return result.value\n\tawait sleep(waitTimeInMs)\n\treturn await retry(cb, tries - 1, waitTimeInMs)\n}\n","import axios from 'axios'\nimport { v } from 'valleyed'\n\nimport * as core from './core'\nimport { dbChangeConfigPipe, type DbChangeConfig } from './types'\nimport { EquippedError } from '../../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {\n\t\tthis.config = v.assert(dbChangeConfigPipe(), config)\n\t}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n","import { v, type PipeOutput } from 'valleyed'\n\nimport { KafkaEventBus } from '../../../events/adapters/kafka'\n\nexport const dbChangeConfigPipe = () =>\n\tv.object({\n\t\tdebeziumUrl: v.string(),\n\t\teventBus: v.instanceOf(KafkaEventBus as unknown as abstract new (...args: any[]) => KafkaEventBus),\n\t})\n\nexport type DbChangeConfig = PipeOutput<ReturnType<typeof dbChangeConfigPipe>>\n\nexport type DbConfig = {\n\tchanges?: DbChangeConfig\n}\n","import { KafkaJS } from '@confluentinc/kafka-javascript'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { Events } from '../../../types'\nimport { Random, configurable, parseJSONValue } from '../../../utilities'\nimport { EventBus, type Stream, type StreamOptions } from '../base'\n\nexport const kafkaConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\tbrokers: v.array(v.string()),\n\t\t\tssl: v.optional(v.boolean()),\n\t\t\tsasl: v.optional(\n\t\t\t\tv.object({\n\t\t\t\t\tmechanism: v.is('plain' as const),\n\t\t\t\t\tusername: v.string(),\n\t\t\t\t\tpassword: v.string(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclientId: v.optional(v.string()),\n\t\t}),\n\t\t{ title: 'Kafka Config', $refId: 'KafkaConfig' },\n\t)\n\nexport class KafkaEventBus extends configurable(kafkaConfigPipe, EventBus) {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | null = null\n\n\tprotected constructor(config: typeof KafkaEventBus.Config) {\n\t\tsuper(config)\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n\n\tstream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}): Stream<Event['data']> {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on('close', async () => {\n\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t}, { class: KafkaEventBus })\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, { class: KafkaEventBus })\n\t\t\t},\n\t\t}\n\t}\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\tMongoClient,\n\tObjectId,\n\ttype CollectionInfo,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\nimport { v } from 'valleyed'\n\nimport { MongoDbChange } from './changes'\nimport { mongoDbConfigPipe, type MongoDbConfig } from './pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { QueryParamsBase } from '../../pipes'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { 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.mongoConfig = v.assert(mongoDbConfigPipe(), mongoConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on('start', async () => {\n\t\t\tawait this.client.connect()\n\n\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\treturn acc\n\t\t\t}, {})\n\n\t\t\tconst options = {\n\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t}\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t})\n\t\tInstance.on('close', async () => this.client.close())\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => 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\tfunction transform(doc: WI, select?: core.Select<Entity>): Entity\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI[], select?: core.Select<Entity>): Entity[]\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI | WI[], select?: core.Select<Entity>) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model, select))\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) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params as QueryParamsBase)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: transform(results.results as any, params.select as core.Select<Entity>),\n\t\t\t\t} as any\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst { select, ...rest } = options\n\t\t\t\tconst projection = select?.length ? Object.fromEntries(select.map((k) => [k, 1])) : undefined\n\t\t\t\tconst sortArray = Array.isArray(rest.sort) ? rest.sort : rest.sort ? [rest.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: rest.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t\tprojection,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs, select as core.Select<Entity>) as any\n\t\t\t},\n\n\t\t\tfindOne: async (filter: core.Filter<Model>, options = {}) => {\n\t\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 } as any)\n\t\t\t\treturn (result.at(0) ?? null) as any\n\t\t\t},\n\n\t\t\tfindById: async (id, options = {}) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options as any)\n\t\t\t\treturn result as any\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, undefined) : 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, undefined)\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, undefined) : 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\tif (!operations.length) return\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, (m) =>\n\t\t\t\t\tconfig.mapper(m),\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n","import { type PipeInput, v } from 'valleyed'\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeInput<ReturnType<typeof mongoDbConfigPipe>>\n","import { Collection } from 'mongodb'\n\nimport { QueryKeys, type QueryParamsBase, type QueryResults, type QueryWhereBlock, type QueryWhereClause } from '../../pipes'\nimport * as core from '../base/core'\n\nexport const parseMongodbQueryParams = async <Model extends core.Model<{ _id: string }>>(\n\tcollection: Collection<Model>,\n\tparams: QueryParamsBase,\n): Promise<QueryResults<Model>> => {\n\t// Handle where/search clauses\n\tconst query = <ReturnType<typeof buildWhereQuery>[]>[]\n\tconst where = buildWhereQuery(params.where, params.whereType)\n\tif (where) query.push(where)\n\tconst auth = buildWhereQuery(params.auth, params.authType)\n\tif (auth) query.push(auth)\n\tif (params.search && params.search.fields.length > 0) {\n\t\tconst search = params.search.fields.map((field) => ({\n\t\t\t[field]: {\n\t\t\t\t$regex: new RegExp(params.search!.value, 'i'),\n\t\t\t},\n\t\t}))\n\t\tquery.push({ $or: search })\n\t}\n\tconst totalClause = {}\n\tif (query.length > 0) totalClause['$and'] = query\n\n\t// Handle sort clauses\n\tconst sort = params.sort.map((p) => [p.field, p.desc ? 'desc' : 'asc'])\n\n\t// Handle limit/offest clause\n\tconst all = params.all ?? false\n\tconst limit = params.limit\n\tconst page = params.page\n\n\tconst total = await collection.countDocuments(totalClause)\n\n\tconst projection = params.select?.length ? Object.fromEntries(params.select.map((k) => [k, 1])) : undefined\n\tlet builtQuery = collection.find(totalClause, { projection })\n\tif (sort.length) builtQuery = builtQuery.sort(Object.fromEntries(sort))\n\tif (!all && limit) {\n\t\tbuiltQuery = builtQuery.limit(limit)\n\t\tif (page) builtQuery = builtQuery.skip((page - 1) * limit)\n\t}\n\n\tconst results = await builtQuery.toArray()\n\tconst start = 1\n\tconst last = Math.ceil(total / limit) || 1\n\tconst next = page >= last ? null : page + 1\n\tconst previous = page <= start ? null : page - 1\n\n\treturn {\n\t\tpages: { start, last, next, previous, current: page },\n\t\tdocs: { limit, total, count: results.length },\n\t\tresults: results as any[],\n\t} satisfies QueryResults<Model>\n}\n\nfunction isWhereBlock(param: QueryWhereClause): param is QueryWhereBlock {\n\treturn Object.values(QueryKeys).includes(param.condition as QueryKeys)\n}\n\nconst buildWhereQuery = (params: QueryWhereClause[], key: QueryKeys = QueryKeys.and): Record<string, Record<string, any>> | null => {\n\tconst where = (Array.isArray(params) ? params : [])\n\t\t.map((param) => {\n\t\t\tif (isWhereBlock(param)) return buildWhereQuery(param.value, param.condition)\n\t\t\tconst { field } = param\n\t\t\tconst checkedField = field === 'id' ? '_id' : (field ?? '')\n\t\t\tconst checkedValue = param.value === undefined ? '' : param.value\n\t\t\treturn {\n\t\t\t\tfield: checkedField,\n\t\t\t\tvalue: checkedValue,\n\t\t\t\tcondition: param.condition,\n\t\t\t\tisWhere: true,\n\t\t\t}\n\t\t})\n\t\t.filter((c) => !!c)\n\t\t.map((c) => {\n\t\t\tif (c.isWhere) return { [`${c.field}`]: { [`$${c.condition}`]: c.value } }\n\t\t\telse return c\n\t\t})\n\n\treturn where.length > 0 ? { [`$${key}`]: where } : null\n}\n","import { type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { Select } from './adapters/base/core'\n\nexport enum QueryKeys {\n\tand = 'and',\n\tor = 'or',\n}\n\nexport enum Conditions {\n\tlt = 'lt',\n\tlte = 'lte',\n\tgt = 'gt',\n\tgte = 'gte',\n\teq = 'eq',\n\tne = 'ne',\n\tin = 'in',\n\tnin = 'nin',\n}\n\n// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\nconst queryKeys = v.catch(v.defaults(v.in([QueryKeys.and, QueryKeys.or]), QueryKeys.and), QueryKeys.and)\nconst queryWhere = v.object({\n\tfield: v.string(),\n\tvalue: v.any(),\n\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\tcondition: v.catch(v.defaults(v.in(Object.values(Conditions)), Conditions.eq), Conditions.eq),\n})\nconst queryWhereBlock = v.recursive(\n\t() =>\n\t\tv.discriminate((d) => (Object.values(QueryKeys).includes(d.condition as any) ? 'block' : 'regular'), {\n\t\t\tblock: v.object({\n\t\t\t\tcondition: queryKeys,\n\t\t\t\tvalue: v.array(queryWhereBlock),\n\t\t\t}),\n\t\t\tregular: queryWhere,\n\t\t}),\n\t'QueryWhereBlock',\n) as Pipe<\n\t| {\n\t\t\tcondition: PipeInput<typeof queryKeys>\n\t\t\tvalue: PipeInput<typeof queryWhere>[]\n\t }\n\t| PipeInput<typeof queryWhere>,\n\t| {\n\t\t\tcondition: PipeOutput<typeof queryKeys>\n\t\t\tvalue: PipeOutput<typeof queryWhere>[]\n\t }\n\t| PipeOutput<typeof queryWhere>\n>\n\nconst queryWhereClause = v.defaults(v.array(queryWhereBlock), [])\n\nexport function queryParamsPipe() {\n\treturn v.meta(\n\t\tv\n\t\t\t.object({\n\t\t\t\tall: v.defaults(v.boolean(), false),\n\t\t\t\tlimit: v.lazy(() => {\n\t\t\t\t\tconst pagLimit = Instance.get().settings.utils.paginationDefaultLimit\n\t\t\t\t\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\t\t\t\t\treturn v.catch(v.defaults(v.number().pipe(v.lte(pagLimit)), pagLimit), pagLimit)\n\t\t\t\t}),\n\t\t\t\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\t\t\t\tpage: v.catch(v.defaults(v.number().pipe(v.gte(1)), 1), 1),\n\t\t\t\tsearch: v.defaults(\n\t\t\t\t\tv.nullish(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tvalue: v.string(),\n\t\t\t\t\t\t\tfields: v.array(v.string()),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tnull,\n\t\t\t\t),\n\t\t\t\tsort: v.defaults(\n\t\t\t\t\tv.array(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tfield: v.string(),\n\t\t\t\t\t\t\tdesc: v.defaults(v.boolean(), false),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\t[],\n\t\t\t\t),\n\t\t\t\twhereType: queryKeys,\n\t\t\t\twhere: queryWhereClause,\n\t\t\t\tselect: v.optional(v.array(v.string())),\n\t\t\t})\n\t\t\t.pipe((p) => ({ ...p, auth: <(typeof p)['where']>[], authType: QueryKeys.and })),\n\t\t{ title: 'Query Params', $refId: 'QueryParams' },\n\t)\n}\n\nexport function queryResultsPipe<T>(model: Pipe<any, T>) {\n\treturn v.object({\n\t\tpages: v.object({\n\t\t\tcurrent: v.number(),\n\t\t\tstart: v.number(),\n\t\t\tlast: v.number(),\n\t\t\tprevious: v.nullable(v.number()),\n\t\t\tnext: v.nullable(v.number()),\n\t\t}),\n\t\tdocs: v.object({\n\t\t\tlimit: v.number(),\n\t\t\ttotal: v.number(),\n\t\t\tcount: v.number(),\n\t\t}),\n\t\tresults: v.array(model),\n\t})\n}\n\nexport function wrapQueryParams(params: QueryParamsInput): QueryParamsBase {\n\treturn v.assert(queryParamsPipe(), params)\n}\n\nexport type QueryParamsBase = PipeOutput<ReturnType<typeof queryParamsPipe>>\nexport type QueryParams<T, S extends Select<T> | undefined = undefined> = Omit<QueryParamsBase, 'select'> & {\n\tselect?: S extends undefined ? QueryParamsBase['select'] : S\n}\nexport type QueryParamsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof queryParamsPipe>>>\nexport type QueryWhereClause = QueryParamsBase['where'][number]\nexport type QueryWhere = Extract<QueryWhereClause, { field: string }>\nexport type QueryWhereBlock = Exclude<QueryWhereClause, { field: string }>\nexport type QueryResults<T> = PipeOutput<ReturnType<typeof queryResultsPipe<T>>>\n","import * as core from './core'\nimport type { DbConfig } from './types'\nimport { Instance } from '../../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"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","names":["import_valleyed","import_valleyed","pino","import_valleyed","v","crypto","import_valleyed","import_valleyed","import_valleyed","axios","import_mongodb","import_valleyed","import_valleyed","import_mongodb","import_valleyed","QueryKeys","Conditions"]}
1
+ {"version":3,"sources":["../../../../../src/dbs/adapters/mongodb/index.ts","../../../../../src/dbs/adapters/mongodb/changes.ts","../../../../../src/errors/equippedError.ts","../../../../../src/events/adapters/base.ts","../../../../../src/instance/index.ts","../../../../../src/instance/hooks.ts","../../../../../src/instance/settings.ts","../../../../../src/utilities/configurable.ts","../../../../../src/utilities/json.ts","../../../../../src/utilities/random.ts","../../../../../src/utilities/retry.ts","../../../../../src/dbs/adapters/base/changes.ts","../../../../../src/dbs/adapters/base/types.ts","../../../../../src/events/adapters/kafka/index.ts","../../../../../src/dbs/adapters/mongodb/db.ts","../../../../../src/dbs/adapters/mongodb/pipes.ts","../../../../../src/dbs/adapters/mongodb/query.ts","../../../../../src/dbs/pipes.ts","../../../../../src/dbs/adapters/base/db.ts"],"sourcesContent":["export * from './changes'\nexport * from './db'\nexport * from './pipes'\n","import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport type { MongoDbConfig } from './pipes'\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 type { DbChangeConfig } from '../base/types'\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.stream(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('start', async () => {\n\t\t\tif (this.#started) return\n\t\t\tthis.#started = true\n\n\t\t\tawait retry(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t})\n\n\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\treturn { done: false }\n\t\t\t\t},\n\t\t\t\t6,\n\t\t\t\t30_000,\n\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t})\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n","export class EquippedError extends Error {\n\tconstructor(\n\t\tpublic readonly message: string,\n\t\tpublic readonly context: Record<string, unknown>,\n\t\tpublic readonly cause?: unknown,\n\t) {\n\t\tsuper(message, { cause })\n\t}\n}\n","import type { Events } from '../../types'\n\nexport type StreamOptions = { skipScope?: boolean; fanout: boolean }\n\nexport type Stream<EventData> = {\n\tpublish: (data: EventData) => Promise<boolean>\n\tsubscribe: (onMessage: (data: EventData) => Promise<void>) => void\n}\n\nexport abstract class EventBus {\n\tabstract stream<Event extends Events[keyof Events]>(topic: Event['topic'], options?: Partial<StreamOptions>): Stream<Event['data']>\n}\n","import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type Pipe, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type ClassRef, type HookCb, type HookEvent, type HookOptions, type HookRecord, registerHook, runHooks } from './hooks'\nimport { instanceSettingsPipe, type Settings, type SettingsInput } from './settings'\n\nexport type { ClassRef, HookCb, HookEvent, HookOptions }\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance | undefined\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic maybeGet() {\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, options?: HookOptions) {\n\t\tInstance.#hooks[event] ??= []\n\t\tconst record: HookRecord = { cb, class: options?.class, after: options?.after ?? [] }\n\t\tregisterHook(Instance.#hooks[event], record)\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {}, true)\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n","export type HookEvent = 'setup' | 'start' | 'close'\nexport type HookCb = Promise<unknown | void> | (() => void | unknown | Promise<void | unknown>)\n\nexport type ClassRef = Function & { prototype: unknown; name: string }\nexport type HookOptions = {\n\tclass?: ClassRef\n\tafter?: ClassRef[]\n}\nexport type HookRecord = { cb: HookCb; class?: ClassRef; after: ClassRef[] }\n\nexport function registerHook(hooks: HookRecord[], record: HookRecord): void {\n\tfor (const dep of record.after) {\n\t\tif (!hooks.some((h) => h.class === dep)) {\n\t\t\tconst depName = dep.name || 'unknown'\n\t\t\tconst ownerName = record.class?.name || 'anonymous'\n\t\t\tthrow new Error(`Missing dependency: ${ownerName} declares after: [${depName}], but ${depName} is not registered`)\n\t\t}\n\t}\n\n\tif (record.class) {\n\t\tconst tentative = [...hooks, record]\n\t\tdetectCycle(tentative)\n\t}\n\n\thooks.push(record)\n}\n\nfunction detectCycle(hooks: HookRecord[]): void {\n\tconst classToAfter = new Map<ClassRef, ClassRef[]>()\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tconst existing = classToAfter.get(h.class)\n\t\tif (existing) {\n\t\t\tfor (const dep of h.after) {\n\t\t\t\tif (!existing.includes(dep)) existing.push(dep)\n\t\t\t}\n\t\t} else {\n\t\t\tclassToAfter.set(h.class, [...h.after])\n\t\t}\n\t}\n\n\tconst visited = new Set<ClassRef>()\n\tconst stack = new Set<ClassRef>()\n\n\tfunction visit(cls: ClassRef, path: ClassRef[]): void {\n\t\tif (stack.has(cls)) {\n\t\t\tconst cycleStart = path.indexOf(cls)\n\t\t\tconst cycle = [...path.slice(cycleStart), cls]\n\t\t\tconst names = cycle.map((c) => c.name || 'unknown')\n\t\t\tthrow new Error(`Cycle detected: ${names.join(' → ')}`)\n\t\t}\n\t\tif (visited.has(cls)) return\n\t\tstack.add(cls)\n\t\tpath.push(cls)\n\t\tfor (const dep of classToAfter.get(cls) ?? []) {\n\t\t\tvisit(dep, path)\n\t\t}\n\t\tpath.pop()\n\t\tstack.delete(cls)\n\t\tvisited.add(cls)\n\t}\n\n\tfor (const cls of classToAfter.keys()) {\n\t\tvisit(cls, [])\n\t}\n}\n\nexport type HookLayer = HookRecord[]\n\nexport function resolveHookDAG(hooks: HookRecord[], invert: boolean = false): HookLayer[] {\n\tif (hooks.length === 0) return []\n\n\tconst classToHooks = new Map<ClassRef, HookRecord[]>()\n\tconst anonymous: HookRecord[] = []\n\n\tfor (const h of hooks) {\n\t\tif (h.class) {\n\t\t\tconst list = classToHooks.get(h.class)\n\t\t\tif (list) list.push(h)\n\t\t\telse classToHooks.set(h.class, [h])\n\t\t} else {\n\t\t\tanonymous.push(h)\n\t\t}\n\t}\n\n\tconst classes = [...classToHooks.keys()]\n\n\tconst inDegree = new Map<ClassRef, number>()\n\tconst graph = new Map<ClassRef, ClassRef[]>()\n\n\tfor (const cls of classes) {\n\t\tinDegree.set(cls, 0)\n\t\tgraph.set(cls, [])\n\t}\n\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tfor (const dep of h.after) {\n\t\t\tconst [from, to] = invert ? [h.class, dep] : [dep, h.class]\n\t\t\tconst edges = graph.get(from)!\n\t\t\tif (!edges.includes(to)) {\n\t\t\t\tedges.push(to)\n\t\t\t\tinDegree.set(to, inDegree.get(to)! + 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst layers: HookLayer[] = []\n\tlet queue = classes.filter((c) => inDegree.get(c) === 0)\n\n\twhile (queue.length > 0) {\n\t\tconst layer: HookRecord[] = []\n\t\tconst next: ClassRef[] = []\n\n\t\tfor (const cls of queue) {\n\t\t\tlayer.push(...(classToHooks.get(cls) ?? []))\n\t\t}\n\t\tlayers.push(layer)\n\n\t\tfor (const cls of queue) {\n\t\t\tfor (const neighbor of graph.get(cls) ?? []) {\n\t\t\t\tconst d = inDegree.get(neighbor)! - 1\n\t\t\t\tinDegree.set(neighbor, d)\n\t\t\t\tif (d === 0) next.push(neighbor)\n\t\t\t}\n\t\t}\n\n\t\tqueue = next\n\t}\n\n\tif (anonymous.length > 0) {\n\t\tconst anonWithDeps = anonymous.filter((h) => h.after.length > 0)\n\t\tconst anonWithoutDeps = anonymous.filter((h) => h.after.length === 0)\n\n\t\tif (anonWithDeps.length > 0) {\n\t\t\tlet maxLayer = -1\n\t\t\tfor (const h of anonWithDeps) {\n\t\t\t\tfor (const dep of h.after) {\n\t\t\t\t\tconst depLayer = layers.findIndex((l) => l.some((r) => r.class === dep))\n\t\t\t\t\tif (depLayer > maxLayer) maxLayer = depLayer\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst insertAt = maxLayer + 1\n\t\t\tif (insertAt < layers.length) {\n\t\t\t\tlayers[insertAt].push(...anonWithDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithDeps)\n\t\t\t}\n\t\t}\n\n\t\tif (anonWithoutDeps.length > 0) {\n\t\t\tif (layers.length > 0) {\n\t\t\t\tlayers[layers.length - 1].push(...anonWithoutDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithoutDeps)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn layers\n}\n\nexport async function runHooks(\n\thooks: HookRecord[],\n\tonError: (error: Error) => void = (error) => {\n\t\tthrow error\n\t},\n\tinvert: boolean = false,\n) {\n\tconst layers = resolveHookDAG(hooks, invert)\n\tfor (const layer of layers)\n\t\tawait Promise.all(\n\t\t\tlayer.map(async (h) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof h.cb === 'function') return await h.cb()\n\t\t\t\t\treturn await h.cb\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn onError(error instanceof Error ? error : new Error(`${error}`))\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect } = import.meta.vitest\n\n\tclass A {}\n\tclass B {}\n\tclass C {}\n\tclass D {}\n\n\tconst noop = () => {}\n\n\tdescribe('registerHook', () => {\n\t\ttest('registers a hook with no dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\texpect(hooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: B, after: [A] })).toThrow(/Missing dependency.*B.*A/)\n\t\t})\n\n\t\ttest('throws on cycle: A→B→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [B] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('throws on transitive cycle: A→B→C→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\tregisterHook(hooks, { cb: noop, class: C, after: [B] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [C] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('allows anonymous hooks with dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, after: [A] })\n\t\t\texpect(hooks).toHaveLength(2)\n\t\t})\n\n\t\ttest('anonymous hook throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, after: [A] })).toThrow(/Missing dependency.*anonymous.*A/)\n\t\t})\n\t})\n\n\tdescribe('resolveHookDAG', () => {\n\t\ttest('linear chain: A → B → C', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === C)).toBe(true)\n\t\t})\n\n\t\ttest('fan-out: A → B, A → C (B and C are parallel)', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\tconst secondClasses = layers[1].map((h) => h.class)\n\t\t\texpect(secondClasses).toContain(B)\n\t\t\texpect(secondClasses).toContain(C)\n\t\t})\n\n\t\ttest('fan-in: B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: B, after: [] },\n\t\t\t\t{ cb: noop, class: C, after: [] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === D)).toBe(true)\n\t\t})\n\n\t\ttest('diamond: A → B, A → C, B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0][0].class).toBe(A)\n\t\t\tconst midClasses = layers[1].map((h) => h.class)\n\t\t\texpect(midClasses).toContain(B)\n\t\t\texpect(midClasses).toContain(C)\n\t\t\texpect(layers[2][0].class).toBe(D)\n\t\t})\n\n\t\ttest('close-event inversion reverses the graph', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === C)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('close inversion: fan-out becomes fan-in', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('multiple hooks per class are all in the same layer', () => {\n\t\t\tconst cb1 = () => {}\n\t\t\tconst cb2 = () => {}\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: cb1, class: A, after: [] },\n\t\t\t\t{ cb: cb2, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0]).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks without deps run at deepest level', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, after: [] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst lastLayer = layers[layers.length - 1]\n\t\t\texpect(lastLayer.some((h) => h.class === undefined)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks with deps run after their dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t\t{ cb: noop, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\tconst anonLayer = layers.findIndex((l) => l.some((h) => h.class === undefined))\n\t\t\tconst aLayer = layers.findIndex((l) => l.some((h) => h.class === A))\n\t\t\texpect(anonLayer).toBeGreaterThan(aLayer)\n\t\t})\n\n\t\ttest('empty hooks returns empty layers', () => {\n\t\t\texpect(resolveHookDAG([])).toEqual([])\n\t\t})\n\t})\n\n\tdescribe('runHooks', () => {\n\t\ttest('same-depth siblings observably overlap', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('B-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('C-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('C-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: C,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log[0]).toBe('B-start')\n\t\t\texpect(log[1]).toBe('C-start')\n\t\t})\n\n\t\ttest('different depths run sequentially', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('A')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [A],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toEqual(['A', 'B'])\n\t\t})\n\n\t\ttest('close inversion runs hooks in reverse dependency order', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: async () => log.push('A'), class: A, after: [] },\n\t\t\t\t{ cb: async () => log.push('B'), class: B, after: [A] },\n\t\t\t\t{ cb: async () => log.push('C'), class: C, after: [B] },\n\t\t\t]\n\t\t\tawait runHooks(hooks, undefined, true)\n\t\t\texpect(log).toEqual(['C', 'B', 'A'])\n\t\t})\n\n\t\ttest('errors are routed to onError handler', async () => {\n\t\t\tconst errors: Error[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: () => {\n\t\t\t\t\t\tthrow new Error('boom')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks, (e) => {\n\t\t\t\terrors.push(e)\n\t\t\t})\n\t\t\texpect(errors).toHaveLength(1)\n\t\t\texpect(errors[0].message).toBe('boom')\n\t\t})\n\n\t\ttest('raw promise callbacks are awaited', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: Promise.resolve().then(() => log.push('resolved')),\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toContain('resolved')\n\t\t})\n\t})\n}\n","import { type ConditionalObjectKeys, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nexport const instanceSettingsPipe = () =>\n\tv.object({\n\t\tapp: v.object({\n\t\t\tname: v.string(),\n\t\t}),\n\t\tlog: v.defaults(\n\t\t\tv.object({\n\t\t\t\tlevel: v.defaults(v.in(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'] as const), 'info'),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t\tutils: v.defaults(\n\t\t\tv.object({\n\t\t\t\thashSaltRounds: v.defaults(v.number(), 10),\n\t\t\t\tpaginationDefaultLimit: v.defaults(v.number(), 100),\n\t\t\t\tmaxFileUploadSizeInMb: v.defaults(v.number(), 500),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t})\n\nexport type Settings = PipeOutput<ReturnType<typeof instanceSettingsPipe>>\nexport type SettingsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof instanceSettingsPipe>>>\n","import { v, type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput } from 'valleyed'\n\ntype CtorParams<T> = ConstructorParameters<T & (abstract new (...args: any[]) => any)>\ntype BaseCtorParams<T> = T extends abstract new (...args: infer A) => any ? A : never\n\nexport function configurable<P extends Pipe<any, any>, Base extends abstract new (...args: any[]) => any>(pipeFn: () => P, base: Base) {\n\tconst pipe = pipeFn()\n\tv.compile(pipe)\n\n\tabstract class Configurable extends (base as unknown as new (...args: any[]) => any) {\n\t\tdeclare static readonly Config: PipeOutput<P>\n\n\t\tprotected constructor (protected readonly config: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) {\n\t\t\t// eslint-disable-next-line constructor-super\n\t\t\tsuper(...baseArgs)\n\t\t}\n\n\t\tstatic create<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype'] {\n\t\t\tconst r = v.validate(pipe, input)\n\t\t\tif (!r.valid) throw r.error\n\t\t\treturn new (this as any)(r.value, ...args) as This['prototype']\n\t\t}\n\t}\n\n\treturn Configurable as unknown as (abstract new (validated: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) => InstanceType<Base> & { readonly config: PipeOutput<P> }) & {\n\t\treadonly Config: PipeOutput<P>\n\t\tcreate<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype']\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\tconst { v } = await import('valleyed')\n\n\tconst testPipe = () =>\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.number(),\n\t\t})\n\n\ttype TestConfig = PipeOutput<ReturnType<typeof testPipe>>\n\n\tclass TestBase {\n\t\tbaseValue: string\n\t\tconstructor() {\n\t\t\tthis.baseValue = 'base'\n\t\t}\n\t}\n\n\tclass TestBaseWithArgs {\n\t\tlabel: string\n\t\tconstructor(label: string) {\n\t\t\tthis.label = label\n\t\t}\n\t}\n\n\tdescribe('configurable', () => {\n\t\ttest('validation runs in static create before constructor body executes', () => {\n\t\t\tlet constructorRan = false\n\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tconstructorRan = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpect(() => MyClass.create({ host: 123, port: 'bad' } as any)).toThrow()\n\t\t\texpect(constructorRan).toBe(false)\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(constructorRan).toBe(true)\n\t\t})\n\n\t\ttest('constructor receives validated value', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tlet receivedConfig: unknown\n\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\treceivedConfig = this.config\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\n\t\t\texpect(receivedConfig).toEqual({ host: 'localhost', port: 3000 })\n\t\t})\n\n\t\ttest('external new is a compile error', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new MyClass({ host: 'localhost', port: 3000 }))\n\t\t})\n\n\t\ttest('static Config resolves to PipeOutput<P> at the type level', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpectTypeOf<typeof MyClass.Config>().toEqualTypeOf<TestConfig>()\n\t\t\texpect(MyClass.create).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\textra: number\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, extra: number) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tthis.extra = extra\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 42)\n\n\t\t\texpect(instance.extra).toBe(42)\n\t\t\texpectTypeOf(instance).toHaveProperty('extra')\n\t\t\texpectTypeOf(instance.extra).toEqualTypeOf<number>()\n\n\t\t\t// @ts-expect-error — wrong extra type\n\t\t\tvoid (() => MyClass.create({ host: 'localhost', port: 3000 }, 'not-a-number'))\n\t\t})\n\n\t\ttest('base-args forwarding works for non-zero-arg bases', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBaseWithArgs)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, label: string) {\n\t\t\t\t\tsuper(config, label)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 'test-label')\n\n\t\t\texpect(instance.label).toBe('test-label')\n\t\t})\n\n\t\ttest('config is accessible as protected readonly on instances', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\n\t\t\t\tgetHost() {\n\t\t\t\t\treturn this.config.host\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.getHost()).toBe('localhost')\n\t\t})\n\n\t\ttest('accepts an abstract base class', () => {\n\t\t\tabstract class AbstractBase {\n\t\t\t\tabstract greet(): string\n\t\t\t}\n\n\t\t\tconst Wrapped = configurable(testPipe, AbstractBase)\n\t\t\tclass Concrete extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof Concrete.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t\tgreet() {\n\t\t\t\t\treturn `hello from ${this.config.host}`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = Concrete.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.greet()).toBe('hello from localhost')\n\t\t\texpectTypeOf(instance).toHaveProperty('config')\n\t\t})\n\t})\n}\n","export const parseJSONValue = (data: any) => {\n\ttry {\n\t\tif (data?.constructor?.name !== 'String') return data\n\t\treturn JSON.parse(data)\n\t} catch {\n\t\treturn data\n\t}\n}\n","import crypto from 'crypto'\n\nexport function string(length = 20) {\n\treturn crypto.randomBytes(length).toString('hex').slice(0, length)\n}\n\nexport function number(min = 0, max = 2 ** 48 - 1) {\n\treturn crypto.randomInt(min, max)\n}\n","import { EquippedError } from '../errors'\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const retry = async <T>(cb: () => Promise<{ done: true; value: T } | { done: false }>, tries: number, waitTimeInMs: number) => {\n\tif (tries <= 0) throw new EquippedError('out of tries', { tries, waitTimeInMs })\n\tconst result = await cb()\n\tif (result.done === true) return result.value\n\tawait sleep(waitTimeInMs)\n\treturn await retry(cb, tries - 1, waitTimeInMs)\n}\n","import axios from 'axios'\nimport { v } from 'valleyed'\n\nimport * as core from './core'\nimport { dbChangeConfigPipe, type DbChangeConfig } from './types'\nimport { EquippedError } from '../../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {\n\t\tthis.config = v.assert(dbChangeConfigPipe(), config)\n\t}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n","import { v, type PipeOutput } from 'valleyed'\n\nimport { KafkaEventBus } from '../../../events/adapters/kafka'\n\nexport const dbChangeConfigPipe = () =>\n\tv.object({\n\t\tdebeziumUrl: v.string(),\n\t\teventBus: v.instanceOf(KafkaEventBus as unknown as abstract new (...args: any[]) => KafkaEventBus),\n\t})\n\nexport type DbChangeConfig = PipeOutput<ReturnType<typeof dbChangeConfigPipe>>\n\nexport type DbConfig = {\n\tchanges?: DbChangeConfig\n}\n","import { KafkaJS } from '@confluentinc/kafka-javascript'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { Events } from '../../../types'\nimport { Random, configurable, parseJSONValue } from '../../../utilities'\nimport { EventBus, type Stream, type StreamOptions } from '../base'\n\nexport const kafkaConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\tbrokers: v.array(v.string()),\n\t\t\tssl: v.optional(v.boolean()),\n\t\t\tsasl: v.optional(\n\t\t\t\tv.object({\n\t\t\t\t\tmechanism: v.is('plain' as const),\n\t\t\t\t\tusername: v.string(),\n\t\t\t\t\tpassword: v.string(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclientId: v.optional(v.string()),\n\t\t}),\n\t\t{ title: 'Kafka Config', $refId: 'KafkaConfig' },\n\t)\n\nexport class KafkaEventBus extends configurable(kafkaConfigPipe, EventBus) {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | null = null\n\n\tprotected constructor(config: typeof KafkaEventBus.Config) {\n\t\tsuper(config)\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n\n\tstream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}): Stream<Event['data']> {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on('close', async () => {\n\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t}, { class: KafkaEventBus })\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, { class: KafkaEventBus })\n\t\t\t},\n\t\t}\n\t}\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\tMongoClient,\n\tObjectId,\n\ttype CollectionInfo,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\nimport { v } from 'valleyed'\n\nimport { MongoDbChange } from './changes'\nimport { mongoDbConfigPipe, type MongoDbConfig } from './pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { QueryParamsBase } from '../../pipes'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { 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.mongoConfig = v.assert(mongoDbConfigPipe(), mongoConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on('start', async () => {\n\t\t\tawait this.client.connect()\n\n\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\treturn acc\n\t\t\t}, {})\n\n\t\t\tconst options = {\n\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t}\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t})\n\t\tInstance.on('close', async () => this.client.close())\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => 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\tfunction transform(doc: WI, select?: core.Select<Entity>): Entity\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI[], select?: core.Select<Entity>): Entity[]\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI | WI[], select?: core.Select<Entity>) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model, select))\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) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params as QueryParamsBase)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: transform(results.results as any, params.select as core.Select<Entity>),\n\t\t\t\t} as any\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst { select, ...rest } = options\n\t\t\t\tconst projection = select?.length ? Object.fromEntries(select.map((k) => [k, 1])) : undefined\n\t\t\t\tconst sortArray = Array.isArray(rest.sort) ? rest.sort : rest.sort ? [rest.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: rest.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t\tprojection,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs, select as core.Select<Entity>) as any\n\t\t\t},\n\n\t\t\tfindOne: async (filter: core.Filter<Model>, options = {}) => {\n\t\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 } as any)\n\t\t\t\treturn (result.at(0) ?? null) as any\n\t\t\t},\n\n\t\t\tfindById: async (id, options = {}) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options as any)\n\t\t\t\treturn result as any\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, undefined) : 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, undefined)\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, undefined) : 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\tif (!operations.length) return\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, (m) =>\n\t\t\t\t\tconfig.mapper(m),\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n","import { type PipeInput, v } from 'valleyed'\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeInput<ReturnType<typeof mongoDbConfigPipe>>\n","import { Collection } from 'mongodb'\n\nimport { QueryKeys, type QueryParamsBase, type QueryResults, type QueryWhereBlock, type QueryWhereClause } from '../../pipes'\nimport * as core from '../base/core'\n\nexport const parseMongodbQueryParams = async <Model extends core.Model<{ _id: string }>>(\n\tcollection: Collection<Model>,\n\tparams: QueryParamsBase,\n): Promise<QueryResults<Model>> => {\n\t// Handle where/search clauses\n\tconst query = <ReturnType<typeof buildWhereQuery>[]>[]\n\tconst where = buildWhereQuery(params.where, params.whereType)\n\tif (where) query.push(where)\n\tconst auth = buildWhereQuery(params.auth, params.authType)\n\tif (auth) query.push(auth)\n\tif (params.search && params.search.fields.length > 0) {\n\t\tconst search = params.search.fields.map((field) => ({\n\t\t\t[field]: {\n\t\t\t\t$regex: new RegExp(params.search!.value, 'i'),\n\t\t\t},\n\t\t}))\n\t\tquery.push({ $or: search })\n\t}\n\tconst totalClause = {}\n\tif (query.length > 0) totalClause['$and'] = query\n\n\t// Handle sort clauses\n\tconst sort = params.sort.map((p) => [p.field, p.desc ? 'desc' : 'asc'])\n\n\t// Handle limit/offest clause\n\tconst all = params.all ?? false\n\tconst limit = params.limit\n\tconst page = params.page\n\n\tconst total = await collection.countDocuments(totalClause)\n\n\tconst projection = params.select?.length ? Object.fromEntries(params.select.map((k) => [k, 1])) : undefined\n\tlet builtQuery = collection.find(totalClause, { projection })\n\tif (sort.length) builtQuery = builtQuery.sort(Object.fromEntries(sort))\n\tif (!all && limit) {\n\t\tbuiltQuery = builtQuery.limit(limit)\n\t\tif (page) builtQuery = builtQuery.skip((page - 1) * limit)\n\t}\n\n\tconst results = await builtQuery.toArray()\n\tconst start = 1\n\tconst last = Math.ceil(total / limit) || 1\n\tconst next = page >= last ? null : page + 1\n\tconst previous = page <= start ? null : page - 1\n\n\treturn {\n\t\tpages: { start, last, next, previous, current: page },\n\t\tdocs: { limit, total, count: results.length },\n\t\tresults: results as any[],\n\t} satisfies QueryResults<Model>\n}\n\nfunction isWhereBlock(param: QueryWhereClause): param is QueryWhereBlock {\n\treturn Object.values(QueryKeys).includes(param.condition as QueryKeys)\n}\n\nconst buildWhereQuery = (params: QueryWhereClause[], key: QueryKeys = QueryKeys.and): Record<string, Record<string, any>> | null => {\n\tconst where = (Array.isArray(params) ? params : [])\n\t\t.map((param) => {\n\t\t\tif (isWhereBlock(param)) return buildWhereQuery(param.value, param.condition)\n\t\t\tconst { field } = param\n\t\t\tconst checkedField = field === 'id' ? '_id' : (field ?? '')\n\t\t\tconst checkedValue = param.value === undefined ? '' : param.value\n\t\t\treturn {\n\t\t\t\tfield: checkedField,\n\t\t\t\tvalue: checkedValue,\n\t\t\t\tcondition: param.condition,\n\t\t\t\tisWhere: true,\n\t\t\t}\n\t\t})\n\t\t.filter((c) => !!c)\n\t\t.map((c) => {\n\t\t\tif (c.isWhere) return { [`${c.field}`]: { [`$${c.condition}`]: c.value } }\n\t\t\telse return c\n\t\t})\n\n\treturn where.length > 0 ? { [`$${key}`]: where } : null\n}\n","import { type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { Select } from './adapters/base/core'\n\nexport enum QueryKeys {\n\tand = 'and',\n\tor = 'or',\n}\n\nexport enum Conditions {\n\tlt = 'lt',\n\tlte = 'lte',\n\tgt = 'gt',\n\tgte = 'gte',\n\teq = 'eq',\n\tne = 'ne',\n\tin = 'in',\n\tnin = 'nin',\n}\n\n// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\nconst queryKeys = v.catch(v.defaults(v.in([QueryKeys.and, QueryKeys.or]), QueryKeys.and), QueryKeys.and)\nconst queryWhere = v.object({\n\tfield: v.string(),\n\tvalue: v.any(),\n\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\tcondition: v.catch(v.defaults(v.in(Object.values(Conditions)), Conditions.eq), Conditions.eq),\n})\nconst queryWhereBlock = v.recursive(\n\t() =>\n\t\tv.discriminate((d) => (Object.values(QueryKeys).includes(d.condition as any) ? 'block' : 'regular'), {\n\t\t\tblock: v.object({\n\t\t\t\tcondition: queryKeys,\n\t\t\t\tvalue: v.array(queryWhereBlock),\n\t\t\t}),\n\t\t\tregular: queryWhere,\n\t\t}),\n\t'QueryWhereBlock',\n) as Pipe<\n\t| {\n\t\t\tcondition: PipeInput<typeof queryKeys>\n\t\t\tvalue: PipeInput<typeof queryWhere>[]\n\t }\n\t| PipeInput<typeof queryWhere>,\n\t| {\n\t\t\tcondition: PipeOutput<typeof queryKeys>\n\t\t\tvalue: PipeOutput<typeof queryWhere>[]\n\t }\n\t| PipeOutput<typeof queryWhere>\n>\n\nconst queryWhereClause = v.defaults(v.array(queryWhereBlock), [])\n\nexport function queryParamsPipe() {\n\treturn v.meta(\n\t\tv\n\t\t\t.object({\n\t\t\t\tall: v.defaults(v.boolean(), false),\n\t\t\t\tlimit: v.lazy(() => {\n\t\t\t\t\tconst pagLimit = Instance.get().settings.utils.paginationDefaultLimit\n\t\t\t\t\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\t\t\t\t\treturn v.catch(v.defaults(v.number().pipe(v.lte(pagLimit)), pagLimit), pagLimit)\n\t\t\t\t}),\n\t\t\t\t// eslint-disable-next-line promise/valid-params -- valleyed v.catch(schema, fallback) is not Promise.prototype.catch\n\t\t\t\tpage: v.catch(v.defaults(v.number().pipe(v.gte(1)), 1), 1),\n\t\t\t\tsearch: v.defaults(\n\t\t\t\t\tv.nullish(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tvalue: v.string(),\n\t\t\t\t\t\t\tfields: v.array(v.string()),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tnull,\n\t\t\t\t),\n\t\t\t\tsort: v.defaults(\n\t\t\t\t\tv.array(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tfield: v.string(),\n\t\t\t\t\t\t\tdesc: v.defaults(v.boolean(), false),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\t[],\n\t\t\t\t),\n\t\t\t\twhereType: queryKeys,\n\t\t\t\twhere: queryWhereClause,\n\t\t\t\tselect: v.optional(v.array(v.string())),\n\t\t\t})\n\t\t\t.pipe((p) => ({ ...p, auth: <(typeof p)['where']>[], authType: QueryKeys.and })),\n\t\t{ title: 'Query Params', $refId: 'QueryParams' },\n\t)\n}\n\nexport function queryResultsPipe<T>(model: Pipe<any, T>) {\n\treturn v.object({\n\t\tpages: v.object({\n\t\t\tcurrent: v.number(),\n\t\t\tstart: v.number(),\n\t\t\tlast: v.number(),\n\t\t\tprevious: v.nullable(v.number()),\n\t\t\tnext: v.nullable(v.number()),\n\t\t}),\n\t\tdocs: v.object({\n\t\t\tlimit: v.number(),\n\t\t\ttotal: v.number(),\n\t\t\tcount: v.number(),\n\t\t}),\n\t\tresults: v.array(model),\n\t})\n}\n\nexport function wrapQueryParams(params: QueryParamsInput): QueryParamsBase {\n\treturn v.assert(queryParamsPipe(), params)\n}\n\nexport type QueryParamsBase = PipeOutput<ReturnType<typeof queryParamsPipe>>\nexport type QueryParams<T, S extends Select<T> | undefined = undefined> = Omit<QueryParamsBase, 'select'> & {\n\tselect?: S extends undefined ? QueryParamsBase['select'] : S\n}\nexport type QueryParamsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof queryParamsPipe>>>\nexport type QueryWhereClause = QueryParamsBase['where'][number]\nexport type QueryWhere = Extract<QueryWhereClause, { field: string }>\nexport type QueryWhereBlock = Exclude<QueryWhereClause, { field: string }>\nexport type QueryResults<T> = PipeOutput<ReturnType<typeof queryResultsPipe<T>>>\n","import * as core from './core'\nimport type { DbConfig } from './types'\nimport { Instance } from '../../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"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","names":["import_valleyed","import_valleyed","pino","import_valleyed","v","crypto","import_valleyed","import_valleyed","import_valleyed","axios","import_mongodb","import_valleyed","import_valleyed","import_mongodb","import_valleyed","QueryKeys","Conditions"]}
@@ -1,4 +1,4 @@
1
- "use strict";var de=Object.create;var M=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ge=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var X=(s,e)=>{for(var t in e)M(s,t,{get:e[t],enumerable:!0})},Y=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of ye(e))!he.call(s,d)&&d!==t&&M(s,d,{get:()=>e[d],enumerable:!(r=fe(e,d))||r.enumerable});return s};var q=(s,e,t)=>(t=s!=null?de(ge(s)):{},Y(e||!s||!s.__esModule?M(t,"default",{value:s,enumerable:!0}):t,s)),me=s=>Y(M({},"__esModule",{value:!0}),s);var He={};X(He,{MongoDb:()=>V,MongoDbChange:()=>T,mongoDbConfigPipe:()=>F});module.exports=me(He);var rt=require("mongodb"),U=require("valleyed");var g=class extends Error{constructor(t,r,d){super(t,{cause:d});this.message=t;this.context=r;this.cause=d}};var E=class{};var H=q(require("pino"),1),ee=require("ulid"),$=require("valleyed");function Z(s,e){for(let t of e.after)if(!s.some(r=>r.class===t)){let r=t.name||"unknown",d=e.class?.name||"anonymous";throw new Error(`Missing dependency: ${d} declares after: [${r}], but ${r} is not registered`)}if(e.class){let t=[...s,e];be(t)}s.push(e)}function be(s){let e=new Map;for(let i of s){if(!i.class)continue;let p=e.get(i.class);if(p)for(let f of i.after)p.includes(f)||p.push(f);else e.set(i.class,[...i.after])}let t=new Set,r=new Set;function d(i,p){if(r.has(i)){let f=p.indexOf(i),o=[...p.slice(f),i].map(n=>n.name||"unknown");throw new Error(`Cycle detected: ${o.join(" \u2192 ")}`)}if(!t.has(i)){r.add(i),p.push(i);for(let f of e.get(i)??[])d(f,p);p.pop(),r.delete(i),t.add(i)}}for(let i of e.keys())d(i,[])}function ke(s,e=!1){if(s.length===0)return[];let t=new Map,r=[];for(let o of s)if(o.class){let n=t.get(o.class);n?n.push(o):t.set(o.class,[o])}else r.push(o);let d=[...t.keys()],i=new Map,p=new Map;for(let o of d)i.set(o,0),p.set(o,[]);for(let o of s)if(o.class)for(let n of o.after){let[a,c]=e?[o.class,n]:[n,o.class],l=p.get(a);l.includes(c)||(l.push(c),i.set(c,i.get(c)+1))}let f=[],u=d.filter(o=>i.get(o)===0);for(;u.length>0;){let o=[],n=[];for(let a of u)o.push(...t.get(a)??[]);f.push(o);for(let a of u)for(let c of p.get(a)??[]){let l=i.get(c)-1;i.set(c,l),l===0&&n.push(c)}u=n}if(r.length>0){let o=r.filter(a=>a.after.length>0),n=r.filter(a=>a.after.length===0);if(o.length>0){let a=-1;for(let l of o)for(let m of l.after){let y=f.findIndex(b=>b.some(v=>v.class===m));y>a&&(a=y)}let c=a+1;c<f.length?f[c].push(...o):f.push(o)}n.length>0&&(f.length>0?f[f.length-1].push(...n):f.push(n))}return f}async function S(s,e=r=>{throw r},t=!1){let r=ke(s,t);for(let d of r)await Promise.all(d.map(async i=>{try{return typeof i.cb=="function"?await i.cb():await i.cb}catch(p){return e(p instanceof Error?p:new Error(`${p}`))}}))}var k=require("valleyed"),_=()=>k.v.object({app:k.v.object({name:k.v.string()}),log:k.v.defaults(k.v.object({level:k.v.defaults(k.v.in(["fatal","error","warn","info","debug","trace","silent"]),"info")}),{}),utils:k.v.defaults(k.v.object({hashSaltRounds:k.v.defaults(k.v.number(),10),paginationDefaultLimit:k.v.defaults(k.v.number(),100),maxFileUploadSizeInMb:k.v.defaults(k.v.number(),500)}),{})});var h=class s{static#e;static#t;static#s={};settings;log;constructor(e){s.#t=this,this.settings=Object.freeze(e),this.log=(0,H.default)({level:this.settings.log.level,serializers:{err:H.default.stdSerializers.err,error:H.default.stdSerializers.err,req:H.default.stdSerializers.req,res:H.default.stdSerializers.res},mixin:()=>({instanceId:s.#e})}),s.#o()}alias(e){if(s.#e!==void 0)return s.crash(new g("Instance already has an alias",{}));s.#e=e}get id(){return s.#e===void 0?s.crash(new g("Instance doesnt have an alias yet",{})):s.#e}getScopedName(e,t="."){return[this.settings.app.name,e].join(t)}async start(){try{await S(s.#s.setup??[]),await S(s.#s.start??[])}catch(e){s.crash(new g("Error starting instance",{},e))}}static envs(e){let t=$.v.validate(e,process.env);return t.valid||s.crash(new g(`Environment variables are not valid
1
+ "use strict";var de=Object.create;var T=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ge=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var X=(s,e)=>{for(var t in e)T(s,t,{get:e[t],enumerable:!0})},Y=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of ye(e))!he.call(s,d)&&d!==t&&T(s,d,{get:()=>e[d],enumerable:!(r=fe(e,d))||r.enumerable});return s};var q=(s,e,t)=>(t=s!=null?de(ge(s)):{},Y(e||!s||!s.__esModule?T(t,"default",{value:s,enumerable:!0}):t,s)),me=s=>Y(T({},"__esModule",{value:!0}),s);var He={};X(He,{MongoDb:()=>V,MongoDbChange:()=>M,mongoDbConfigPipe:()=>F});module.exports=me(He);var rt=require("mongodb"),U=require("valleyed");var g=class extends Error{constructor(t,r,d){super(t,{cause:d});this.message=t;this.context=r;this.cause=d}};var E=class{};var H=q(require("pino"),1),ee=require("ulid"),$=require("valleyed");function Z(s,e){for(let t of e.after)if(!s.some(r=>r.class===t)){let r=t.name||"unknown",d=e.class?.name||"anonymous";throw new Error(`Missing dependency: ${d} declares after: [${r}], but ${r} is not registered`)}if(e.class){let t=[...s,e];be(t)}s.push(e)}function be(s){let e=new Map;for(let i of s){if(!i.class)continue;let p=e.get(i.class);if(p)for(let f of i.after)p.includes(f)||p.push(f);else e.set(i.class,[...i.after])}let t=new Set,r=new Set;function d(i,p){if(r.has(i)){let f=p.indexOf(i),o=[...p.slice(f),i].map(n=>n.name||"unknown");throw new Error(`Cycle detected: ${o.join(" \u2192 ")}`)}if(!t.has(i)){r.add(i),p.push(i);for(let f of e.get(i)??[])d(f,p);p.pop(),r.delete(i),t.add(i)}}for(let i of e.keys())d(i,[])}function ke(s,e=!1){if(s.length===0)return[];let t=new Map,r=[];for(let o of s)if(o.class){let n=t.get(o.class);n?n.push(o):t.set(o.class,[o])}else r.push(o);let d=[...t.keys()],i=new Map,p=new Map;for(let o of d)i.set(o,0),p.set(o,[]);for(let o of s)if(o.class)for(let n of o.after){let[a,c]=e?[o.class,n]:[n,o.class],l=p.get(a);l.includes(c)||(l.push(c),i.set(c,i.get(c)+1))}let f=[],u=d.filter(o=>i.get(o)===0);for(;u.length>0;){let o=[],n=[];for(let a of u)o.push(...t.get(a)??[]);f.push(o);for(let a of u)for(let c of p.get(a)??[]){let l=i.get(c)-1;i.set(c,l),l===0&&n.push(c)}u=n}if(r.length>0){let o=r.filter(a=>a.after.length>0),n=r.filter(a=>a.after.length===0);if(o.length>0){let a=-1;for(let l of o)for(let m of l.after){let y=f.findIndex(b=>b.some(v=>v.class===m));y>a&&(a=y)}let c=a+1;c<f.length?f[c].push(...o):f.push(o)}n.length>0&&(f.length>0?f[f.length-1].push(...n):f.push(n))}return f}async function S(s,e=r=>{throw r},t=!1){let r=ke(s,t);for(let d of r)await Promise.all(d.map(async i=>{try{return typeof i.cb=="function"?await i.cb():await i.cb}catch(p){return e(p instanceof Error?p:new Error(`${p}`))}}))}var k=require("valleyed"),_=()=>k.v.object({app:k.v.object({name:k.v.string()}),log:k.v.defaults(k.v.object({level:k.v.defaults(k.v.in(["fatal","error","warn","info","debug","trace","silent"]),"info")}),{}),utils:k.v.defaults(k.v.object({hashSaltRounds:k.v.defaults(k.v.number(),10),paginationDefaultLimit:k.v.defaults(k.v.number(),100),maxFileUploadSizeInMb:k.v.defaults(k.v.number(),500)}),{})});var h=class s{static#e;static#t;static#s={};settings;log;constructor(e){s.#t=this,this.settings=Object.freeze(e),this.log=(0,H.default)({level:this.settings.log.level,serializers:{err:H.default.stdSerializers.err,error:H.default.stdSerializers.err,req:H.default.stdSerializers.req,res:H.default.stdSerializers.res},mixin:()=>({instanceId:s.#e})}),s.#o()}alias(e){if(s.#e!==void 0)return s.crash(new g("Instance already has an alias",{}));s.#e=e}get id(){return s.#e===void 0?s.crash(new g("Instance doesnt have an alias yet",{})):s.#e}getScopedName(e,t="."){return[this.settings.app.name,e].join(t)}async start(){try{await S(s.#s.setup??[]),await S(s.#s.start??[])}catch(e){s.crash(new g("Error starting instance",{},e))}}static envs(e){let t=$.v.validate(e,process.env);return t.valid||s.crash(new g(`Environment variables are not valid
2
2
  ${t.error.toString()}`,{messages:t.error.messages})),t.value}static create(e){if(s.#t)return s.crash(new g("Instance has been initialized already",{}));let t=$.v.validate(_(),e);return t.valid||s.crash(new g(`Settings are not valid
3
- ${t.error.toString()}`,{messages:t.error.messages})),new s(t.value)}static get(){return s.#t?s.#t:s.crash(new g("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static maybeGet(){return s.#t}static on(e,t,r){s.#s[e]??=[];let d={cb:t,class:r?.class,after:r?.after??[]};Z(s.#s[e],d)}static#o(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([t,r])=>{process.on(t,async()=>{await S(s.#s.close??[],()=>{},!0),process.exit(128+r)})})}static resolveBeforeCrash(e){let t=e();return s.on("close",async()=>await t),t}static crash(e){console.error(e),process.exit(1)}static createId(e){return`${e?.prefix??""}${(0,ee.ulid)(e?.time?.getTime())}`}};var L=require("valleyed");function te(s,e){let t=s();L.v.compile(t);class r extends e{constructor(p,...f){super(...f);this.config=p}static create(p,...f){let u=L.v.validate(t,p);if(!u.valid)throw u.error;return new this(u.value,...f)}}return r}var se=s=>{try{return s?.constructor?.name!=="String"?s:JSON.parse(s)}catch{return s}};var R={};X(R,{number:()=>xe,string:()=>Ce});var K=q(require("crypto"),1);function Ce(s=20){return K.default.randomBytes(s).toString("hex").slice(0,s)}function xe(s=0,e=2**48-1){return K.default.randomInt(s,e)}var we=s=>new Promise(e=>setTimeout(e,s)),G=async(s,e,t)=>{if(e<=0)throw new g("out of tries",{tries:e,waitTimeInMs:t});let r=await s();return r.done===!0?r.value:(await we(t),await G(s,e-1,t))};var re=q(require("axios"),1),ne=require("valleyed");var I=require("valleyed");var N=require("@confluentinc/kafka-javascript"),x=require("valleyed");var ve=()=>x.v.meta(x.v.object({brokers:x.v.array(x.v.string()),ssl:x.v.optional(x.v.boolean()),sasl:x.v.optional(x.v.object({mechanism:x.v.is("plain"),username:x.v.string(),password:x.v.string()})),clientId:x.v.optional(x.v.string())}),{title:"Kafka Config",$refId:"KafkaConfig"}),O=class s extends te(ve,E){#e;#t=null;constructor(e){super(e),this.#e=new N.KafkaJS.Kafka({kafkaJS:{...e,logLevel:N.KafkaJS.logLevel.NOTHING}})}async#s(){return this.#t||(this.#t=(async()=>{let e=this.#e.admin();return await e.connect(),e})()),this.#t}async#o(e){await(await this.#s()).createTopics({topics:[{topic:e}],timeout:5e3})}async#r(e){await(await this.#s()).deleteGroups([e]).catch(()=>{})}stream(e,t={}){let r=t.skipScope?e:h.get().getScopedName(e);return{publish:async d=>{let i=this.#e.producer();return await i.connect(),await i.send({topic:r,messages:[{value:JSON.stringify(d)}]}),!0},subscribe:d=>{let i=async()=>{await this.#o(r);let p=t.fanout?h.get().getScopedName(`${h.get().id}-fanout-${R.string(10)}`):r,f=this.#e.consumer({kafkaJS:{groupId:p}});await f.connect(),await f.subscribe({topic:r}),await f.run({eachMessage:async({message:u})=>{await h.resolveBeforeCrash(async()=>{u.value&&await d(se(u.value.toString()))}).catch(o=>h.crash(new g("Error processing kafka event",{topic:r,groupId:p,options:t},o)))}}),t.fanout&&h.on("close",async()=>{await f.disconnect(),await this.#r(p)},{class:s})};h.on("start",i,{class:s})}}}};var oe=()=>I.v.object({debeziumUrl:I.v.string(),eventBus:I.v.instanceOf(O)});var z="db-changes",D=class{constructor(e,t,r){this.config=e;this.callbacks=t;this.mapper=r;this.config=ne.v.assert(oe(),e)}async configureConnector(e,t){let r=re.default.create({baseURL:this.config.debeziumUrl});return await r.put(`/connectors/${e}/config`,{"topic.prefix":z,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...t}).then(async()=>(await r.get(`/connectors/${e}/topics`)).data[e]?.topics?.includes?.(e)??!1).catch(d=>{throw new g("Failed to configure watcher",{key:e},d)})}};var T=class extends D{#e=!1;constructor(e,t,r,d,i){super(t,d,i);let p=l=>l._id?{...l,_id:l._id.$oid??l._id}:void 0,f=r.dbName,u=r.collectionName,o=`${f}.${u}`,n=`${z}.${o}`,a="5f5f65717569707065645f5f",c={_id:a};t.eventBus.stream(n,{skipScope:!0}).subscribe(async l=>{let m=l.op,y=JSON.parse(l.before??"null"),b=JSON.parse(l.after??"null");y&&(y=p(y)),b&&(b=p(b)),!(y?._id===a||b?._id===a)&&(m==="c"&&this.callbacks.created&&b?await this.callbacks.created({before:null,after:this.mapper(b)}):m==="u"&&this.callbacks.updated&&y&&b?await this.callbacks.updated({before:this.mapper(y),after:this.mapper(b),changes:U.differ.from(U.differ.diff(y,b))}):m==="d"&&this.callbacks.deleted&&y&&await this.callbacks.deleted({before:this.mapper(y),after:null}))}),h.on("start",async()=>{this.#e||(this.#e=!0,await G(async()=>await this.configureConnector(n,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":e.uri,"collection.include.list":o,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":o,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await r.findOneAndUpdate(c,{$set:{colName:u}},{upsert:!0}),await r.findOneAndDelete(c),h.get().log.warn(`Waiting for db changes for ${o} to start...`),{done:!1}),6,3e4).catch(l=>h.crash(new g("Failed to start db changes",{dbColName:o},l))))})}};var le=require("async_hooks"),B=require("mongodb"),pe=require("valleyed");var W=require("valleyed"),F=()=>W.v.meta(W.v.object({uri:W.v.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});var yt=require("mongodb");var C=require("valleyed");var j=(t=>(t.and="and",t.or="or",t))(j||{}),ae=(u=>(u.lt="lt",u.lte="lte",u.gt="gt",u.gte="gte",u.eq="eq",u.ne="ne",u.in="in",u.nin="nin",u))(ae||{}),Pe=C.v.catch(C.v.defaults(C.v.in(["and","or"]),"and"),"and"),Be=C.v.object({field:C.v.string(),value:C.v.any(),condition:C.v.catch(C.v.defaults(C.v.in(Object.values(ae)),"eq"),"eq")}),ie=C.v.recursive(()=>C.v.discriminate(s=>Object.values(j).includes(s.condition)?"block":"regular",{block:C.v.object({condition:Pe,value:C.v.array(ie)}),regular:Be}),"QueryWhereBlock"),dt=C.v.defaults(C.v.array(ie),[]);var ce=async(s,e)=>{let t=[],r=J(e.where,e.whereType);r&&t.push(r);let d=J(e.auth,e.authType);if(d&&t.push(d),e.search&&e.search.fields.length>0){let A=e.search.fields.map(ue=>({[ue]:{$regex:new RegExp(e.search.value,"i")}}));t.push({$or:A})}let i={};t.length>0&&(i.$and=t);let p=e.sort.map(A=>[A.field,A.desc?"desc":"asc"]),f=e.all??!1,u=e.limit,o=e.page,n=await s.countDocuments(i),a=e.select?.length?Object.fromEntries(e.select.map(A=>[A,1])):void 0,c=s.find(i,{projection:a});p.length&&(c=c.sort(Object.fromEntries(p))),!f&&u&&(c=c.limit(u),o&&(c=c.skip((o-1)*u)));let l=await c.toArray(),m=1,y=Math.ceil(n/u)||1,b=o>=y?null:o+1,v=o<=m?null:o-1;return{pages:{start:m,last:y,next:b,previous:v,current:o},docs:{limit:u,total:n,count:l.length},results:l}};function Ae(s){return Object.values(j).includes(s.condition)}var J=(s,e="and")=>{let t=(Array.isArray(s)?s:[]).map(r=>{if(Ae(r))return J(r.value,r.condition);let{field:d}=r,i=d==="id"?"_id":d??"",p=r.value===void 0?"":r.value;return{field:i,value:p,condition:r.condition,isWhere:!0}}).filter(r=>!!r).map(r=>r.isWhere?{[`${r.field}`]:{[`$${r.condition}`]:r.value}}:r);return t.length>0?{[`$${e}`]:t}:null};var Q=class{constructor(e){this.config=e}getScopedDb(e){return h.get().getScopedName(e).replaceAll(".","-")}};var P="_id",w=new le.AsyncLocalStorage(void 0),V=class extends Q{constructor(t,r){super(r);this.mongoConfig=t;this.mongoConfig=pe.v.assert(F(),t),this.client=new B.MongoClient(t.uri,{ignoreUndefined:!0}),h.on("start",async()=>{await this.client.connect();let d=this.#e.reduce((p,f)=>(p[f.db]||(p[f.db]=[]),p[f.db].push(f.col),p),{}),i={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(d).map(async([p,f])=>{let u=this.client.db(p),o=await u.listCollections().toArray();return f.map(async n=>{let a=o.find(c=>c.name===n);a?a.options?.changeStreamPreAndPostImages?.enabled!==i.changeStreamPreAndPostImages.enabled&&await u.command({collMod:n,...i}):await u.createCollection(n,i)})}))}),h.on("close",async()=>this.client.close())}client;#e=[];async session(t){if(w.getStore())return t();let r=await this.client.startSession();return r.withTransaction(async()=>w.run(r,t))}id(){return new B.ObjectId}use(t){let r=this.getScopedDb(t.db);return this.#e.push({db:r,col:t.col}),this.#t(t,this.client.db(r).collection(t.col))}#t(t,r){function d(o,n){let c=(Array.isArray(o)?o:[o]).map(l=>t.mapper(l,n));return Array.isArray(o)?c:c[0]}function i(o,n,a,c){let l={[P]:n,...t.options?.skipAudit?{}:{createdAt:a.getTime(),...c?{}:{updatedAt:a.getTime()}}};return{...o,...l}}function p(o,n,a=!1){return{...o,$set:{...o.$set,...a||Object.keys(o).length>0&&!t.options?.skipAudit?{updatedAt:n.getTime()}:{}}}}let f=this,u={config:t,extras:{collection:r},query:async o=>{let n=await ce(r,o);return{...n,results:d(n.results,o.select)}},findMany:async(o,n={})=>{let{select:a,...c}=n,l=a?.length?Object.fromEntries(a.map(v=>[v,1])):void 0,y=(Array.isArray(c.sort)?c.sort:c.sort?[c.sort]:[]).map(v=>[v.field,v.desc?"desc":"asc"]),b=await r.find(o,{session:w.getStore(),limit:c.limit,sort:y,projection:l}).toArray();return d(b,a)},findOne:async(o,n={})=>(await u.findMany(o,{...n,limit:1})).at(0)??null,findById:async(o,n={})=>await u.findOne({[P]:o},n),insertMany:async(o,n={})=>{let a=n.getTime?.()??new Date,c=o.map((m,y)=>i(m,n.makeId?.(y)??new B.ObjectId().toString(),a));return await r.insertMany(c,{session:w.getStore()}),(await Promise.all(c.map(async m=>await u.findById(m[P])))).filter(m=>!!m)},insertOne:async(o,n={})=>(await u.insertMany([o],n))[0],updateMany:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=w.getStore(),y=(await r.find(o,{session:l,projection:{[P]:1}}).toArray()).map(v=>v[P]),b={[P]:{$in:y}};return await r.updateMany(b,p(n,c),{session:l}),u.findMany(b)},updateOne:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=await r.findOneAndUpdate(o,p(n,c),{returnDocument:"after",session:w.getStore()});return l?d(l,void 0):null},updateById:async(o,n,a={})=>await u.updateOne({[P]:o},n,a),upsertOne:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=await r.findOneAndUpdate(o,{...p("update"in n?n.update:{},c,!0),$setOnInsert:i(n.insert,a.makeId?.()??new B.ObjectId().toString(),c,!0)},{returnDocument:"after",session:w.getStore(),upsert:!0});return d(l,void 0)},deleteMany:async(o,n={})=>{let a=await u.findMany(o,n);return await r.deleteMany(o,{session:w.getStore()}),a},deleteOne:async o=>{let n=await r.findOneAndDelete(o,{session:w.getStore()});return n?d(n,void 0):null},deleteById:async o=>await u.deleteOne({[P]:o}),bulkWrite:async(o,n={})=>{if(!o.length)return;let a=r.initializeUnorderedBulkOp({session:w.getStore()}),c=n.getTime?.()??new Date;o.forEach((l,m)=>{switch(l.op){case"insert":a.insert(i(l.value,l.makeId?.(m)??new B.ObjectId().toString(),c));break;case"delete":a.find(l.filter).delete();break;case"update":a.find(l.filter).update(p(l.value,c));break;case"upsert":a.find(l.filter).upsert().update({...p("update"in l?l.update:{},c,!0),$setOnInsert:i(l.insert,l.makeId?.(m)??new B.ObjectId().toString(),c,!0)});break;default:throw new g("Unknown bulkWrite operation",{operation:l})}}),await a.execute({session:w.getStore()})},watch(o){return f.config.changes||h.crash(new g("Db changes are not enabled in the configuration.",{config:t})),new T(f.mongoConfig,f.config.changes,r,o,n=>t.mapper(n))}};return u}};0&&(module.exports={MongoDb,MongoDbChange,mongoDbConfigPipe});
3
+ ${t.error.toString()}`,{messages:t.error.messages})),new s(t.value)}static get(){return s.#t?s.#t:s.crash(new g("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static maybeGet(){return s.#t}static on(e,t,r){s.#s[e]??=[];let d={cb:t,class:r?.class,after:r?.after??[]};Z(s.#s[e],d)}static#o(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([t,r])=>{process.on(t,async()=>{await S(s.#s.close??[],()=>{},!0),process.exit(128+r)})})}static resolveBeforeCrash(e){let t=e();return s.on("close",async()=>await t),t}static crash(e){console.error(e),process.exit(1)}static createId(e){return`${e?.prefix??""}${(0,ee.ulid)(e?.time?.getTime())}`}};var L=require("valleyed");function te(s,e){let t=s();L.v.compile(t);class r extends e{constructor(p,...f){super(...f);this.config=p}static create(p,...f){let u=L.v.validate(t,p);if(!u.valid)throw u.error;return new this(u.value,...f)}}return r}var se=s=>{try{return s?.constructor?.name!=="String"?s:JSON.parse(s)}catch{return s}};var R={};X(R,{number:()=>xe,string:()=>Ce});var K=q(require("crypto"),1);function Ce(s=20){return K.default.randomBytes(s).toString("hex").slice(0,s)}function xe(s=0,e=2**48-1){return K.default.randomInt(s,e)}var we=s=>new Promise(e=>setTimeout(e,s)),G=async(s,e,t)=>{if(e<=0)throw new g("out of tries",{tries:e,waitTimeInMs:t});let r=await s();return r.done===!0?r.value:(await we(t),await G(s,e-1,t))};var re=q(require("axios"),1),ne=require("valleyed");var I=require("valleyed");var N=require("@confluentinc/kafka-javascript"),x=require("valleyed");var ve=()=>x.v.meta(x.v.object({brokers:x.v.array(x.v.string()),ssl:x.v.optional(x.v.boolean()),sasl:x.v.optional(x.v.object({mechanism:x.v.is("plain"),username:x.v.string(),password:x.v.string()})),clientId:x.v.optional(x.v.string())}),{title:"Kafka Config",$refId:"KafkaConfig"}),O=class s extends te(ve,E){#e;#t=null;constructor(e){super(e),this.#e=new N.KafkaJS.Kafka({kafkaJS:{...e,logLevel:N.KafkaJS.logLevel.NOTHING}})}async#s(){return this.#t||(this.#t=(async()=>{let e=this.#e.admin();return await e.connect(),e})()),this.#t}async#o(e){await(await this.#s()).createTopics({topics:[{topic:e}],timeout:5e3})}async#r(e){await(await this.#s()).deleteGroups([e]).catch(()=>{})}stream(e,t={}){let r=t.skipScope?e:h.get().getScopedName(e);return{publish:async d=>{let i=this.#e.producer();return await i.connect(),await i.send({topic:r,messages:[{value:JSON.stringify(d)}]}),!0},subscribe:d=>{let i=async()=>{await this.#o(r);let p=t.fanout?h.get().getScopedName(`${h.get().id}-fanout-${R.string(10)}`):r,f=this.#e.consumer({kafkaJS:{groupId:p}});await f.connect(),await f.subscribe({topic:r}),await f.run({eachMessage:async({message:u})=>{await h.resolveBeforeCrash(async()=>{u.value&&await d(se(u.value.toString()))}).catch(o=>h.crash(new g("Error processing kafka event",{topic:r,groupId:p,options:t},o)))}}),t.fanout&&h.on("close",async()=>{await f.disconnect(),await this.#r(p)},{class:s})};h.on("start",i,{class:s})}}}};var oe=()=>I.v.object({debeziumUrl:I.v.string(),eventBus:I.v.instanceOf(O)});var z="db-changes",D=class{constructor(e,t,r){this.config=e;this.callbacks=t;this.mapper=r;this.config=ne.v.assert(oe(),e)}async configureConnector(e,t){let r=re.default.create({baseURL:this.config.debeziumUrl});return await r.put(`/connectors/${e}/config`,{"topic.prefix":z,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...t}).then(async()=>(await r.get(`/connectors/${e}/topics`)).data[e]?.topics?.includes?.(e)??!1).catch(d=>{throw new g("Failed to configure watcher",{key:e},d)})}};var M=class extends D{#e=!1;constructor(e,t,r,d,i){super(t,d,i);let p=l=>l._id?{...l,_id:l._id.$oid??l._id}:void 0,f=r.dbName,u=r.collectionName,o=`${f}.${u}`,n=`${z}.${o}`,a="5f5f65717569707065645f5f",c={_id:a};t.eventBus.stream(n,{skipScope:!0}).subscribe(async l=>{let m=l.op,y=JSON.parse(l.before??"null"),b=JSON.parse(l.after??"null");y&&(y=p(y)),b&&(b=p(b)),!(y?._id===a||b?._id===a)&&(m==="c"&&this.callbacks.created&&b?await this.callbacks.created({before:null,after:this.mapper(b)}):m==="u"&&this.callbacks.updated&&y&&b?await this.callbacks.updated({before:this.mapper(y),after:this.mapper(b),changes:U.differ.from(U.differ.diff(y,b))}):m==="d"&&this.callbacks.deleted&&y&&await this.callbacks.deleted({before:this.mapper(y),after:null}))}),h.on("start",async()=>{this.#e||(this.#e=!0,await G(async()=>await this.configureConnector(n,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":e.uri,"collection.include.list":o,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":o,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await r.findOneAndUpdate(c,{$set:{colName:u}},{upsert:!0}),await r.findOneAndDelete(c),h.get().log.warn(`Waiting for db changes for ${o} to start...`),{done:!1}),6,3e4).catch(l=>h.crash(new g("Failed to start db changes",{dbColName:o},l))))})}};var le=require("async_hooks"),B=require("mongodb"),pe=require("valleyed");var W=require("valleyed"),F=()=>W.v.meta(W.v.object({uri:W.v.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});var yt=require("mongodb");var C=require("valleyed");var j=(t=>(t.and="and",t.or="or",t))(j||{}),ae=(u=>(u.lt="lt",u.lte="lte",u.gt="gt",u.gte="gte",u.eq="eq",u.ne="ne",u.in="in",u.nin="nin",u))(ae||{}),Pe=C.v.catch(C.v.defaults(C.v.in(["and","or"]),"and"),"and"),Be=C.v.object({field:C.v.string(),value:C.v.any(),condition:C.v.catch(C.v.defaults(C.v.in(Object.values(ae)),"eq"),"eq")}),ie=C.v.recursive(()=>C.v.discriminate(s=>Object.values(j).includes(s.condition)?"block":"regular",{block:C.v.object({condition:Pe,value:C.v.array(ie)}),regular:Be}),"QueryWhereBlock"),dt=C.v.defaults(C.v.array(ie),[]);var ce=async(s,e)=>{let t=[],r=J(e.where,e.whereType);r&&t.push(r);let d=J(e.auth,e.authType);if(d&&t.push(d),e.search&&e.search.fields.length>0){let A=e.search.fields.map(ue=>({[ue]:{$regex:new RegExp(e.search.value,"i")}}));t.push({$or:A})}let i={};t.length>0&&(i.$and=t);let p=e.sort.map(A=>[A.field,A.desc?"desc":"asc"]),f=e.all??!1,u=e.limit,o=e.page,n=await s.countDocuments(i),a=e.select?.length?Object.fromEntries(e.select.map(A=>[A,1])):void 0,c=s.find(i,{projection:a});p.length&&(c=c.sort(Object.fromEntries(p))),!f&&u&&(c=c.limit(u),o&&(c=c.skip((o-1)*u)));let l=await c.toArray(),m=1,y=Math.ceil(n/u)||1,b=o>=y?null:o+1,v=o<=m?null:o-1;return{pages:{start:m,last:y,next:b,previous:v,current:o},docs:{limit:u,total:n,count:l.length},results:l}};function Ae(s){return Object.values(j).includes(s.condition)}var J=(s,e="and")=>{let t=(Array.isArray(s)?s:[]).map(r=>{if(Ae(r))return J(r.value,r.condition);let{field:d}=r,i=d==="id"?"_id":d??"",p=r.value===void 0?"":r.value;return{field:i,value:p,condition:r.condition,isWhere:!0}}).filter(r=>!!r).map(r=>r.isWhere?{[`${r.field}`]:{[`$${r.condition}`]:r.value}}:r);return t.length>0?{[`$${e}`]:t}:null};var Q=class{constructor(e){this.config=e}getScopedDb(e){return h.get().getScopedName(e).replaceAll(".","-")}};var P="_id",w=new le.AsyncLocalStorage(void 0),V=class extends Q{constructor(t,r){super(r);this.mongoConfig=t;this.mongoConfig=pe.v.assert(F(),t),this.client=new B.MongoClient(t.uri,{ignoreUndefined:!0}),h.on("start",async()=>{await this.client.connect();let d=this.#e.reduce((p,f)=>(p[f.db]||(p[f.db]=[]),p[f.db].push(f.col),p),{}),i={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(d).map(async([p,f])=>{let u=this.client.db(p),o=await u.listCollections().toArray();return f.map(async n=>{let a=o.find(c=>c.name===n);a?a.options?.changeStreamPreAndPostImages?.enabled!==i.changeStreamPreAndPostImages.enabled&&await u.command({collMod:n,...i}):await u.createCollection(n,i)})}))}),h.on("close",async()=>this.client.close())}client;#e=[];async session(t){if(w.getStore())return t();let r=await this.client.startSession();return r.withTransaction(async()=>w.run(r,t))}id(){return new B.ObjectId}use(t){let r=this.getScopedDb(t.db);return this.#e.push({db:r,col:t.col}),this.#t(t,this.client.db(r).collection(t.col))}#t(t,r){function d(o,n){let c=(Array.isArray(o)?o:[o]).map(l=>t.mapper(l,n));return Array.isArray(o)?c:c[0]}function i(o,n,a,c){let l={[P]:n,...t.options?.skipAudit?{}:{createdAt:a.getTime(),...c?{}:{updatedAt:a.getTime()}}};return{...o,...l}}function p(o,n,a=!1){return{...o,$set:{...o.$set,...a||Object.keys(o).length>0&&!t.options?.skipAudit?{updatedAt:n.getTime()}:{}}}}let f=this,u={config:t,extras:{collection:r},query:async o=>{let n=await ce(r,o);return{...n,results:d(n.results,o.select)}},findMany:async(o,n={})=>{let{select:a,...c}=n,l=a?.length?Object.fromEntries(a.map(v=>[v,1])):void 0,y=(Array.isArray(c.sort)?c.sort:c.sort?[c.sort]:[]).map(v=>[v.field,v.desc?"desc":"asc"]),b=await r.find(o,{session:w.getStore(),limit:c.limit,sort:y,projection:l}).toArray();return d(b,a)},findOne:async(o,n={})=>(await u.findMany(o,{...n,limit:1})).at(0)??null,findById:async(o,n={})=>await u.findOne({[P]:o},n),insertMany:async(o,n={})=>{let a=n.getTime?.()??new Date,c=o.map((m,y)=>i(m,n.makeId?.(y)??new B.ObjectId().toString(),a));return await r.insertMany(c,{session:w.getStore()}),(await Promise.all(c.map(async m=>await u.findById(m[P])))).filter(m=>!!m)},insertOne:async(o,n={})=>(await u.insertMany([o],n))[0],updateMany:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=w.getStore(),y=(await r.find(o,{session:l,projection:{[P]:1}}).toArray()).map(v=>v[P]),b={[P]:{$in:y}};return await r.updateMany(b,p(n,c),{session:l}),u.findMany(b)},updateOne:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=await r.findOneAndUpdate(o,p(n,c),{returnDocument:"after",session:w.getStore()});return l?d(l,void 0):null},updateById:async(o,n,a={})=>await u.updateOne({[P]:o},n,a),upsertOne:async(o,n,a={})=>{let c=a.getTime?.()??new Date,l=await r.findOneAndUpdate(o,{...p("update"in n?n.update:{},c,!0),$setOnInsert:i(n.insert,a.makeId?.()??new B.ObjectId().toString(),c,!0)},{returnDocument:"after",session:w.getStore(),upsert:!0});return d(l,void 0)},deleteMany:async(o,n={})=>{let a=await u.findMany(o,n);return await r.deleteMany(o,{session:w.getStore()}),a},deleteOne:async o=>{let n=await r.findOneAndDelete(o,{session:w.getStore()});return n?d(n,void 0):null},deleteById:async o=>await u.deleteOne({[P]:o}),bulkWrite:async(o,n={})=>{if(!o.length)return;let a=r.initializeUnorderedBulkOp({session:w.getStore()}),c=n.getTime?.()??new Date;o.forEach((l,m)=>{switch(l.op){case"insert":a.insert(i(l.value,l.makeId?.(m)??new B.ObjectId().toString(),c));break;case"delete":a.find(l.filter).delete();break;case"update":a.find(l.filter).update(p(l.value,c));break;case"upsert":a.find(l.filter).upsert().update({...p("update"in l?l.update:{},c,!0),$setOnInsert:i(l.insert,l.makeId?.(m)??new B.ObjectId().toString(),c,!0)});break;default:throw new g("Unknown bulkWrite operation",{operation:l})}}),await a.execute({session:w.getStore()})},watch(o){return f.config.changes||h.crash(new g("Db changes are not enabled in the configuration.",{config:t})),new M(f.mongoConfig,f.config.changes,r,o,n=>t.mapper(n))}};return u}};0&&(module.exports={MongoDb,MongoDbChange,mongoDbConfigPipe});
4
4
  //# sourceMappingURL=index.min.cjs.map