@kronos-ts/messaging 0.1.1 → 0.3.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-handler.d.ts +15 -15
- package/dist/command-handler.d.ts.map +1 -1
- package/dist/command-handler.js.map +1 -1
- package/dist/command-handling-module.js +2 -2
- package/dist/command-handling-module.js.map +1 -1
- package/dist/dead-lettering-handler.js +1 -1
- package/dist/dead-lettering-handler.js.map +1 -1
- package/dist/emit-update.d.ts +2 -1
- package/dist/emit-update.d.ts.map +1 -1
- package/dist/emit-update.js.map +1 -1
- package/dist/event-handler.d.ts +5 -5
- package/dist/event-handler.d.ts.map +1 -1
- package/dist/event-handler.js +2 -2
- package/dist/event-handler.js.map +1 -1
- package/dist/event-processor-builder.d.ts +3 -3
- package/dist/event-processor-builder.js +3 -3
- package/dist/event-scheduler.d.ts +95 -0
- package/dist/event-scheduler.d.ts.map +1 -0
- package/dist/event-scheduler.js +47 -0
- package/dist/event-scheduler.js.map +1 -0
- package/dist/gateway.d.ts +7 -5
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +9 -12
- package/dist/gateway.js.map +1 -1
- package/dist/handler.d.ts +13 -13
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js.map +1 -1
- package/dist/in-memory-event-scheduler.d.ts +45 -0
- package/dist/in-memory-event-scheduler.d.ts.map +1 -0
- package/dist/in-memory-event-scheduler.js +112 -0
- package/dist/in-memory-event-scheduler.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/intercepting-command-bus.d.ts +1 -1
- package/dist/intercepting-command-bus.d.ts.map +1 -1
- package/dist/intercepting-command-bus.js +3 -4
- package/dist/intercepting-command-bus.js.map +1 -1
- package/dist/intercepting-query-bus.d.ts +1 -1
- package/dist/intercepting-query-bus.d.ts.map +1 -1
- package/dist/intercepting-query-bus.js +3 -4
- package/dist/intercepting-query-bus.js.map +1 -1
- package/dist/interceptor.d.ts +18 -3
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/message.d.ts +4 -0
- package/dist/message.d.ts.map +1 -1
- package/dist/query-bus.d.ts +8 -3
- package/dist/query-bus.d.ts.map +1 -1
- package/dist/query-handler.d.ts +5 -5
- package/dist/query-handler.d.ts.map +1 -1
- package/dist/query-handler.js +2 -2
- package/dist/query-handler.js.map +1 -1
- package/dist/query-handling-module.js +1 -1
- package/dist/query-handling-module.js.map +1 -1
- package/dist/simple-command-bus.d.ts +11 -4
- package/dist/simple-command-bus.d.ts.map +1 -1
- package/dist/simple-command-bus.js +16 -10
- package/dist/simple-command-bus.js.map +1 -1
- package/dist/simple-query-bus.d.ts.map +1 -1
- package/dist/simple-query-bus.js +4 -3
- package/dist/simple-query-bus.js.map +1 -1
- package/dist/streaming-event-processor.js +1 -1
- package/dist/streaming-event-processor.js.map +1 -1
- package/dist/subscribing-event-processor.js +1 -1
- package/dist/subscribing-event-processor.js.map +1 -1
- package/dist/subscription-filter.d.ts +43 -0
- package/dist/subscription-filter.d.ts.map +1 -0
- package/dist/subscription-filter.js +71 -0
- package/dist/subscription-filter.js.map +1 -0
- package/dist/tracking-event-processor.js +1 -1
- package/dist/tracking-event-processor.js.map +1 -1
- package/dist/transaction.d.ts +31 -0
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +80 -0
- package/dist/transaction.js.map +1 -1
- package/package.json +1 -1
- package/src/command-handler.ts +15 -28
- package/src/command-handling-module.ts +2 -2
- package/src/dead-lettering-handler.ts +1 -1
- package/src/emit-update.ts +3 -2
- package/src/event-handler.ts +5 -8
- package/src/event-processor-builder.ts +3 -3
- package/src/event-scheduler.ts +96 -0
- package/src/gateway.ts +14 -22
- package/src/handler.ts +13 -22
- package/src/in-memory-event-scheduler.ts +150 -0
- package/src/index.ts +23 -1
- package/src/intercepting-command-bus.ts +7 -6
- package/src/intercepting-query-bus.ts +11 -9
- package/src/interceptor.ts +21 -4
- package/src/message.ts +5 -0
- package/src/query-bus.ts +8 -3
- package/src/query-handler.ts +5 -5
- package/src/query-handling-module.ts +1 -1
- package/src/simple-command-bus.ts +17 -11
- package/src/simple-query-bus.ts +8 -6
- package/src/streaming-event-processor.ts +1 -1
- package/src/subscribing-event-processor.ts +1 -1
- package/src/subscription-filter.ts +85 -0
- package/src/tracking-event-processor.ts +1 -1
- package/src/transaction.ts +84 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory {@link EventScheduler} — intended for tests only.
|
|
3
|
+
*
|
|
4
|
+
* Backed by a `Map<scheduleId, record>` and `setTimeout`. Publishes fired
|
|
5
|
+
* events through a supplied {@link EventSink} (typically the in-memory
|
|
6
|
+
* event bus or a test spy).
|
|
7
|
+
*
|
|
8
|
+
* # UoW semantics (best-effort, test-grade)
|
|
9
|
+
*
|
|
10
|
+
* - `schedule()` must be called inside a UoW (INVOCATION phase). The
|
|
11
|
+
* record is staged immediately so cancel() inside the SAME UoW sees it,
|
|
12
|
+
* but the `setTimeout` arming is deferred to AFTER_COMMIT — so if the
|
|
13
|
+
* UoW rolls back the schedule never fires. `onError` cleans the staged
|
|
14
|
+
* record so callers see `not-found` on the rolled-back token.
|
|
15
|
+
*
|
|
16
|
+
* - `cancel()` may be called inside or outside a UoW. State change is
|
|
17
|
+
* applied immediately for caller-visibility; this means a UoW that
|
|
18
|
+
* cancels and then rolls back does NOT restore the schedule. This
|
|
19
|
+
* differs from the postgres implementation (which is true
|
|
20
|
+
* transactional) and is acceptable for the in-memory's test-only
|
|
21
|
+
* remit. Document this when writing tests that depend on cancel
|
|
22
|
+
* rollback semantics — use the postgres scheduler for that.
|
|
23
|
+
*
|
|
24
|
+
* # NOT production
|
|
25
|
+
*
|
|
26
|
+
* No persistence, no recovery on restart, no at-least-once. A test-only
|
|
27
|
+
* spy with a real-enough surface to exercise framework wiring.
|
|
28
|
+
*/
|
|
29
|
+
import type { EventSink } from "./event-sink.js";
|
|
30
|
+
import type { EventScheduler } from "./event-scheduler.js";
|
|
31
|
+
export interface InMemoryEventSchedulerOptions {
|
|
32
|
+
readonly eventSink: EventSink;
|
|
33
|
+
/** Override `Date.now` for deterministic tests. Defaults to `Date.now`. */
|
|
34
|
+
readonly now?: () => number;
|
|
35
|
+
}
|
|
36
|
+
export interface InMemoryEventScheduler extends EventScheduler {
|
|
37
|
+
/**
|
|
38
|
+
* Cancel any armed timers and drop all internal state. Tests call this
|
|
39
|
+
* in `afterEach` to ensure schedulers from one test do not fire into
|
|
40
|
+
* another. Not part of the public {@link EventScheduler} contract.
|
|
41
|
+
*/
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export declare function createInMemoryEventScheduler(options: InMemoryEventSchedulerOptions): InMemoryEventScheduler;
|
|
45
|
+
//# sourceMappingURL=in-memory-event-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-scheduler.d.ts","sourceRoot":"","sources":["../src/in-memory-event-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,sBAAsB,CAAA;AAkBvF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,GACrC,sBAAsB,CAmFxB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory {@link EventScheduler} — intended for tests only.
|
|
3
|
+
*
|
|
4
|
+
* Backed by a `Map<scheduleId, record>` and `setTimeout`. Publishes fired
|
|
5
|
+
* events through a supplied {@link EventSink} (typically the in-memory
|
|
6
|
+
* event bus or a test spy).
|
|
7
|
+
*
|
|
8
|
+
* # UoW semantics (best-effort, test-grade)
|
|
9
|
+
*
|
|
10
|
+
* - `schedule()` must be called inside a UoW (INVOCATION phase). The
|
|
11
|
+
* record is staged immediately so cancel() inside the SAME UoW sees it,
|
|
12
|
+
* but the `setTimeout` arming is deferred to AFTER_COMMIT — so if the
|
|
13
|
+
* UoW rolls back the schedule never fires. `onError` cleans the staged
|
|
14
|
+
* record so callers see `not-found` on the rolled-back token.
|
|
15
|
+
*
|
|
16
|
+
* - `cancel()` may be called inside or outside a UoW. State change is
|
|
17
|
+
* applied immediately for caller-visibility; this means a UoW that
|
|
18
|
+
* cancels and then rolls back does NOT restore the schedule. This
|
|
19
|
+
* differs from the postgres implementation (which is true
|
|
20
|
+
* transactional) and is acceptable for the in-memory's test-only
|
|
21
|
+
* remit. Document this when writing tests that depend on cancel
|
|
22
|
+
* rollback semantics — use the postgres scheduler for that.
|
|
23
|
+
*
|
|
24
|
+
* # NOT production
|
|
25
|
+
*
|
|
26
|
+
* No persistence, no recovery on restart, no at-least-once. A test-only
|
|
27
|
+
* spy with a real-enough surface to exercise framework wiring.
|
|
28
|
+
*/
|
|
29
|
+
import { requireInvocationPhase, onAfterCommit, onError, processingStateStorage, } from "./processing-state.js";
|
|
30
|
+
import { generateIdentifier } from "@kronos-ts/common";
|
|
31
|
+
export function createInMemoryEventScheduler(options) {
|
|
32
|
+
const { eventSink } = options;
|
|
33
|
+
const now = options.now ?? Date.now;
|
|
34
|
+
const records = new Map();
|
|
35
|
+
function armTimer(id, record) {
|
|
36
|
+
const delay = Math.max(0, record.fireAt - now());
|
|
37
|
+
record.timer = setTimeout(() => {
|
|
38
|
+
const rec = records.get(id);
|
|
39
|
+
if (!rec || rec.status !== "pending")
|
|
40
|
+
return;
|
|
41
|
+
rec.status = "appended";
|
|
42
|
+
rec.timer = undefined;
|
|
43
|
+
eventSink.publish([rec.event]).catch((err) => {
|
|
44
|
+
// Test-only: surface but do not crash the process. Real
|
|
45
|
+
// implementations need an at-least-once retry; not modelled here.
|
|
46
|
+
console.warn("inMemoryEventScheduler: publish failed:", err);
|
|
47
|
+
});
|
|
48
|
+
}, delay);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
async schedule(event, at) {
|
|
52
|
+
requireInvocationPhase();
|
|
53
|
+
const id = generateIdentifier();
|
|
54
|
+
const record = {
|
|
55
|
+
status: "pending",
|
|
56
|
+
event,
|
|
57
|
+
fireAt: at.getTime(),
|
|
58
|
+
};
|
|
59
|
+
records.set(id, record);
|
|
60
|
+
onAfterCommit(() => {
|
|
61
|
+
const rec = records.get(id);
|
|
62
|
+
if (!rec || rec.status !== "pending")
|
|
63
|
+
return;
|
|
64
|
+
armTimer(id, rec);
|
|
65
|
+
});
|
|
66
|
+
onError(() => {
|
|
67
|
+
// Roll back the staged record so post-rollback cancel() sees
|
|
68
|
+
// `not-found` rather than `cancelled`.
|
|
69
|
+
const rec = records.get(id);
|
|
70
|
+
if (rec && rec.status === "pending")
|
|
71
|
+
records.delete(id);
|
|
72
|
+
});
|
|
73
|
+
return { id };
|
|
74
|
+
},
|
|
75
|
+
async cancel(token) {
|
|
76
|
+
const rec = records.get(token.id);
|
|
77
|
+
if (!rec)
|
|
78
|
+
return { kind: "not-found" };
|
|
79
|
+
if (rec.status === "appended")
|
|
80
|
+
return { kind: "already-appended" };
|
|
81
|
+
if (rec.status === "cancelled")
|
|
82
|
+
return { kind: "not-found" };
|
|
83
|
+
rec.status = "cancelled";
|
|
84
|
+
if (rec.timer !== undefined) {
|
|
85
|
+
clearTimeout(rec.timer);
|
|
86
|
+
rec.timer = undefined;
|
|
87
|
+
}
|
|
88
|
+
// Best-effort UoW participation: if we're inside a UoW that later
|
|
89
|
+
// errors, revert the cancel so the schedule's pending state
|
|
90
|
+
// re-materialises. The original timer (if it was armed) has already
|
|
91
|
+
// been cleared — the AFTER_COMMIT re-arm cycle is not re-driven
|
|
92
|
+
// here, which means a cancel + rollback inside a post-commit window
|
|
93
|
+
// would not re-fire. Acceptable for the in-memory's test-only remit.
|
|
94
|
+
if (processingStateStorage.getStore() !== undefined) {
|
|
95
|
+
onError(() => {
|
|
96
|
+
const r = records.get(token.id);
|
|
97
|
+
if (r && r.status === "cancelled")
|
|
98
|
+
r.status = "pending";
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return { kind: "cancelled" };
|
|
102
|
+
},
|
|
103
|
+
async stop() {
|
|
104
|
+
for (const rec of records.values()) {
|
|
105
|
+
if (rec.timer !== undefined)
|
|
106
|
+
clearTimeout(rec.timer);
|
|
107
|
+
}
|
|
108
|
+
records.clear();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=in-memory-event-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-scheduler.js","sourceRoot":"","sources":["../src/in-memory-event-scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { type Message, type CommandMessage, type CommandResultMessage, type EventMessage, type QueryMessage, } from "./message.js";
|
|
1
|
+
export { type Message, type CommandMessage, type CommandResultMessage, type EventMessage, type SequencedEventMessage, type QueryMessage, } from "./message.js";
|
|
2
2
|
export { type CommandDescriptor, type EventDescriptor, type QueryDescriptor, type MessageDescriptor, command, event, query, } from "./descriptor.js";
|
|
3
3
|
export { type TagCriteria, type TypeRestrictedCriteria, type EitherCriteria, type AnyTagCriteria, type RestrictableEventCriteria, EventCriteria, tags, anyTag, either, } from "./event-criteria.js";
|
|
4
4
|
export { Phase, type PhaseValue, on as onPhase, onPrepareCommit, onCommit, onAfterCommit, onError, whenComplete, NoActiveUnitOfWork, WrongUoWPhase, } from "./processing-state.js";
|
|
@@ -20,6 +20,7 @@ export { createInterceptingQueryBus } from "./intercepting-query-bus.js";
|
|
|
20
20
|
export { createTracingCommandBus } from "./tracing-command-bus.js";
|
|
21
21
|
export { type CommandGateway, type QueryGateway, createCommandGateway, createQueryGateway, } from "./gateway.js";
|
|
22
22
|
export { type SubscriptionQueryResult, type UpdateHandler, createUpdateHandler, runAfterCommitOrImmediately, } from "./subscription-query.js";
|
|
23
|
+
export { type SubscriptionFilter, payloadEquals, applySubscriptionFilter, extractStructuredFilter, matchesPayloadEquals, } from "./subscription-filter.js";
|
|
23
24
|
export { type EventSink } from "./event-sink.js";
|
|
24
25
|
export { type SubscribableEventSource, type EventBus, createSimpleEventBus, } from "./event-bus.js";
|
|
25
26
|
export { createInterceptingEventBus } from "./intercepting-event-bus.js";
|
|
@@ -31,10 +32,12 @@ export { type Segment, ROOT_SEGMENT, segment, segmentMatches, splitSegment, merg
|
|
|
31
32
|
export { type TokenStore, UnableToClaimTokenError, createInMemoryTokenStore, } from "./token-store.js";
|
|
32
33
|
export { type TrackingToken, type GlobalSequenceToken, type ReplayToken, globalSequenceToken, FIRST_TOKEN, LATEST_TOKEN, replayToken, isReplayToken, isGlobalSequenceToken, advanceToken, isReplaying, unwrapToken, wasProcessedBeforeReset, } from "./tracking-token.js";
|
|
33
34
|
export { isReplay, REPLAY_STATE_KEY, } from "./replay-token.js";
|
|
34
|
-
export { type TransactionManager, noTransactionManager, getActiveTransaction, transactionalUnitOfWorkFactory, TRANSACTION_KEY, } from "./transaction.js";
|
|
35
|
+
export { type TransactionManager, noTransactionManager, getActiveTransaction, getOrBeginActiveTransaction, transactionalUnitOfWorkFactory, lazyTransactionalUnitOfWorkFactory, TRANSACTION_KEY, } from "./transaction.js";
|
|
35
36
|
export { type RetryPolicy, exponentialBackoffRetryPolicy, createRetryingCommandBus, } from "./retrying-command-bus.js";
|
|
36
37
|
export { send, COMMAND_BUS_KEY } from "./send.js";
|
|
37
38
|
export { emitUpdate, QUERY_BUS_KEY } from "./emit-update.js";
|
|
39
|
+
export { type EventScheduler, type ScheduleToken, type CancelResult, } from "./event-scheduler.js";
|
|
40
|
+
export { type InMemoryEventScheduler, type InMemoryEventSchedulerOptions, createInMemoryEventScheduler, } from "./in-memory-event-scheduler.js";
|
|
38
41
|
export { registerCommandHandlersNatively, createCommandInvocation, type MinimalConfiguration, } from "./command-handling-module.js";
|
|
39
42
|
export { registerQueryHandlersNatively } from "./query-handling-module.js";
|
|
40
43
|
export { type SubscribingEventProcessor, type SubscribingEventProcessorOptions, createSubscribingEventProcessor, } from "./subscribing-event-processor.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,OAAO,EACP,KAAK,EACL,KAAK,GACN,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,aAAa,EACb,IAAI,EACJ,MAAM,EACN,MAAM,GACP,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,KAAK,EACL,KAAK,UAAU,EAEf,EAAE,IAAI,OAAO,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,KAAK,SAAS,EACd,QAAQ,EACR,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAM1B,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,EAAE,EACF,OAAO,GACR,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,KAAK,wBAAwB,EAC7B,cAAc,GACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,KAAK,sBAAsB,EAC3B,YAAY,GACb,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,KAAK,sBAAsB,EAC3B,YAAY,GACb,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,KAAK,eAAe,EACpB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,8BAA8B,GAC/B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,EAC7B,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAG5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAA;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAGxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAGlE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ export { createTracingCommandBus } from "./tracing-command-bus.js";
|
|
|
44
44
|
export { createCommandGateway, createQueryGateway, } from "./gateway.js";
|
|
45
45
|
// Subscription queries
|
|
46
46
|
export { createUpdateHandler, runAfterCommitOrImmediately, } from "./subscription-query.js";
|
|
47
|
+
export { payloadEquals, applySubscriptionFilter, extractStructuredFilter, matchesPayloadEquals, } from "./subscription-filter.js";
|
|
47
48
|
// Event sink (publish-only)
|
|
48
49
|
export {} from "./event-sink.js";
|
|
49
50
|
// Event bus (publish + subscribe)
|
|
@@ -67,12 +68,15 @@ export { globalSequenceToken, FIRST_TOKEN, LATEST_TOKEN, replayToken, isReplayTo
|
|
|
67
68
|
// Replay detection (ProcessingContext helper)
|
|
68
69
|
export { isReplay, REPLAY_STATE_KEY, } from "./replay-token.js";
|
|
69
70
|
// Transaction management
|
|
70
|
-
export { noTransactionManager, getActiveTransaction, transactionalUnitOfWorkFactory, TRANSACTION_KEY, } from "./transaction.js";
|
|
71
|
+
export { noTransactionManager, getActiveTransaction, getOrBeginActiveTransaction, transactionalUnitOfWorkFactory, lazyTransactionalUnitOfWorkFactory, TRANSACTION_KEY, } from "./transaction.js";
|
|
71
72
|
// Retrying command bus
|
|
72
73
|
export { exponentialBackoffRetryPolicy, createRetryingCommandBus, } from "./retrying-command-bus.js";
|
|
73
74
|
// Module-level handler helpers (Plan 04-01 / HDL-02 / D-42)
|
|
74
75
|
export { send, COMMAND_BUS_KEY } from "./send.js";
|
|
75
76
|
export { emitUpdate, QUERY_BUS_KEY } from "./emit-update.js";
|
|
77
|
+
// Event scheduling
|
|
78
|
+
export {} from "./event-scheduler.js";
|
|
79
|
+
export { createInMemoryEventScheduler, } from "./in-memory-event-scheduler.js";
|
|
76
80
|
// Modules — Plan 08-03a (D-82): function-style helpers replace Module-shape factories
|
|
77
81
|
export { registerCommandHandlersNatively, createCommandInvocation, } from "./command-handling-module.js";
|
|
78
82
|
export { registerQueryHandlersNatively } from "./query-handling-module.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAON,MAAM,cAAc,CAAA;AAErB,cAAc;AACd,OAAO,EAKL,OAAO,EACP,KAAK,EACL,KAAK,GACN,MAAM,iBAAiB,CAAA;AAExB,iBAAiB;AACjB,OAAO,EAML,aAAa,EACb,IAAI,EACJ,MAAM,EACN,MAAM,GACP,MAAM,qBAAqB,CAAA;AAE5B,sEAAsE;AACtE,OAAO,EACL,KAAK;AAEL,mDAAmD;AACnD,EAAE,IAAI,OAAO,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,uBAAuB,CAAA;AAE9B,sEAAsE;AACtE,OAAO,EAEL,QAAQ,EACR,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,uBAAuB;AACvB,mEAAmE;AACnE,iCAAiC;AACjC,8GAA8G;AAC9G,OAAO,EAIL,EAAE,EACF,OAAO,GACR,MAAM,cAAc,CAAA;AAErB,mBAAmB;AACnB,OAAO,EAEL,cAAc,GACf,MAAM,sBAAsB,CAAA;AAE7B,iBAAiB;AACjB,OAAO,EAEL,YAAY,GACb,MAAM,oBAAoB,CAAA;AAE3B,iBAAiB;AACjB,OAAO,EAEL,YAAY,GACb,MAAM,oBAAoB,CAAA;AAE3B,eAAe;AACf,OAAO,EAGN,MAAM,kBAAkB,CAAA;AAEzB,qBAAqB;AACrB,OAAO,EAEL,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAE9B,oBAAoB;AACpB,OAAO,EAGL,8BAA8B,GAC/B,MAAM,uBAAuB,CAAA;AAE9B,mBAAmB;AACnB,OAAO,EAEL,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,EAC7B,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,uBAAuB,CAAA;AAE9B,iBAAiB;AACjB,OAAO,EAAmB,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAiB,MAAM,gBAAgB,CAAA;AAE9C,sBAAsB;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,8BAA8B;AAC9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAA;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAExE,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,WAAW;AACX,OAAO,EAGL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,uBAAuB;AACvB,OAAO,EAGL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAEL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AAEjC,4BAA4B;AAC5B,OAAO,EAAkB,MAAM,iBAAiB,CAAA;AAEhD,kCAAkC;AAClC,OAAO,EAGL,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAEvB,mCAAmC;AACnC,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAExE,gBAAgB;AAChB,OAAO,EAEL,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAE3B,mCAAmC;AACnC,OAAO,EAAuB,MAAM,sBAAsB,CAAA;AAE1D,gCAAgC;AAChC,OAAO,EAKL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAE1B,kBAAkB;AAClB,OAAO,EAIL,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,WAAW;AACX,OAAO,EAEL,YAAY,EACZ,OAAO,EACP,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,MAAM,EACN,cAAc,GACf,MAAM,cAAc,CAAA;AAErB,cAAc;AACd,OAAO,EAEL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAA;AAEzB,kBAAkB;AAClB,OAAO,EAIL,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,uBAAuB,GACxB,MAAM,qBAAqB,CAAA;AAE5B,8CAA8C;AAC9C,OAAO,EACL,QAAQ,EACR,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAE1B,yBAAyB;AACzB,OAAO,EAEL,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,8BAA8B,EAC9B,kCAAkC,EAClC,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAEzB,uBAAuB;AACvB,OAAO,EAEL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,2BAA2B,CAAA;AAElC,4DAA4D;AAC5D,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE5D,mBAAmB;AACnB,OAAO,EAIN,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAGL,4BAA4B,GAC7B,MAAM,gCAAgC,CAAA;AAEvC,sFAAsF;AACtF,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,GAExB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAE1E,8BAA8B;AAC9B,OAAO,EAGL,+BAA+B,GAChC,MAAM,kCAAkC,CAAA;AAEzC,4BAA4B;AAC5B,OAAO,EAIL,6BAA6B,GAC9B,MAAM,gCAAgC,CAAA;AAEvC,oBAAoB;AACpB,OAAO,EAKL,mBAAmB,EACnB,gBAAgB,EAChB,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAA;AAE/B,gCAAgC;AAChC,OAAO,EAEL,2BAA2B,GAC5B,MAAM,6BAA6B,CAAA;AAEpC,YAAY;AACZ,OAAO,EAGL,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,eAAe,CAAA;AAEtB,gBAAgB;AAChB,OAAO,EAEL,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AAExB,mBAAmB;AACnB,OAAO,EAGL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAEL,4BAA4B,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,8BAA8B;AAC9B,OAAO,EAIL,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,gCAAgC,GACjC,MAAM,+BAA+B,CAAA;AAEtC,mCAAmC;AACnC,OAAO,EAA+B,MAAM,8BAA8B,CAAA;AAE1E,2BAA2B;AAC3B,OAAO,EAIL,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,8BAA8B,CAAA;AAErC,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -12,6 +12,6 @@ export declare function createInterceptingCommandBus(delegate: CommandBus): Comm
|
|
|
12
12
|
/** Register a dispatch interceptor. Returns an unsubscribe function. */
|
|
13
13
|
registerDispatchInterceptor(interceptor: DispatchInterceptor<CommandMessage>): () => void;
|
|
14
14
|
/** Register a handler interceptor. Returns an unsubscribe function. */
|
|
15
|
-
registerHandlerInterceptor(interceptor: HandlerInterceptor): () => void;
|
|
15
|
+
registerHandlerInterceptor(interceptor: HandlerInterceptor<CommandMessage>): () => void;
|
|
16
16
|
};
|
|
17
17
|
//# sourceMappingURL=intercepting-command-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercepting-command-bus.d.ts","sourceRoot":"","sources":["../src/intercepting-command-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE/E;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,UAAU,GACnB,UAAU,GAAG;IACd,wEAAwE;IACxE,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAA;IACzF,uEAAuE;IACvE,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"intercepting-command-bus.d.ts","sourceRoot":"","sources":["../src/intercepting-command-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE/E;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,UAAU,GACnB,UAAU,GAAG;IACd,wEAAwE;IACxE,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAA;IACzF,uEAAuE;IACvE,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAA;CACxF,CAuDA"}
|
|
@@ -18,18 +18,17 @@ export function createInterceptingCommandBus(delegate) {
|
|
|
18
18
|
return delegate.dispatch(interceptedMessage);
|
|
19
19
|
},
|
|
20
20
|
subscribe(commandName, handler) {
|
|
21
|
-
// Wrap the handler with handler interceptors
|
|
22
21
|
const wrappedHandler = (message) => {
|
|
23
22
|
if (handlerInterceptors.length === 0) {
|
|
24
23
|
return handler(message);
|
|
25
24
|
}
|
|
26
|
-
let chain = () => handler(
|
|
25
|
+
let chain = (currentMessage) => handler(currentMessage);
|
|
27
26
|
for (let i = handlerInterceptors.length - 1; i >= 0; i--) {
|
|
28
27
|
const interceptor = handlerInterceptors[i];
|
|
29
28
|
const next = chain;
|
|
30
|
-
chain = () => interceptor(
|
|
29
|
+
chain = (currentMessage) => interceptor(currentMessage, (replacementMessage) => next(replacementMessage ?? currentMessage));
|
|
31
30
|
}
|
|
32
|
-
return chain();
|
|
31
|
+
return chain(message);
|
|
33
32
|
};
|
|
34
33
|
delegate.subscribe(commandName, wrappedHandler);
|
|
35
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercepting-command-bus.js","sourceRoot":"","sources":["../src/intercepting-command-bus.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAoB;IAOpB,MAAM,oBAAoB,GAA+C,EAAE,CAAA;IAC3E,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"intercepting-command-bus.js","sourceRoot":"","sources":["../src/intercepting-command-bus.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAoB;IAOpB,MAAM,oBAAoB,GAA+C,EAAE,CAAA;IAC3E,MAAM,mBAAmB,GAA8C,EAAE,CAAA;IAEzE,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAuB;YACpC,sDAAsD;YACtD,IAAI,kBAAkB,GAAG,OAAO,CAAA;YAChC,KAAK,MAAM,WAAW,IAAI,oBAAoB,EAAE,CAAC;gBAC/C,kBAAkB,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAA;YAC5D,CAAC;YAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QAC9C,CAAC;QAED,SAAS,CACP,WAAmB,EACnB,OAAsD;YAEtD,MAAM,cAAc,GAAG,CAAC,OAAuB,EAAE,EAAE;gBACjD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBAED,IAAI,KAAK,GAAG,CAAC,cAA8B,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;gBACvE,KAAK,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzD,MAAM,WAAW,GAAG,mBAAmB,CAAC,CAAC,CAAE,CAAA;oBAC3C,MAAM,IAAI,GAAG,KAAK,CAAA;oBAClB,KAAK,GAAG,CAAC,cAA8B,EAAE,EAAE,CACzC,WAAW,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,EAAE,CACjD,IAAI,CAAC,kBAAkB,IAAI,cAAc,CAAC,CAAC,CAAA;gBACjD,CAAC;gBAED,OAAO,KAAK,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC,CAAA;YAED,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;QACjD,CAAC;QAED,2BAA2B,CAAC,WAAW;YACrC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACtC,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;gBACrD,IAAI,GAAG,IAAI,CAAC;oBAAE,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACnD,CAAC,CAAA;QACH,CAAC;QAED,0BAA0B,CAAC,WAAW;YACpC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACrC,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;gBACpD,IAAI,GAAG,IAAI,CAAC;oBAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAClD,CAAC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -12,6 +12,6 @@ export declare function createInterceptingQueryBus(delegate: QueryBus): QueryBus
|
|
|
12
12
|
/** Register a dispatch interceptor. Returns an unsubscribe function. */
|
|
13
13
|
registerDispatchInterceptor(interceptor: DispatchInterceptor<QueryMessage>): () => void;
|
|
14
14
|
/** Register a handler interceptor. Returns an unsubscribe function. */
|
|
15
|
-
registerHandlerInterceptor(interceptor: HandlerInterceptor): () => void;
|
|
15
|
+
registerHandlerInterceptor(interceptor: HandlerInterceptor<QueryMessage>): () => void;
|
|
16
16
|
};
|
|
17
17
|
//# sourceMappingURL=intercepting-query-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercepting-query-bus.d.ts","sourceRoot":"","sources":["../src/intercepting-query-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"intercepting-query-bus.d.ts","sourceRoot":"","sources":["../src/intercepting-query-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE/E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,GACjB,QAAQ,GAAG;IACZ,wEAAwE;IACxE,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI,CAAA;IACvF,uEAAuE;IACvE,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI,CAAA;CACtF,CAqFA"}
|
|
@@ -17,18 +17,17 @@ export function createInterceptingQueryBus(delegate) {
|
|
|
17
17
|
return delegate.query(interceptedMessage);
|
|
18
18
|
},
|
|
19
19
|
subscribe(queryName, handler) {
|
|
20
|
-
// Wrap the handler with handler interceptors
|
|
21
20
|
const wrappedHandler = (message) => {
|
|
22
21
|
if (handlerInterceptors.length === 0) {
|
|
23
22
|
return handler(message);
|
|
24
23
|
}
|
|
25
|
-
let chain = () => handler(
|
|
24
|
+
let chain = (currentMessage) => handler(currentMessage);
|
|
26
25
|
for (let i = handlerInterceptors.length - 1; i >= 0; i--) {
|
|
27
26
|
const interceptor = handlerInterceptors[i];
|
|
28
27
|
const next = chain;
|
|
29
|
-
chain = () => interceptor(
|
|
28
|
+
chain = (currentMessage) => interceptor(currentMessage, (replacementMessage) => next(replacementMessage ?? currentMessage));
|
|
30
29
|
}
|
|
31
|
-
return chain();
|
|
30
|
+
return chain(message);
|
|
32
31
|
};
|
|
33
32
|
delegate.subscribe(queryName, wrappedHandler);
|
|
34
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercepting-query-bus.js","sourceRoot":"","sources":["../src/intercepting-query-bus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"intercepting-query-bus.js","sourceRoot":"","sources":["../src/intercepting-query-bus.ts"],"names":[],"mappings":"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"}
|
package/dist/interceptor.d.ts
CHANGED
|
@@ -35,12 +35,27 @@ export interface DispatchInterceptor<M extends Message = Message> {
|
|
|
35
35
|
* accessors (`getResource` / `setResource`) — no `ProcessingContext`
|
|
36
36
|
* parameter is threaded.
|
|
37
37
|
*
|
|
38
|
+
* The first argument is the full message object. Prefer keeping it as
|
|
39
|
+
* `message` when transforming or inspecting broad message details:
|
|
40
|
+
*
|
|
41
|
+
* ```
|
|
42
|
+
* app.handlerInterceptor(async (message, next) => {
|
|
43
|
+
* const { payload, metadata, timestamp } = message
|
|
44
|
+
* return next({
|
|
45
|
+
* ...message,
|
|
46
|
+
* metadata: { ...metadata, tenantId: "tenant-1" },
|
|
47
|
+
* })
|
|
48
|
+
* })
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
38
51
|
* The `next` function calls the next interceptor in the chain, or the
|
|
39
|
-
* actual handler if this is the last interceptor.
|
|
52
|
+
* actual handler if this is the last interceptor. Call `next()` to proceed
|
|
53
|
+
* with the current message, or `next(replacementMessage)` to proceed with a
|
|
54
|
+
* transformed message.
|
|
40
55
|
*
|
|
41
56
|
* To skip handling entirely, don't call `next()` and return a result directly.
|
|
42
57
|
*/
|
|
43
|
-
export interface HandlerInterceptor<R = unknown> {
|
|
44
|
-
(message:
|
|
58
|
+
export interface HandlerInterceptor<M extends Message = Message, R = unknown> {
|
|
59
|
+
(message: M, next: (message?: M) => Promise<R>): Promise<R>;
|
|
45
60
|
}
|
|
46
61
|
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC9D,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,GAAG,OAAO;IAEX,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC5D"}
|
package/dist/message.d.ts
CHANGED
|
@@ -34,6 +34,10 @@ export interface EventMessage<P = unknown> extends Message<P> {
|
|
|
34
34
|
readonly value: string;
|
|
35
35
|
}>;
|
|
36
36
|
}
|
|
37
|
+
export interface SequencedEventMessage<P = unknown> extends EventMessage<P> {
|
|
38
|
+
/** Stream position when the source has one; absent for push-only delivery. */
|
|
39
|
+
readonly sequence?: bigint;
|
|
40
|
+
}
|
|
37
41
|
/**
|
|
38
42
|
* A query message — dispatched to handler(s) that can answer it.
|
|
39
43
|
*/
|
package/dist/message.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEhE;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;CAAG;AAElE;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/E;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;CAAG"}
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEhE;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;CAAG;AAElE;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/E;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACzE,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;CAAG"}
|
package/dist/query-bus.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { QueryMessage } from "./message.js";
|
|
2
2
|
import type { SubscriptionQueryResult } from "./subscription-query.js";
|
|
3
|
+
import type { SubscriptionFilter } from "./subscription-filter.js";
|
|
3
4
|
/**
|
|
4
5
|
* The query bus — low-level infrastructure for dispatching query messages.
|
|
5
6
|
*
|
|
@@ -37,15 +38,19 @@ export interface QueryBus {
|
|
|
37
38
|
* Emit an update to all active subscription queries matching the filter.
|
|
38
39
|
* When called within an active UnitOfWork (detected via ALS), the update is
|
|
39
40
|
* deferred to AFTER_COMMIT.
|
|
41
|
+
*
|
|
42
|
+
* The filter can be either a function (local-only when a distributed bus is
|
|
43
|
+
* in use) or a structured `payloadEquals` predicate (crosses transports).
|
|
44
|
+
* See {@link SubscriptionFilter}.
|
|
40
45
|
*/
|
|
41
|
-
emitUpdate(queryName: string, filter:
|
|
46
|
+
emitUpdate(queryName: string, filter: SubscriptionFilter, update: unknown): Promise<void>;
|
|
42
47
|
/**
|
|
43
48
|
* Complete all subscription queries matching the filter.
|
|
44
49
|
*/
|
|
45
|
-
completeSubscription(queryName: string, filter?:
|
|
50
|
+
completeSubscription(queryName: string, filter?: SubscriptionFilter): Promise<void>;
|
|
46
51
|
/**
|
|
47
52
|
* Complete all subscription queries matching the filter with an error.
|
|
48
53
|
*/
|
|
49
|
-
completeSubscriptionExceptionally(queryName: string, error: Error, filter?:
|
|
54
|
+
completeSubscriptionExceptionally(queryName: string, error: Error, filter?: SubscriptionFilter): Promise<void>;
|
|
50
55
|
}
|
|
51
56
|
//# sourceMappingURL=query-bus.d.ts.map
|
package/dist/query-bus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-bus.d.ts","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"query-bus.d.ts","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAElE;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE9C;;;;;OAKG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,GACnD,IAAI,CAAA;IAEP;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAAA;IAEtF;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAA;IAE1G;;;;;;;;OAQG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;OAEG;IACH,oBAAoB,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;OAEG;IACH,iCAAiC,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB"}
|
package/dist/query-handler.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { Metadata } from "@kronos-ts/common";
|
|
3
2
|
import type { QueryDescriptor } from "./descriptor.js";
|
|
3
|
+
import type { QueryMessage } from "./message.js";
|
|
4
4
|
/**
|
|
5
5
|
* A registered singular query handler — pairs a query descriptor with its handler
|
|
6
6
|
* function. Mirrors {@link import("./command-handler.js").CommandHandlerDefinition}
|
|
@@ -14,14 +14,14 @@ import type { QueryDescriptor } from "./descriptor.js";
|
|
|
14
14
|
export interface QueryHandlerDefinition<Q extends z.ZodType = z.ZodType, R = unknown> {
|
|
15
15
|
readonly kind: "query-handler";
|
|
16
16
|
readonly descriptor: QueryDescriptor<Q, z.ZodType | undefined>;
|
|
17
|
-
readonly handler: (
|
|
17
|
+
readonly handler: (message: QueryMessage<z.infer<Q>>) => Promise<R> | R;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Defines a singular query handler.
|
|
21
21
|
*
|
|
22
22
|
* ```
|
|
23
|
-
* const getCourseView = queryHandler(GetCourseView, async (
|
|
24
|
-
* const view = courseViews.get(
|
|
23
|
+
* const getCourseView = queryHandler(GetCourseView, async ({ payload, metadata }) => {
|
|
24
|
+
* const view = courseViews.get(payload.courseId)
|
|
25
25
|
* if (!view) throw new Error("not found")
|
|
26
26
|
* return view
|
|
27
27
|
* })
|
|
@@ -31,5 +31,5 @@ export interface QueryHandlerDefinition<Q extends z.ZodType = z.ZodType, R = unk
|
|
|
31
31
|
* {@link import("./command-handler.js").commandHandler} and
|
|
32
32
|
* {@link import("./event-handler.js").eventHandler}.
|
|
33
33
|
*/
|
|
34
|
-
export declare function queryHandler<Q extends z.ZodType, R>(descriptor: QueryDescriptor<Q, z.ZodType | undefined>, handler: (
|
|
34
|
+
export declare function queryHandler<Q extends z.ZodType, R>(descriptor: QueryDescriptor<Q, z.ZodType | undefined>, handler: (message: QueryMessage<z.infer<Q>>) => Promise<R> | R): QueryHandlerDefinition<Q, R>;
|
|
35
35
|
//# sourceMappingURL=query-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-handler.d.ts","sourceRoot":"","sources":["../src/query-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"query-handler.d.ts","sourceRoot":"","sources":["../src/query-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAOhD;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB,CACrC,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAC/B,CAAC,GAAG,OAAO;IAEX,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;IAC9D,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;CACxE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,EACjD,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,EACrD,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC7D,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAE9B"}
|
package/dist/query-handler.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Defines a singular query handler.
|
|
3
3
|
*
|
|
4
4
|
* ```
|
|
5
|
-
* const getCourseView = queryHandler(GetCourseView, async (
|
|
6
|
-
* const view = courseViews.get(
|
|
5
|
+
* const getCourseView = queryHandler(GetCourseView, async ({ payload, metadata }) => {
|
|
6
|
+
* const view = courseViews.get(payload.courseId)
|
|
7
7
|
* if (!view) throw new Error("not found")
|
|
8
8
|
* return view
|
|
9
9
|
* })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-handler.js","sourceRoot":"","sources":["../src/query-handler.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,UAAqD,EACrD,
|
|
1
|
+
{"version":3,"file":"query-handler.js","sourceRoot":"","sources":["../src/query-handler.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,UAAqD,EACrD,OAA8D;IAE9D,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AACvD,CAAC"}
|
|
@@ -18,7 +18,7 @@ export function registerQueryHandlersNatively(handlers, deps) {
|
|
|
18
18
|
const moduleName = deps.moduleName ?? "queries";
|
|
19
19
|
for (const reg of handlers) {
|
|
20
20
|
const queryName = qualifiedNameToString(reg.descriptor.name);
|
|
21
|
-
let invocation = async (message) => reg.handler(message
|
|
21
|
+
let invocation = async (message) => reg.handler(message);
|
|
22
22
|
if (deps.handlerEnhancer) {
|
|
23
23
|
invocation = deps.handlerEnhancer.wrapHandler(invocation, {
|
|
24
24
|
messageType: "query",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-handling-module.js","sourceRoot":"","sources":["../src/query-handling-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAMzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAA+C,EAC/C,IAIC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAA;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC5D,IAAI,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAE,EAAE,CAC/C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"query-handling-module.js","sourceRoot":"","sources":["../src/query-handling-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAMzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAA+C,EAC/C,IAIC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAA;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC5D,IAAI,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAE,EAAE,CAC/C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE;gBACxD,WAAW,EAAE,OAAO;gBACpB,WAAW,EAAE,SAAS;gBACtB,YAAY,EAAE,UAAU;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CommandBus } from "./command-bus.js";
|
|
2
|
+
import { type UoWRunner } from "./unit-of-work.js";
|
|
2
3
|
/**
|
|
3
4
|
* Simple in-process command bus.
|
|
4
5
|
*
|
|
@@ -12,12 +13,18 @@ import type { CommandBus } from "./command-bus.js";
|
|
|
12
13
|
* by sharing a transaction. DCB read-set / append-condition merging
|
|
13
14
|
* happens only WITHIN a single handler's UnitOfWork.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* The handler runs through `unitOfWorkRunner` — by default `runInNewUoW`, but
|
|
17
|
+
* the configurer injects the resolved `unitOfWorkFactory` slot (e.g. a
|
|
18
|
+
* transactional runner from a storage extension) so the per-command UoW
|
|
19
|
+
* carries whatever transaction that backend provides. This mirrors the
|
|
20
|
+
* distributed command buses (kronosdb / axon-server), which already run
|
|
21
|
+
* handlers through the configured runner. The runner is always built on
|
|
22
|
+
* `runInNewUoW`, so a command — primary OR nested via `send()` — still gets
|
|
23
|
+
* its own fresh UoW (and its own independent transaction); composition does
|
|
24
|
+
* not change AF5 isolation, only whether that fresh UoW has a transaction.
|
|
18
25
|
*
|
|
19
26
|
* Interceptor support is provided by wrapping with
|
|
20
27
|
* {@link createInterceptingCommandBus}.
|
|
21
28
|
*/
|
|
22
|
-
export declare function createSimpleCommandBus(): CommandBus;
|
|
29
|
+
export declare function createSimpleCommandBus(unitOfWorkRunner?: UoWRunner): CommandBus;
|
|
23
30
|
//# sourceMappingURL=simple-command-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-command-bus.d.ts","sourceRoot":"","sources":["../src/simple-command-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"simple-command-bus.d.ts","sourceRoot":"","sources":["../src/simple-command-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,sBAAsB,CAAC,gBAAgB,GAAE,SAAuB,GAAG,UAAU,CAiC5F"}
|