@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.
- package/dist/command-bus.d.ts +30 -0
- package/dist/command-bus.d.ts.map +1 -0
- package/dist/command-bus.js +2 -0
- package/dist/command-bus.js.map +1 -0
- package/dist/command-handler.d.ts +58 -0
- package/dist/command-handler.d.ts.map +1 -0
- package/dist/command-handler.js +12 -0
- package/dist/command-handler.js.map +1 -0
- package/dist/command-handling-module.d.ts +53 -0
- package/dist/command-handling-module.d.ts.map +1 -0
- package/dist/command-handling-module.js +130 -0
- package/dist/command-handling-module.js.map +1 -0
- package/dist/correlation-data.d.ts +79 -0
- package/dist/correlation-data.d.ts.map +1 -0
- package/dist/correlation-data.js +133 -0
- package/dist/correlation-data.js.map +1 -0
- package/dist/dead-letter-queue.d.ts +134 -0
- package/dist/dead-letter-queue.d.ts.map +1 -0
- package/dist/dead-letter-queue.js +176 -0
- package/dist/dead-letter-queue.js.map +1 -0
- package/dist/dead-lettering-handler.d.ts +42 -0
- package/dist/dead-lettering-handler.d.ts.map +1 -0
- package/dist/dead-lettering-handler.js +67 -0
- package/dist/dead-lettering-handler.js.map +1 -0
- package/dist/descriptor.d.ts +135 -0
- package/dist/descriptor.d.ts.map +1 -0
- package/dist/descriptor.js +36 -0
- package/dist/descriptor.js.map +1 -0
- package/dist/emit-update.d.ts +22 -0
- package/dist/emit-update.d.ts.map +1 -0
- package/dist/emit-update.js +23 -0
- package/dist/emit-update.js.map +1 -0
- package/dist/event-bus.d.ts +29 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +22 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-criteria.d.ts +87 -0
- package/dist/event-criteria.d.ts.map +1 -0
- package/dist/event-criteria.js +90 -0
- package/dist/event-criteria.js.map +1 -0
- package/dist/event-gateway.d.ts +19 -0
- package/dist/event-gateway.d.ts.map +1 -0
- package/dist/event-gateway.js +22 -0
- package/dist/event-gateway.js.map +1 -0
- package/dist/event-handler.d.ts +30 -0
- package/dist/event-handler.d.ts.map +1 -0
- package/dist/event-handler.js +18 -0
- package/dist/event-handler.js.map +1 -0
- package/dist/event-processor-builder.d.ts +148 -0
- package/dist/event-processor-builder.d.ts.map +1 -0
- package/dist/event-processor-builder.js +175 -0
- package/dist/event-processor-builder.js.map +1 -0
- package/dist/event-processor.d.ts +10 -0
- package/dist/event-processor.d.ts.map +1 -0
- package/dist/event-processor.js +2 -0
- package/dist/event-processor.js.map +1 -0
- package/dist/event-sink.d.ts +23 -0
- package/dist/event-sink.d.ts.map +1 -0
- package/dist/event-sink.js +2 -0
- package/dist/event-sink.js.map +1 -0
- package/dist/event-source.d.ts +98 -0
- package/dist/event-source.d.ts.map +1 -0
- package/dist/event-source.js +191 -0
- package/dist/event-source.js.map +1 -0
- package/dist/gateway.d.ts +68 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +62 -0
- package/dist/gateway.js.map +1 -0
- package/dist/handler-enhancer.d.ts +53 -0
- package/dist/handler-enhancer.d.ts.map +1 -0
- package/dist/handler-enhancer.js +17 -0
- package/dist/handler-enhancer.js.map +1 -0
- package/dist/handler.d.ts +51 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +26 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/intercepting-command-bus.d.ts +17 -0
- package/dist/intercepting-command-bus.d.ts.map +1 -0
- package/dist/intercepting-command-bus.js +54 -0
- package/dist/intercepting-command-bus.js.map +1 -0
- package/dist/intercepting-event-bus.d.ts +8 -0
- package/dist/intercepting-event-bus.d.ts.map +1 -0
- package/dist/intercepting-event-bus.js +22 -0
- package/dist/intercepting-event-bus.js.map +1 -0
- package/dist/intercepting-query-bus.d.ts +17 -0
- package/dist/intercepting-query-bus.d.ts.map +1 -0
- package/dist/intercepting-query-bus.js +68 -0
- package/dist/intercepting-query-bus.js.map +1 -0
- package/dist/interceptor.d.ts +46 -0
- package/dist/interceptor.d.ts.map +1 -0
- package/dist/interceptor.js +2 -0
- package/dist/interceptor.js.map +1 -0
- package/dist/message-monitor-registry.d.ts +28 -0
- package/dist/message-monitor-registry.d.ts.map +1 -0
- package/dist/message-monitor-registry.js +37 -0
- package/dist/message-monitor-registry.js.map +1 -0
- package/dist/message-monitor.d.ts +36 -0
- package/dist/message-monitor.d.ts.map +1 -0
- package/dist/message-monitor.js +39 -0
- package/dist/message-monitor.js.map +1 -0
- package/dist/message.d.ts +42 -0
- package/dist/message.d.ts.map +1 -0
- package/dist/message.js +2 -0
- package/dist/message.js.map +1 -0
- package/dist/processing-state.d.ts +115 -0
- package/dist/processing-state.d.ts.map +1 -0
- package/dist/processing-state.js +205 -0
- package/dist/processing-state.js.map +1 -0
- package/dist/processor-configuration.d.ts +51 -0
- package/dist/processor-configuration.d.ts.map +1 -0
- package/dist/processor-configuration.js +2 -0
- package/dist/processor-configuration.js.map +1 -0
- package/dist/query-bus.d.ts +51 -0
- package/dist/query-bus.d.ts.map +1 -0
- package/dist/query-bus.js +2 -0
- package/dist/query-bus.js.map +1 -0
- package/dist/query-handler.d.ts +35 -0
- package/dist/query-handler.d.ts.map +1 -0
- package/dist/query-handler.js +19 -0
- package/dist/query-handler.js.map +1 -0
- package/dist/query-handling-module.d.ts +24 -0
- package/dist/query-handling-module.d.ts.map +1 -0
- package/dist/query-handling-module.js +32 -0
- package/dist/query-handling-module.js.map +1 -0
- package/dist/replay-token.d.ts +31 -0
- package/dist/replay-token.d.ts.map +1 -0
- package/dist/replay-token.js +37 -0
- package/dist/replay-token.js.map +1 -0
- package/dist/retrying-command-bus.d.ts +32 -0
- package/dist/retrying-command-bus.d.ts.map +1 -0
- package/dist/retrying-command-bus.js +58 -0
- package/dist/retrying-command-bus.js.map +1 -0
- package/dist/routing-strategy.d.ts +30 -0
- package/dist/routing-strategy.d.ts.map +1 -0
- package/dist/routing-strategy.js +37 -0
- package/dist/routing-strategy.js.map +1 -0
- package/dist/segment.d.ts +72 -0
- package/dist/segment.d.ts.map +1 -0
- package/dist/segment.js +103 -0
- package/dist/segment.js.map +1 -0
- package/dist/send.d.ts +28 -0
- package/dist/send.d.ts.map +1 -0
- package/dist/send.js +36 -0
- package/dist/send.js.map +1 -0
- package/dist/serializer.d.ts +40 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +90 -0
- package/dist/serializer.js.map +1 -0
- package/dist/simple-command-bus.d.ts +23 -0
- package/dist/simple-command-bus.d.ts.map +1 -0
- package/dist/simple-command-bus.js +49 -0
- package/dist/simple-command-bus.js.map +1 -0
- package/dist/simple-query-bus.d.ts +16 -0
- package/dist/simple-query-bus.d.ts.map +1 -0
- package/dist/simple-query-bus.js +122 -0
- package/dist/simple-query-bus.js.map +1 -0
- package/dist/span-factory.d.ts +58 -0
- package/dist/span-factory.d.ts.map +1 -0
- package/dist/span-factory.js +19 -0
- package/dist/span-factory.js.map +1 -0
- package/dist/streaming-event-processor.d.ts +65 -0
- package/dist/streaming-event-processor.d.ts.map +1 -0
- package/dist/streaming-event-processor.js +239 -0
- package/dist/streaming-event-processor.js.map +1 -0
- package/dist/subscribing-event-processor.d.ts +57 -0
- package/dist/subscribing-event-processor.d.ts.map +1 -0
- package/dist/subscribing-event-processor.js +100 -0
- package/dist/subscribing-event-processor.js.map +1 -0
- package/dist/subscription-query.d.ts +63 -0
- package/dist/subscription-query.d.ts.map +1 -0
- package/dist/subscription-query.js +119 -0
- package/dist/subscription-query.js.map +1 -0
- package/dist/token-store.d.ts +83 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +112 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tracing-command-bus.d.ts +16 -0
- package/dist/tracing-command-bus.d.ts.map +1 -0
- package/dist/tracing-command-bus.js +44 -0
- package/dist/tracing-command-bus.js.map +1 -0
- package/dist/tracing-handler-enhancer.d.ts +11 -0
- package/dist/tracing-handler-enhancer.d.ts.map +1 -0
- package/dist/tracing-handler-enhancer.js +27 -0
- package/dist/tracing-handler-enhancer.js.map +1 -0
- package/dist/tracking-event-processor.d.ts +72 -0
- package/dist/tracking-event-processor.d.ts.map +1 -0
- package/dist/tracking-event-processor.js +223 -0
- package/dist/tracking-event-processor.js.map +1 -0
- package/dist/tracking-token.d.ts +120 -0
- package/dist/tracking-token.d.ts.map +1 -0
- package/dist/tracking-token.js +132 -0
- package/dist/tracking-token.js.map +1 -0
- package/dist/transaction.d.ts +60 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +74 -0
- package/dist/transaction.js.map +1 -0
- package/dist/unit-of-work.d.ts +41 -0
- package/dist/unit-of-work.d.ts.map +1 -0
- package/dist/unit-of-work.js +96 -0
- package/dist/unit-of-work.js.map +1 -0
- package/dist/upcaster.d.ts +91 -0
- package/dist/upcaster.d.ts.map +1 -0
- package/dist/upcaster.js +114 -0
- package/dist/upcaster.js.map +1 -0
- package/dist/with-namespace.d.ts +59 -0
- package/dist/with-namespace.d.ts.map +1 -0
- package/dist/with-namespace.js +42 -0
- package/dist/with-namespace.js.map +1 -0
- package/package.json +65 -0
- package/src/command-bus.ts +34 -0
- package/src/command-handler.ts +116 -0
- package/src/command-handling-module.ts +183 -0
- package/src/correlation-data.ts +169 -0
- package/src/dead-letter-queue.ts +330 -0
- package/src/dead-lettering-handler.ts +109 -0
- package/src/descriptor.ts +176 -0
- package/src/emit-update.ts +35 -0
- package/src/event-bus.ts +45 -0
- package/src/event-criteria.ts +141 -0
- package/src/event-gateway.ts +42 -0
- package/src/event-handler.ts +44 -0
- package/src/event-processor-builder.ts +246 -0
- package/src/event-processor.ts +9 -0
- package/src/event-sink.ts +23 -0
- package/src/event-source.ts +301 -0
- package/src/gateway.ts +144 -0
- package/src/handler-enhancer.ts +70 -0
- package/src/handler.ts +133 -0
- package/src/index.ts +356 -0
- package/src/intercepting-command-bus.ts +73 -0
- package/src/intercepting-event-bus.ts +29 -0
- package/src/intercepting-query-bus.ts +104 -0
- package/src/interceptor.ts +48 -0
- package/src/message-monitor-registry.ts +64 -0
- package/src/message-monitor.ts +68 -0
- package/src/message.ts +41 -0
- package/src/processing-state.ts +258 -0
- package/src/processor-configuration.ts +59 -0
- package/src/query-bus.ts +69 -0
- package/src/query-handler.ts +49 -0
- package/src/query-handling-module.ts +44 -0
- package/src/replay-token.ts +53 -0
- package/src/retrying-command-bus.ts +80 -0
- package/src/routing-strategy.ts +59 -0
- package/src/segment.ts +136 -0
- package/src/send.ts +44 -0
- package/src/serializer.ts +122 -0
- package/src/simple-command-bus.ts +59 -0
- package/src/simple-query-bus.ts +158 -0
- package/src/span-factory.ts +81 -0
- package/src/streaming-event-processor.ts +351 -0
- package/src/subscribing-event-processor.ts +169 -0
- package/src/subscription-query.ts +173 -0
- package/src/token-store.ts +211 -0
- package/src/tracing-command-bus.ts +52 -0
- package/src/tracing-handler-enhancer.ts +34 -0
- package/src/tracking-event-processor.ts +336 -0
- package/src/tracking-token.ts +231 -0
- package/src/transaction.ts +98 -0
- package/src/unit-of-work.ts +138 -0
- package/src/upcaster.ts +174 -0
- package/src/with-namespace.ts +75 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { resourceKey, qualifiedNameToString } from "@kronos-ts/common";
|
|
2
|
+
import { requireInvocationPhase } from "./processing-state.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resource key for the query bus component.
|
|
5
|
+
* Written by handling modules + processors at handler-invocation entry (D-44).
|
|
6
|
+
*/
|
|
7
|
+
export const QUERY_BUS_KEY = resourceKey("queryBus");
|
|
8
|
+
/**
|
|
9
|
+
* Plan 04-01 (HDL-02 / D-42): module-level emitUpdate.
|
|
10
|
+
*
|
|
11
|
+
* Throws NoActiveUnitOfWork outside a UoW; throws WrongUoWPhase outside
|
|
12
|
+
* INVOCATION phase (D-43 mutator guard). Emits a subscription query update
|
|
13
|
+
* through the active query bus.
|
|
14
|
+
*/
|
|
15
|
+
export const emitUpdate = (queryDescriptor, filter, update) => {
|
|
16
|
+
const state = requireInvocationPhase(); // D-43 mutator guard
|
|
17
|
+
const bus = state.resources.get(QUERY_BUS_KEY.symbol);
|
|
18
|
+
if (!bus)
|
|
19
|
+
throw new Error("No query bus configured");
|
|
20
|
+
const queryName = qualifiedNameToString(queryDescriptor.name);
|
|
21
|
+
bus.emitUpdate(queryName, filter, update);
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=emit-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-update.js","sourceRoot":"","sources":["../src/emit-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAoB,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAa9D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B,WAAW,CAAC,UAAU,CAAC,CAAA;AAE3E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;IAChF,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAyB,CAAA;IAC7E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7D,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,MAAiC,EAAE,MAAM,CAAC,CAAA;AACtE,CAAC,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { EventMessage } from "./message.js";
|
|
2
|
+
import type { EventSink } from "./event-sink.js";
|
|
3
|
+
/**
|
|
4
|
+
* Subscribable source of events — push-based delivery.
|
|
5
|
+
*/
|
|
6
|
+
export interface SubscribableEventSource {
|
|
7
|
+
/**
|
|
8
|
+
* Subscribe to events as they are published.
|
|
9
|
+
* Returns an unsubscribe function.
|
|
10
|
+
*
|
|
11
|
+
* @param handler Called with each batch of events as they are appended.
|
|
12
|
+
*/
|
|
13
|
+
subscribe(handler: (events: ReadonlyArray<EventMessage>) => Promise<void>): () => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The event bus — combines event publication (EventSink) with
|
|
17
|
+
* push-based subscription (SubscribableEventSource).
|
|
18
|
+
*
|
|
19
|
+
* In event sourcing setups, the EventStore serves as the EventBus.
|
|
20
|
+
* In non-event-sourcing setups, SimpleEventBus provides in-memory distribution.
|
|
21
|
+
*/
|
|
22
|
+
export interface EventBus extends SubscribableEventSource, EventSink {
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* In-memory event bus for non-event-sourcing scenarios.
|
|
26
|
+
* Publishes events directly to all subscribers.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createSimpleEventBus(): EventBus;
|
|
29
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAA;CACvF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAS,SAAQ,uBAAuB,EAAE,SAAS;CAAG;AAEvE;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,QAAQ,CAe/C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory event bus for non-event-sourcing scenarios.
|
|
3
|
+
* Publishes events directly to all subscribers.
|
|
4
|
+
*/
|
|
5
|
+
export function createSimpleEventBus() {
|
|
6
|
+
const subscribers = new Set();
|
|
7
|
+
return {
|
|
8
|
+
async publish(events) {
|
|
9
|
+
for (const subscriber of subscribers) {
|
|
10
|
+
try {
|
|
11
|
+
await subscriber(events);
|
|
12
|
+
}
|
|
13
|
+
catch { /* ignore subscriber errors */ }
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
subscribe(handler) {
|
|
17
|
+
subscribers.add(handler);
|
|
18
|
+
return () => { subscribers.delete(handler); };
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0D,CAAA;IAErF,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM;YAClB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC;oBAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,SAAS,CAAC,OAAO;YACf,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACxB,OAAO,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Tag, QualifiedName } from "@kronos-ts/common";
|
|
2
|
+
import type { EventDescriptor } from "./descriptor.js";
|
|
3
|
+
/**
|
|
4
|
+
* Criteria for selecting events from the event store.
|
|
5
|
+
* Used for both sourcing conditions (which events to load) and
|
|
6
|
+
* append conditions (which events define the consistency boundary).
|
|
7
|
+
*
|
|
8
|
+
* Criteria are composable via `or()` and restrictable via `ofTypes()`.
|
|
9
|
+
*/
|
|
10
|
+
export type EventCriteria = TagCriteria | TypeRestrictedCriteria | EitherCriteria | AnyTagCriteria;
|
|
11
|
+
export interface TagCriteria {
|
|
12
|
+
readonly kind: "tags";
|
|
13
|
+
readonly tags: ReadonlyArray<Tag>;
|
|
14
|
+
}
|
|
15
|
+
export interface TypeRestrictedCriteria {
|
|
16
|
+
readonly kind: "type-restricted";
|
|
17
|
+
readonly inner: TagCriteria | AnyTagCriteria;
|
|
18
|
+
readonly types: ReadonlyArray<string>;
|
|
19
|
+
}
|
|
20
|
+
export interface EitherCriteria {
|
|
21
|
+
readonly kind: "either";
|
|
22
|
+
readonly criteria: ReadonlyArray<EventCriteria>;
|
|
23
|
+
}
|
|
24
|
+
export interface AnyTagCriteria {
|
|
25
|
+
readonly kind: "any-tag";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A tag or any-tag criteria that allows further restriction by event types.
|
|
29
|
+
*/
|
|
30
|
+
export type RestrictableEventCriteria = (TagCriteria | AnyTagCriteria) & {
|
|
31
|
+
/**
|
|
32
|
+
* Restrict matched events to the given types.
|
|
33
|
+
* Accepts event descriptors or qualified name strings.
|
|
34
|
+
*/
|
|
35
|
+
ofTypes(...types: Array<EventDescriptor<any> | QualifiedName | string>): EventCriteria;
|
|
36
|
+
};
|
|
37
|
+
export declare const EventCriteria: {
|
|
38
|
+
/**
|
|
39
|
+
* Match events having all the specified tags.
|
|
40
|
+
*
|
|
41
|
+
* Accepts individual Tag objects or a record of key-value pairs:
|
|
42
|
+
* ```typescript
|
|
43
|
+
* EventCriteria.havingTags({ courseId: id.courseId })
|
|
44
|
+
* EventCriteria.havingTags(tag("courseId", id.courseId))
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
readonly havingTags: (...args: Tag[] | [Record<string, string>]) => RestrictableEventCriteria;
|
|
48
|
+
/**
|
|
49
|
+
* Match events having any tag (i.e., all tagged events).
|
|
50
|
+
*/
|
|
51
|
+
readonly havingAnyTag: () => RestrictableEventCriteria;
|
|
52
|
+
/**
|
|
53
|
+
* Match events matching any of the given criteria (logical OR).
|
|
54
|
+
*/
|
|
55
|
+
readonly either: (...criteria: EventCriteria[]) => EventCriteria;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Match events having all the specified tags.
|
|
59
|
+
*
|
|
60
|
+
* Shorthand for `EventCriteria.havingTags()`. Supports `.ofTypes()` chaining.
|
|
61
|
+
*
|
|
62
|
+
* ```typescript
|
|
63
|
+
* tags({ courseId: id.courseId })
|
|
64
|
+
* tags({ courseId: id.courseId }).ofTypes(CourseCreated, CourseCapacityChanged)
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function tags(...args: Tag[] | [Record<string, string>]): RestrictableEventCriteria;
|
|
68
|
+
/**
|
|
69
|
+
* Match events having any tag.
|
|
70
|
+
*
|
|
71
|
+
* Shorthand for `EventCriteria.havingAnyTag()`. Supports `.ofTypes()` chaining.
|
|
72
|
+
*/
|
|
73
|
+
export declare function anyTag(): RestrictableEventCriteria;
|
|
74
|
+
/**
|
|
75
|
+
* Match events matching any of the given criteria (logical OR).
|
|
76
|
+
*
|
|
77
|
+
* Shorthand for `EventCriteria.either()`.
|
|
78
|
+
*
|
|
79
|
+
* ```typescript
|
|
80
|
+
* either(
|
|
81
|
+
* tags({ courseId: id.courseId }),
|
|
82
|
+
* tags({ studentId: id.studentId }).ofTypes(StudentSubscribed),
|
|
83
|
+
* )
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare function either(...criteria: EventCriteria[]): EventCriteria;
|
|
87
|
+
//# sourceMappingURL=event-criteria.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-criteria.d.ts","sourceRoot":"","sources":["../src/event-criteria.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,sBAAsB,GACtB,cAAc,GACd,cAAc,CAAA;AAElB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAAA;IAC5C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,WAAW,GAAG,cAAc,CAAC,GAAG;IACvE;;;OAGG;IACH,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,MAAM,CAAC,GAAG,aAAa,CAAA;CACvF,CAAA;AAqBD,eAAO,MAAM,aAAa;IACxB;;;;;;;;OAQG;mCACiB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,yBAAyB;IAOhF;;OAEG;iCACa,yBAAyB;IAIzC;;OAEG;mCACiB,aAAa,EAAE,KAAG,aAAa;CAG3C,CAAA;AAMV;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,yBAAyB,CAEzF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,yBAAyB,CAElD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,GAAG,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,CAElE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { qualifiedNameToString, tagsFromRecord } from "@kronos-ts/common";
|
|
2
|
+
function resolveTypeName(t) {
|
|
3
|
+
if (typeof t === "string")
|
|
4
|
+
return t;
|
|
5
|
+
if ("kind" in t && t.kind === "event")
|
|
6
|
+
return qualifiedNameToString(t.name);
|
|
7
|
+
if ("namespace" in t && "name" in t)
|
|
8
|
+
return qualifiedNameToString(t);
|
|
9
|
+
return String(t);
|
|
10
|
+
}
|
|
11
|
+
function makeRestrictable(criteria) {
|
|
12
|
+
return Object.assign(criteria, {
|
|
13
|
+
ofTypes(...types) {
|
|
14
|
+
return {
|
|
15
|
+
kind: "type-restricted",
|
|
16
|
+
inner: criteria,
|
|
17
|
+
types: types.map(resolveTypeName),
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export const EventCriteria = {
|
|
23
|
+
/**
|
|
24
|
+
* Match events having all the specified tags.
|
|
25
|
+
*
|
|
26
|
+
* Accepts individual Tag objects or a record of key-value pairs:
|
|
27
|
+
* ```typescript
|
|
28
|
+
* EventCriteria.havingTags({ courseId: id.courseId })
|
|
29
|
+
* EventCriteria.havingTags(tag("courseId", id.courseId))
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
havingTags(...args) {
|
|
33
|
+
if (args.length === 1 && typeof args[0] === "object" && !("key" in args[0])) {
|
|
34
|
+
return makeRestrictable({ kind: "tags", tags: tagsFromRecord(args[0]) });
|
|
35
|
+
}
|
|
36
|
+
return makeRestrictable({ kind: "tags", tags: args });
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Match events having any tag (i.e., all tagged events).
|
|
40
|
+
*/
|
|
41
|
+
havingAnyTag() {
|
|
42
|
+
return makeRestrictable({ kind: "any-tag" });
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Match events matching any of the given criteria (logical OR).
|
|
46
|
+
*/
|
|
47
|
+
either(...criteria) {
|
|
48
|
+
return { kind: "either", criteria };
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Standalone shorthand functions
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* Match events having all the specified tags.
|
|
56
|
+
*
|
|
57
|
+
* Shorthand for `EventCriteria.havingTags()`. Supports `.ofTypes()` chaining.
|
|
58
|
+
*
|
|
59
|
+
* ```typescript
|
|
60
|
+
* tags({ courseId: id.courseId })
|
|
61
|
+
* tags({ courseId: id.courseId }).ofTypes(CourseCreated, CourseCapacityChanged)
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function tags(...args) {
|
|
65
|
+
return EventCriteria.havingTags(...args);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Match events having any tag.
|
|
69
|
+
*
|
|
70
|
+
* Shorthand for `EventCriteria.havingAnyTag()`. Supports `.ofTypes()` chaining.
|
|
71
|
+
*/
|
|
72
|
+
export function anyTag() {
|
|
73
|
+
return EventCriteria.havingAnyTag();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Match events matching any of the given criteria (logical OR).
|
|
77
|
+
*
|
|
78
|
+
* Shorthand for `EventCriteria.either()`.
|
|
79
|
+
*
|
|
80
|
+
* ```typescript
|
|
81
|
+
* either(
|
|
82
|
+
* tags({ courseId: id.courseId }),
|
|
83
|
+
* tags({ studentId: id.studentId }).ofTypes(StudentSubscribed),
|
|
84
|
+
* )
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export function either(...criteria) {
|
|
88
|
+
return EventCriteria.either(...criteria);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=event-criteria.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-criteria.js","sourceRoot":"","sources":["../src/event-criteria.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA+CzE,SAAS,eAAe,CAAC,CAAgD;IACvE,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAA;IACnC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3E,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,qBAAqB,CAAC,CAAkB,CAAC,CAAA;IACrF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAsC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QAC7B,OAAO,CAAC,GAAG,KAA2D;YACpE,OAAO;gBACL,IAAI,EAAE,iBAA0B;gBAChC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;aAClC,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;;;;;;;;OAQG;IACH,UAAU,CAAC,GAAG,IAAsC;QAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAA2B,CAAC,EAAE,CAAC,CAAA;QACpG,CAAC;QACD,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAA;IAChE,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,QAAyB;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACrC,CAAC;CACO,CAAA;AAEV,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,IAAsC;IAC5D,OAAO,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAA;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,aAAa,CAAC,YAAY,EAAE,CAAA;AACrC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,QAAyB;IACjD,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EventSink } from "./event-sink.js";
|
|
2
|
+
import type { EventDescriptor } from "./descriptor.js";
|
|
3
|
+
import type { z } from "zod";
|
|
4
|
+
/**
|
|
5
|
+
* User-facing gateway for publishing events directly (without going through
|
|
6
|
+
* command handlers).
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
export interface EventGateway {
|
|
10
|
+
/**
|
|
11
|
+
* Publish a single event described by its descriptor.
|
|
12
|
+
*/
|
|
13
|
+
publish<P extends z.ZodType>(descriptor: EventDescriptor<P>, payload: z.infer<P>, metadata?: Record<string, unknown>): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates an event gateway backed by an event sink.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createEventGateway(eventSink: EventSink): EventGateway;
|
|
19
|
+
//# sourceMappingURL=event-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-gateway.d.ts","sourceRoot":"","sources":["../src/event-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EACzB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CAgBrE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { generateIdentifier } from "@kronos-ts/common";
|
|
2
|
+
/**
|
|
3
|
+
* Creates an event gateway backed by an event sink.
|
|
4
|
+
*/
|
|
5
|
+
export function createEventGateway(eventSink) {
|
|
6
|
+
return {
|
|
7
|
+
async publish(descriptor, payload, metadata = {}) {
|
|
8
|
+
const tags = descriptor.tags ? descriptor.tags(payload) : [];
|
|
9
|
+
const event = {
|
|
10
|
+
identifier: generateIdentifier(),
|
|
11
|
+
name: descriptor.name,
|
|
12
|
+
version: descriptor.version,
|
|
13
|
+
payload,
|
|
14
|
+
metadata,
|
|
15
|
+
timestamp: Date.now(),
|
|
16
|
+
tags,
|
|
17
|
+
};
|
|
18
|
+
await eventSink.publish([event]);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=event-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-gateway.js","sourceRoot":"","sources":["../src/event-gateway.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAmBtD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAoB;IACrD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC5D,MAAM,KAAK,GAAiB;gBAC1B,UAAU,EAAE,kBAAkB,EAAE;gBAChC,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,OAAO;gBACP,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI;aACL,CAAA;YACD,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAClC,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Metadata } from "@kronos-ts/common";
|
|
3
|
+
import type { EventDescriptor } from "./descriptor.js";
|
|
4
|
+
/**
|
|
5
|
+
* A registered singular event handler — pairs an event descriptor with its handler
|
|
6
|
+
* function. Mirrors {@link import("./command-handler.js").CommandHandlerDefinition}
|
|
7
|
+
* structurally so all three handler shapes (command / event / query) share the same
|
|
8
|
+
* pattern.
|
|
9
|
+
*/
|
|
10
|
+
export interface EventHandlerDefinition<P extends z.ZodType = z.ZodType> {
|
|
11
|
+
readonly kind: "event-handler";
|
|
12
|
+
readonly descriptor: EventDescriptor<P>;
|
|
13
|
+
readonly handler: (event: z.infer<P>, metadata: Metadata) => Promise<void> | void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Defines a singular event handler.
|
|
17
|
+
*
|
|
18
|
+
* ```
|
|
19
|
+
* const onCourseCreated = eventHandler(CourseCreated, async (event, metadata) => {
|
|
20
|
+
* await db.courses.insert({ id: event.courseId, name: event.name })
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Use with `trackingProcessor(...).eventHandlers(onCreated, onCapChanged).build()` or
|
|
25
|
+
* `subscribingProcessor(...).eventHandlers(...).build()`. Symmetric to
|
|
26
|
+
* {@link import("./command-handler.js").commandHandler} and
|
|
27
|
+
* {@link import("./query-handler.js").queryHandler}.
|
|
28
|
+
*/
|
|
29
|
+
export declare function eventHandler<P extends z.ZodType>(descriptor: EventDescriptor<P>, handler: (event: z.infer<P>, metadata: Metadata) => Promise<void> | void): EventHandlerDefinition<P>;
|
|
30
|
+
//# sourceMappingURL=event-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler.d.ts","sourceRoot":"","sources":["../src/event-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAOtD;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IACrE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,CAChB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACjB,QAAQ,EAAE,QAAQ,KACf,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAC9C,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACvE,sBAAsB,CAAC,CAAC,CAAC,CAE3B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines a singular event handler.
|
|
3
|
+
*
|
|
4
|
+
* ```
|
|
5
|
+
* const onCourseCreated = eventHandler(CourseCreated, async (event, metadata) => {
|
|
6
|
+
* await db.courses.insert({ id: event.courseId, name: event.name })
|
|
7
|
+
* })
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* Use with `trackingProcessor(...).eventHandlers(onCreated, onCapChanged).build()` or
|
|
11
|
+
* `subscribingProcessor(...).eventHandlers(...).build()`. Symmetric to
|
|
12
|
+
* {@link import("./command-handler.js").commandHandler} and
|
|
13
|
+
* {@link import("./query-handler.js").queryHandler}.
|
|
14
|
+
*/
|
|
15
|
+
export function eventHandler(descriptor, handler) {
|
|
16
|
+
return { kind: "event-handler", descriptor, handler };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=event-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler.js","sourceRoot":"","sources":["../src/event-handler.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA8B,EAC9B,OAAwE;IAExE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AACvD,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { EventHandlerDefinition } from "./event-handler.js";
|
|
2
|
+
import type { TokenStore } from "./token-store.js";
|
|
3
|
+
import type { UoWRunner } from "./unit-of-work.js";
|
|
4
|
+
import type { EventProcessingErrorHandler } from "./tracking-event-processor.js";
|
|
5
|
+
import type { SequencedDeadLetterQueue } from "./dead-letter-queue.js";
|
|
6
|
+
/**
|
|
7
|
+
* Base configuration shared by all event processor types.
|
|
8
|
+
*
|
|
9
|
+
* Plan 11-02: option types carry a flat `eventHandlers: EventHandlerDefinition[]`
|
|
10
|
+
* array. The processor (not the handler bundle) owns reset semantics — see
|
|
11
|
+
* `TrackingProcessorModule.onReset`.
|
|
12
|
+
*/
|
|
13
|
+
interface EventProcessorBase {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly eventHandlers: ReadonlyArray<EventHandlerDefinition>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for a tracking event processor (polling-based, with token store).
|
|
19
|
+
*/
|
|
20
|
+
export interface TrackingProcessorModule extends EventProcessorBase {
|
|
21
|
+
readonly kind: "tracking";
|
|
22
|
+
readonly batchSize?: number;
|
|
23
|
+
readonly pollingIntervalMs?: number;
|
|
24
|
+
readonly tokenStore?: TokenStore;
|
|
25
|
+
readonly unitOfWorkRunner?: UoWRunner;
|
|
26
|
+
readonly errorHandler?: EventProcessingErrorHandler;
|
|
27
|
+
readonly deadLetterQueue?: SequencedDeadLetterQueue;
|
|
28
|
+
/** Number of segments created on first startup. Default 16 (Axon Framework parity). Always set by builder.build(). */
|
|
29
|
+
readonly initialSegmentCount: number;
|
|
30
|
+
readonly claimExtensionThresholdMs?: number;
|
|
31
|
+
readonly tokenClaimIntervalMs?: number;
|
|
32
|
+
/** Reset callback invoked when the processor is reset. Reset is processor-level (clear token + replay), and the callback that wipes view state belongs alongside it. */
|
|
33
|
+
readonly onReset?: () => Promise<void> | void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configuration for a subscribing event processor (push-based, no tracking).
|
|
37
|
+
*
|
|
38
|
+
* Subscribing processors do not support reset — see `supportsReset()` on the
|
|
39
|
+
* runtime instance — so there is no `onReset` field here.
|
|
40
|
+
*/
|
|
41
|
+
export interface SubscribingProcessorModule extends EventProcessorBase {
|
|
42
|
+
readonly kind: "subscribing";
|
|
43
|
+
readonly unitOfWorkRunner?: UoWRunner;
|
|
44
|
+
readonly errorHandler?: EventProcessingErrorHandler;
|
|
45
|
+
}
|
|
46
|
+
export type EventProcessorModule = TrackingProcessorModule | SubscribingProcessorModule;
|
|
47
|
+
/**
|
|
48
|
+
* Builder for a tracking event processor.
|
|
49
|
+
*
|
|
50
|
+
* Tracking processors poll the event store for new events, maintain
|
|
51
|
+
* position via a token store, and support replay/reset.
|
|
52
|
+
*
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const onCreated = eventHandler(CourseCreated, async (e) => { ... })
|
|
55
|
+
* const onCapChanged = eventHandler(CourseCapacityChanged, async (e) => { ... })
|
|
56
|
+
*
|
|
57
|
+
* trackingProcessor("course-projection")
|
|
58
|
+
* .eventHandlers(onCreated, onCapChanged)
|
|
59
|
+
* .onReset(async () => courseViews.clear())
|
|
60
|
+
* .batchSize(50)
|
|
61
|
+
* .build()
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* NOTE: Pooled streaming processor support is deferred to a follow-up
|
|
65
|
+
* research phase exploring how that model should fit Node/Bun runtime
|
|
66
|
+
* semantics, where worker threads are not reservable the same way as JVM
|
|
67
|
+
* threads.
|
|
68
|
+
*/
|
|
69
|
+
export declare function trackingProcessor(name: string): TrackingProcessorBuilder;
|
|
70
|
+
export declare class TrackingProcessorBuilder {
|
|
71
|
+
private readonly _name;
|
|
72
|
+
private readonly _eventHandlers;
|
|
73
|
+
private _onReset?;
|
|
74
|
+
private _batchSize?;
|
|
75
|
+
private _pollingIntervalMs?;
|
|
76
|
+
private _tokenStore?;
|
|
77
|
+
private _unitOfWorkRunner?;
|
|
78
|
+
private _errorHandler?;
|
|
79
|
+
private _deadLetterQueue?;
|
|
80
|
+
private _initialSegmentCount?;
|
|
81
|
+
private _claimExtensionThresholdMs?;
|
|
82
|
+
private _tokenClaimIntervalMs?;
|
|
83
|
+
constructor(name: string);
|
|
84
|
+
/** Register one or more singular event handlers on this processor. */
|
|
85
|
+
eventHandlers(...handlers: EventHandlerDefinition[]): this;
|
|
86
|
+
/** Register a callback fired when the processor is reset (clears view state for replay). */
|
|
87
|
+
onReset(fn: () => Promise<void> | void): this;
|
|
88
|
+
/** Events per batch/transaction. Default: 100. */
|
|
89
|
+
batchSize(size: number): this;
|
|
90
|
+
/** Polling interval in ms. Default: 500. */
|
|
91
|
+
pollingIntervalMs(ms: number): this;
|
|
92
|
+
/** Override the token store for this processor. */
|
|
93
|
+
tokenStore(store: TokenStore): this;
|
|
94
|
+
/**
|
|
95
|
+
* Override the UnitOfWork runner for this processor. Compose with
|
|
96
|
+
* `transactionalUnitOfWorkFactory(runInUoW, txManager)` to attach
|
|
97
|
+
* transactional semantics.
|
|
98
|
+
*/
|
|
99
|
+
unitOfWorkRunner(runner: UoWRunner): this;
|
|
100
|
+
/** Override the error handler for this processor. */
|
|
101
|
+
errorHandler(handler: EventProcessingErrorHandler): this;
|
|
102
|
+
/** Set a dead letter queue for this processor. */
|
|
103
|
+
deadLetterQueue(queue: SequencedDeadLetterQueue): this;
|
|
104
|
+
/** Number of segments to create on first startup. Default: 16 (Axon Framework parity). */
|
|
105
|
+
initialSegmentCount(count: number): this;
|
|
106
|
+
/** @internal Build the processor configuration. */
|
|
107
|
+
build(): TrackingProcessorModule;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Builder for a subscribing event processor.
|
|
111
|
+
*
|
|
112
|
+
* Subscribing processors receive events pushed from the event source
|
|
113
|
+
* as they are appended. No token store, no position tracking, no replay.
|
|
114
|
+
*
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const onNotification = eventHandler(NotificationRaised, async (e) => { ... })
|
|
117
|
+
*
|
|
118
|
+
* subscribingProcessor("notifications")
|
|
119
|
+
* .eventHandlers(onNotification)
|
|
120
|
+
* .build()
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* Subscribing processors do NOT support reset (`supportsReset() === false`),
|
|
124
|
+
* so there is no `.onReset(fn)` builder method here — that lives on
|
|
125
|
+
* `TrackingProcessorBuilder` only.
|
|
126
|
+
*/
|
|
127
|
+
export declare function subscribingProcessor(name: string): SubscribingProcessorBuilder;
|
|
128
|
+
export declare class SubscribingProcessorBuilder {
|
|
129
|
+
private readonly _name;
|
|
130
|
+
private readonly _eventHandlers;
|
|
131
|
+
private _unitOfWorkRunner?;
|
|
132
|
+
private _errorHandler?;
|
|
133
|
+
constructor(name: string);
|
|
134
|
+
/** Register one or more singular event handlers on this processor. */
|
|
135
|
+
eventHandlers(...handlers: EventHandlerDefinition[]): this;
|
|
136
|
+
/**
|
|
137
|
+
* Override the UnitOfWork runner for this processor. Compose with
|
|
138
|
+
* `transactionalUnitOfWorkFactory(runInUoW, txManager)` to attach
|
|
139
|
+
* transactional semantics.
|
|
140
|
+
*/
|
|
141
|
+
unitOfWorkRunner(runner: UoWRunner): this;
|
|
142
|
+
/** Override the error handler for this processor. */
|
|
143
|
+
errorHandler(handler: EventProcessingErrorHandler): this;
|
|
144
|
+
/** @internal Build the processor configuration. */
|
|
145
|
+
build(): SubscribingProcessorModule;
|
|
146
|
+
}
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=event-processor-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-processor-builder.d.ts","sourceRoot":"","sources":["../src/event-processor-builder.ts"],"names":[],"mappings":"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"}
|