@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,122 @@
1
+ import { createUpdateHandler, runAfterCommitOrImmediately } from "./subscription-query.js";
2
+ import { runInUoW } from "./unit-of-work.js";
3
+ import { qualifiedNameToString } from "@kronos-ts/common";
4
+ /**
5
+ * Simple in-process query bus with subscription query support.
6
+ *
7
+ * Direct queries are dispatched within a UnitOfWork via `runInUoW`.
8
+ * Subscription queries receive an initial result plus a stream of
9
+ * incremental updates emitted via `emitUpdate()`.
10
+ *
11
+ * Plan 03-04 (CTX-04 / D-34): the explicit `unitOfWorkFactory`
12
+ * parameter and branch are gone. `runInUoW` is the only codepath.
13
+ *
14
+ * Interceptor support is provided by wrapping with
15
+ * {@link createInterceptingQueryBus}.
16
+ */
17
+ export function createSimpleQueryBus() {
18
+ const handlers = new Map();
19
+ // Active subscription query handlers, keyed by query identifier
20
+ const subscriptions = new Map();
21
+ const bus = {
22
+ async query(message) {
23
+ const key = qualifiedNameToString(message.name);
24
+ const handler = handlers.get(key);
25
+ if (!handler) {
26
+ throw new Error(`No handler registered for query "${key}"`);
27
+ }
28
+ // Plan 03-01 (D-32) / Plan 03-04 (CTX-04): mirrors
29
+ // simple-command-bus.dispatch. ALS-aware nesting; primary dispatch
30
+ // creates a new UoW.
31
+ return runInUoW(message.metadata, () => handler(message));
32
+ },
33
+ subscribe(queryName, handler) {
34
+ const existing = handlers.get(queryName);
35
+ if (existing && existing !== handler) {
36
+ throw new Error(`A different handler is already registered for query "${queryName}". ` +
37
+ `Duplicate query handler subscriptions are not allowed.`);
38
+ }
39
+ handlers.set(queryName, handler);
40
+ },
41
+ subscriptionQuery(message, bufferSize) {
42
+ const queryId = message.identifier;
43
+ if (subscriptions.has(queryId)) {
44
+ throw new Error(`Subscription query already registered for identifier "${queryId}"`);
45
+ }
46
+ const updateHandler = createUpdateHandler(message, bufferSize);
47
+ subscriptions.set(queryId, updateHandler);
48
+ const initialResult = bus.query(message);
49
+ return {
50
+ initialResult,
51
+ updates: updateHandler.iterable,
52
+ close: () => {
53
+ subscriptions.delete(queryId);
54
+ updateHandler.complete();
55
+ },
56
+ };
57
+ },
58
+ subscribeToUpdates(message, bufferSize) {
59
+ const queryId = message.identifier;
60
+ if (subscriptions.has(queryId)) {
61
+ throw new Error(`Subscription query already registered for identifier "${queryId}"`);
62
+ }
63
+ const updateHandler = createUpdateHandler(message, bufferSize);
64
+ subscriptions.set(queryId, updateHandler);
65
+ return {
66
+ [Symbol.asyncIterator]: () => updateHandler.iterable[Symbol.asyncIterator](),
67
+ close: () => {
68
+ subscriptions.delete(queryId);
69
+ updateHandler.complete();
70
+ },
71
+ };
72
+ },
73
+ async emitUpdate(queryName, filter, update) {
74
+ runAfterCommitOrImmediately(() => {
75
+ for (const [id, handler] of subscriptions) {
76
+ if (!handler.active) {
77
+ subscriptions.delete(id);
78
+ continue;
79
+ }
80
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
81
+ if (handlerQueryName !== queryName)
82
+ continue;
83
+ if (!filter(handler.query.payload))
84
+ continue;
85
+ const accepted = handler.offer(update);
86
+ if (!accepted) {
87
+ handler.completeExceptionally(new Error("Subscription query update buffer overflow"));
88
+ subscriptions.delete(id);
89
+ }
90
+ }
91
+ });
92
+ },
93
+ async completeSubscription(queryName, filter) {
94
+ runAfterCommitOrImmediately(() => {
95
+ for (const [id, handler] of subscriptions) {
96
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
97
+ if (handlerQueryName !== queryName)
98
+ continue;
99
+ if (filter && !filter(handler.query.payload))
100
+ continue;
101
+ handler.complete();
102
+ subscriptions.delete(id);
103
+ }
104
+ });
105
+ },
106
+ async completeSubscriptionExceptionally(queryName, error, filter) {
107
+ runAfterCommitOrImmediately(() => {
108
+ for (const [id, handler] of subscriptions) {
109
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
110
+ if (handlerQueryName !== queryName)
111
+ continue;
112
+ if (filter && !filter(handler.query.payload))
113
+ continue;
114
+ handler.completeExceptionally(error);
115
+ subscriptions.delete(id);
116
+ }
117
+ });
118
+ },
119
+ };
120
+ return bus;
121
+ }
122
+ //# sourceMappingURL=simple-query-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-query-bus.js","sourceRoot":"","sources":["../src/simple-query-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Message } from "./message.js";
2
+ /**
3
+ * A span representing a unit of tracing work.
4
+ * Start the span, do work, then end it.
5
+ *
6
+ */
7
+ export interface Span {
8
+ /** Start the span. Returns the span for chaining. */
9
+ start(): Span;
10
+ /** End the span normally. */
11
+ end(): void;
12
+ /** Record an error on the span and end it. */
13
+ recordException(error: Error): void;
14
+ }
15
+ /**
16
+ * Provides custom attributes to add to spans.
17
+ *
18
+ */
19
+ export interface SpanAttributesProvider {
20
+ provideAttributes(message: Message): Record<string, string>;
21
+ }
22
+ /**
23
+ * Factory for creating tracing spans around message processing.
24
+ *
25
+ * The SpanFactory is the core tracing abstraction. Implementations
26
+ * (e.g., OpenTelemetry) provide the actual span creation and context
27
+ * propagation. The framework calls these methods during dispatch and
28
+ * handling.
29
+ *
30
+ */
31
+ export interface SpanFactory {
32
+ /** Create a root trace span (no parent). */
33
+ createRootTrace(operationName: string): Span;
34
+ /**
35
+ * Create a span for handling a message (consumer side).
36
+ * Extracts trace context from the parent message's metadata.
37
+ */
38
+ createHandlerSpan(operationName: string, parentMessage: Message): Span;
39
+ /**
40
+ * Create a span for dispatching a message (producer side).
41
+ * Links to the parent message's trace context.
42
+ */
43
+ createDispatchSpan(operationName: string, parentMessage: Message): Span;
44
+ /** Create a span for internal framework operations. */
45
+ createInternalSpan(operationName: string): Span;
46
+ /**
47
+ * Inject trace context into a message's metadata so it propagates
48
+ * across message boundaries.
49
+ */
50
+ propagateContext<M extends Message>(message: M): M;
51
+ /** Register a custom span attribute provider. */
52
+ registerSpanAttributeProvider(provider: SpanAttributesProvider): void;
53
+ }
54
+ /**
55
+ * A no-op span factory. Default when no tracing is configured.
56
+ */
57
+ export declare function noOpSpanFactory(): SpanFactory;
58
+ //# sourceMappingURL=span-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-factory.d.ts","sourceRoot":"","sources":["../src/span-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACnB,qDAAqD;IACrD,KAAK,IAAI,IAAI,CAAA;IACb,6BAA6B;IAC7B,GAAG,IAAI,IAAI,CAAA;IACX,8CAA8C;IAC9C,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAE5C;;;OAGG;IACH,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAEtE;;;OAGG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAEvE,uDAAuD;IACvD,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAE/C;;;OAGG;IACH,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;IAElD,iDAAiD;IACjD,6BAA6B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACtE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAe7C"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * A no-op span factory. Default when no tracing is configured.
3
+ */
4
+ export function noOpSpanFactory() {
5
+ const noOpSpan = {
6
+ start() { return this; },
7
+ end() { },
8
+ recordException() { },
9
+ };
10
+ return {
11
+ createRootTrace() { return noOpSpan; },
12
+ createHandlerSpan() { return noOpSpan; },
13
+ createDispatchSpan() { return noOpSpan; },
14
+ createInternalSpan() { return noOpSpan; },
15
+ propagateContext(message) { return message; },
16
+ registerSpanAttributeProvider() { },
17
+ };
18
+ }
19
+ //# sourceMappingURL=span-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-factory.js","sourceRoot":"","sources":["../src/span-factory.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAS;QACrB,KAAK,KAAK,OAAO,IAAI,CAAA,CAAC,CAAC;QACvB,GAAG,KAAI,CAAC;QACR,eAAe,KAAI,CAAC;KACrB,CAAA;IAED,OAAO;QACL,eAAe,KAAK,OAAO,QAAQ,CAAA,CAAC,CAAC;QACrC,iBAAiB,KAAK,OAAO,QAAQ,CAAA,CAAC,CAAC;QACvC,kBAAkB,KAAK,OAAO,QAAQ,CAAA,CAAC,CAAC;QACxC,kBAAkB,KAAK,OAAO,QAAQ,CAAA,CAAC,CAAC;QACxC,gBAAgB,CAAoB,OAAU,IAAI,OAAO,OAAO,CAAA,CAAC,CAAC;QAClE,6BAA6B,KAAI,CAAC;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type { EventHandlerDefinition } from "./event-handler.js";
2
+ import type { StreamableEventSource } from "./event-source.js";
3
+ import type { UoWRunner } from "./unit-of-work.js";
4
+ import type { TokenStore } from "./token-store.js";
5
+ import type { EventProcessingErrorHandler } from "./tracking-event-processor.js";
6
+ import type { HandlerEnhancerDefinition } from "./handler-enhancer.js";
7
+ import type { CommandBus } from "./command-bus.js";
8
+ import type { QueryBus } from "./query-bus.js";
9
+ /**
10
+ * A streaming event processor that uses push-based event delivery
11
+ * via {@link MessageStream}.
12
+ *
13
+ * Architecture:
14
+ * - Opens a MessageStream from the event source via {@link StreamableEventSource.open}
15
+ * - When events become available (via setCallback), pulls them
16
+ * - Processes batches within a UnitOfWork
17
+ * - Stores token at PREPARE_COMMIT (same transaction as handler work)
18
+ *
19
+ */
20
+ export interface EventProcessorStatus {
21
+ readonly segmentId: number;
22
+ readonly position: bigint;
23
+ readonly replaying: boolean;
24
+ readonly caughtUp: boolean;
25
+ readonly error?: Error;
26
+ }
27
+ export interface StreamingEventProcessor {
28
+ readonly name: string;
29
+ readonly running: boolean;
30
+ readonly position: bigint;
31
+ readonly replaying: boolean;
32
+ /** Status per segment. */
33
+ processingStatus(): Map<number, EventProcessorStatus>;
34
+ /** Whether this processor supports reset (always true if not running). */
35
+ supportsReset(): boolean;
36
+ start(): Promise<void>;
37
+ stop(): void;
38
+ resetTokens(startPosition?: bigint, resetContext?: unknown): Promise<void>;
39
+ splitSegment(segmentId: number): Promise<boolean>;
40
+ mergeSegment(segmentId: number): Promise<boolean>;
41
+ releaseSegment(segmentId: number): Promise<void>;
42
+ }
43
+ export interface StreamingEventProcessorOptions {
44
+ name: string;
45
+ eventSource: StreamableEventSource;
46
+ eventHandlers: ReadonlyArray<EventHandlerDefinition>;
47
+ /** State manager injected into ALS at handler-invocation entry (D-44). */
48
+ stateManager?: unknown;
49
+ /** Command bus injected into ALS at handler-invocation entry (D-44). */
50
+ commandBus?: CommandBus;
51
+ /** Query bus injected into ALS at handler-invocation entry (D-44). */
52
+ queryBus?: QueryBus;
53
+ /** Optional per-event callback fired inside the UoW before handler invocation (e.g. monitoring). */
54
+ onEventDelivery?: () => void;
55
+ unitOfWorkRunner?: UoWRunner;
56
+ tokenStore?: TokenStore;
57
+ batchSize?: number;
58
+ errorHandler?: EventProcessingErrorHandler;
59
+ /** Optional handler enhancer applied to all event handlers at setup time. */
60
+ handlerEnhancer?: HandlerEnhancerDefinition;
61
+ /** Reset callback invoked from resetTokens(). */
62
+ onReset?: () => Promise<void> | void;
63
+ }
64
+ export declare function createStreamingEventProcessor(options: StreamingEventProcessorOptions): StreamingEventProcessor;
65
+ //# sourceMappingURL=streaming-event-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-event-processor.d.ts","sourceRoot":"","sources":["../src/streaming-event-processor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAiC,MAAM,mBAAmB,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAEhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAWtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAK9C;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,0BAA0B;IAC1B,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACrD,0EAA0E;IAC1E,aAAa,IAAI,OAAO,CAAA;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,IAAI,CAAA;IACZ,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,qBAAqB,CAAA;IAClC,aAAa,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAA;IACpD,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,oGAAoG;IACpG,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,2BAA2B,CAAA;IAC1C,6EAA6E;IAC7E,eAAe,CAAC,EAAE,yBAAyB,CAAA;IAC3C,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACrC;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAwQzB"}
@@ -0,0 +1,239 @@
1
+ import { emptyMetadata, qualifiedNameToString } from "@kronos-ts/common";
2
+ import { runInNewUoW } from "./unit-of-work.js";
3
+ import { loggingErrorHandler } from "./tracking-event-processor.js";
4
+ import { globalSequenceToken, replayToken, isReplayToken, isReplaying, advanceToken, } from "./tracking-token.js";
5
+ import { REPLAY_STATE_KEY } from "./replay-token.js";
6
+ import { setResource, onPrepareCommit } from "./processing-state.js";
7
+ import { STATE_MANAGER_KEY } from "@kronos-ts/eventsourcing";
8
+ import { COMMAND_BUS_KEY } from "./send.js";
9
+ import { QUERY_BUS_KEY } from "./emit-update.js";
10
+ export function createStreamingEventProcessor(options) {
11
+ const { name, eventSource, eventHandlers, stateManager, commandBus, queryBus, onEventDelivery, unitOfWorkRunner = runInNewUoW, tokenStore, batchSize = 100, errorHandler = loggingErrorHandler(name), handlerEnhancer, onReset, } = options;
12
+ const segment = 0;
13
+ const handlerMap = new Map();
14
+ for (const reg of eventHandlers) {
15
+ const eventName = qualifiedNameToString(reg.descriptor.name);
16
+ if (!handlerMap.has(eventName)) {
17
+ handlerMap.set(eventName, []);
18
+ }
19
+ const enhanced = handlerEnhancer
20
+ ? {
21
+ ...reg,
22
+ handler: handlerEnhancer.wrapHandler(reg.handler, {
23
+ messageType: "event",
24
+ messageName: eventName,
25
+ handlerGroup: name,
26
+ }),
27
+ }
28
+ : reg;
29
+ handlerMap.get(eventName).push(enhanced);
30
+ }
31
+ let token = globalSequenceToken(0n);
32
+ let isRunning = false;
33
+ let stream = null;
34
+ let processTimer = null;
35
+ let processing = false;
36
+ let caughtUp = false;
37
+ let lastError;
38
+ async function initialize() {
39
+ if (tokenStore) {
40
+ await tokenStore.initializeSegments(name, 1);
41
+ const stored = await tokenStore.get(name, segment);
42
+ if (stored !== undefined) {
43
+ token = stored;
44
+ }
45
+ }
46
+ }
47
+ function openStream() {
48
+ stream = eventSource.open({ position: token.position() });
49
+ stream.setCallback(() => {
50
+ if (isRunning && !processing) {
51
+ scheduleImmediate();
52
+ }
53
+ });
54
+ }
55
+ async function processAvailable() {
56
+ if (!isRunning || processing)
57
+ return;
58
+ processing = true;
59
+ try {
60
+ await processFromStream();
61
+ }
62
+ catch (err) {
63
+ lastError = err instanceof Error ? err : new Error(String(err));
64
+ console.error(`Event processor "${name}" error:`, err);
65
+ }
66
+ finally {
67
+ processing = false;
68
+ }
69
+ if (isRunning && stream) {
70
+ if (stream.hasNextAvailable()) {
71
+ scheduleImmediate();
72
+ }
73
+ }
74
+ }
75
+ async function processFromStream() {
76
+ if (!stream)
77
+ return;
78
+ // Check for stream errors — reopen if needed
79
+ const streamError = stream.error();
80
+ if (streamError) {
81
+ console.error(`Event processor "${name}": stream error, reopening:`, streamError);
82
+ stream.close();
83
+ stream = null;
84
+ openStream();
85
+ return;
86
+ }
87
+ const batch = [];
88
+ let event = stream.next();
89
+ while (event && batch.length < batchSize) {
90
+ batch.push(event);
91
+ if (batch.length < batchSize && stream.hasNextAvailable()) {
92
+ event = stream.next();
93
+ }
94
+ else {
95
+ break;
96
+ }
97
+ }
98
+ if (batch.length > 0) {
99
+ caughtUp = false;
100
+ await processBatch(batch);
101
+ if (stream.hasNextAvailable()) {
102
+ scheduleImmediate();
103
+ }
104
+ }
105
+ else {
106
+ caughtUp = true;
107
+ if (isReplayToken(token)) {
108
+ token = globalSequenceToken(token.position());
109
+ if (tokenStore) {
110
+ await tokenStore.store(name, segment, token);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ async function processBatch(batch) {
116
+ let batchEndToken = token;
117
+ await unitOfWorkRunner(emptyMetadata(), async () => {
118
+ for (const sequencedEvent of batch) {
119
+ setResource(REPLAY_STATE_KEY, { replaying: isReplaying(batchEndToken) });
120
+ await deliverEvent(sequencedEvent);
121
+ batchEndToken = advanceToken(batchEndToken, sequencedEvent.sequence + 1n);
122
+ }
123
+ if (tokenStore) {
124
+ onPrepareCommit(async () => {
125
+ await tokenStore.store(name, segment, batchEndToken);
126
+ // Extend claim to prevent expiry during long batches
127
+ await tokenStore.extendClaim(name, segment, name);
128
+ });
129
+ }
130
+ });
131
+ token = batchEndToken;
132
+ }
133
+ async function deliverEvent(sequencedEvent) {
134
+ const event = sequencedEvent.event;
135
+ const eventName = qualifiedNameToString(event.name);
136
+ const handlers = handlerMap.get(eventName);
137
+ if (!handlers || handlers.length === 0)
138
+ return;
139
+ // D-44 wiring: write framework components into ALS at per-event invocation entry.
140
+ if (stateManager !== undefined)
141
+ setResource(STATE_MANAGER_KEY, stateManager);
142
+ if (commandBus !== undefined)
143
+ setResource(COMMAND_BUS_KEY, commandBus);
144
+ if (queryBus !== undefined)
145
+ setResource(QUERY_BUS_KEY, queryBus);
146
+ // Optional per-event callback (e.g. monitoring hooks registered inside the UoW).
147
+ if (onEventDelivery)
148
+ onEventDelivery();
149
+ for (const reg of handlers) {
150
+ try {
151
+ await reg.handler(event.payload, event.metadata);
152
+ }
153
+ catch (err) {
154
+ await errorHandler.handleError(err, eventName, sequencedEvent.sequence);
155
+ }
156
+ }
157
+ }
158
+ function scheduleImmediate() {
159
+ if (processTimer !== null) {
160
+ clearTimeout(processTimer);
161
+ }
162
+ processTimer = setTimeout(processAvailable, 0);
163
+ }
164
+ return {
165
+ get name() { return name; },
166
+ get running() { return isRunning; },
167
+ get position() { return token.position(); },
168
+ get replaying() { return isReplaying(token); },
169
+ processingStatus() {
170
+ const status = new Map();
171
+ status.set(segment, {
172
+ segmentId: segment,
173
+ position: token.position(),
174
+ replaying: isReplaying(token),
175
+ caughtUp,
176
+ error: lastError,
177
+ });
178
+ return status;
179
+ },
180
+ async start() {
181
+ if (isRunning)
182
+ return;
183
+ await initialize();
184
+ isRunning = true;
185
+ openStream();
186
+ scheduleImmediate();
187
+ },
188
+ stop() {
189
+ isRunning = false;
190
+ if (processTimer !== null) {
191
+ clearTimeout(processTimer);
192
+ processTimer = null;
193
+ }
194
+ if (stream) {
195
+ stream.close();
196
+ stream = null;
197
+ }
198
+ },
199
+ async resetTokens(startPosition = 0n, resetContext) {
200
+ if (isRunning) {
201
+ throw new Error(`Processor "${name}" must be stopped before resetting tokens`);
202
+ }
203
+ const headPosition = await eventSource.getHeadPosition();
204
+ if (headPosition <= startPosition) {
205
+ token = globalSequenceToken(startPosition);
206
+ }
207
+ else {
208
+ token = replayToken(globalSequenceToken(headPosition), globalSequenceToken(startPosition), resetContext);
209
+ }
210
+ if (tokenStore) {
211
+ await tokenStore.store(name, segment, token);
212
+ }
213
+ if (onReset) {
214
+ await onReset();
215
+ }
216
+ },
217
+ async splitSegment(_segmentId) {
218
+ if (!tokenStore)
219
+ return false;
220
+ console.warn(`Processor "${name}": segment splitting requires multi-segment support (not yet implemented)`);
221
+ return false;
222
+ },
223
+ async mergeSegment(_segmentId) {
224
+ if (!tokenStore)
225
+ return false;
226
+ console.warn(`Processor "${name}": segment merging requires multi-segment support (not yet implemented)`);
227
+ return false;
228
+ },
229
+ async releaseSegment(_segmentId) {
230
+ if (!tokenStore)
231
+ return;
232
+ await tokenStore.releaseClaim(name, segment, name);
233
+ },
234
+ supportsReset() {
235
+ return !isRunning;
236
+ },
237
+ };
238
+ }
239
+ //# sourceMappingURL=streaming-event-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-event-processor.js","sourceRoot":"","sources":["../src/streaming-event-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { EventHandlerDefinition } from "./event-handler.js";
2
+ import type { UoWRunner } from "./unit-of-work.js";
3
+ import type { EventProcessingErrorHandler } from "./tracking-event-processor.js";
4
+ import type { SubscribableEventSource } from "./event-bus.js";
5
+ import type { CommandBus } from "./command-bus.js";
6
+ import type { QueryBus } from "./query-bus.js";
7
+ import type { HandlerEnhancerDefinition } from "./handler-enhancer.js";
8
+ export type { SubscribableEventSource } from "./event-bus.js";
9
+ /**
10
+ * A push-based event processor that subscribes directly to an event source.
11
+ *
12
+ * Unlike tracking/streaming processors, the subscribing processor:
13
+ * - Does **not** use a token store (no position tracking)
14
+ * - Does **not** support replay or reset
15
+ * - Processes events synchronously with the publisher
16
+ * - Is suitable for in-memory projections that don't need persistence
17
+ *
18
+ */
19
+ export interface SubscribingEventProcessor {
20
+ readonly name: string;
21
+ readonly running: boolean;
22
+ start(): void;
23
+ stop(): void;
24
+ /** Always returns false — subscribing processors don't support reset. */
25
+ supportsReset(): boolean;
26
+ }
27
+ export interface SubscribingEventProcessorOptions {
28
+ name: string;
29
+ eventSource: SubscribableEventSource;
30
+ eventHandlers: ReadonlyArray<EventHandlerDefinition>;
31
+ /** State manager injected into ALS at handler-invocation entry (D-44). */
32
+ stateManager?: unknown;
33
+ /** Command bus injected into ALS at handler-invocation entry (D-44). */
34
+ commandBus?: CommandBus;
35
+ /** Query bus injected into ALS at handler-invocation entry (D-44). */
36
+ queryBus?: QueryBus;
37
+ /** Optional per-event callback fired inside the UoW before handler invocation (e.g. monitoring). */
38
+ onEventDelivery?: () => void;
39
+ unitOfWorkRunner?: UoWRunner;
40
+ errorHandler?: EventProcessingErrorHandler;
41
+ /**
42
+ * Plan 09-01: optional handler enhancer applied to each event handler at
43
+ * registration time. Symmetric to TrackingEventProcessor.handlerEnhancer.
44
+ * When set, each registered handler is wrapped via wrapHandler with
45
+ * messageType "event" and the group name as handlerGroup.
46
+ */
47
+ handlerEnhancer?: HandlerEnhancerDefinition;
48
+ }
49
+ /**
50
+ * Creates a subscribing event processor.
51
+ *
52
+ * The processor subscribes to the event source and processes events
53
+ * within a UnitOfWork as they arrive. Events are delivered on the
54
+ * publisher's call stack (synchronous with append).
55
+ */
56
+ export declare function createSubscribingEventProcessor(options: SubscribingEventProcessorOptions): SubscribingEventProcessor;
57
+ //# sourceMappingURL=subscribing-event-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribing-event-processor.d.ts","sourceRoot":"","sources":["../src/subscribing-event-processor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAEhF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAOtE,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,yEAAyE;IACzE,aAAa,IAAI,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,uBAAuB,CAAA;IACpC,aAAa,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAA;IACpD,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,oGAAoG;IACpG,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,YAAY,CAAC,EAAE,2BAA2B,CAAA;IAC1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,yBAAyB,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAiG3B"}