webapp-factory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/README.md +145 -0
  2. package/dist/access-control/adapters/in-memory-relations.d.ts +7 -0
  3. package/dist/access-control/adapters/in-memory-relations.d.ts.map +1 -0
  4. package/dist/access-control/adapters/in-memory-relations.js +6 -0
  5. package/dist/access-control/adapters/in-memory-relations.js.map +1 -0
  6. package/dist/access-control/core/enforcement.d.ts +13 -0
  7. package/dist/access-control/core/enforcement.d.ts.map +1 -0
  8. package/dist/access-control/core/enforcement.js +38 -0
  9. package/dist/access-control/core/enforcement.js.map +1 -0
  10. package/dist/access-control/core/errors.d.ts +30 -0
  11. package/dist/access-control/core/errors.d.ts.map +1 -0
  12. package/dist/access-control/core/errors.js +46 -0
  13. package/dist/access-control/core/errors.js.map +1 -0
  14. package/dist/access-control/core/pdp.d.ts +14 -0
  15. package/dist/access-control/core/pdp.d.ts.map +1 -0
  16. package/dist/access-control/core/pdp.js +79 -0
  17. package/dist/access-control/core/pdp.js.map +1 -0
  18. package/dist/access-control/core/ports.d.ts +68 -0
  19. package/dist/access-control/core/ports.d.ts.map +1 -0
  20. package/dist/access-control/core/ports.js +6 -0
  21. package/dist/access-control/core/ports.js.map +1 -0
  22. package/dist/access-control/core/rbac.d.ts +10 -0
  23. package/dist/access-control/core/rbac.d.ts.map +1 -0
  24. package/dist/access-control/core/rbac.js +78 -0
  25. package/dist/access-control/core/rbac.js.map +1 -0
  26. package/dist/access-control/core/rebac.d.ts +15 -0
  27. package/dist/access-control/core/rebac.d.ts.map +1 -0
  28. package/dist/access-control/core/rebac.js +48 -0
  29. package/dist/access-control/core/rebac.js.map +1 -0
  30. package/dist/access-control/index.d.ts +15 -0
  31. package/dist/access-control/index.d.ts.map +1 -0
  32. package/dist/access-control/index.js +20 -0
  33. package/dist/access-control/index.js.map +1 -0
  34. package/dist/access-control/nestjs/access-control.module.d.ts +34 -0
  35. package/dist/access-control/nestjs/access-control.module.d.ts.map +1 -0
  36. package/dist/access-control/nestjs/access-control.module.js +80 -0
  37. package/dist/access-control/nestjs/access-control.module.js.map +1 -0
  38. package/dist/audit/adapters/in-memory-store.d.ts +3 -0
  39. package/dist/audit/adapters/in-memory-store.d.ts.map +1 -0
  40. package/dist/audit/adapters/in-memory-store.js +66 -0
  41. package/dist/audit/adapters/in-memory-store.js.map +1 -0
  42. package/dist/audit/adapters/pg-store.d.ts +22 -0
  43. package/dist/audit/adapters/pg-store.d.ts.map +1 -0
  44. package/dist/audit/adapters/pg-store.js +119 -0
  45. package/dist/audit/adapters/pg-store.js.map +1 -0
  46. package/dist/audit/core/audit-log.d.ts +41 -0
  47. package/dist/audit/core/audit-log.d.ts.map +1 -0
  48. package/dist/audit/core/audit-log.js +78 -0
  49. package/dist/audit/core/audit-log.js.map +1 -0
  50. package/dist/audit/core/errors.d.ts +22 -0
  51. package/dist/audit/core/errors.d.ts.map +1 -0
  52. package/dist/audit/core/errors.js +35 -0
  53. package/dist/audit/core/errors.js.map +1 -0
  54. package/dist/audit/core/hash.d.ts +9 -0
  55. package/dist/audit/core/hash.d.ts.map +1 -0
  56. package/dist/audit/core/hash.js +45 -0
  57. package/dist/audit/core/hash.js.map +1 -0
  58. package/dist/audit/core/ports.d.ts +68 -0
  59. package/dist/audit/core/ports.d.ts.map +1 -0
  60. package/dist/audit/core/ports.js +6 -0
  61. package/dist/audit/core/ports.js.map +1 -0
  62. package/dist/audit/index.d.ts +13 -0
  63. package/dist/audit/index.d.ts.map +1 -0
  64. package/dist/audit/index.js +16 -0
  65. package/dist/audit/index.js.map +1 -0
  66. package/dist/auth/adapters/argon2id-hasher.d.ts +15 -0
  67. package/dist/auth/adapters/argon2id-hasher.d.ts.map +1 -0
  68. package/dist/auth/adapters/argon2id-hasher.js +61 -0
  69. package/dist/auth/adapters/argon2id-hasher.js.map +1 -0
  70. package/dist/auth/adapters/in-memory-stores.d.ts +14 -0
  71. package/dist/auth/adapters/in-memory-stores.d.ts.map +1 -0
  72. package/dist/auth/adapters/in-memory-stores.js +78 -0
  73. package/dist/auth/adapters/in-memory-stores.js.map +1 -0
  74. package/dist/auth/core/auth-service.d.ts +40 -0
  75. package/dist/auth/core/auth-service.d.ts.map +1 -0
  76. package/dist/auth/core/auth-service.js +106 -0
  77. package/dist/auth/core/auth-service.js.map +1 -0
  78. package/dist/auth/core/credentials.d.ts +15 -0
  79. package/dist/auth/core/credentials.d.ts.map +1 -0
  80. package/dist/auth/core/credentials.js +15 -0
  81. package/dist/auth/core/credentials.js.map +1 -0
  82. package/dist/auth/core/crypto-util.d.ts +7 -0
  83. package/dist/auth/core/crypto-util.d.ts.map +1 -0
  84. package/dist/auth/core/crypto-util.js +15 -0
  85. package/dist/auth/core/crypto-util.js.map +1 -0
  86. package/dist/auth/core/errors.d.ts +33 -0
  87. package/dist/auth/core/errors.d.ts.map +1 -0
  88. package/dist/auth/core/errors.js +48 -0
  89. package/dist/auth/core/errors.js.map +1 -0
  90. package/dist/auth/core/jwt.d.ts +5 -0
  91. package/dist/auth/core/jwt.d.ts.map +1 -0
  92. package/dist/auth/core/jwt.js +40 -0
  93. package/dist/auth/core/jwt.js.map +1 -0
  94. package/dist/auth/core/ports.d.ts +95 -0
  95. package/dist/auth/core/ports.d.ts.map +1 -0
  96. package/dist/auth/core/ports.js +7 -0
  97. package/dist/auth/core/ports.js.map +1 -0
  98. package/dist/auth/core/single-use.d.ts +10 -0
  99. package/dist/auth/core/single-use.d.ts.map +1 -0
  100. package/dist/auth/core/single-use.js +47 -0
  101. package/dist/auth/core/single-use.js.map +1 -0
  102. package/dist/auth/core/tokens.d.ts +14 -0
  103. package/dist/auth/core/tokens.d.ts.map +1 -0
  104. package/dist/auth/core/tokens.js +85 -0
  105. package/dist/auth/core/tokens.js.map +1 -0
  106. package/dist/auth/index.d.ts +18 -0
  107. package/dist/auth/index.d.ts.map +1 -0
  108. package/dist/auth/index.js +22 -0
  109. package/dist/auth/index.js.map +1 -0
  110. package/dist/auth/nestjs/auth.module.d.ts +17 -0
  111. package/dist/auth/nestjs/auth.module.d.ts.map +1 -0
  112. package/dist/auth/nestjs/auth.module.js +18 -0
  113. package/dist/auth/nestjs/auth.module.js.map +1 -0
  114. package/dist/cache/adapters/in-memory-store.d.ts +6 -0
  115. package/dist/cache/adapters/in-memory-store.d.ts.map +1 -0
  116. package/dist/cache/adapters/in-memory-store.js +65 -0
  117. package/dist/cache/adapters/in-memory-store.js.map +1 -0
  118. package/dist/cache/adapters/redis-store.d.ts +32 -0
  119. package/dist/cache/adapters/redis-store.d.ts.map +1 -0
  120. package/dist/cache/adapters/redis-store.js +59 -0
  121. package/dist/cache/adapters/redis-store.js.map +1 -0
  122. package/dist/cache/core/cache.d.ts +31 -0
  123. package/dist/cache/core/cache.d.ts.map +1 -0
  124. package/dist/cache/core/cache.js +89 -0
  125. package/dist/cache/core/cache.js.map +1 -0
  126. package/dist/cache/core/errors.d.ts +17 -0
  127. package/dist/cache/core/errors.d.ts.map +1 -0
  128. package/dist/cache/core/errors.js +27 -0
  129. package/dist/cache/core/errors.js.map +1 -0
  130. package/dist/cache/core/lock.d.ts +21 -0
  131. package/dist/cache/core/lock.d.ts.map +1 -0
  132. package/dist/cache/core/lock.js +47 -0
  133. package/dist/cache/core/lock.js.map +1 -0
  134. package/dist/cache/core/ports.d.ts +33 -0
  135. package/dist/cache/core/ports.d.ts.map +1 -0
  136. package/dist/cache/core/ports.js +6 -0
  137. package/dist/cache/core/ports.js.map +1 -0
  138. package/dist/cache/core/pubsub.d.ts +14 -0
  139. package/dist/cache/core/pubsub.d.ts.map +1 -0
  140. package/dist/cache/core/pubsub.js +13 -0
  141. package/dist/cache/core/pubsub.js.map +1 -0
  142. package/dist/cache/core/serializer.d.ts +4 -0
  143. package/dist/cache/core/serializer.d.ts.map +1 -0
  144. package/dist/cache/core/serializer.js +6 -0
  145. package/dist/cache/core/serializer.js.map +1 -0
  146. package/dist/cache/index.d.ts +14 -0
  147. package/dist/cache/index.d.ts.map +1 -0
  148. package/dist/cache/index.js +19 -0
  149. package/dist/cache/index.js.map +1 -0
  150. package/dist/config/adapters/reporters.d.ts +17 -0
  151. package/dist/config/adapters/reporters.d.ts.map +1 -0
  152. package/dist/config/adapters/reporters.js +35 -0
  153. package/dist/config/adapters/reporters.js.map +1 -0
  154. package/dist/config/adapters/secret-resolvers.d.ts +21 -0
  155. package/dist/config/adapters/secret-resolvers.d.ts.map +1 -0
  156. package/dist/config/adapters/secret-resolvers.js +60 -0
  157. package/dist/config/adapters/secret-resolvers.js.map +1 -0
  158. package/dist/config/adapters/zod-schema.d.ts +20 -0
  159. package/dist/config/adapters/zod-schema.d.ts.map +1 -0
  160. package/dist/config/adapters/zod-schema.js +35 -0
  161. package/dist/config/adapters/zod-schema.js.map +1 -0
  162. package/dist/config/core/env-loader.d.ts +47 -0
  163. package/dist/config/core/env-loader.d.ts.map +1 -0
  164. package/dist/config/core/env-loader.js +155 -0
  165. package/dist/config/core/env-loader.js.map +1 -0
  166. package/dist/config/core/errors.d.ts +34 -0
  167. package/dist/config/core/errors.d.ts.map +1 -0
  168. package/dist/config/core/errors.js +49 -0
  169. package/dist/config/core/errors.js.map +1 -0
  170. package/dist/config/core/freeze.d.ts +7 -0
  171. package/dist/config/core/freeze.d.ts.map +1 -0
  172. package/dist/config/core/freeze.js +20 -0
  173. package/dist/config/core/freeze.js.map +1 -0
  174. package/dist/config/core/load-config.d.ts +43 -0
  175. package/dist/config/core/load-config.d.ts.map +1 -0
  176. package/dist/config/core/load-config.js +74 -0
  177. package/dist/config/core/load-config.js.map +1 -0
  178. package/dist/config/core/merge.d.ts +19 -0
  179. package/dist/config/core/merge.d.ts.map +1 -0
  180. package/dist/config/core/merge.js +31 -0
  181. package/dist/config/core/merge.js.map +1 -0
  182. package/dist/config/core/ports.d.ts +58 -0
  183. package/dist/config/core/ports.d.ts.map +1 -0
  184. package/dist/config/core/ports.js +2 -0
  185. package/dist/config/core/ports.js.map +1 -0
  186. package/dist/config/core/secret-resolver.d.ts +16 -0
  187. package/dist/config/core/secret-resolver.d.ts.map +1 -0
  188. package/dist/config/core/secret-resolver.js +73 -0
  189. package/dist/config/core/secret-resolver.js.map +1 -0
  190. package/dist/config/core/secret.d.ts +21 -0
  191. package/dist/config/core/secret.d.ts.map +1 -0
  192. package/dist/config/core/secret.js +40 -0
  193. package/dist/config/core/secret.js.map +1 -0
  194. package/dist/config/index.d.ts +16 -0
  195. package/dist/config/index.d.ts.map +1 -0
  196. package/dist/config/index.js +23 -0
  197. package/dist/config/index.js.map +1 -0
  198. package/dist/config/nestjs/config-kit.module.d.ts +37 -0
  199. package/dist/config/nestjs/config-kit.module.d.ts.map +1 -0
  200. package/dist/config/nestjs/config-kit.module.js +24 -0
  201. package/dist/config/nestjs/config-kit.module.js.map +1 -0
  202. package/dist/http/adapters/zod-schema.d.ts +11 -0
  203. package/dist/http/adapters/zod-schema.d.ts.map +1 -0
  204. package/dist/http/adapters/zod-schema.js +74 -0
  205. package/dist/http/adapters/zod-schema.js.map +1 -0
  206. package/dist/http/core/context.d.ts +25 -0
  207. package/dist/http/core/context.d.ts.map +1 -0
  208. package/dist/http/core/context.js +60 -0
  209. package/dist/http/core/context.js.map +1 -0
  210. package/dist/http/core/errors.d.ts +41 -0
  211. package/dist/http/core/errors.d.ts.map +1 -0
  212. package/dist/http/core/errors.js +99 -0
  213. package/dist/http/core/errors.js.map +1 -0
  214. package/dist/http/core/kernel.d.ts +54 -0
  215. package/dist/http/core/kernel.d.ts.map +1 -0
  216. package/dist/http/core/kernel.js +122 -0
  217. package/dist/http/core/kernel.js.map +1 -0
  218. package/dist/http/core/openapi.d.ts +37 -0
  219. package/dist/http/core/openapi.d.ts.map +1 -0
  220. package/dist/http/core/openapi.js +99 -0
  221. package/dist/http/core/openapi.js.map +1 -0
  222. package/dist/http/core/pagination.d.ts +17 -0
  223. package/dist/http/core/pagination.d.ts.map +1 -0
  224. package/dist/http/core/pagination.js +108 -0
  225. package/dist/http/core/pagination.js.map +1 -0
  226. package/dist/http/core/ports.d.ts +106 -0
  227. package/dist/http/core/ports.d.ts.map +1 -0
  228. package/dist/http/core/ports.js +6 -0
  229. package/dist/http/core/ports.js.map +1 -0
  230. package/dist/http/core/redaction.d.ts +8 -0
  231. package/dist/http/core/redaction.d.ts.map +1 -0
  232. package/dist/http/core/redaction.js +45 -0
  233. package/dist/http/core/redaction.js.map +1 -0
  234. package/dist/http/core/router.d.ts +37 -0
  235. package/dist/http/core/router.d.ts.map +1 -0
  236. package/dist/http/core/router.js +120 -0
  237. package/dist/http/core/router.js.map +1 -0
  238. package/dist/http/core/security.d.ts +43 -0
  239. package/dist/http/core/security.d.ts.map +1 -0
  240. package/dist/http/core/security.js +66 -0
  241. package/dist/http/core/security.js.map +1 -0
  242. package/dist/http/core/validation.d.ts +9 -0
  243. package/dist/http/core/validation.d.ts.map +1 -0
  244. package/dist/http/core/validation.js +36 -0
  245. package/dist/http/core/validation.js.map +1 -0
  246. package/dist/http/index.d.ts +20 -0
  247. package/dist/http/index.d.ts.map +1 -0
  248. package/dist/http/index.js +29 -0
  249. package/dist/http/index.js.map +1 -0
  250. package/dist/http/nestjs/http-kernel.module.d.ts +37 -0
  251. package/dist/http/nestjs/http-kernel.module.d.ts.map +1 -0
  252. package/dist/http/nestjs/http-kernel.module.js +77 -0
  253. package/dist/http/nestjs/http-kernel.module.js.map +1 -0
  254. package/dist/http/nodejs/http-adapter.d.ts +11 -0
  255. package/dist/http/nodejs/http-adapter.d.ts.map +1 -0
  256. package/dist/http/nodejs/http-adapter.js +60 -0
  257. package/dist/http/nodejs/http-adapter.js.map +1 -0
  258. package/dist/i18n/core/catalog.d.ts +23 -0
  259. package/dist/i18n/core/catalog.d.ts.map +1 -0
  260. package/dist/i18n/core/catalog.js +31 -0
  261. package/dist/i18n/core/catalog.js.map +1 -0
  262. package/dist/i18n/core/errors.d.ts +14 -0
  263. package/dist/i18n/core/errors.d.ts.map +1 -0
  264. package/dist/i18n/core/errors.js +22 -0
  265. package/dist/i18n/core/errors.js.map +1 -0
  266. package/dist/i18n/core/i18n.d.ts +20 -0
  267. package/dist/i18n/core/i18n.d.ts.map +1 -0
  268. package/dist/i18n/core/i18n.js +48 -0
  269. package/dist/i18n/core/i18n.js.map +1 -0
  270. package/dist/i18n/core/message.d.ts +8 -0
  271. package/dist/i18n/core/message.d.ts.map +1 -0
  272. package/dist/i18n/core/message.js +38 -0
  273. package/dist/i18n/core/message.js.map +1 -0
  274. package/dist/i18n/core/negotiate.d.ts +13 -0
  275. package/dist/i18n/core/negotiate.d.ts.map +1 -0
  276. package/dist/i18n/core/negotiate.js +46 -0
  277. package/dist/i18n/core/negotiate.js.map +1 -0
  278. package/dist/i18n/core/ports.d.ts +35 -0
  279. package/dist/i18n/core/ports.d.ts.map +1 -0
  280. package/dist/i18n/core/ports.js +6 -0
  281. package/dist/i18n/core/ports.js.map +1 -0
  282. package/dist/i18n/index.d.ts +14 -0
  283. package/dist/i18n/index.d.ts.map +1 -0
  284. package/dist/i18n/index.js +18 -0
  285. package/dist/i18n/index.js.map +1 -0
  286. package/dist/i18n/nestjs/i18n.module.d.ts +16 -0
  287. package/dist/i18n/nestjs/i18n.module.d.ts.map +1 -0
  288. package/dist/i18n/nestjs/i18n.module.js +17 -0
  289. package/dist/i18n/nestjs/i18n.module.js.map +1 -0
  290. package/dist/index.d.ts +31 -0
  291. package/dist/index.d.ts.map +1 -0
  292. package/dist/index.js +31 -0
  293. package/dist/index.js.map +1 -0
  294. package/dist/jobs/adapters/in-memory-idempotency.d.ts +9 -0
  295. package/dist/jobs/adapters/in-memory-idempotency.d.ts.map +1 -0
  296. package/dist/jobs/adapters/in-memory-idempotency.js +34 -0
  297. package/dist/jobs/adapters/in-memory-idempotency.js.map +1 -0
  298. package/dist/jobs/adapters/in-memory-queue-store.d.ts +7 -0
  299. package/dist/jobs/adapters/in-memory-queue-store.d.ts.map +1 -0
  300. package/dist/jobs/adapters/in-memory-queue-store.js +70 -0
  301. package/dist/jobs/adapters/in-memory-queue-store.js.map +1 -0
  302. package/dist/jobs/adapters/redis-queue-store.d.ts +28 -0
  303. package/dist/jobs/adapters/redis-queue-store.d.ts.map +1 -0
  304. package/dist/jobs/adapters/redis-queue-store.js +86 -0
  305. package/dist/jobs/adapters/redis-queue-store.js.map +1 -0
  306. package/dist/jobs/core/backoff.d.ts +15 -0
  307. package/dist/jobs/core/backoff.d.ts.map +1 -0
  308. package/dist/jobs/core/backoff.js +20 -0
  309. package/dist/jobs/core/backoff.js.map +1 -0
  310. package/dist/jobs/core/cron.d.ts +13 -0
  311. package/dist/jobs/core/cron.d.ts.map +1 -0
  312. package/dist/jobs/core/cron.js +101 -0
  313. package/dist/jobs/core/cron.js.map +1 -0
  314. package/dist/jobs/core/errors.d.ts +18 -0
  315. package/dist/jobs/core/errors.d.ts.map +1 -0
  316. package/dist/jobs/core/errors.js +30 -0
  317. package/dist/jobs/core/errors.js.map +1 -0
  318. package/dist/jobs/core/ports.d.ts +80 -0
  319. package/dist/jobs/core/ports.d.ts.map +1 -0
  320. package/dist/jobs/core/ports.js +6 -0
  321. package/dist/jobs/core/ports.js.map +1 -0
  322. package/dist/jobs/core/queue.d.ts +16 -0
  323. package/dist/jobs/core/queue.d.ts.map +1 -0
  324. package/dist/jobs/core/queue.js +29 -0
  325. package/dist/jobs/core/queue.js.map +1 -0
  326. package/dist/jobs/core/registry.d.ts +4 -0
  327. package/dist/jobs/core/registry.d.ts.map +1 -0
  328. package/dist/jobs/core/registry.js +11 -0
  329. package/dist/jobs/core/registry.js.map +1 -0
  330. package/dist/jobs/core/scheduler.d.ts +30 -0
  331. package/dist/jobs/core/scheduler.d.ts.map +1 -0
  332. package/dist/jobs/core/scheduler.js +53 -0
  333. package/dist/jobs/core/scheduler.js.map +1 -0
  334. package/dist/jobs/core/serializer.d.ts +3 -0
  335. package/dist/jobs/core/serializer.d.ts.map +1 -0
  336. package/dist/jobs/core/serializer.js +5 -0
  337. package/dist/jobs/core/serializer.js.map +1 -0
  338. package/dist/jobs/core/worker.d.ts +28 -0
  339. package/dist/jobs/core/worker.d.ts.map +1 -0
  340. package/dist/jobs/core/worker.js +118 -0
  341. package/dist/jobs/core/worker.js.map +1 -0
  342. package/dist/jobs/index.d.ts +18 -0
  343. package/dist/jobs/index.d.ts.map +1 -0
  344. package/dist/jobs/index.js +23 -0
  345. package/dist/jobs/index.js.map +1 -0
  346. package/dist/mailer/adapters/dev-inbox.d.ts +17 -0
  347. package/dist/mailer/adapters/dev-inbox.d.ts.map +1 -0
  348. package/dist/mailer/adapters/dev-inbox.js +29 -0
  349. package/dist/mailer/adapters/dev-inbox.js.map +1 -0
  350. package/dist/mailer/adapters/i18n-renderer.d.ts +13 -0
  351. package/dist/mailer/adapters/i18n-renderer.d.ts.map +1 -0
  352. package/dist/mailer/adapters/i18n-renderer.js +27 -0
  353. package/dist/mailer/adapters/i18n-renderer.js.map +1 -0
  354. package/dist/mailer/adapters/in-memory-templates.d.ts +6 -0
  355. package/dist/mailer/adapters/in-memory-templates.d.ts.map +1 -0
  356. package/dist/mailer/adapters/in-memory-templates.js +6 -0
  357. package/dist/mailer/adapters/in-memory-templates.js.map +1 -0
  358. package/dist/mailer/adapters/transports.d.ts +19 -0
  359. package/dist/mailer/adapters/transports.d.ts.map +1 -0
  360. package/dist/mailer/adapters/transports.js +38 -0
  361. package/dist/mailer/adapters/transports.js.map +1 -0
  362. package/dist/mailer/core/errors.d.ts +23 -0
  363. package/dist/mailer/core/errors.d.ts.map +1 -0
  364. package/dist/mailer/core/errors.js +40 -0
  365. package/dist/mailer/core/errors.js.map +1 -0
  366. package/dist/mailer/core/failover.d.ts +3 -0
  367. package/dist/mailer/core/failover.d.ts.map +1 -0
  368. package/dist/mailer/core/failover.js +30 -0
  369. package/dist/mailer/core/failover.js.map +1 -0
  370. package/dist/mailer/core/mailer.d.ts +25 -0
  371. package/dist/mailer/core/mailer.d.ts.map +1 -0
  372. package/dist/mailer/core/mailer.js +61 -0
  373. package/dist/mailer/core/mailer.js.map +1 -0
  374. package/dist/mailer/core/ports.d.ts +54 -0
  375. package/dist/mailer/core/ports.d.ts.map +1 -0
  376. package/dist/mailer/core/ports.js +6 -0
  377. package/dist/mailer/core/ports.js.map +1 -0
  378. package/dist/mailer/core/render.d.ts +4 -0
  379. package/dist/mailer/core/render.d.ts.map +1 -0
  380. package/dist/mailer/core/render.js +29 -0
  381. package/dist/mailer/core/render.js.map +1 -0
  382. package/dist/mailer/index.d.ts +17 -0
  383. package/dist/mailer/index.d.ts.map +1 -0
  384. package/dist/mailer/index.js +21 -0
  385. package/dist/mailer/index.js.map +1 -0
  386. package/dist/mailer/nestjs/mailer.module.d.ts +17 -0
  387. package/dist/mailer/nestjs/mailer.module.d.ts.map +1 -0
  388. package/dist/mailer/nestjs/mailer.module.js +15 -0
  389. package/dist/mailer/nestjs/mailer.module.js.map +1 -0
  390. package/dist/observability/core/context.d.ts +9 -0
  391. package/dist/observability/core/context.d.ts.map +1 -0
  392. package/dist/observability/core/context.js +15 -0
  393. package/dist/observability/core/context.js.map +1 -0
  394. package/dist/observability/core/health.d.ts +40 -0
  395. package/dist/observability/core/health.d.ts.map +1 -0
  396. package/dist/observability/core/health.js +51 -0
  397. package/dist/observability/core/health.js.map +1 -0
  398. package/dist/observability/core/logger.d.ts +22 -0
  399. package/dist/observability/core/logger.d.ts.map +1 -0
  400. package/dist/observability/core/logger.js +45 -0
  401. package/dist/observability/core/logger.js.map +1 -0
  402. package/dist/observability/core/metrics.d.ts +63 -0
  403. package/dist/observability/core/metrics.d.ts.map +1 -0
  404. package/dist/observability/core/metrics.js +172 -0
  405. package/dist/observability/core/metrics.js.map +1 -0
  406. package/dist/observability/core/redaction.d.ts +10 -0
  407. package/dist/observability/core/redaction.d.ts.map +1 -0
  408. package/dist/observability/core/redaction.js +48 -0
  409. package/dist/observability/core/redaction.js.map +1 -0
  410. package/dist/observability/core/tracing.d.ts +52 -0
  411. package/dist/observability/core/tracing.d.ts.map +1 -0
  412. package/dist/observability/core/tracing.js +88 -0
  413. package/dist/observability/core/tracing.js.map +1 -0
  414. package/dist/observability/index.d.ts +14 -0
  415. package/dist/observability/index.d.ts.map +1 -0
  416. package/dist/observability/index.js +19 -0
  417. package/dist/observability/index.js.map +1 -0
  418. package/dist/observability/nestjs/observability.module.d.ts +35 -0
  419. package/dist/observability/nestjs/observability.module.d.ts.map +1 -0
  420. package/dist/observability/nestjs/observability.module.js +87 -0
  421. package/dist/observability/nestjs/observability.module.js.map +1 -0
  422. package/dist/persistence/adapters/in-memory-driver.d.ts +18 -0
  423. package/dist/persistence/adapters/in-memory-driver.d.ts.map +1 -0
  424. package/dist/persistence/adapters/in-memory-driver.js +229 -0
  425. package/dist/persistence/adapters/in-memory-driver.js.map +1 -0
  426. package/dist/persistence/adapters/pg-driver.d.ts +21 -0
  427. package/dist/persistence/adapters/pg-driver.d.ts.map +1 -0
  428. package/dist/persistence/adapters/pg-driver.js +42 -0
  429. package/dist/persistence/adapters/pg-driver.js.map +1 -0
  430. package/dist/persistence/adapters/testcontainer-harness.d.ts +37 -0
  431. package/dist/persistence/adapters/testcontainer-harness.d.ts.map +1 -0
  432. package/dist/persistence/adapters/testcontainer-harness.js +79 -0
  433. package/dist/persistence/adapters/testcontainer-harness.js.map +1 -0
  434. package/dist/persistence/core/errors.d.ts +36 -0
  435. package/dist/persistence/core/errors.d.ts.map +1 -0
  436. package/dist/persistence/core/errors.js +58 -0
  437. package/dist/persistence/core/errors.js.map +1 -0
  438. package/dist/persistence/core/migrations.d.ts +16 -0
  439. package/dist/persistence/core/migrations.d.ts.map +1 -0
  440. package/dist/persistence/core/migrations.js +95 -0
  441. package/dist/persistence/core/migrations.js.map +1 -0
  442. package/dist/persistence/core/pool.d.ts +4 -0
  443. package/dist/persistence/core/pool.d.ts.map +1 -0
  444. package/dist/persistence/core/pool.js +180 -0
  445. package/dist/persistence/core/pool.js.map +1 -0
  446. package/dist/persistence/core/ports.d.ts +91 -0
  447. package/dist/persistence/core/ports.d.ts.map +1 -0
  448. package/dist/persistence/core/ports.js +6 -0
  449. package/dist/persistence/core/ports.js.map +1 -0
  450. package/dist/persistence/core/repository.d.ts +18 -0
  451. package/dist/persistence/core/repository.d.ts.map +1 -0
  452. package/dist/persistence/core/repository.js +113 -0
  453. package/dist/persistence/core/repository.js.map +1 -0
  454. package/dist/persistence/core/sql.d.ts +13 -0
  455. package/dist/persistence/core/sql.d.ts.map +1 -0
  456. package/dist/persistence/core/sql.js +35 -0
  457. package/dist/persistence/core/sql.js.map +1 -0
  458. package/dist/persistence/index.d.ts +14 -0
  459. package/dist/persistence/index.d.ts.map +1 -0
  460. package/dist/persistence/index.js +22 -0
  461. package/dist/persistence/index.js.map +1 -0
  462. package/dist/persistence/pg.d.ts +7 -0
  463. package/dist/persistence/pg.d.ts.map +1 -0
  464. package/dist/persistence/pg.js +7 -0
  465. package/dist/persistence/pg.js.map +1 -0
  466. package/dist/privacy/adapters/audit-sink.d.ts +19 -0
  467. package/dist/privacy/adapters/audit-sink.d.ts.map +1 -0
  468. package/dist/privacy/adapters/audit-sink.js +13 -0
  469. package/dist/privacy/adapters/audit-sink.js.map +1 -0
  470. package/dist/privacy/adapters/in-memory-consent-store.d.ts +7 -0
  471. package/dist/privacy/adapters/in-memory-consent-store.d.ts.map +1 -0
  472. package/dist/privacy/adapters/in-memory-consent-store.js +18 -0
  473. package/dist/privacy/adapters/in-memory-consent-store.js.map +1 -0
  474. package/dist/privacy/adapters/pg-consent-store.d.ts +26 -0
  475. package/dist/privacy/adapters/pg-consent-store.d.ts.map +1 -0
  476. package/dist/privacy/adapters/pg-consent-store.js +43 -0
  477. package/dist/privacy/adapters/pg-consent-store.js.map +1 -0
  478. package/dist/privacy/core/consent.d.ts +35 -0
  479. package/dist/privacy/core/consent.d.ts.map +1 -0
  480. package/dist/privacy/core/consent.js +49 -0
  481. package/dist/privacy/core/consent.js.map +1 -0
  482. package/dist/privacy/core/erasure.d.ts +22 -0
  483. package/dist/privacy/core/erasure.d.ts.map +1 -0
  484. package/dist/privacy/core/erasure.js +35 -0
  485. package/dist/privacy/core/erasure.js.map +1 -0
  486. package/dist/privacy/core/errors.d.ts +18 -0
  487. package/dist/privacy/core/errors.d.ts.map +1 -0
  488. package/dist/privacy/core/errors.js +30 -0
  489. package/dist/privacy/core/errors.js.map +1 -0
  490. package/dist/privacy/core/export.d.ts +20 -0
  491. package/dist/privacy/core/export.d.ts.map +1 -0
  492. package/dist/privacy/core/export.js +30 -0
  493. package/dist/privacy/core/export.js.map +1 -0
  494. package/dist/privacy/core/ports.d.ts +48 -0
  495. package/dist/privacy/core/ports.d.ts.map +1 -0
  496. package/dist/privacy/core/ports.js +6 -0
  497. package/dist/privacy/core/ports.js.map +1 -0
  498. package/dist/privacy/core/registry.d.ts +17 -0
  499. package/dist/privacy/core/registry.d.ts.map +1 -0
  500. package/dist/privacy/core/registry.js +31 -0
  501. package/dist/privacy/core/registry.js.map +1 -0
  502. package/dist/privacy/index.d.ts +16 -0
  503. package/dist/privacy/index.d.ts.map +1 -0
  504. package/dist/privacy/index.js +21 -0
  505. package/dist/privacy/index.js.map +1 -0
  506. package/dist/rate-limit/adapters/in-memory-store.d.ts +7 -0
  507. package/dist/rate-limit/adapters/in-memory-store.d.ts.map +1 -0
  508. package/dist/rate-limit/adapters/in-memory-store.js +50 -0
  509. package/dist/rate-limit/adapters/in-memory-store.js.map +1 -0
  510. package/dist/rate-limit/adapters/redis-store.d.ts +11 -0
  511. package/dist/rate-limit/adapters/redis-store.d.ts.map +1 -0
  512. package/dist/rate-limit/adapters/redis-store.js +93 -0
  513. package/dist/rate-limit/adapters/redis-store.js.map +1 -0
  514. package/dist/rate-limit/core/enforcer.d.ts +23 -0
  515. package/dist/rate-limit/core/enforcer.d.ts.map +1 -0
  516. package/dist/rate-limit/core/enforcer.js +27 -0
  517. package/dist/rate-limit/core/enforcer.js.map +1 -0
  518. package/dist/rate-limit/core/errors.d.ts +19 -0
  519. package/dist/rate-limit/core/errors.d.ts.map +1 -0
  520. package/dist/rate-limit/core/errors.js +32 -0
  521. package/dist/rate-limit/core/errors.js.map +1 -0
  522. package/dist/rate-limit/core/ports.d.ts +50 -0
  523. package/dist/rate-limit/core/ports.d.ts.map +1 -0
  524. package/dist/rate-limit/core/ports.js +6 -0
  525. package/dist/rate-limit/core/ports.js.map +1 -0
  526. package/dist/rate-limit/core/sliding-window.d.ts +9 -0
  527. package/dist/rate-limit/core/sliding-window.d.ts.map +1 -0
  528. package/dist/rate-limit/core/sliding-window.js +24 -0
  529. package/dist/rate-limit/core/sliding-window.js.map +1 -0
  530. package/dist/rate-limit/core/token-bucket.d.ts +9 -0
  531. package/dist/rate-limit/core/token-bucket.d.ts.map +1 -0
  532. package/dist/rate-limit/core/token-bucket.js +24 -0
  533. package/dist/rate-limit/core/token-bucket.js.map +1 -0
  534. package/dist/rate-limit/index.d.ts +15 -0
  535. package/dist/rate-limit/index.d.ts.map +1 -0
  536. package/dist/rate-limit/index.js +19 -0
  537. package/dist/rate-limit/index.js.map +1 -0
  538. package/dist/rate-limit/nestjs/rate-limit.module.d.ts +25 -0
  539. package/dist/rate-limit/nestjs/rate-limit.module.d.ts.map +1 -0
  540. package/dist/rate-limit/nestjs/rate-limit.module.js +63 -0
  541. package/dist/rate-limit/nestjs/rate-limit.module.js.map +1 -0
  542. package/dist/rate-limit/nodejs/middleware.d.ts +16 -0
  543. package/dist/rate-limit/nodejs/middleware.d.ts.map +1 -0
  544. package/dist/rate-limit/nodejs/middleware.js +26 -0
  545. package/dist/rate-limit/nodejs/middleware.js.map +1 -0
  546. package/dist/test-kit/adapters/infra-bootstrap.d.ts +40 -0
  547. package/dist/test-kit/adapters/infra-bootstrap.d.ts.map +1 -0
  548. package/dist/test-kit/adapters/infra-bootstrap.js +64 -0
  549. package/dist/test-kit/adapters/infra-bootstrap.js.map +1 -0
  550. package/dist/test-kit/core/contract.d.ts +49 -0
  551. package/dist/test-kit/core/contract.d.ts.map +1 -0
  552. package/dist/test-kit/core/contract.js +52 -0
  553. package/dist/test-kit/core/contract.js.map +1 -0
  554. package/dist/test-kit/core/errors.d.ts +12 -0
  555. package/dist/test-kit/core/errors.d.ts.map +1 -0
  556. package/dist/test-kit/core/errors.js +19 -0
  557. package/dist/test-kit/core/errors.js.map +1 -0
  558. package/dist/test-kit/core/factories.d.ts +24 -0
  559. package/dist/test-kit/core/factories.d.ts.map +1 -0
  560. package/dist/test-kit/core/factories.js +57 -0
  561. package/dist/test-kit/core/factories.js.map +1 -0
  562. package/dist/test-kit/core/http-client.d.ts +46 -0
  563. package/dist/test-kit/core/http-client.d.ts.map +1 -0
  564. package/dist/test-kit/core/http-client.js +63 -0
  565. package/dist/test-kit/core/http-client.js.map +1 -0
  566. package/dist/test-kit/index.d.ts +10 -0
  567. package/dist/test-kit/index.d.ts.map +1 -0
  568. package/dist/test-kit/index.js +14 -0
  569. package/dist/test-kit/index.js.map +1 -0
  570. package/dist/test-kit/infra.d.ts +6 -0
  571. package/dist/test-kit/infra.d.ts.map +1 -0
  572. package/dist/test-kit/infra.js +6 -0
  573. package/dist/test-kit/infra.js.map +1 -0
  574. package/package.json +170 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Dep-vrije in-memory adapters (dev/tests): een {@link CacheStore} met TTL-verval (via injecteerbare
3
+ * clock) en een {@link PubSubStore} op basis van een event-emitter.
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ export function inMemoryCacheStore(options = {}) {
7
+ const clock = options.clock ?? Date.now;
8
+ const map = new Map();
9
+ const live = (key) => {
10
+ const entry = map.get(key);
11
+ if (!entry)
12
+ return undefined;
13
+ if (entry.expiresAt !== undefined && clock() > entry.expiresAt) {
14
+ map.delete(key);
15
+ return undefined;
16
+ }
17
+ return entry;
18
+ };
19
+ return {
20
+ async get(key) {
21
+ return live(key)?.value ?? null;
22
+ },
23
+ async set(key, value, ttlMs) {
24
+ map.set(key, ttlMs !== undefined ? { value, expiresAt: clock() + ttlMs } : { value });
25
+ },
26
+ async del(key) {
27
+ map.delete(key);
28
+ },
29
+ async has(key) {
30
+ return live(key) !== undefined;
31
+ },
32
+ async setIfAbsent(key, value, ttlMs) {
33
+ if (live(key))
34
+ return false;
35
+ map.set(key, { value, expiresAt: clock() + ttlMs });
36
+ return true;
37
+ },
38
+ async deleteIfMatch(key, value) {
39
+ const entry = live(key);
40
+ if (entry && entry.value === value) {
41
+ map.delete(key);
42
+ return true;
43
+ }
44
+ return false;
45
+ },
46
+ };
47
+ }
48
+ export function inMemoryPubSub() {
49
+ const emitter = new EventEmitter();
50
+ emitter.setMaxListeners(0);
51
+ return {
52
+ async publish(channel, message) {
53
+ emitter.emit(channel, message);
54
+ },
55
+ async subscribe(channel, handler) {
56
+ emitter.on(channel, handler);
57
+ return {
58
+ async unsubscribe() {
59
+ emitter.off(channel, handler);
60
+ },
61
+ };
62
+ },
63
+ };
64
+ }
65
+ //# sourceMappingURL=in-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../../../src/cache/adapters/in-memory-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,UAAU,kBAAkB,CAAC,UAA6B,EAAE;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiB,CAAC;IAErC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAqB,EAAE;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YAC/D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK;YACjC,IAAI,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;YAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO;YAC9B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO;gBACL,KAAK,CAAC,WAAW;oBACf,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChC,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Redis-adapters (productie). Werken tegen structurele client-interfaces (compatibel met ioredis),
3
+ * zodat de kit niet hard aan één redis-lib hangt. De cache-store gebruikt `SET ... PX/NX` en een
4
+ * Lua-script voor veilige (atomaire) lock-release. Pub/sub gebruikt een dedicated subscriber-client.
5
+ */
6
+ import type { CacheStore, PubSubStore } from '../core/ports.js';
7
+ /** Minimale Redis-client voor de cache-store (compatibel met ioredis). */
8
+ export interface RedisCacheClient {
9
+ get(key: string): Promise<string | null>;
10
+ set(key: string, value: string, ...args: (string | number)[]): Promise<unknown>;
11
+ del(...keys: string[]): Promise<number>;
12
+ exists(...keys: string[]): Promise<number>;
13
+ eval(script: string, numKeys: number, ...args: (string | number)[]): Promise<unknown>;
14
+ }
15
+ export declare function redisCacheStore(client: RedisCacheClient): CacheStore;
16
+ export interface RedisPublisherClient {
17
+ publish(channel: string, message: string): Promise<number>;
18
+ }
19
+ export interface RedisSubscriberClient {
20
+ subscribe(...channels: string[]): Promise<unknown>;
21
+ unsubscribe(...channels: string[]): Promise<unknown>;
22
+ on(event: 'message', listener: (channel: string, message: string) => void): unknown;
23
+ }
24
+ /**
25
+ * Redis pub/sub. Vereist een dedicated subscriber-client (Redis-subscribe-mode) naast de publisher.
26
+ * ioredis herstelt abonnementen automatisch bij reconnect (US-0704 AC3).
27
+ */
28
+ export declare function redisPubSub(clients: {
29
+ publisher: RedisPublisherClient;
30
+ subscriber: RedisSubscriberClient;
31
+ }): PubSubStore;
32
+ //# sourceMappingURL=redis-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.d.ts","sourceRoot":"","sources":["../../../src/cache/adapters/redis-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhE,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAUD,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAcpE;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;CACrF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,qBAAqB,CAAC;CACnC,GAAG,WAAW,CA+Bd"}
@@ -0,0 +1,59 @@
1
+ // Veilige release: verwijder alleen als de opgeslagen token overeenkomt.
2
+ const DELETE_IF_MATCH = `
3
+ if redis.call('get', KEYS[1]) == ARGV[1] then
4
+ return redis.call('del', KEYS[1])
5
+ else
6
+ return 0
7
+ end`;
8
+ export function redisCacheStore(client) {
9
+ return {
10
+ get: (key) => client.get(key),
11
+ set: async (key, value, ttlMs) => {
12
+ if (ttlMs !== undefined)
13
+ await client.set(key, value, 'PX', ttlMs);
14
+ else
15
+ await client.set(key, value);
16
+ },
17
+ del: async (key) => {
18
+ await client.del(key);
19
+ },
20
+ has: async (key) => (await client.exists(key)) > 0,
21
+ setIfAbsent: async (key, value, ttlMs) => (await client.set(key, value, 'PX', ttlMs, 'NX')) === 'OK',
22
+ deleteIfMatch: async (key, value) => Number(await client.eval(DELETE_IF_MATCH, 1, key, value)) === 1,
23
+ };
24
+ }
25
+ /**
26
+ * Redis pub/sub. Vereist een dedicated subscriber-client (Redis-subscribe-mode) naast de publisher.
27
+ * ioredis herstelt abonnementen automatisch bij reconnect (US-0704 AC3).
28
+ */
29
+ export function redisPubSub(clients) {
30
+ const { publisher, subscriber } = clients;
31
+ const handlers = new Map();
32
+ subscriber.on('message', (channel, message) => {
33
+ handlers.get(channel)?.forEach((handler) => handler(message));
34
+ });
35
+ return {
36
+ async publish(channel, message) {
37
+ await publisher.publish(channel, message);
38
+ },
39
+ async subscribe(channel, handler) {
40
+ let set = handlers.get(channel);
41
+ if (!set) {
42
+ set = new Set();
43
+ handlers.set(channel, set);
44
+ await subscriber.subscribe(channel);
45
+ }
46
+ set.add(handler);
47
+ return {
48
+ async unsubscribe() {
49
+ set.delete(handler);
50
+ if (set.size === 0) {
51
+ handlers.delete(channel);
52
+ await subscriber.unsubscribe(channel);
53
+ }
54
+ },
55
+ };
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=redis-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.js","sourceRoot":"","sources":["../../../src/cache/adapters/redis-store.ts"],"names":[],"mappings":"AAgBA,yEAAyE;AACzE,MAAM,eAAe,GAAG;;;;;IAKpB,CAAC;AAEL,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/B,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;;gBAC9D,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjB,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QAClD,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;QACpG,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;KACrG,CAAC;AACJ,CAAC;AAYD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAG3B;IACC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0C,CAAC;IAEnE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QAC5C,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;YAC5B,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO;YAC9B,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;gBAChB,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjB,OAAO;gBACL,KAAK,CAAC,WAAW;oBACf,GAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACrB,IAAI,GAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACpB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBACzB,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * US-0701 — Getypte cache-API (get/set/del/has) met TTL en namespacing over een pluggable
3
+ * {@link CacheStore}. En US-0702 — `memoize` (cache-aside) met single-flight stampede-bescherming.
4
+ *
5
+ * Namespacing voegt een prefix toe zodat keys van verschillende consumers niet botsen. Bij een
6
+ * store-fout degradeert de cache veilig (miss) of gooit een getypte fout volgens `failMode`; er
7
+ * belandt nooit een ruwe payload of secret in de foutafhandeling.
8
+ */
9
+ import { CacheStoreError } from './errors.js';
10
+ import type { CacheStore, Serializer } from './ports.js';
11
+ export interface CacheOptions {
12
+ /** Prefix per logische ruimte, bv. `users` → fysieke key `users:42`. */
13
+ namespace?: string;
14
+ /** Default-TTL (ms) als een `set`/`memoize` er geen meegeeft. */
15
+ defaultTtlMs?: number;
16
+ serializer?: Serializer;
17
+ /** Gedrag van reads bij een store-fout: `miss` (default) of `throw`. */
18
+ failMode?: 'miss' | 'throw';
19
+ /** Hook voor store-fouten; ontvangt een geredigeerde {@link CacheStoreError} (geen payload). */
20
+ onError?: (error: CacheStoreError) => void;
21
+ }
22
+ export interface Cache {
23
+ get<T>(key: string): Promise<T | null>;
24
+ set<T>(key: string, value: T, ttlMs?: number): Promise<void>;
25
+ del(key: string): Promise<void>;
26
+ has(key: string): Promise<boolean>;
27
+ /** Cache-aside met single-flight: de loader draait bij een miss hooguit één keer per key. */
28
+ memoize<T>(key: string, ttlMs: number, loader: () => Promise<T>): Promise<T>;
29
+ }
30
+ export declare function createCache(store: CacheStore, options?: CacheOptions): Cache;
31
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/cache/core/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,gGAAgG;IAChG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,6FAA6F;IAC7F,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB,GAAG,KAAK,CA2EhF"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * US-0701 — Getypte cache-API (get/set/del/has) met TTL en namespacing over een pluggable
3
+ * {@link CacheStore}. En US-0702 — `memoize` (cache-aside) met single-flight stampede-bescherming.
4
+ *
5
+ * Namespacing voegt een prefix toe zodat keys van verschillende consumers niet botsen. Bij een
6
+ * store-fout degradeert de cache veilig (miss) of gooit een getypte fout volgens `failMode`; er
7
+ * belandt nooit een ruwe payload of secret in de foutafhandeling.
8
+ */
9
+ import { CacheStoreError } from './errors.js';
10
+ import { jsonSerializer } from './serializer.js';
11
+ export function createCache(store, options = {}) {
12
+ const namespace = options.namespace;
13
+ const serializer = options.serializer ?? jsonSerializer;
14
+ const failMode = options.failMode ?? 'miss';
15
+ const inflight = new Map();
16
+ const physical = (key) => (namespace ? `${namespace}:${key}` : key);
17
+ const handleError = () => options.onError?.(new CacheStoreError());
18
+ const cache = {
19
+ async get(key) {
20
+ try {
21
+ const raw = await store.get(physical(key));
22
+ return raw === null ? null : serializer.deserialize(raw);
23
+ }
24
+ catch {
25
+ handleError();
26
+ if (failMode === 'throw')
27
+ throw new CacheStoreError();
28
+ return null;
29
+ }
30
+ },
31
+ async set(key, value, ttlMs) {
32
+ const serialized = serializer.serialize(value);
33
+ if (typeof serialized !== 'string')
34
+ return; // niet-cachebare waarde (bv. undefined)
35
+ try {
36
+ await store.set(physical(key), serialized, ttlMs ?? options.defaultTtlMs);
37
+ }
38
+ catch {
39
+ handleError();
40
+ if (failMode === 'throw')
41
+ throw new CacheStoreError();
42
+ }
43
+ },
44
+ async del(key) {
45
+ try {
46
+ await store.del(physical(key));
47
+ }
48
+ catch {
49
+ handleError();
50
+ if (failMode === 'throw')
51
+ throw new CacheStoreError();
52
+ }
53
+ },
54
+ async has(key) {
55
+ try {
56
+ return await store.has(physical(key));
57
+ }
58
+ catch {
59
+ handleError();
60
+ if (failMode === 'throw')
61
+ throw new CacheStoreError();
62
+ return false;
63
+ }
64
+ },
65
+ async memoize(key, ttlMs, loader) {
66
+ const cached = await cache.get(key);
67
+ if (cached !== null)
68
+ return cached;
69
+ const pk = physical(key);
70
+ let pending = inflight.get(pk);
71
+ if (!pending) {
72
+ pending = (async () => {
73
+ try {
74
+ const value = await loader();
75
+ await cache.set(key, value, ttlMs);
76
+ return value;
77
+ }
78
+ finally {
79
+ inflight.delete(pk); // fout wordt niet gecacht (US-0702 AC3)
80
+ }
81
+ })();
82
+ inflight.set(pk, pending);
83
+ }
84
+ return pending;
85
+ },
86
+ };
87
+ return cache;
88
+ }
89
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/cache/core/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,UAAwB,EAAE;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEpF,MAAM,WAAW,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAU;QACnB,KAAK,CAAC,GAAG,CAAI,GAAW;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAI,GAAG,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC;gBACd,IAAI,QAAQ,KAAK,OAAO;oBAAE,MAAM,IAAI,eAAe,EAAE,CAAC;gBACtD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAc;YAChD,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,OAAO,UAAU,KAAK,QAAQ;gBAAE,OAAO,CAAC,wCAAwC;YACpF,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC;gBACd,IAAI,QAAQ,KAAK,OAAO;oBAAE,MAAM,IAAI,eAAe,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAW;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC;gBACd,IAAI,QAAQ,KAAK,OAAO;oBAAE,MAAM,IAAI,eAAe,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAW;YACnB,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC;gBACd,IAAI,QAAQ,KAAK,OAAO;oBAAE,MAAM,IAAI,eAAe,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,KAAa,EAAE,MAAwB;YACnE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;YAEnC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAA2B,CAAC;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;oBACpB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;wBAC7B,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;wBACnC,OAAO,KAAK,CAAC;oBACf,CAAC;4BAAS,CAAC;wBACT,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,wCAAwC;oBAC/D,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Foutentaxonomie voor cache-kit. Fouten lekken nooit ruwe waarde-payloads of secrets.
3
+ */
4
+ export declare class CacheError extends Error {
5
+ readonly code: string;
6
+ constructor(message: string, code: string);
7
+ }
8
+ /** Store onbereikbaar; bevat geen payload/secret (US-0701 AC3). */
9
+ export declare class CacheStoreError extends CacheError {
10
+ constructor();
11
+ }
12
+ /** De lock kon niet worden verkregen (US-0703). */
13
+ export declare class LockNotAcquiredError extends CacheError {
14
+ readonly key: string;
15
+ constructor(key: string);
16
+ }
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/cache/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1C;AAED,mEAAmE;AACnE,qBAAa,eAAgB,SAAQ,UAAU;;CAI9C;AAED,mDAAmD;AACnD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,GAAG,EAAE,MAAM;CAIxB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Foutentaxonomie voor cache-kit. Fouten lekken nooit ruwe waarde-payloads of secrets.
3
+ */
4
+ export class CacheError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.name = new.target.name;
9
+ this.code = code;
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ }
13
+ /** Store onbereikbaar; bevat geen payload/secret (US-0701 AC3). */
14
+ export class CacheStoreError extends CacheError {
15
+ constructor() {
16
+ super('Cache-store is niet bereikbaar', 'CACHE_STORE_UNAVAILABLE');
17
+ }
18
+ }
19
+ /** De lock kon niet worden verkregen (US-0703). */
20
+ export class LockNotAcquiredError extends CacheError {
21
+ key;
22
+ constructor(key) {
23
+ super(`Lock voor "${key}" kon niet worden verkregen`, 'LOCK_NOT_ACQUIRED');
24
+ this.key = key;
25
+ }
26
+ }
27
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/cache/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C;QACE,KAAK,CAAC,gCAAgC,EAAE,yBAAyB,CAAC,CAAC;IACrE,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IACzC,GAAG,CAAS;IACrB,YAAY,GAAW;QACrB,KAAK,CAAC,cAAc,GAAG,6BAA6B,EAAE,mBAAmB,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { CacheStore } from './ports.js';
2
+ export interface Lock {
3
+ key: string;
4
+ token: string;
5
+ }
6
+ export interface AcquireOptions {
7
+ /** Aantal extra pogingen als de lock bezet is. Default 0. */
8
+ retries?: number;
9
+ /** Wachttijd (ms) tussen pogingen. Default 50. */
10
+ retryDelayMs?: number;
11
+ }
12
+ export interface LockManager {
13
+ acquire(key: string, ttlMs: number, options?: AcquireOptions): Promise<Lock | null>;
14
+ /** Geeft de lock vrij; `true` als vrijgegeven, `false` bij token-mismatch (niet-eigenaar). */
15
+ release(lock: Lock): Promise<boolean>;
16
+ withLock<T>(key: string, ttlMs: number, fn: () => Promise<T>, options?: AcquireOptions): Promise<T>;
17
+ }
18
+ export declare function createLock(store: CacheStore, options?: {
19
+ namespace?: string;
20
+ }): LockManager;
21
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/cache/core/lock.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpF,8FAA8F;IAC9F,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACrG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAkC/F"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * US-0703 — Distributed lock met TTL en veilige release over de {@link CacheStore}-poort.
3
+ *
4
+ * `acquire` zet atomair een unieke token met TTL (SET NX PX), zodat een gecrashte houder de lock niet
5
+ * eeuwig vasthoudt. `release` verwijdert de lock alleen als de token overeenkomt (voorkomt dat een
6
+ * ander proces jouw lock vrijgeeft). `withLock` combineert acquire + release rond een sectie.
7
+ */
8
+ import { randomBytes } from 'node:crypto';
9
+ import { LockNotAcquiredError } from './errors.js';
10
+ export function createLock(store, options = {}) {
11
+ const namespace = options.namespace ?? 'lock';
12
+ const physical = (key) => `${namespace}:${key}`;
13
+ const manager = {
14
+ async acquire(key, ttlMs, acquireOptions = {}) {
15
+ const retries = acquireOptions.retries ?? 0;
16
+ const retryDelayMs = acquireOptions.retryDelayMs ?? 50;
17
+ for (let attempt = 0; attempt <= retries; attempt++) {
18
+ const token = randomBytes(16).toString('hex');
19
+ if (await store.setIfAbsent(physical(key), token, ttlMs)) {
20
+ return { key, token };
21
+ }
22
+ if (attempt < retries)
23
+ await delay(retryDelayMs);
24
+ }
25
+ return null;
26
+ },
27
+ async release(lock) {
28
+ return store.deleteIfMatch(physical(lock.key), lock.token);
29
+ },
30
+ async withLock(key, ttlMs, fn, acquireOptions) {
31
+ const lock = await manager.acquire(key, ttlMs, acquireOptions);
32
+ if (!lock)
33
+ throw new LockNotAcquiredError(key);
34
+ try {
35
+ return await fn();
36
+ }
37
+ finally {
38
+ await manager.release(lock);
39
+ }
40
+ },
41
+ };
42
+ return manager;
43
+ }
44
+ function delay(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/cache/core/lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAsBnD,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,UAAkC,EAAE;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC;IAEhE,MAAM,OAAO,GAAgB;QAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,IAAI,EAAE,CAAC;YACvD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,MAAM,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;oBACzD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,GAAG,OAAO;oBAAE,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc;YAC3C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YAC/D,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Poorten & types voor de cache-kit. De store (KV + coördinatie) en de pub/sub-store zijn pluggable;
3
+ * cache-keys, TTL's en kanalen worden door het consumerende project geïnjecteerd. Geen domeinkennis.
4
+ */
5
+ export type Clock = () => number;
6
+ /**
7
+ * Store-abstractie voor de cache (US-0701) en de distributed lock (US-0703). Werkt met reeds
8
+ * geserialiseerde string-waarden. Adapters: in-memory (dev/tests) en Redis (productie).
9
+ */
10
+ export interface CacheStore {
11
+ get(key: string): Promise<string | null>;
12
+ set(key: string, value: string, ttlMs?: number): Promise<void>;
13
+ del(key: string): Promise<void>;
14
+ has(key: string): Promise<boolean>;
15
+ /** Zet alleen als de key nog niet bestaat (SET NX PX). True als gezet. Basis voor de lock. */
16
+ setIfAbsent(key: string, value: string, ttlMs: number): Promise<boolean>;
17
+ /** Verwijder alleen als de waarde matcht (atomair). Basis voor veilige lock-release. */
18
+ deleteIfMatch(key: string, value: string): Promise<boolean>;
19
+ }
20
+ export interface Subscription {
21
+ unsubscribe(): Promise<void>;
22
+ }
23
+ /** Pub/sub-store (US-0704): berichten zijn reeds-geserialiseerde strings. */
24
+ export interface PubSubStore {
25
+ publish(channel: string, message: string): Promise<void>;
26
+ subscribe(channel: string, handler: (message: string) => void): Promise<Subscription>;
27
+ }
28
+ /** (De)serialisatie van cache-waarden en pub/sub-berichten. Default JSON. */
29
+ export interface Serializer {
30
+ serialize(value: unknown): string;
31
+ deserialize<T>(raw: string): T;
32
+ }
33
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/cache/core/ports.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;AAEjC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,8FAA8F;IAC9F,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,wFAAwF;IACxF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACvF;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;CAChC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Poorten & types voor de cache-kit. De store (KV + coördinatie) en de pub/sub-store zijn pluggable;
3
+ * cache-keys, TTL's en kanalen worden door het consumerende project geïnjecteerd. Geen domeinkennis.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/cache/core/ports.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * US-0704 — Pub/sub over de {@link PubSubStore}-poort (Redis pub/sub in productie, in-memory
3
+ * event-emitter voor dev/tests). Berichten worden getypt (de)geserialiseerd; een consument kan zich
4
+ * netjes afmelden. Typisch gebruik: cache-invalidatie-broadcast tussen instances. Domein-loos.
5
+ */
6
+ import type { PubSubStore, Serializer, Subscription } from './ports.js';
7
+ export interface PubSub {
8
+ publish<T>(channel: string, message: T): Promise<void>;
9
+ subscribe<T>(channel: string, handler: (message: T) => void): Promise<Subscription>;
10
+ }
11
+ export declare function createPubSub(store: PubSubStore, options?: {
12
+ serializer?: Serializer;
13
+ }): PubSub;
14
+ //# sourceMappingURL=pubsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../../src/cache/core/pubsub.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGxE,MAAM,WAAW,MAAM;IACrB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACrF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAA;CAAO,GAAG,MAAM,CAWlG"}
@@ -0,0 +1,13 @@
1
+ import { jsonSerializer } from './serializer.js';
2
+ export function createPubSub(store, options = {}) {
3
+ const serializer = options.serializer ?? jsonSerializer;
4
+ return {
5
+ publish(channel, message) {
6
+ return store.publish(channel, serializer.serialize(message));
7
+ },
8
+ subscribe(channel, handler) {
9
+ return store.subscribe(channel, (raw) => handler(serializer.deserialize(raw)));
10
+ },
11
+ };
12
+ }
13
+ //# sourceMappingURL=pubsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../../src/cache/core/pubsub.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjD,MAAM,UAAU,YAAY,CAAC,KAAkB,EAAE,UAAuC,EAAE;IACxF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IAExD,OAAO;QACL,OAAO,CAAI,OAAe,EAAE,OAAU;YACpC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,SAAS,CAAI,OAAe,EAAE,OAA6B;YACzD,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Serializer } from './ports.js';
2
+ /** Standaard JSON-serializer. */
3
+ export declare const jsonSerializer: Serializer;
4
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../../src/cache/core/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,iCAAiC;AACjC,eAAO,MAAM,cAAc,EAAE,UAG5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Standaard JSON-serializer. */
2
+ export const jsonSerializer = {
3
+ serialize: (value) => JSON.stringify(value),
4
+ deserialize: (raw) => JSON.parse(raw),
5
+ };
6
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/cache/core/serializer.ts"],"names":[],"mappings":"AAEA,iCAAiC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC3C,WAAW,EAAE,CAAI,GAAW,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM;CACzD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `cache` kit — domein-loze caching: getypte get/set/del + TTL + namespacing, memoize (cache-aside)
3
+ * met stampede-bescherming, distributed lock en pub/sub. Pluggable store (in-memory + Redis) via een
4
+ * port; keys/TTL's/kanalen worden geïnjecteerd.
5
+ */
6
+ export { createCache, type Cache, type CacheOptions } from './core/cache.js';
7
+ export { createLock, type LockManager, type Lock, type AcquireOptions, } from './core/lock.js';
8
+ export { createPubSub, type PubSub } from './core/pubsub.js';
9
+ export { jsonSerializer } from './core/serializer.js';
10
+ export type { CacheStore, PubSubStore, Subscription, Serializer, Clock } from './core/ports.js';
11
+ export { CacheError, CacheStoreError, LockNotAcquiredError } from './core/errors.js';
12
+ export { inMemoryCacheStore, inMemoryPubSub } from './adapters/in-memory-store.js';
13
+ export { redisCacheStore, redisPubSub, type RedisCacheClient, type RedisPublisherClient, type RedisSubscriberClient, } from './adapters/redis-store.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,EACL,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGhG,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGrF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EACL,eAAe,EACf,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `cache` kit — domein-loze caching: getypte get/set/del + TTL + namespacing, memoize (cache-aside)
3
+ * met stampede-bescherming, distributed lock en pub/sub. Pluggable store (in-memory + Redis) via een
4
+ * port; keys/TTL's/kanalen worden geïnjecteerd.
5
+ */
6
+ // Cache + memoize (US-0701/US-0702)
7
+ export { createCache } from './core/cache.js';
8
+ // Distributed lock (US-0703)
9
+ export { createLock, } from './core/lock.js';
10
+ // Pub/sub (US-0704)
11
+ export { createPubSub } from './core/pubsub.js';
12
+ // Serializer
13
+ export { jsonSerializer } from './core/serializer.js';
14
+ // Fouten
15
+ export { CacheError, CacheStoreError, LockNotAcquiredError } from './core/errors.js';
16
+ // Adapters (dep-vrij; Redis-adapters gebruiken structurele client-interfaces)
17
+ export { inMemoryCacheStore, inMemoryPubSub } from './adapters/in-memory-store.js';
18
+ export { redisCacheStore, redisPubSub, } from './adapters/redis-store.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oCAAoC;AACpC,OAAO,EAAE,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAE7E,6BAA6B;AAC7B,OAAO,EACL,UAAU,GAIX,MAAM,gBAAgB,CAAC;AAExB,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAe,MAAM,kBAAkB,CAAC;AAE7D,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAErF,8EAA8E;AAC9E,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EACL,eAAe,EACf,WAAW,GAIZ,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * US-0104 — {@link Reporter}-adapters. Het geredigeerde foutrapport wordt via een injecteerbare
3
+ * poort uitgeschreven, zodat P-OPS de vorm (stdout, structured log) bepaalt.
4
+ */
5
+ import type { ConfigReport, Reporter } from '../core/ports.js';
6
+ /** Formatteert een rapport tot een mensvriendelijke, geredigeerde tekst. */
7
+ export declare function formatReport(report: ConfigReport): string;
8
+ /**
9
+ * Schrijft het geformatteerde rapport naar een sink (default `console.error`). Bevat nooit
10
+ * secretwaarden — de issues zijn reeds geredigeerd.
11
+ */
12
+ export declare function consoleReporter(sink?: (message: string) => void): Reporter;
13
+ /** Reporter die rapporten verzamelt in geheugen. Handig voor tests en assertions. */
14
+ export declare function collectingReporter(): Reporter & {
15
+ reports: ConfigReport[];
16
+ };
17
+ //# sourceMappingURL=reporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../../src/config/adapters/reporters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE/D,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAazD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAoB,GAAG,QAAQ,CAIzF;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,IAAI,QAAQ,GAAG;IAAE,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAQ3E"}