@kronos-ts/messaging 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 (266) hide show
  1. package/dist/command-bus.d.ts +30 -0
  2. package/dist/command-bus.d.ts.map +1 -0
  3. package/dist/command-bus.js +2 -0
  4. package/dist/command-bus.js.map +1 -0
  5. package/dist/command-handler.d.ts +58 -0
  6. package/dist/command-handler.d.ts.map +1 -0
  7. package/dist/command-handler.js +12 -0
  8. package/dist/command-handler.js.map +1 -0
  9. package/dist/command-handling-module.d.ts +53 -0
  10. package/dist/command-handling-module.d.ts.map +1 -0
  11. package/dist/command-handling-module.js +130 -0
  12. package/dist/command-handling-module.js.map +1 -0
  13. package/dist/correlation-data.d.ts +79 -0
  14. package/dist/correlation-data.d.ts.map +1 -0
  15. package/dist/correlation-data.js +133 -0
  16. package/dist/correlation-data.js.map +1 -0
  17. package/dist/dead-letter-queue.d.ts +134 -0
  18. package/dist/dead-letter-queue.d.ts.map +1 -0
  19. package/dist/dead-letter-queue.js +176 -0
  20. package/dist/dead-letter-queue.js.map +1 -0
  21. package/dist/dead-lettering-handler.d.ts +42 -0
  22. package/dist/dead-lettering-handler.d.ts.map +1 -0
  23. package/dist/dead-lettering-handler.js +67 -0
  24. package/dist/dead-lettering-handler.js.map +1 -0
  25. package/dist/descriptor.d.ts +135 -0
  26. package/dist/descriptor.d.ts.map +1 -0
  27. package/dist/descriptor.js +36 -0
  28. package/dist/descriptor.js.map +1 -0
  29. package/dist/emit-update.d.ts +22 -0
  30. package/dist/emit-update.d.ts.map +1 -0
  31. package/dist/emit-update.js +23 -0
  32. package/dist/emit-update.js.map +1 -0
  33. package/dist/event-bus.d.ts +29 -0
  34. package/dist/event-bus.d.ts.map +1 -0
  35. package/dist/event-bus.js +22 -0
  36. package/dist/event-bus.js.map +1 -0
  37. package/dist/event-criteria.d.ts +87 -0
  38. package/dist/event-criteria.d.ts.map +1 -0
  39. package/dist/event-criteria.js +90 -0
  40. package/dist/event-criteria.js.map +1 -0
  41. package/dist/event-gateway.d.ts +19 -0
  42. package/dist/event-gateway.d.ts.map +1 -0
  43. package/dist/event-gateway.js +22 -0
  44. package/dist/event-gateway.js.map +1 -0
  45. package/dist/event-handler.d.ts +30 -0
  46. package/dist/event-handler.d.ts.map +1 -0
  47. package/dist/event-handler.js +18 -0
  48. package/dist/event-handler.js.map +1 -0
  49. package/dist/event-processor-builder.d.ts +148 -0
  50. package/dist/event-processor-builder.d.ts.map +1 -0
  51. package/dist/event-processor-builder.js +175 -0
  52. package/dist/event-processor-builder.js.map +1 -0
  53. package/dist/event-processor.d.ts +10 -0
  54. package/dist/event-processor.d.ts.map +1 -0
  55. package/dist/event-processor.js +2 -0
  56. package/dist/event-processor.js.map +1 -0
  57. package/dist/event-sink.d.ts +23 -0
  58. package/dist/event-sink.d.ts.map +1 -0
  59. package/dist/event-sink.js +2 -0
  60. package/dist/event-sink.js.map +1 -0
  61. package/dist/event-source.d.ts +98 -0
  62. package/dist/event-source.d.ts.map +1 -0
  63. package/dist/event-source.js +191 -0
  64. package/dist/event-source.js.map +1 -0
  65. package/dist/gateway.d.ts +68 -0
  66. package/dist/gateway.d.ts.map +1 -0
  67. package/dist/gateway.js +62 -0
  68. package/dist/gateway.js.map +1 -0
  69. package/dist/handler-enhancer.d.ts +53 -0
  70. package/dist/handler-enhancer.d.ts.map +1 -0
  71. package/dist/handler-enhancer.js +17 -0
  72. package/dist/handler-enhancer.js.map +1 -0
  73. package/dist/handler.d.ts +51 -0
  74. package/dist/handler.d.ts.map +1 -0
  75. package/dist/handler.js +26 -0
  76. package/dist/handler.js.map +1 -0
  77. package/dist/index.d.ts +53 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +103 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/intercepting-command-bus.d.ts +17 -0
  82. package/dist/intercepting-command-bus.d.ts.map +1 -0
  83. package/dist/intercepting-command-bus.js +54 -0
  84. package/dist/intercepting-command-bus.js.map +1 -0
  85. package/dist/intercepting-event-bus.d.ts +8 -0
  86. package/dist/intercepting-event-bus.d.ts.map +1 -0
  87. package/dist/intercepting-event-bus.js +22 -0
  88. package/dist/intercepting-event-bus.js.map +1 -0
  89. package/dist/intercepting-query-bus.d.ts +17 -0
  90. package/dist/intercepting-query-bus.d.ts.map +1 -0
  91. package/dist/intercepting-query-bus.js +68 -0
  92. package/dist/intercepting-query-bus.js.map +1 -0
  93. package/dist/interceptor.d.ts +46 -0
  94. package/dist/interceptor.d.ts.map +1 -0
  95. package/dist/interceptor.js +2 -0
  96. package/dist/interceptor.js.map +1 -0
  97. package/dist/message-monitor-registry.d.ts +28 -0
  98. package/dist/message-monitor-registry.d.ts.map +1 -0
  99. package/dist/message-monitor-registry.js +37 -0
  100. package/dist/message-monitor-registry.js.map +1 -0
  101. package/dist/message-monitor.d.ts +36 -0
  102. package/dist/message-monitor.d.ts.map +1 -0
  103. package/dist/message-monitor.js +39 -0
  104. package/dist/message-monitor.js.map +1 -0
  105. package/dist/message.d.ts +42 -0
  106. package/dist/message.d.ts.map +1 -0
  107. package/dist/message.js +2 -0
  108. package/dist/message.js.map +1 -0
  109. package/dist/processing-state.d.ts +115 -0
  110. package/dist/processing-state.d.ts.map +1 -0
  111. package/dist/processing-state.js +205 -0
  112. package/dist/processing-state.js.map +1 -0
  113. package/dist/processor-configuration.d.ts +51 -0
  114. package/dist/processor-configuration.d.ts.map +1 -0
  115. package/dist/processor-configuration.js +2 -0
  116. package/dist/processor-configuration.js.map +1 -0
  117. package/dist/query-bus.d.ts +51 -0
  118. package/dist/query-bus.d.ts.map +1 -0
  119. package/dist/query-bus.js +2 -0
  120. package/dist/query-bus.js.map +1 -0
  121. package/dist/query-handler.d.ts +35 -0
  122. package/dist/query-handler.d.ts.map +1 -0
  123. package/dist/query-handler.js +19 -0
  124. package/dist/query-handler.js.map +1 -0
  125. package/dist/query-handling-module.d.ts +24 -0
  126. package/dist/query-handling-module.d.ts.map +1 -0
  127. package/dist/query-handling-module.js +32 -0
  128. package/dist/query-handling-module.js.map +1 -0
  129. package/dist/replay-token.d.ts +31 -0
  130. package/dist/replay-token.d.ts.map +1 -0
  131. package/dist/replay-token.js +37 -0
  132. package/dist/replay-token.js.map +1 -0
  133. package/dist/retrying-command-bus.d.ts +32 -0
  134. package/dist/retrying-command-bus.d.ts.map +1 -0
  135. package/dist/retrying-command-bus.js +58 -0
  136. package/dist/retrying-command-bus.js.map +1 -0
  137. package/dist/routing-strategy.d.ts +30 -0
  138. package/dist/routing-strategy.d.ts.map +1 -0
  139. package/dist/routing-strategy.js +37 -0
  140. package/dist/routing-strategy.js.map +1 -0
  141. package/dist/segment.d.ts +72 -0
  142. package/dist/segment.d.ts.map +1 -0
  143. package/dist/segment.js +103 -0
  144. package/dist/segment.js.map +1 -0
  145. package/dist/send.d.ts +28 -0
  146. package/dist/send.d.ts.map +1 -0
  147. package/dist/send.js +36 -0
  148. package/dist/send.js.map +1 -0
  149. package/dist/serializer.d.ts +40 -0
  150. package/dist/serializer.d.ts.map +1 -0
  151. package/dist/serializer.js +90 -0
  152. package/dist/serializer.js.map +1 -0
  153. package/dist/simple-command-bus.d.ts +23 -0
  154. package/dist/simple-command-bus.d.ts.map +1 -0
  155. package/dist/simple-command-bus.js +49 -0
  156. package/dist/simple-command-bus.js.map +1 -0
  157. package/dist/simple-query-bus.d.ts +16 -0
  158. package/dist/simple-query-bus.d.ts.map +1 -0
  159. package/dist/simple-query-bus.js +122 -0
  160. package/dist/simple-query-bus.js.map +1 -0
  161. package/dist/span-factory.d.ts +58 -0
  162. package/dist/span-factory.d.ts.map +1 -0
  163. package/dist/span-factory.js +19 -0
  164. package/dist/span-factory.js.map +1 -0
  165. package/dist/streaming-event-processor.d.ts +65 -0
  166. package/dist/streaming-event-processor.d.ts.map +1 -0
  167. package/dist/streaming-event-processor.js +239 -0
  168. package/dist/streaming-event-processor.js.map +1 -0
  169. package/dist/subscribing-event-processor.d.ts +57 -0
  170. package/dist/subscribing-event-processor.d.ts.map +1 -0
  171. package/dist/subscribing-event-processor.js +100 -0
  172. package/dist/subscribing-event-processor.js.map +1 -0
  173. package/dist/subscription-query.d.ts +63 -0
  174. package/dist/subscription-query.d.ts.map +1 -0
  175. package/dist/subscription-query.js +119 -0
  176. package/dist/subscription-query.js.map +1 -0
  177. package/dist/token-store.d.ts +83 -0
  178. package/dist/token-store.d.ts.map +1 -0
  179. package/dist/token-store.js +112 -0
  180. package/dist/token-store.js.map +1 -0
  181. package/dist/tracing-command-bus.d.ts +16 -0
  182. package/dist/tracing-command-bus.d.ts.map +1 -0
  183. package/dist/tracing-command-bus.js +44 -0
  184. package/dist/tracing-command-bus.js.map +1 -0
  185. package/dist/tracing-handler-enhancer.d.ts +11 -0
  186. package/dist/tracing-handler-enhancer.d.ts.map +1 -0
  187. package/dist/tracing-handler-enhancer.js +27 -0
  188. package/dist/tracing-handler-enhancer.js.map +1 -0
  189. package/dist/tracking-event-processor.d.ts +72 -0
  190. package/dist/tracking-event-processor.d.ts.map +1 -0
  191. package/dist/tracking-event-processor.js +223 -0
  192. package/dist/tracking-event-processor.js.map +1 -0
  193. package/dist/tracking-token.d.ts +120 -0
  194. package/dist/tracking-token.d.ts.map +1 -0
  195. package/dist/tracking-token.js +132 -0
  196. package/dist/tracking-token.js.map +1 -0
  197. package/dist/transaction.d.ts +60 -0
  198. package/dist/transaction.d.ts.map +1 -0
  199. package/dist/transaction.js +74 -0
  200. package/dist/transaction.js.map +1 -0
  201. package/dist/unit-of-work.d.ts +41 -0
  202. package/dist/unit-of-work.d.ts.map +1 -0
  203. package/dist/unit-of-work.js +96 -0
  204. package/dist/unit-of-work.js.map +1 -0
  205. package/dist/upcaster.d.ts +91 -0
  206. package/dist/upcaster.d.ts.map +1 -0
  207. package/dist/upcaster.js +114 -0
  208. package/dist/upcaster.js.map +1 -0
  209. package/dist/with-namespace.d.ts +59 -0
  210. package/dist/with-namespace.d.ts.map +1 -0
  211. package/dist/with-namespace.js +42 -0
  212. package/dist/with-namespace.js.map +1 -0
  213. package/package.json +65 -0
  214. package/src/command-bus.ts +34 -0
  215. package/src/command-handler.ts +116 -0
  216. package/src/command-handling-module.ts +183 -0
  217. package/src/correlation-data.ts +169 -0
  218. package/src/dead-letter-queue.ts +330 -0
  219. package/src/dead-lettering-handler.ts +109 -0
  220. package/src/descriptor.ts +176 -0
  221. package/src/emit-update.ts +35 -0
  222. package/src/event-bus.ts +45 -0
  223. package/src/event-criteria.ts +141 -0
  224. package/src/event-gateway.ts +42 -0
  225. package/src/event-handler.ts +44 -0
  226. package/src/event-processor-builder.ts +246 -0
  227. package/src/event-processor.ts +9 -0
  228. package/src/event-sink.ts +23 -0
  229. package/src/event-source.ts +301 -0
  230. package/src/gateway.ts +144 -0
  231. package/src/handler-enhancer.ts +70 -0
  232. package/src/handler.ts +133 -0
  233. package/src/index.ts +356 -0
  234. package/src/intercepting-command-bus.ts +73 -0
  235. package/src/intercepting-event-bus.ts +29 -0
  236. package/src/intercepting-query-bus.ts +104 -0
  237. package/src/interceptor.ts +48 -0
  238. package/src/message-monitor-registry.ts +64 -0
  239. package/src/message-monitor.ts +68 -0
  240. package/src/message.ts +41 -0
  241. package/src/processing-state.ts +258 -0
  242. package/src/processor-configuration.ts +59 -0
  243. package/src/query-bus.ts +69 -0
  244. package/src/query-handler.ts +49 -0
  245. package/src/query-handling-module.ts +44 -0
  246. package/src/replay-token.ts +53 -0
  247. package/src/retrying-command-bus.ts +80 -0
  248. package/src/routing-strategy.ts +59 -0
  249. package/src/segment.ts +136 -0
  250. package/src/send.ts +44 -0
  251. package/src/serializer.ts +122 -0
  252. package/src/simple-command-bus.ts +59 -0
  253. package/src/simple-query-bus.ts +158 -0
  254. package/src/span-factory.ts +81 -0
  255. package/src/streaming-event-processor.ts +351 -0
  256. package/src/subscribing-event-processor.ts +169 -0
  257. package/src/subscription-query.ts +173 -0
  258. package/src/token-store.ts +211 -0
  259. package/src/tracing-command-bus.ts +52 -0
  260. package/src/tracing-handler-enhancer.ts +34 -0
  261. package/src/tracking-event-processor.ts +336 -0
  262. package/src/tracking-token.ts +231 -0
  263. package/src/transaction.ts +98 -0
  264. package/src/unit-of-work.ts +138 -0
  265. package/src/upcaster.ts +174 -0
  266. package/src/with-namespace.ts +75 -0
@@ -0,0 +1,74 @@
1
+ import { resourceKey } from "@kronos-ts/common";
2
+ import { processingStateStorage, setResource, on, onError, Phase, } from "./processing-state.js";
3
+ /**
4
+ * A no-op transaction manager for when no database transactions are needed.
5
+ */
6
+ export function noTransactionManager() {
7
+ return {
8
+ begin: async () => { },
9
+ commit: async () => { },
10
+ rollback: async () => { },
11
+ };
12
+ }
13
+ /** Resource key for storing the active transaction in the active UnitOfWork's ALS-backed resources. */
14
+ export const TRANSACTION_KEY = resourceKey("transaction");
15
+ /**
16
+ * Get the active transaction from the active UnitOfWork's ALS-backed resources.
17
+ * Returns undefined if no UnitOfWork is active or no transaction has been stored.
18
+ *
19
+ * ORM integrations use this to participate in the framework's transaction:
20
+ * ```
21
+ * const db = drizzle(pool, {
22
+ * transaction: () => getActiveTransaction(),
23
+ * })
24
+ * ```
25
+ *
26
+ * Permissive undefined-return preserved (D-12 / D-23): callers outside a UoW
27
+ * get `undefined`, NOT a NoActiveUnitOfWork throw — this is an ORM escape hatch,
28
+ * not a framework-internal accessor.
29
+ */
30
+ export function getActiveTransaction() {
31
+ const state = processingStateStorage.getStore();
32
+ if (!state)
33
+ return undefined;
34
+ return state.resources.get(TRANSACTION_KEY.symbol);
35
+ }
36
+ /**
37
+ * Wraps a delegate runner with transaction management. The transaction is:
38
+ * - Started before the delegate's action runs
39
+ * - Available via `getActiveTransaction()` throughout
40
+ * - Committed in the COMMIT phase
41
+ * - Rolled back on error
42
+ *
43
+ * The transaction is stored as a resource on the active UoW's ALS state,
44
+ * so all phases (PRE_INVOCATION through AFTER_COMMIT) and any code calling
45
+ * `getActiveTransaction()` inside the UoW see it.
46
+ *
47
+ * ```
48
+ * const txRunner = transactionalUnitOfWorkFactory(runInUoW, myTransactionManager)
49
+ * await txRunner(metadata, async () => { ... })
50
+ * ```
51
+ *
52
+ * Plan 03-04 (CTX-04 / D-34): rewritten as a composable runner wrapper.
53
+ * Previously took/returned `UnitOfWorkFactory`; the UoW interface and
54
+ * factory are gone, so this now takes/returns `UoWRunner`. The name is
55
+ * preserved despite the shape change — public docs and extension code
56
+ * import `transactionalUnitOfWorkFactory` by name. Phase 9 (Extension
57
+ * Migration) can rename if the kronos() app API warrants.
58
+ */
59
+ export function transactionalUnitOfWorkFactory(delegate, txManager) {
60
+ return async (metadata, action) => {
61
+ const tx = await txManager.begin();
62
+ return delegate(metadata, async () => {
63
+ setResource(TRANSACTION_KEY, tx);
64
+ on(Phase.COMMIT, async () => {
65
+ await txManager.commit(tx);
66
+ });
67
+ onError(async () => {
68
+ await txManager.rollback(tx);
69
+ });
70
+ return action();
71
+ });
72
+ };
73
+ }
74
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,EAAE,EACF,OAAO,EACP,KAAK,GACN,MAAM,uBAAuB,CAAA;AAe9B;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACrB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtB,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACzB,CAAA;AACH,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,MAAM,eAAe,GAAyB,WAAW,CAAC,aAAa,CAAC,CAAA;AAE/E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAA;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAkB,CAAA;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,8BAA8B,CAC5C,QAAmB,EACnB,SAAgC;IAEhC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QAClC,OAAO,QAAQ,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;YAChC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC1B,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YAC9B,CAAC,CAAC,CAAA;YACF,OAAO,MAAM,EAAE,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type Metadata } from "@kronos-ts/common";
2
+ /**
3
+ * Runner type: the canonical "enter a UnitOfWork" shape.
4
+ *
5
+ * Plan 03-04 (CTX-04 / D-34): replaces the old `UnitOfWorkFactory` shape.
6
+ * Extensions (kronosdb, axon-server) and transactional wrappers compose
7
+ * runners — `transactionalUnitOfWorkFactory` accepts a delegate runner
8
+ * and returns a new runner that begins/commits/rolls-back a transaction
9
+ * around the inner action.
10
+ */
11
+ export type UoWRunner = <R>(metadata: Metadata | undefined, action: () => Promise<R>) => Promise<R>;
12
+ /**
13
+ * Run `action` inside a NEW UnitOfWork. Always creates a fresh UoW even
14
+ * if one is already active on the ALS stack.
15
+ *
16
+ * Used by gateways (D-32): `commandGateway.send`, `queryGateway.query`,
17
+ * and any external entry point. This keeps gateway calls isolated from
18
+ * an injected dispatcher that reuses the active UoW.
19
+ */
20
+ export declare function runInNewUoW<R>(metadata: Metadata | undefined, action: () => Promise<R>): Promise<R>;
21
+ /**
22
+ * Run `action` inside a UnitOfWork. ALS-aware:
23
+ *
24
+ * - If `processingStateStorage` already has an active state (we are
25
+ * nested inside a parent UoW), this REUSES the parent's state and
26
+ * calls `action` directly — no new `processingStateStorage.run`, no
27
+ * new phase lifecycle. This is CTX-02: nested dispatch threads through
28
+ * the same UoW so transactionality spans handler-internal bus calls.
29
+ *
30
+ * - If no state is active, behaves identically to `runInNewUoW` —
31
+ * creates a fresh UoW and drives the full phase lifecycle.
32
+ *
33
+ * Used by `queryBus.query` so handler-internal queries auto-nest, while
34
+ * a primary query (no active UoW) starts a new one.
35
+ *
36
+ * NOTE: `commandBus.dispatch` deliberately does NOT use this — for AF5
37
+ * parity every command gets its own fresh UnitOfWork via `runInNewUoW`,
38
+ * nested or not. See `createSimpleCommandBus`.
39
+ */
40
+ export declare function runInUoW<R>(metadata: Metadata | undefined, action: () => Promise<R>): Promise<R>;
41
+ //# sourceMappingURL=unit-of-work.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-of-work.d.ts","sourceRoot":"","sources":["../src/unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAQhE;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,EACxB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAAC,CAAA;AAEf;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAIZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,96 @@
1
+ import { emptyMetadata } from "@kronos-ts/common";
2
+ import { processingStateStorage, createInitialProcessingState, Phase, } from "./processing-state.js";
3
+ /**
4
+ * Run `action` inside a NEW UnitOfWork. Always creates a fresh UoW even
5
+ * if one is already active on the ALS stack.
6
+ *
7
+ * Used by gateways (D-32): `commandGateway.send`, `queryGateway.query`,
8
+ * and any external entry point. This keeps gateway calls isolated from
9
+ * an injected dispatcher that reuses the active UoW.
10
+ */
11
+ export function runInNewUoW(metadata, action) {
12
+ const resolvedMetadata = metadata ?? emptyMetadata();
13
+ const state = createInitialProcessingState(resolvedMetadata);
14
+ return processingStateStorage.run(state, () => drivePhases(state, action));
15
+ }
16
+ /**
17
+ * Run `action` inside a UnitOfWork. ALS-aware:
18
+ *
19
+ * - If `processingStateStorage` already has an active state (we are
20
+ * nested inside a parent UoW), this REUSES the parent's state and
21
+ * calls `action` directly — no new `processingStateStorage.run`, no
22
+ * new phase lifecycle. This is CTX-02: nested dispatch threads through
23
+ * the same UoW so transactionality spans handler-internal bus calls.
24
+ *
25
+ * - If no state is active, behaves identically to `runInNewUoW` —
26
+ * creates a fresh UoW and drives the full phase lifecycle.
27
+ *
28
+ * Used by `queryBus.query` so handler-internal queries auto-nest, while
29
+ * a primary query (no active UoW) starts a new one.
30
+ *
31
+ * NOTE: `commandBus.dispatch` deliberately does NOT use this — for AF5
32
+ * parity every command gets its own fresh UnitOfWork via `runInNewUoW`,
33
+ * nested or not. See `createSimpleCommandBus`.
34
+ */
35
+ export function runInUoW(metadata, action) {
36
+ if (processingStateStorage.getStore() !== undefined)
37
+ return action();
38
+ return runInNewUoW(metadata, action);
39
+ }
40
+ async function drivePhases(state, action) {
41
+ state.status = "started";
42
+ try {
43
+ await runPhase(state, Phase.PRE_INVOCATION);
44
+ state.currentPhase = Phase.INVOCATION;
45
+ let actions = state.phaseActions.get(Phase.INVOCATION);
46
+ while (actions && actions.length > 0) {
47
+ const bucket = actions;
48
+ state.phaseActions.set(Phase.INVOCATION, []);
49
+ for (const a of bucket)
50
+ await a();
51
+ actions = state.phaseActions.get(Phase.INVOCATION);
52
+ }
53
+ const result = await action();
54
+ await runPhase(state, Phase.POST_INVOCATION);
55
+ await runPhase(state, Phase.PREPARE_COMMIT);
56
+ await runPhase(state, Phase.COMMIT);
57
+ await runPhase(state, Phase.AFTER_COMMIT);
58
+ state.status = "completed";
59
+ for (const h of state.completeHandlers) {
60
+ try {
61
+ h();
62
+ }
63
+ catch (e) {
64
+ console.warn("UnitOfWork: completion handler threw an exception:", e);
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+ catch (error) {
70
+ state.status = "error";
71
+ const failedPhase = state.currentPhase ?? undefined;
72
+ for (const h of state.errorHandlers) {
73
+ try {
74
+ await h(error, failedPhase);
75
+ }
76
+ catch (e) {
77
+ console.warn("UnitOfWork: error handler threw an exception:", e);
78
+ }
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+ async function runPhase(state, phase) {
84
+ state.currentPhase = phase;
85
+ // Late registration: actions registered during a phase's own execution
86
+ // fire next loop iteration (still within the same phase).
87
+ let actions = state.phaseActions.get(phase);
88
+ while (actions && actions.length > 0) {
89
+ const bucket = actions;
90
+ state.phaseActions.set(phase, []);
91
+ for (const a of bucket)
92
+ await a();
93
+ actions = state.phaseActions.get(phase);
94
+ }
95
+ }
96
+ //# sourceMappingURL=unit-of-work.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-of-work.js","sourceRoot":"","sources":["../src/unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAA;AAChE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,GAEN,MAAM,uBAAuB,CAAA;AAgB9B;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,QAA8B,EAC9B,MAAwB;IAExB,MAAM,gBAAgB,GAAG,QAAQ,IAAI,aAAa,EAAE,CAAA;IACpD,MAAM,KAAK,GAAG,4BAA4B,CAAC,gBAAgB,CAAC,CAAA;IAC5D,OAAO,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,QAAQ,CACtB,QAA8B,EAC9B,MAAwB;IAExB,IAAI,sBAAsB,CAAC,QAAQ,EAAE,KAAK,SAAS;QAAE,OAAO,MAAM,EAAE,CAAA;IACpE,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;AACtC,CAAC;AAmBD,KAAK,UAAU,WAAW,CAAI,KAAY,EAAE,MAAwB;IAClE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAA;IACxB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;QAE3C,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,CAAA;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACtD,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,OAAO,CAAA;YACtB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;YAC5C,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,MAAM,CAAC,EAAE,CAAA;YACjC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAA;QAE7B,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAC5C,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;QAC3C,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACnC,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;QAEzC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAA;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,CAAC,EAAE,CAAA;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,GAAG,OAAO,CAAA;QACtB,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,SAAS,CAAA;QACnD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAAY,EAAE,KAAiB;IACrD,KAAK,CAAC,YAAY,GAAG,KAAK,CAAA;IAC1B,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC3C,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAA;QACtB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjC,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,MAAM,CAAC,EAAE,CAAA;QACjC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,91 @@
1
+ import type { Serializer } from "@kronos-ts/common";
2
+ /**
3
+ * An intermediate representation of an event during the upcasting pipeline.
4
+ *
5
+ * After deserialization from bytes (JSON.parse) but before Zod validation,
6
+ * the event passes through the upcaster chain as an IntermediateEventRepresentation.
7
+ * Each upcaster can transform the payload, type name, revision, and metadata.
8
+ */
9
+ export interface IntermediateEventRepresentation {
10
+ /** The deserialized payload (raw JSON, not yet Zod-validated). */
11
+ readonly payload: unknown;
12
+ /** The qualified type name (e.g., "university.CourseCreated"). */
13
+ readonly typeName: string;
14
+ /** The schema revision (e.g., "1.0"). */
15
+ readonly revision: string;
16
+ /** Event metadata. */
17
+ readonly metadata: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * An event upcaster transforms events from one schema version to another.
21
+ *
22
+ * Upcasters run after JSON deserialization but before Zod validation,
23
+ * so the payload is raw parsed JSON. The upcaster can add fields, rename
24
+ * fields, change the type name, bump the revision, etc.
25
+ *
26
+ * An upcaster can return:
27
+ * - A single representation (one-to-one transform)
28
+ * - An array of representations (one-to-many, e.g., splitting events)
29
+ * - An empty array (filtering out an event)
30
+ */
31
+ export interface EventUpcaster {
32
+ /** Whether this upcaster can handle the given type + revision. */
33
+ canUpcast(typeName: string, revision: string): boolean;
34
+ /**
35
+ * Transform the intermediate representation.
36
+ * Return the upcasted representation(s).
37
+ */
38
+ upcast(event: IntermediateEventRepresentation): IntermediateEventRepresentation | IntermediateEventRepresentation[];
39
+ }
40
+ /**
41
+ * Convenience function for the common case: a single event type
42
+ * being transformed from one revision to the next.
43
+ *
44
+ * ```typescript
45
+ * const upcaster = singleEventUpcaster({
46
+ * typeName: "university.CourseCreated",
47
+ * fromRevision: "1.0",
48
+ * toRevision: "2.0",
49
+ * upcast: (payload: any) => ({
50
+ * ...payload,
51
+ * capacity: payload.capacity ?? 30, // added in v2
52
+ * }),
53
+ * })
54
+ * ```
55
+ */
56
+ export declare function singleEventUpcaster(options: {
57
+ typeName: string;
58
+ fromRevision: string;
59
+ toRevision: string;
60
+ upcast: (payload: unknown) => unknown;
61
+ upcastMetadata?: (metadata: Record<string, unknown>) => Record<string, unknown>;
62
+ }): EventUpcaster;
63
+ /**
64
+ * Chains multiple upcasters into a single upcaster.
65
+ * Upcasters are applied in order. Each upcaster's output becomes
66
+ * the next upcaster's input. Handles one-to-many expansion.
67
+ *
68
+ * ```typescript
69
+ * const chain = upcasterChain(
70
+ * courseCreatedV1ToV2,
71
+ * courseCreatedV2ToV3,
72
+ * )
73
+ * ```
74
+ */
75
+ export declare function upcasterChain(...upcasters: EventUpcaster[]): EventUpcaster;
76
+ /**
77
+ * Creates an upcasting serializer decorator.
78
+ *
79
+ * On deserialization, the raw payload is first deserialized by the delegate,
80
+ * then passed through the upcaster chain before being returned. The type name
81
+ * and revision from the SerializedObject drive upcaster selection.
82
+ *
83
+ * ```typescript
84
+ * const serializer = upcastingSerializer(
85
+ * jsonSerializer(),
86
+ * upcasterChain(v1ToV2, v2ToV3),
87
+ * )
88
+ * ```
89
+ */
90
+ export declare function upcastingSerializer(delegate: Serializer, upcaster: EventUpcaster): Serializer;
91
+ //# sourceMappingURL=upcaster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upcaster.d.ts","sourceRoot":"","sources":["../src/upcaster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAA;AAErE;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC9C,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;IAEtD;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,+BAA+B,GAAG,+BAA+B,GAAG,+BAA+B,EAAE,CAAA;CACpH;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACrC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChF,GAAG,aAAa,CAiBhB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,CA6B1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,aAAa,GACtB,UAAU,CA6BZ"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Convenience function for the common case: a single event type
3
+ * being transformed from one revision to the next.
4
+ *
5
+ * ```typescript
6
+ * const upcaster = singleEventUpcaster({
7
+ * typeName: "university.CourseCreated",
8
+ * fromRevision: "1.0",
9
+ * toRevision: "2.0",
10
+ * upcast: (payload: any) => ({
11
+ * ...payload,
12
+ * capacity: payload.capacity ?? 30, // added in v2
13
+ * }),
14
+ * })
15
+ * ```
16
+ */
17
+ export function singleEventUpcaster(options) {
18
+ return {
19
+ canUpcast(typeName, revision) {
20
+ return typeName === options.typeName && revision === options.fromRevision;
21
+ },
22
+ upcast(event) {
23
+ return {
24
+ payload: options.upcast(event.payload),
25
+ typeName: options.typeName,
26
+ revision: options.toRevision,
27
+ metadata: options.upcastMetadata
28
+ ? options.upcastMetadata(event.metadata)
29
+ : event.metadata,
30
+ };
31
+ },
32
+ };
33
+ }
34
+ /**
35
+ * Chains multiple upcasters into a single upcaster.
36
+ * Upcasters are applied in order. Each upcaster's output becomes
37
+ * the next upcaster's input. Handles one-to-many expansion.
38
+ *
39
+ * ```typescript
40
+ * const chain = upcasterChain(
41
+ * courseCreatedV1ToV2,
42
+ * courseCreatedV2ToV3,
43
+ * )
44
+ * ```
45
+ */
46
+ export function upcasterChain(...upcasters) {
47
+ return {
48
+ canUpcast(typeName, revision) {
49
+ return upcasters.some((u) => u.canUpcast(typeName, revision));
50
+ },
51
+ upcast(event) {
52
+ let representations = [event];
53
+ for (const upcaster of upcasters) {
54
+ const next = [];
55
+ for (const rep of representations) {
56
+ if (upcaster.canUpcast(rep.typeName, rep.revision)) {
57
+ const result = upcaster.upcast(rep);
58
+ if (Array.isArray(result)) {
59
+ next.push(...result);
60
+ }
61
+ else {
62
+ next.push(result);
63
+ }
64
+ }
65
+ else {
66
+ next.push(rep);
67
+ }
68
+ }
69
+ representations = next;
70
+ }
71
+ return representations.length === 1 ? representations[0] : representations;
72
+ },
73
+ };
74
+ }
75
+ /**
76
+ * Creates an upcasting serializer decorator.
77
+ *
78
+ * On deserialization, the raw payload is first deserialized by the delegate,
79
+ * then passed through the upcaster chain before being returned. The type name
80
+ * and revision from the SerializedObject drive upcaster selection.
81
+ *
82
+ * ```typescript
83
+ * const serializer = upcastingSerializer(
84
+ * jsonSerializer(),
85
+ * upcasterChain(v1ToV2, v2ToV3),
86
+ * )
87
+ * ```
88
+ */
89
+ export function upcastingSerializer(delegate, upcaster) {
90
+ return {
91
+ serialize(value, type, revision) {
92
+ return delegate.serialize(value, type, revision);
93
+ },
94
+ deserialize(data) {
95
+ const raw = delegate.deserialize(data);
96
+ if (!upcaster.canUpcast(data.type, data.revision)) {
97
+ return raw;
98
+ }
99
+ const representation = {
100
+ payload: raw,
101
+ typeName: data.type,
102
+ revision: data.revision,
103
+ metadata: {},
104
+ };
105
+ const result = upcaster.upcast(representation);
106
+ const upcasted = Array.isArray(result) ? result[0] : result;
107
+ return upcasted.payload;
108
+ },
109
+ canConvert(type) {
110
+ return delegate.canConvert(type);
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=upcaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upcaster.js","sourceRoot":"","sources":["../src/upcaster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { type Tag } from "@kronos-ts/common";
2
+ import { command as createCommand, query as createQuery } from "./descriptor.js";
3
+ import type { z } from "zod";
4
+ /**
5
+ * Creates a namespace-scoped factory for message descriptors.
6
+ * Reduces repetition when defining many messages in the same bounded context.
7
+ *
8
+ * ```typescript
9
+ * const ns = withNamespace("university.courses")
10
+ *
11
+ * const CreateCourse = ns.command("CreateCourse", {
12
+ * payload: z.object({ courseId: z.string(), name: z.string() }),
13
+ * })
14
+ *
15
+ * const CourseCreated = ns.event("CourseCreated", {
16
+ * payload: z.object({ courseId: z.string(), name: z.string() }),
17
+ * tags: (p) => [tag("courseId", p.courseId)],
18
+ * })
19
+ *
20
+ * const GetCourse = ns.query("GetCourse", {
21
+ * payload: z.object({ courseId: z.string() }),
22
+ * })
23
+ * ```
24
+ */
25
+ export declare function withNamespace(namespace: string): {
26
+ /** Create a command descriptor in this namespace. */
27
+ command: {
28
+ <P extends z.ZodType>(name: string, def: {
29
+ payload: P;
30
+ version?: string;
31
+ routingKey?: string;
32
+ }): ReturnType<typeof createCommand<P>>;
33
+ <P extends z.ZodType, R extends z.ZodType>(name: string, def: {
34
+ payload: P;
35
+ result: R;
36
+ version?: string;
37
+ routingKey?: string;
38
+ }): ReturnType<typeof createCommand<P, R>>;
39
+ };
40
+ /** Create an event descriptor in this namespace. */
41
+ event<P extends z.ZodType>(name: string, def: {
42
+ payload: P;
43
+ version?: string;
44
+ tags?: (payload: z.infer<P>) => Tag[];
45
+ }): import("./descriptor.js").EventDescriptor<P>;
46
+ /** Create a query descriptor in this namespace. */
47
+ query: {
48
+ <P extends z.ZodType>(name: string, def: {
49
+ payload: P;
50
+ version?: string;
51
+ }): ReturnType<typeof createQuery<P>>;
52
+ <P extends z.ZodType, R extends z.ZodType>(name: string, def: {
53
+ payload: P;
54
+ result: R;
55
+ version?: string;
56
+ }): ReturnType<typeof createQuery<P, R>>;
57
+ };
58
+ };
59
+ //# sourceMappingURL=with-namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-namespace.d.ts","sourceRoot":"","sources":["../src/with-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,OAAO,IAAI,aAAa,EAExB,KAAK,IAAI,WAAW,EACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM;IA8B3C,qDAAqD;;SA7BtC,CAAC,SAAS,CAAC,CAAC,OAAO,QAAQ,MAAM,OAAO;YACvD,OAAO,EAAE,CAAC,CAAA;YACV,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,MAAM,CAAA;SACpB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;SACtB,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,QAAQ,MAAM,OAAO;YAC5E,OAAO,EAAE,CAAC,CAAA;YACV,MAAM,EAAE,CAAC,CAAA;YACT,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,MAAM,CAAA;SACpB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;IAsBxC,oDAAoD;UAC9C,CAAC,SAAS,CAAC,CAAC,OAAO,QAAQ,MAAM,OAAO;QAC5C,OAAO,EAAE,CAAC,CAAA;QACV,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;KACtC;IAID,mDAAmD;;SA1BtC,CAAC,SAAS,CAAC,CAAC,OAAO,QAAQ,MAAM,OAAO;YACrD,OAAO,EAAE,CAAC,CAAA;YACV,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;SACtB,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,QAAQ,MAAM,OAAO;YAC1E,OAAO,EAAE,CAAC,CAAA;YACV,MAAM,EAAE,CAAC,CAAA;YACT,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;EAqBzC"}
@@ -0,0 +1,42 @@
1
+ import { qn } from "@kronos-ts/common";
2
+ import { command as createCommand, event as createEvent, query as createQuery, } from "./descriptor.js";
3
+ /**
4
+ * Creates a namespace-scoped factory for message descriptors.
5
+ * Reduces repetition when defining many messages in the same bounded context.
6
+ *
7
+ * ```typescript
8
+ * const ns = withNamespace("university.courses")
9
+ *
10
+ * const CreateCourse = ns.command("CreateCourse", {
11
+ * payload: z.object({ courseId: z.string(), name: z.string() }),
12
+ * })
13
+ *
14
+ * const CourseCreated = ns.event("CourseCreated", {
15
+ * payload: z.object({ courseId: z.string(), name: z.string() }),
16
+ * tags: (p) => [tag("courseId", p.courseId)],
17
+ * })
18
+ *
19
+ * const GetCourse = ns.query("GetCourse", {
20
+ * payload: z.object({ courseId: z.string() }),
21
+ * })
22
+ * ```
23
+ */
24
+ export function withNamespace(namespace) {
25
+ function command(name, def) {
26
+ return createCommand({ name: qn(namespace, name), ...def });
27
+ }
28
+ function query(name, def) {
29
+ return createQuery({ name: qn(namespace, name), ...def });
30
+ }
31
+ return {
32
+ /** Create a command descriptor in this namespace. */
33
+ command,
34
+ /** Create an event descriptor in this namespace. */
35
+ event(name, def) {
36
+ return createEvent({ name: qn(namespace, name), ...def });
37
+ },
38
+ /** Create a query descriptor in this namespace. */
39
+ query,
40
+ };
41
+ }
42
+ //# sourceMappingURL=with-namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-namespace.js","sourceRoot":"","sources":["../src/with-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAY,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,OAAO,IAAI,aAAa,EACxB,KAAK,IAAI,WAAW,EACpB,KAAK,IAAI,WAAW,GACrB,MAAM,iBAAiB,CAAA;AAGxB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAY7C,SAAS,OAAO,CAAC,IAAY,EAAE,GAA2B;QACxD,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAW,CAAC,CAAA;IACtE,CAAC;IAWD,SAAS,KAAK,CAAC,IAAY,EAAE,GAA2B;QACtD,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAW,CAAC,CAAA;IACpE,CAAC;IAED,OAAO;QACL,qDAAqD;QACrD,OAAO;QAEP,oDAAoD;QACpD,KAAK,CAAsB,IAAY,EAAE,GAIxC;YACC,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED,mDAAmD;QACnD,KAAK;KACN,CAAA;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@kronos-ts/messaging",
3
+ "version": "0.1.0",
4
+ "description": "Messaging primitives for Kronos — commands, events, handlers, and event processors.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "author": "Theo Emanuelsson",
8
+ "homepage": "https://github.com/KronosDB/kronos-ts/tree/main/packages/messaging#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/KronosDB/kronos-ts.git",
12
+ "directory": "packages/messaging"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/KronosDB/kronos-ts/issues"
16
+ },
17
+ "keywords": [
18
+ "kronos",
19
+ "event-sourcing",
20
+ "cqrs",
21
+ "dcb",
22
+ "typescript"
23
+ ],
24
+ "sideEffects": false,
25
+ "main": "src/index.ts",
26
+ "types": "src/index.ts",
27
+ "exports": {
28
+ ".": "./src/index.ts",
29
+ "./processing-state": "./src/processing-state.ts"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "src",
34
+ "!src/**/__tests__",
35
+ "!src/**/*.test.ts",
36
+ "!src/**/*.bench.ts"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.json",
40
+ "clean": "rm -rf dist *.tsbuildinfo"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "main": "./dist/index.js",
45
+ "types": "./dist/index.d.ts",
46
+ "exports": {
47
+ ".": {
48
+ "types": "./dist/index.d.ts",
49
+ "default": "./dist/index.js"
50
+ },
51
+ "./processing-state": {
52
+ "types": "./dist/processing-state.d.ts",
53
+ "default": "./dist/processing-state.js"
54
+ }
55
+ }
56
+ },
57
+ "dependencies": {
58
+ "@kronos-ts/common": "workspace:*",
59
+ "@kronos-ts/eventsourcing": "workspace:*",
60
+ "zod": "^4.3.6"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^25.5.2"
64
+ }
65
+ }
@@ -0,0 +1,34 @@
1
+ import type { CommandMessage } from "./message.js"
2
+
3
+ /**
4
+ * The command bus — low-level infrastructure for dispatching command messages
5
+ * to handlers. The bus is swappable: SimpleCommandBus for local, Axon Server connector
6
+ * for distributed.
7
+ *
8
+ * Users don't interact with the bus directly — they use the CommandGateway.
9
+ */
10
+ export interface CommandBus {
11
+ /**
12
+ * Dispatch a fully-formed command message to its handler.
13
+ *
14
+ * The bus auto-nests via ALS (CTX-02): when called outside a UnitOfWork,
15
+ * `runInUoW` creates one; when called inside an active UoW (handler-internal
16
+ * re-dispatch), the active UoW is reused. No explicit context parameter is
17
+ * threaded.
18
+ */
19
+ dispatch(message: CommandMessage): Promise<unknown>
20
+
21
+ /**
22
+ * Subscribe a handler for the given command name. The handler is invoked
23
+ * inside the active UnitOfWork — module-level accessors
24
+ * (`getResource`, `setResource`, `on`, `onError`, …) read/write that UoW's
25
+ * ALS-backed state.
26
+ *
27
+ * Plan 03-04 (CTX-04 / D-34): handler signature dropped its `ctx`
28
+ * parameter. The ProcessingContext type is gone.
29
+ */
30
+ subscribe(
31
+ commandName: string,
32
+ handler: (message: CommandMessage) => Promise<unknown>,
33
+ ): void
34
+ }