@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,30 @@
1
+ import type { CommandMessage } from "./message.js";
2
+ /**
3
+ * The command bus — low-level infrastructure for dispatching command messages
4
+ * to handlers. The bus is swappable: SimpleCommandBus for local, Axon Server connector
5
+ * for distributed.
6
+ *
7
+ * Users don't interact with the bus directly — they use the CommandGateway.
8
+ */
9
+ export interface CommandBus {
10
+ /**
11
+ * Dispatch a fully-formed command message to its handler.
12
+ *
13
+ * The bus auto-nests via ALS (CTX-02): when called outside a UnitOfWork,
14
+ * `runInUoW` creates one; when called inside an active UoW (handler-internal
15
+ * re-dispatch), the active UoW is reused. No explicit context parameter is
16
+ * threaded.
17
+ */
18
+ dispatch(message: CommandMessage): Promise<unknown>;
19
+ /**
20
+ * Subscribe a handler for the given command name. The handler is invoked
21
+ * inside the active UnitOfWork — module-level accessors
22
+ * (`getResource`, `setResource`, `on`, `onError`, …) read/write that UoW's
23
+ * ALS-backed state.
24
+ *
25
+ * Plan 03-04 (CTX-04 / D-34): handler signature dropped its `ctx`
26
+ * parameter. The ProcessingContext type is gone.
27
+ */
28
+ subscribe(commandName: string, handler: (message: CommandMessage) => Promise<unknown>): void;
29
+ }
30
+ //# sourceMappingURL=command-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bus.d.ts","sourceRoot":"","sources":["../src/command-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnD;;;;;;;;OAQG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GACrD,IAAI,CAAA;CACR"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=command-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bus.js","sourceRoot":"","sources":["../src/command-bus.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import type { z } from "zod";
2
+ import type { Metadata } from "@kronos-ts/common";
3
+ import type { CommandDescriptor } from "./descriptor.js";
4
+ import type { EventCriteria } from "./event-criteria.js";
5
+ /**
6
+ * A registered command handler — pairs a command descriptor with its handler function.
7
+ * When the descriptor has a result schema, the handler must return that type.
8
+ */
9
+ export interface CommandHandlerDefinition<P extends z.ZodType = z.ZodType, R extends z.ZodType | undefined = undefined> {
10
+ readonly kind: "command-handler";
11
+ readonly descriptor: CommandDescriptor<P, R>;
12
+ readonly handler: (command: z.infer<P>, metadata: Metadata) => R extends z.ZodType ? Promise<z.infer<R>> | z.infer<R> : Promise<void> | void;
13
+ readonly appendCondition?: (command: z.infer<P>, sourcedCriteria: EventCriteria) => EventCriteria;
14
+ }
15
+ /**
16
+ * Defines a command handler.
17
+ *
18
+ * Void command (no result on descriptor):
19
+ * ```
20
+ * commandHandler(ChangeCourseCapacity, async (command, metadata) => {
21
+ * const course = await load(Course, command.courseId)
22
+ * append(CourseCapacityChanged, { courseId: command.courseId, capacity: command.capacity })
23
+ * })
24
+ * ```
25
+ *
26
+ * Typed result command (result on descriptor):
27
+ * ```
28
+ * const CreateCourse = command({
29
+ * name: qn("university", "CreateCourse"),
30
+ * payload: z.object({ courseId: z.string(), name: z.string() }),
31
+ * result: z.object({ courseId: z.string() }),
32
+ * })
33
+ *
34
+ * commandHandler(CreateCourse, async (command, metadata) => {
35
+ * append(CourseCreated, { ... })
36
+ * return { courseId: command.courseId } // ← must match descriptor's result schema
37
+ * })
38
+ * ```
39
+ *
40
+ * With append condition override:
41
+ * ```
42
+ * commandHandler(CreateCourse, {
43
+ * handler: async (command, metadata) => { ... },
44
+ * appendCondition: (command, criteria) => criteria,
45
+ * })
46
+ * ```
47
+ */
48
+ export declare function commandHandler<P extends z.ZodType>(descriptor: CommandDescriptor<P, undefined>, handler: (command: z.infer<P>, metadata: Metadata) => Promise<void> | void): CommandHandlerDefinition<P, undefined>;
49
+ export declare function commandHandler<P extends z.ZodType, R extends z.ZodType>(descriptor: CommandDescriptor<P, R>, handler: (command: z.infer<P>, metadata: Metadata) => Promise<z.infer<R>> | z.infer<R>): CommandHandlerDefinition<P, R>;
50
+ export declare function commandHandler<P extends z.ZodType>(descriptor: CommandDescriptor<P, undefined>, options: {
51
+ handler: (command: z.infer<P>, metadata: Metadata) => Promise<void> | void;
52
+ appendCondition?: (command: z.infer<P>, sourcedCriteria: EventCriteria) => EventCriteria;
53
+ }): CommandHandlerDefinition<P, undefined>;
54
+ export declare function commandHandler<P extends z.ZodType, R extends z.ZodType>(descriptor: CommandDescriptor<P, R>, options: {
55
+ handler: (command: z.infer<P>, metadata: Metadata) => Promise<z.infer<R>> | z.infer<R>;
56
+ appendCondition?: (command: z.infer<P>, sourcedCriteria: EventCriteria) => EventCriteria;
57
+ }): CommandHandlerDefinition<P, R>;
58
+ //# sourceMappingURL=command-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../src/command-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export function commandHandler(descriptor, handlerOrOptions) {
2
+ if (typeof handlerOrOptions === "function") {
3
+ return { kind: "command-handler", descriptor, handler: handlerOrOptions };
4
+ }
5
+ return {
6
+ kind: "command-handler",
7
+ descriptor,
8
+ handler: handlerOrOptions.handler,
9
+ appendCondition: handlerOrOptions.appendCondition,
10
+ };
11
+ }
12
+ //# sourceMappingURL=command-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handler.js","sourceRoot":"","sources":["../src/command-handler.ts"],"names":[],"mappings":"AAsGA,MAAM,UAAU,cAAc,CAC5B,UAA6B,EAC7B,gBAAqB;IAErB,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3E,CAAC;IACD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,UAAU;QACV,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,eAAe,EAAE,gBAAgB,CAAC,eAAe;KAClD,CAAA;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { CommandHandlerDefinition } from "./command-handler.js";
2
+ /**
3
+ * Minimal Configuration shape consumed by createCommandInvocation /
4
+ * registerCommandHandlersNatively. Phase 8 D-82 reshape: messaging no longer
5
+ * depends on the full @kronos-ts/common Configuration interface (deleted
6
+ * with the configurer trio in Plan 08-04). Callers (kronos() AppImpl.start())
7
+ * pass a shim that satisfies just these methods.
8
+ *
9
+ * The component-key strings used by createCommandInvocation are inlined
10
+ * below (COMMAND_INVOCATION_KEYS) so this file owns its own key set.
11
+ */
12
+ export interface MinimalConfiguration {
13
+ hasComponent(type: string, name?: string): boolean;
14
+ getComponent<T>(type: string, name?: string): T;
15
+ getOptionalComponent<T>(type: string, name?: string): T | undefined;
16
+ }
17
+ import type { CommandBus } from "./command-bus.js";
18
+ import type { HandlerEnhancerDefinition } from "./handler-enhancer.js";
19
+ import type { CommandMessage } from "./message.js";
20
+ /**
21
+ * Creates a command handler invocation function that uses the ProcessingContext
22
+ * for state caching, event buffering, and lifecycle-aware event flushing.
23
+ *
24
+ * D-82: ALS resource setup is preserved BYTE-IDENTICAL across the configurer
25
+ * deletion. The invocation entry seeds the three-key ALS set so module-level
26
+ * helpers (load/append/send/emitUpdate) and the onPrepareCommit closure all
27
+ * resolve their dependencies from the active UoW state.
28
+ */
29
+ export declare function createCommandInvocation(handler: CommandHandlerDefinition<any, any>, config: MinimalConfiguration): (message: CommandMessage) => Promise<unknown>;
30
+ /**
31
+ * Plan 08-03a (D-82 reshape): function-style helper called by AppImpl.start()
32
+ * to subscribe command handlers natively, without the configurer's Module shape.
33
+ *
34
+ * Subscribes each handler onto the commandBus with the createCommandInvocation
35
+ * wrapper that does Phase 4 D-44 ALS resource setup at invocation entry.
36
+ *
37
+ * @param handlers Array of handler definitions to register
38
+ * @param deps Resolved dependencies — commandBus to subscribe onto, plus a
39
+ * Configuration shim (built natively in AppImpl.start()) that
40
+ * createCommandInvocation reads inside the dispatch hot path.
41
+ * Optional handlerEnhancer mirrors the legacy module's enhancer
42
+ * wrap (kept for parity; default-decorator pipeline already
43
+ * handles framework-default interceptors).
44
+ * @param moduleName Logical name passed to the handler enhancer for
45
+ * discriminating command handler groups (default: "commands").
46
+ */
47
+ export declare function registerCommandHandlersNatively(handlers: ReadonlyArray<CommandHandlerDefinition<any, any>>, deps: {
48
+ commandBus: CommandBus;
49
+ config: MinimalConfiguration;
50
+ handlerEnhancer?: HandlerEnhancerDefinition;
51
+ moduleName?: string;
52
+ }): void;
53
+ //# sourceMappingURL=command-handling-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handling-module.d.ts","sourceRoot":"","sources":["../src/command-handling-module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAEpE;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAClD,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAA;IAC/C,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;CACpE;AAgBD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAKtE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,cAAc,CAAA;AAYhE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3C,MAAM,EAAE,oBAAoB,IAEd,SAAS,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC,CA0EzD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,aAAa,CAAC,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAC3D,IAAI,EAAE;IACJ,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,oBAAoB,CAAA;IAC5B,eAAe,CAAC,EAAE,yBAAyB,CAAA;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACA,IAAI,CAgBN"}
@@ -0,0 +1,130 @@
1
+ import { qualifiedNameToString, resourceKey } from "@kronos-ts/common";
2
+ /**
3
+ * Component-key strings consumed by createCommandInvocation. Inlined here
4
+ * so this file has no shared-constant dependency. The kronos() AppImpl
5
+ * populates its config-shim with the same string keys.
6
+ */
7
+ const COMMAND_INVOCATION_KEYS = {
8
+ STATE_MANAGER: "stateManager",
9
+ COMMAND_BUS: "commandBus",
10
+ QUERY_BUS: "queryBus",
11
+ EVENT_STORE: "eventStore",
12
+ TAG_RESOLVER: "tagResolver",
13
+ };
14
+ const EVENT_FLUSH_REGISTERED_KEY = resourceKey("commandInvocationEventFlushRegistered");
15
+ import { CORRELATION_DATA_KEY } from "./correlation-data.js";
16
+ import { getResource, setResource, onPrepareCommit, hasResource } from "./processing-state.js";
17
+ import { COMMAND_BUS_KEY } from "./send.js";
18
+ import { QUERY_BUS_KEY } from "./emit-update.js";
19
+ import { BUFFERED_EVENTS_KEY, SOURCING_INFOS_KEY, STATE_MANAGER_KEY, } from "@kronos-ts/eventsourcing";
20
+ // ---------------------------------------------------------------------------
21
+ // Command invocation — D-82: byte-identical ALS resource setup at invocation entry.
22
+ // Plan 08-03a expanded the ALS three-key set: STATE_MANAGER + COMMAND_BUS + QUERY_BUS.
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Creates a command handler invocation function that uses the ProcessingContext
26
+ * for state caching, event buffering, and lifecycle-aware event flushing.
27
+ *
28
+ * D-82: ALS resource setup is preserved BYTE-IDENTICAL across the configurer
29
+ * deletion. The invocation entry seeds the three-key ALS set so module-level
30
+ * helpers (load/append/send/emitUpdate) and the onPrepareCommit closure all
31
+ * resolve their dependencies from the active UoW state.
32
+ */
33
+ export function createCommandInvocation(handler, config) {
34
+ return async (message) => {
35
+ // D-82 — full ALS resource setup at command invocation entry.
36
+ // STATE_MANAGER: read by load() helper. COMMAND_BUS: read by send() helper.
37
+ // QUERY_BUS: read by emitUpdate() helper.
38
+ if (config.hasComponent(COMMAND_INVOCATION_KEYS.STATE_MANAGER)) {
39
+ setResource(STATE_MANAGER_KEY, config.getComponent(COMMAND_INVOCATION_KEYS.STATE_MANAGER));
40
+ }
41
+ if (config.hasComponent(COMMAND_INVOCATION_KEYS.COMMAND_BUS)) {
42
+ setResource(COMMAND_BUS_KEY, config.getComponent(COMMAND_INVOCATION_KEYS.COMMAND_BUS));
43
+ }
44
+ if (config.hasComponent(COMMAND_INVOCATION_KEYS.QUERY_BUS)) {
45
+ setResource(QUERY_BUS_KEY, config.getComponent(COMMAND_INVOCATION_KEYS.QUERY_BUS));
46
+ }
47
+ // Register event flush in PREPARE_COMMIT phase once per UnitOfWork.
48
+ // Nested context-aware dispatch re-enters createCommandInvocation inside
49
+ // the same ALS state; without this guard every nested command registers an
50
+ // additional flush and the same buffered events are appended repeatedly.
51
+ if (!hasResource(EVENT_FLUSH_REGISTERED_KEY)) {
52
+ setResource(EVENT_FLUSH_REGISTERED_KEY, true);
53
+ onPrepareCommit(async () => {
54
+ const buffered = getResource(BUFFERED_EVENTS_KEY);
55
+ if (!buffered || buffered.length === 0)
56
+ return;
57
+ if (!config.hasComponent(COMMAND_INVOCATION_KEYS.EVENT_STORE))
58
+ return;
59
+ const eventStore = config.getComponent(COMMAND_INVOCATION_KEYS.EVENT_STORE);
60
+ // Enrich events with correlation data from ProcessingContext
61
+ // (set by the CorrelationDataHandlerInterceptor during handler execution)
62
+ const correlationData = getResource(CORRELATION_DATA_KEY);
63
+ const enrichedEvents = correlationData
64
+ ? buffered.map(event => ({
65
+ ...event,
66
+ metadata: { ...event.metadata, ...correlationData },
67
+ }))
68
+ : buffered;
69
+ // Resolve tags via TagResolver (if configured)
70
+ const tagResolver = config.getOptionalComponent(COMMAND_INVOCATION_KEYS.TAG_RESOLVER);
71
+ const resolvedEvents = tagResolver
72
+ ? enrichedEvents.map(event => ({
73
+ ...event,
74
+ tags: [...event.tags, ...tagResolver.resolve(event)],
75
+ }))
76
+ : enrichedEvents;
77
+ const sourcingInfos = getResource(SOURCING_INFOS_KEY) ?? [];
78
+ let appendCondition = undefined;
79
+ if (sourcingInfos.length > 0) {
80
+ const combinedCriteria = sourcingInfos.length === 1
81
+ ? sourcingInfos[0].criteria
82
+ : { kind: "either", criteria: sourcingInfos.map((s) => s.criteria) };
83
+ const maxMarker = sourcingInfos.reduce((max, s) => s.markerPosition > max ? s.markerPosition : max, -1n);
84
+ const finalCriteria = handler.appendCondition
85
+ ? handler.appendCondition(message.payload, combinedCriteria)
86
+ : combinedCriteria;
87
+ appendCondition = {
88
+ criteria: finalCriteria,
89
+ marker: { position: maxMarker },
90
+ };
91
+ }
92
+ await eventStore.append(resolvedEvents, appendCondition);
93
+ });
94
+ }
95
+ return handler.handler(message.payload, message.metadata);
96
+ };
97
+ }
98
+ /**
99
+ * Plan 08-03a (D-82 reshape): function-style helper called by AppImpl.start()
100
+ * to subscribe command handlers natively, without the configurer's Module shape.
101
+ *
102
+ * Subscribes each handler onto the commandBus with the createCommandInvocation
103
+ * wrapper that does Phase 4 D-44 ALS resource setup at invocation entry.
104
+ *
105
+ * @param handlers Array of handler definitions to register
106
+ * @param deps Resolved dependencies — commandBus to subscribe onto, plus a
107
+ * Configuration shim (built natively in AppImpl.start()) that
108
+ * createCommandInvocation reads inside the dispatch hot path.
109
+ * Optional handlerEnhancer mirrors the legacy module's enhancer
110
+ * wrap (kept for parity; default-decorator pipeline already
111
+ * handles framework-default interceptors).
112
+ * @param moduleName Logical name passed to the handler enhancer for
113
+ * discriminating command handler groups (default: "commands").
114
+ */
115
+ export function registerCommandHandlersNatively(handlers, deps) {
116
+ const moduleName = deps.moduleName ?? "commands";
117
+ for (const handler of handlers) {
118
+ const commandName = qualifiedNameToString(handler.descriptor.name);
119
+ let invocation = createCommandInvocation(handler, deps.config);
120
+ if (deps.handlerEnhancer) {
121
+ invocation = deps.handlerEnhancer.wrapHandler(invocation, {
122
+ messageType: "command",
123
+ messageName: commandName,
124
+ handlerGroup: moduleName,
125
+ });
126
+ }
127
+ deps.commandBus.subscribe(commandName, invocation);
128
+ }
129
+ }
130
+ //# sourceMappingURL=command-handling-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handling-module.js","sourceRoot":"","sources":["../src/command-handling-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type ResourceKey } from "@kronos-ts/common";
2
+ import type { Message } from "./message.js";
3
+ import type { DispatchInterceptor, HandlerInterceptor } from "./interceptor.js";
4
+ /**
5
+ * Resource key for storing correlation data in a ProcessingContext.
6
+ */
7
+ export declare const CORRELATION_DATA_KEY: ResourceKey<Record<string, string>>;
8
+ /**
9
+ * Provides correlation data to attach to outgoing messages based on the
10
+ * incoming message being processed.
11
+ *
12
+ * @see messageOriginProvider
13
+ * @see simpleCorrelationDataProvider
14
+ */
15
+ export interface CorrelationDataProvider {
16
+ /**
17
+ * Extract correlation data from the given message.
18
+ * Returns a map of key-value pairs to attach to outgoing messages.
19
+ * Should not throw — exceptions are caught and logged by the framework.
20
+ */
21
+ correlationDataFor(message: Message): Record<string, string>;
22
+ }
23
+ /**
24
+ * Get the active correlation data from the active UnitOfWork (D-29 permissive read).
25
+ *
26
+ * Reads directly from the ALS state. Returns `undefined` when called outside
27
+ * an active UnitOfWork (e.g. primary dispatch path, no handler running) —
28
+ * callers MUST tolerate this no-UoW case.
29
+ *
30
+ * Plan 03-04 (CTX-04 / D-29): no-arg permissive ALS read; the explicit
31
+ * ProcessingContext parameter is gone.
32
+ */
33
+ export declare function getActiveCorrelationData(): Record<string, string> | undefined;
34
+ /**
35
+ * Default correlation data provider that tracks message lineage.
36
+ *
37
+ * - `correlationId`: preserved from the incoming message's metadata, or falls
38
+ * back to the message's own identifier (starts a new correlation chain).
39
+ * - `causationId`: always set to the incoming message's identifier (direct cause).
40
+ *
41
+ * @param correlationKey metadata key for correlation ID (default: "correlationId")
42
+ * @param causationKey metadata key for causation ID (default: "causationId")
43
+ */
44
+ export declare function messageOriginProvider(correlationKey?: string, causationKey?: string): CorrelationDataProvider;
45
+ /**
46
+ * Copies specific metadata keys from the incoming message to outgoing messages.
47
+ *
48
+ * Silently ignores missing keys.
49
+ */
50
+ export declare function simpleCorrelationDataProvider(...metadataKeys: string[]): CorrelationDataProvider;
51
+ /**
52
+ * Creates a handler interceptor that extracts correlation data from the
53
+ * incoming message and stores it in the ProcessingContext.
54
+ *
55
+ * This is the "extract" phase of the dual-interceptor pattern.
56
+ *
57
+ * Each provider is called with the message. Exceptions are caught and
58
+ * logged (they don't break message processing). Results are merged —
59
+ * later providers override earlier ones on key conflicts.
60
+ *
61
+ * The correlation data is stored as a ProcessingContext resource under
62
+ * `CORRELATION_DATA_KEY`, where the dispatch interceptor reads it.
63
+ */
64
+ export declare function correlationDataHandlerInterceptor(providers: ReadonlyArray<CorrelationDataProvider>): HandlerInterceptor;
65
+ /**
66
+ * Creates a dispatch interceptor that reads correlation data from the
67
+ * active ProcessingContext and merges it into the outgoing message's
68
+ * metadata.
69
+ *
70
+ * This is the "apply" phase of the dual-interceptor pattern.
71
+ *
72
+ * When a ProcessingContext is available (nested dispatch from a handler),
73
+ * the interceptor reads correlation data stored by the handler interceptor
74
+ * and merges it into the outgoing message's metadata. For the primary
75
+ * dispatch path (no context), this is a no-op — correlation data flows
76
+ * through message metadata inheritance.
77
+ */
78
+ export declare function correlationDataDispatchInterceptor<M extends Message>(): DispatchInterceptor<M>;
79
+ //# sourceMappingURL=correlation-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation-data.d.ts","sourceRoot":"","sources":["../src/correlation-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAA8B,MAAM,mBAAmB,CAAA;AAC/F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAG/E;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAkC,CAAA;AAEvG;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAM7E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,SAAkB,EAChC,YAAY,SAAgB,GAC3B,uBAAuB,CAYzB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAYhG;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,aAAa,CAAC,uBAAuB,CAAC,GAChD,kBAAkB,CAuBpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kCAAkC,CAAC,CAAC,SAAS,OAAO,KAAK,mBAAmB,CAAC,CAAC,CAAC,CAiB9F"}
@@ -0,0 +1,133 @@
1
+ import { resourceKey, mergeMetadata } from "@kronos-ts/common";
2
+ import { processingStateStorage, setResource } from "./processing-state.js";
3
+ /**
4
+ * Resource key for storing correlation data in a ProcessingContext.
5
+ */
6
+ export const CORRELATION_DATA_KEY = resourceKey("correlationData");
7
+ /**
8
+ * Get the active correlation data from the active UnitOfWork (D-29 permissive read).
9
+ *
10
+ * Reads directly from the ALS state. Returns `undefined` when called outside
11
+ * an active UnitOfWork (e.g. primary dispatch path, no handler running) —
12
+ * callers MUST tolerate this no-UoW case.
13
+ *
14
+ * Plan 03-04 (CTX-04 / D-29): no-arg permissive ALS read; the explicit
15
+ * ProcessingContext parameter is gone.
16
+ */
17
+ export function getActiveCorrelationData() {
18
+ const state = processingStateStorage.getStore();
19
+ if (!state)
20
+ return undefined;
21
+ return state.resources.get(CORRELATION_DATA_KEY.symbol);
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Built-in providers
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Default correlation data provider that tracks message lineage.
28
+ *
29
+ * - `correlationId`: preserved from the incoming message's metadata, or falls
30
+ * back to the message's own identifier (starts a new correlation chain).
31
+ * - `causationId`: always set to the incoming message's identifier (direct cause).
32
+ *
33
+ * @param correlationKey metadata key for correlation ID (default: "correlationId")
34
+ * @param causationKey metadata key for causation ID (default: "causationId")
35
+ */
36
+ export function messageOriginProvider(correlationKey = "correlationId", causationKey = "causationId") {
37
+ return {
38
+ correlationDataFor(message) {
39
+ const existingCorrelation = message.metadata[correlationKey];
40
+ return {
41
+ [correlationKey]: existingCorrelation != null
42
+ ? String(existingCorrelation)
43
+ : message.identifier,
44
+ [causationKey]: message.identifier,
45
+ };
46
+ },
47
+ };
48
+ }
49
+ /**
50
+ * Copies specific metadata keys from the incoming message to outgoing messages.
51
+ *
52
+ * Silently ignores missing keys.
53
+ */
54
+ export function simpleCorrelationDataProvider(...metadataKeys) {
55
+ return {
56
+ correlationDataFor(message) {
57
+ const result = {};
58
+ for (const key of metadataKeys) {
59
+ if (key in message.metadata && message.metadata[key] != null) {
60
+ result[key] = String(message.metadata[key]);
61
+ }
62
+ }
63
+ return result;
64
+ },
65
+ };
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Interceptor factory
69
+ // ---------------------------------------------------------------------------
70
+ /**
71
+ * Creates a handler interceptor that extracts correlation data from the
72
+ * incoming message and stores it in the ProcessingContext.
73
+ *
74
+ * This is the "extract" phase of the dual-interceptor pattern.
75
+ *
76
+ * Each provider is called with the message. Exceptions are caught and
77
+ * logged (they don't break message processing). Results are merged —
78
+ * later providers override earlier ones on key conflicts.
79
+ *
80
+ * The correlation data is stored as a ProcessingContext resource under
81
+ * `CORRELATION_DATA_KEY`, where the dispatch interceptor reads it.
82
+ */
83
+ export function correlationDataHandlerInterceptor(providers) {
84
+ return (message, next) => {
85
+ const correlationData = {};
86
+ for (const provider of providers) {
87
+ try {
88
+ const data = provider.correlationDataFor(message);
89
+ Object.assign(correlationData, data);
90
+ }
91
+ catch (err) {
92
+ console.warn("Encountered exception creating correlation data from provider:", err);
93
+ }
94
+ }
95
+ // Store in ALS-backed processing state.
96
+ // CTX-01 / Plan 03-03: HandlerInterceptor no longer threads ProcessingContext;
97
+ // resource writes go directly through the module-level ALS accessor.
98
+ setResource(CORRELATION_DATA_KEY, correlationData);
99
+ return next();
100
+ };
101
+ }
102
+ /**
103
+ * Creates a dispatch interceptor that reads correlation data from the
104
+ * active ProcessingContext and merges it into the outgoing message's
105
+ * metadata.
106
+ *
107
+ * This is the "apply" phase of the dual-interceptor pattern.
108
+ *
109
+ * When a ProcessingContext is available (nested dispatch from a handler),
110
+ * the interceptor reads correlation data stored by the handler interceptor
111
+ * and merges it into the outgoing message's metadata. For the primary
112
+ * dispatch path (no context), this is a no-op — correlation data flows
113
+ * through message metadata inheritance.
114
+ */
115
+ export function correlationDataDispatchInterceptor() {
116
+ return (message) => {
117
+ // D-24: single code path. Read directly from the ALS state — `getResource`
118
+ // throws on no-UoW, but the dispatch interceptor MUST tolerate the no-UoW
119
+ // primary-dispatch path and return the message unchanged.
120
+ // CTX-01 / Plan 03-03: vestigial _context parameter removed.
121
+ const state = processingStateStorage.getStore();
122
+ if (!state)
123
+ return message;
124
+ const correlationData = state.resources.get(CORRELATION_DATA_KEY.symbol);
125
+ if (!correlationData || Object.keys(correlationData).length === 0)
126
+ return message;
127
+ return {
128
+ ...message,
129
+ metadata: mergeMetadata(message.metadata, correlationData),
130
+ };
131
+ };
132
+ }
133
+ //# sourceMappingURL=correlation-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation-data.js","sourceRoot":"","sources":["../src/correlation-data.ts"],"names":[],"mappings":"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"}