@rotorsoft/act 0.25.2 → 0.26.1
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/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/act-builder.d.ts +2 -2
- package/dist/@types/act-builder.d.ts.map +1 -1
- package/dist/@types/act.d.ts +18 -2
- package/dist/@types/act.d.ts.map +1 -1
- package/dist/@types/merge.d.ts.map +1 -1
- package/dist/@types/projection-builder.d.ts +38 -53
- package/dist/@types/projection-builder.d.ts.map +1 -1
- package/dist/@types/slice-builder.d.ts.map +1 -1
- package/dist/@types/types/reaction.d.ts +42 -0
- package/dist/@types/types/reaction.d.ts.map +1 -1
- package/dist/index.cjs +115 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +115 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/@types/act.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Actor, Committed, Drain, DrainOptions, IAct, Lease, Query, Registry, Schema, SchemaRegister, Schemas, SettleOptions, Snapshot, State, Target } from "./types/index.js";
|
|
1
|
+
import type { Actor, BatchHandler, Committed, Drain, DrainOptions, IAct, Lease, Query, Registry, Schema, SchemaRegister, Schemas, SettleOptions, Snapshot, State, Target } from "./types/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* @category Orchestrator
|
|
4
4
|
* @see Store
|
|
@@ -89,7 +89,9 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
89
89
|
*/
|
|
90
90
|
/** Static resolver targets collected at build time */
|
|
91
91
|
private readonly _static_targets;
|
|
92
|
-
|
|
92
|
+
/** Batch handlers for static-target projections (target → handler) */
|
|
93
|
+
private readonly _batch_handlers;
|
|
94
|
+
constructor(registry: Registry<TSchemaReg, TEvents, TActions>, _states?: Map<string, State<any, any, any>>, batchHandlers?: Map<string, BatchHandler<any>>);
|
|
93
95
|
/**
|
|
94
96
|
* Executes an action on a state instance, committing resulting events.
|
|
95
97
|
*
|
|
@@ -312,6 +314,20 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
312
314
|
* @returns The lease with results
|
|
313
315
|
*/
|
|
314
316
|
private handle;
|
|
317
|
+
/**
|
|
318
|
+
* Handles a batch of events for a projection with a batch handler.
|
|
319
|
+
*
|
|
320
|
+
* Called by `drain()` when a leased stream is a static-target projection
|
|
321
|
+
* with a registered batch handler. All events are passed to the handler
|
|
322
|
+
* in a single call, enabling bulk DB operations.
|
|
323
|
+
*
|
|
324
|
+
* @internal
|
|
325
|
+
* @param lease The lease to handle
|
|
326
|
+
* @param payloads The reactions to handle
|
|
327
|
+
* @param batchHandler The batch handler for this projection
|
|
328
|
+
* @returns The lease with results
|
|
329
|
+
*/
|
|
330
|
+
private handleBatch;
|
|
315
331
|
/**
|
|
316
332
|
* Processes pending reactions by draining uncommitted events from the event store.
|
|
317
333
|
*
|
package/dist/@types/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,KAAK,EAEL,QAAQ,EACR,MAAM,EACN,cAAc,EACd,OAAO,EACP,aAAa,EACb,QAAQ,EACR,KAAK,EACL,MAAM,EACP,MAAM,kBAAkB,CAAC;AAK1B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,GAAG,CACd,UAAU,SAAS,cAAc,CAAC,QAAQ,CAAC,EAC3C,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAChE,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,YAAW,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAMrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAkBT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,MAAM,EAC9C,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,EAChC,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,GAC/B,MAAM,QAAQ,CAAC,MAAM,CAAC,CAExB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,IAAI,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAMrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAkBT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,MAAM,EAC9C,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,EAChC,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,GAC/B,MAAM,QAAQ,CAAC,MAAM,CAAC,CAExB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,IAAI,CAwFN;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,IAAI,CAiBN;AAGD,eAAO,MAAM,MAAM,GAAI,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;;;CAGnD,CAAC;AAGH,eAAO,MAAM,MAAM,iBAAkB,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* actions, and are pure side-effect handlers routed to a named stream.
|
|
10
10
|
*/
|
|
11
11
|
import type { ZodType } from "zod";
|
|
12
|
-
import type { Committed, EventRegister, ReactionResolver, Schema, Schemas } from "./types/index.js";
|
|
12
|
+
import type { BatchHandler, Committed, EventRegister, ReactionResolver, Schema, Schemas } from "./types/index.js";
|
|
13
13
|
/**
|
|
14
14
|
* A self-contained projection grouping read-model update handlers.
|
|
15
15
|
* Projections are composed into an Act orchestrator via `act().withProjection(projection)`.
|
|
@@ -19,38 +19,37 @@ import type { Committed, EventRegister, ReactionResolver, Schema, Schemas } from
|
|
|
19
19
|
export type Projection<TEvents extends Schemas> = {
|
|
20
20
|
readonly _tag: "Projection";
|
|
21
21
|
readonly events: EventRegister<TEvents>;
|
|
22
|
+
readonly target?: string;
|
|
23
|
+
readonly batchHandler?: BatchHandler<TEvents>;
|
|
22
24
|
};
|
|
23
25
|
/** Helper: a single-key record mapping an event name to its Zod schema. */
|
|
24
26
|
type EventEntry<TKey extends string = string, TData extends Schema = Schema> = {
|
|
25
27
|
[P in TKey]: ZodType<TData>;
|
|
26
28
|
};
|
|
27
29
|
/** Infer the handler-result type after registering one event. */
|
|
28
|
-
type DoResult<TEvents extends Schemas, TKey extends string, TData extends Schema> = ProjectionBuilder<TEvents & {
|
|
30
|
+
type DoResult<TEvents extends Schemas, TKey extends string, TData extends Schema, TTarget extends string | undefined = undefined> = ProjectionBuilder<TEvents & {
|
|
29
31
|
[P in TKey]: TData;
|
|
30
|
-
}> & {
|
|
32
|
+
}, TTarget> & {
|
|
31
33
|
to: (resolver: ReactionResolver<TEvents & {
|
|
32
34
|
[P in TKey]: TData;
|
|
33
35
|
}, TKey> | string) => ProjectionBuilder<TEvents & {
|
|
34
36
|
[P in TKey]: TData;
|
|
35
|
-
}>;
|
|
37
|
+
}, TTarget>;
|
|
36
38
|
void: () => ProjectionBuilder<TEvents & {
|
|
37
39
|
[P in TKey]: TData;
|
|
38
|
-
}>;
|
|
40
|
+
}, TTarget>;
|
|
39
41
|
};
|
|
40
42
|
/**
|
|
41
43
|
* Fluent builder interface for composing projections.
|
|
42
44
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* When a default target is provided via `projection("target")`, all
|
|
48
|
-
* handlers inherit that resolver. Per-handler `.to()` or `.void()` can
|
|
49
|
-
* still override it.
|
|
45
|
+
* When a static target is provided via `projection("target")`, the builder
|
|
46
|
+
* exposes a `.batch()` method for registering a batch handler that processes
|
|
47
|
+
* all events in a single call.
|
|
50
48
|
*
|
|
51
49
|
* @template TEvents - Event schemas
|
|
50
|
+
* @template TTarget - Static target string or undefined
|
|
52
51
|
*/
|
|
53
|
-
export type ProjectionBuilder<TEvents extends Schemas> = {
|
|
52
|
+
export type ProjectionBuilder<TEvents extends Schemas, TTarget extends string | undefined = undefined> = {
|
|
54
53
|
/**
|
|
55
54
|
* Begins defining a projection handler for a specific event.
|
|
56
55
|
*
|
|
@@ -61,7 +60,7 @@ export type ProjectionBuilder<TEvents extends Schemas> = {
|
|
|
61
60
|
on: <TKey extends string, TData extends Schema>(entry: EventEntry<TKey, TData>) => {
|
|
62
61
|
do: (handler: (event: Committed<TEvents & {
|
|
63
62
|
[P in TKey]: TData;
|
|
64
|
-
}, TKey>, stream: string) => Promise<void>) => DoResult<TEvents, TKey, TData>;
|
|
63
|
+
}, TKey>, stream: string) => Promise<void>) => DoResult<TEvents, TKey, TData, TTarget>;
|
|
65
64
|
};
|
|
66
65
|
/**
|
|
67
66
|
* Builds and returns the Projection data structure.
|
|
@@ -71,49 +70,35 @@ export type ProjectionBuilder<TEvents extends Schemas> = {
|
|
|
71
70
|
* The registered event schemas and their reaction maps.
|
|
72
71
|
*/
|
|
73
72
|
readonly events: EventRegister<TEvents>;
|
|
74
|
-
}
|
|
73
|
+
} & (TTarget extends string ? {
|
|
74
|
+
/**
|
|
75
|
+
* Registers a batch handler that processes all events in a single call.
|
|
76
|
+
*
|
|
77
|
+
* Only available on projections with a static target (`projection("target")`).
|
|
78
|
+
* The handler receives a discriminated union of all declared events,
|
|
79
|
+
* enabling bulk DB operations in a single transaction.
|
|
80
|
+
*
|
|
81
|
+
* When defined, the batch handler is always called — even for a single event.
|
|
82
|
+
* Individual `.do()` handlers serve as fallback for projections without `.batch()`.
|
|
83
|
+
*/
|
|
84
|
+
batch: (handler: BatchHandler<TEvents>) => {
|
|
85
|
+
build: () => Projection<TEvents>;
|
|
86
|
+
};
|
|
87
|
+
} : {});
|
|
75
88
|
/**
|
|
76
|
-
* Creates a new projection builder
|
|
77
|
-
*
|
|
78
|
-
* Projections enable separation of read-model concerns from command handling.
|
|
79
|
-
* Each `.on({ Event }).do(handler)` call registers a handler that updates
|
|
80
|
-
* a projection (database table, cache, etc.) in response to events.
|
|
81
|
-
*
|
|
82
|
-
* Pass a target stream name to `projection("target")` so every handler
|
|
83
|
-
* inherits that resolver automatically. Omit it and use per-handler
|
|
84
|
-
* `.to()` / `.void()` when handlers route to different streams.
|
|
89
|
+
* Creates a new projection builder with a static target stream.
|
|
85
90
|
*
|
|
86
|
-
*
|
|
91
|
+
* All handlers inherit the target resolver automatically. Enables `.batch()`
|
|
92
|
+
* for bulk event processing in a single transaction.
|
|
87
93
|
*
|
|
88
|
-
* @
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
*
|
|
93
|
-
* await db.insert(tickets).values({ id: stream, ...data });
|
|
94
|
-
* })
|
|
95
|
-
* .on({ TicketClosed })
|
|
96
|
-
* .do(async ({ stream, data }) => {
|
|
97
|
-
* await db.update(tickets).set(data).where(eq(tickets.id, stream));
|
|
98
|
-
* })
|
|
99
|
-
* .build();
|
|
100
|
-
* ```
|
|
101
|
-
*
|
|
102
|
-
* @example Per-handler routing
|
|
103
|
-
* ```typescript
|
|
104
|
-
* const MultiProjection = projection()
|
|
105
|
-
* .on({ OrderPlaced })
|
|
106
|
-
* .do(async (event) => { ... })
|
|
107
|
-
* .to("orders")
|
|
108
|
-
* .on({ PaymentReceived })
|
|
109
|
-
* .do(async (event) => { ... })
|
|
110
|
-
* .to("payments")
|
|
111
|
-
* .build();
|
|
112
|
-
* ```
|
|
94
|
+
* @param target - Static target stream for all handlers
|
|
95
|
+
*/
|
|
96
|
+
export declare function projection<TEvents extends Schemas = {}>(target: string, events?: EventRegister<TEvents>): ProjectionBuilder<TEvents, string>;
|
|
97
|
+
/**
|
|
98
|
+
* Creates a new projection builder without a default target.
|
|
113
99
|
*
|
|
114
|
-
*
|
|
115
|
-
* @see {@link Projection} for the output type
|
|
100
|
+
* Use per-handler `.to()` / `.void()` to route events.
|
|
116
101
|
*/
|
|
117
|
-
export declare function projection<TEvents extends Schemas = {}>(target?:
|
|
102
|
+
export declare function projection<TEvents extends Schemas = {}>(target?: undefined, events?: EventRegister<TEvents>): ProjectionBuilder<TEvents, undefined>;
|
|
118
103
|
export {};
|
|
119
104
|
//# sourceMappingURL=projection-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection-builder.d.ts","sourceRoot":"","sources":["../../src/projection-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EAGb,gBAAgB,EAChB,MAAM,EACN,OAAO,EACR,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,OAAO,IAAI;IAChD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"projection-builder.d.ts","sourceRoot":"","sources":["../../src/projection-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice-builder.d.ts","sourceRoot":"","sources":["../../src/slice-builder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"slice-builder.d.ts","sourceRoot":"","sources":["../../src/slice-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,48 @@ export type ReactionOptions = {
|
|
|
100
100
|
readonly blockOnError: boolean;
|
|
101
101
|
readonly maxRetries: number;
|
|
102
102
|
};
|
|
103
|
+
/**
|
|
104
|
+
* Distributive mapped type that produces a proper discriminated union of
|
|
105
|
+
* committed events. Unlike `Committed<TEvents, keyof TEvents>` (where
|
|
106
|
+
* `name` and `data` are independent unions), each variant correlates
|
|
107
|
+
* `name` with its corresponding `data` — enabling `switch (event.name)`
|
|
108
|
+
* to narrow both fields correctly.
|
|
109
|
+
*
|
|
110
|
+
* @template TEvents - Event schemas
|
|
111
|
+
*
|
|
112
|
+
* @example Exhaustive switch
|
|
113
|
+
* ```typescript
|
|
114
|
+
* for (const event of events) {
|
|
115
|
+
* switch (event.name) {
|
|
116
|
+
* case "TicketOpened":
|
|
117
|
+
* event.data; // typed as TicketOpened's schema
|
|
118
|
+
* break;
|
|
119
|
+
* case "TicketClosed":
|
|
120
|
+
* event.data; // typed as TicketClosed's schema
|
|
121
|
+
* break;
|
|
122
|
+
* default:
|
|
123
|
+
* const _: never = event; // compile error if a case is missing
|
|
124
|
+
* }
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export type BatchEvent<TEvents extends Schemas> = {
|
|
129
|
+
[K in keyof TEvents]: Committed<TEvents, K>;
|
|
130
|
+
}[keyof TEvents];
|
|
131
|
+
/**
|
|
132
|
+
* Batch handler for projections that processes multiple events in a single call.
|
|
133
|
+
*
|
|
134
|
+
* Receives the full ordered array of all event types declared on the projection,
|
|
135
|
+
* enabling bulk DB operations (batch INSERT/UPDATE) in a single transaction.
|
|
136
|
+
* The handler is always called when defined — even for a single event.
|
|
137
|
+
*
|
|
138
|
+
* @template TEvents - Event schemas (all events declared on the projection)
|
|
139
|
+
* @param events - Ordered array of committed events (discriminated union)
|
|
140
|
+
* @param stream - The target stream name
|
|
141
|
+
*
|
|
142
|
+
* @see {@link BatchEvent} for the discriminated union type
|
|
143
|
+
*/
|
|
144
|
+
export type BatchHandler<TEvents extends Schemas> = (events: ReadonlyArray<BatchEvent<TEvents>>, stream: string) => Promise<void>;
|
|
103
145
|
/**
|
|
104
146
|
* Defines a reaction to an event.
|
|
105
147
|
* @template TEvents - Event schemas.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../src/types/reaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,MAAM,eAAe,CACzB,OAAO,SAAS,OAAO,EACvB,IAAI,SAAS,MAAM,OAAO,EAC1B,QAAQ,SAAS,OAAO,GAAG,OAAO,EAClC,MAAM,SAAS,KAAK,GAAG,KAAK,IAC1B,CACF,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,KACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,MAAM,gBAAgB,CAC1B,OAAO,SAAS,OAAO,EACvB,IAAI,SAAS,MAAM,OAAO,IAExB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,CAAC,CACC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,KAC5B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,QAAQ,CAClB,OAAO,SAAS,OAAO,EACvB,IAAI,SAAS,MAAM,OAAO,GAAG,MAAM,OAAO,EAC1C,QAAQ,SAAS,OAAO,GAAG,OAAO,EAClC,MAAM,SAAS,KAAK,GAAG,KAAK,IAC1B;IACF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG;IACzE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,OAAO,IAAI,KAAK,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;CACtD,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,OAAO,IAAI;IAC3C,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../src/types/reaction.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -379,7 +379,7 @@ var InMemoryStream = class {
|
|
|
379
379
|
_error = "";
|
|
380
380
|
_leased_by = void 0;
|
|
381
381
|
_leased_until = void 0;
|
|
382
|
-
get
|
|
382
|
+
get is_available() {
|
|
383
383
|
return !this._blocked && (!this._leased_until || this._leased_until <= /* @__PURE__ */ new Date());
|
|
384
384
|
}
|
|
385
385
|
get at() {
|
|
@@ -573,7 +573,7 @@ var InMemoryStore = class {
|
|
|
573
573
|
async claim(lagging, leading, by, millis) {
|
|
574
574
|
await sleep();
|
|
575
575
|
const available = [...this._streams.values()].filter(
|
|
576
|
-
(s) => s.
|
|
576
|
+
(s) => s.is_available && (s.at < 0 || this._events.some(
|
|
577
577
|
(e) => e.id > s.at && e.name !== SNAP_EVENT && (!s.source || RegExp(s.source).test(e.stream))
|
|
578
578
|
))
|
|
579
579
|
);
|
|
@@ -817,7 +817,7 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
|
|
|
817
817
|
if (!stream) throw new Error("Missing target stream");
|
|
818
818
|
payload = skipValidation ? payload : validate(action2, payload, me.actions[action2]);
|
|
819
819
|
const snapshot = await load(me, stream);
|
|
820
|
-
const expected = expectedVersion
|
|
820
|
+
const expected = expectedVersion ?? snapshot.event?.version;
|
|
821
821
|
logger2.trace(
|
|
822
822
|
payload,
|
|
823
823
|
`\u{1F535} ${stream}.${action2}${typeof expected === "number" ? `.${expected}` : ""}`
|
|
@@ -876,7 +876,7 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
|
|
|
876
876
|
);
|
|
877
877
|
} catch (error) {
|
|
878
878
|
if (error.name === "ERR_CONCURRENCY") {
|
|
879
|
-
|
|
879
|
+
await cache().invalidate(stream);
|
|
880
880
|
}
|
|
881
881
|
throw error;
|
|
882
882
|
}
|
|
@@ -904,9 +904,10 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
|
|
|
904
904
|
var logger3 = log();
|
|
905
905
|
var tracer = build_tracer(config().logLevel);
|
|
906
906
|
var Act = class {
|
|
907
|
-
constructor(registry, _states = /* @__PURE__ */ new Map()) {
|
|
907
|
+
constructor(registry, _states = /* @__PURE__ */ new Map(), batchHandlers = /* @__PURE__ */ new Map()) {
|
|
908
908
|
this.registry = registry;
|
|
909
909
|
this._states = _states;
|
|
910
|
+
this._batch_handlers = batchHandlers;
|
|
910
911
|
const statics = [];
|
|
911
912
|
for (const [name, register] of Object.entries(this.registry.events)) {
|
|
912
913
|
if (register.reactions.size > 0) {
|
|
@@ -964,6 +965,8 @@ var Act = class {
|
|
|
964
965
|
*/
|
|
965
966
|
/** Static resolver targets collected at build time */
|
|
966
967
|
_static_targets;
|
|
968
|
+
/** Batch handlers for static-target projections (target → handler) */
|
|
969
|
+
_batch_handlers;
|
|
967
970
|
/**
|
|
968
971
|
* Executes an action on a state instance, committing resulting events.
|
|
969
972
|
*
|
|
@@ -1205,6 +1208,41 @@ var Act = class {
|
|
|
1205
1208
|
}
|
|
1206
1209
|
return { lease, handled, at };
|
|
1207
1210
|
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Handles a batch of events for a projection with a batch handler.
|
|
1213
|
+
*
|
|
1214
|
+
* Called by `drain()` when a leased stream is a static-target projection
|
|
1215
|
+
* with a registered batch handler. All events are passed to the handler
|
|
1216
|
+
* in a single call, enabling bulk DB operations.
|
|
1217
|
+
*
|
|
1218
|
+
* @internal
|
|
1219
|
+
* @param lease The lease to handle
|
|
1220
|
+
* @param payloads The reactions to handle
|
|
1221
|
+
* @param batchHandler The batch handler for this projection
|
|
1222
|
+
* @returns The lease with results
|
|
1223
|
+
*/
|
|
1224
|
+
async handleBatch(lease, payloads, batchHandler) {
|
|
1225
|
+
const stream = lease.stream;
|
|
1226
|
+
const events = payloads.map((p) => p.event);
|
|
1227
|
+
const at = events.at(-1).id;
|
|
1228
|
+
lease.retry > 0 && logger3.warn(`Retrying batch ${stream}@${events[0].id} (${lease.retry}).`);
|
|
1229
|
+
try {
|
|
1230
|
+
await batchHandler(events, stream);
|
|
1231
|
+
return { lease, handled: events.length, at };
|
|
1232
|
+
} catch (error) {
|
|
1233
|
+
logger3.error(error);
|
|
1234
|
+
const { options } = payloads[0];
|
|
1235
|
+
const block = lease.retry >= options.maxRetries && options.blockOnError;
|
|
1236
|
+
block && logger3.error(`Blocking ${stream} after ${lease.retry} retries.`);
|
|
1237
|
+
return {
|
|
1238
|
+
lease,
|
|
1239
|
+
handled: 0,
|
|
1240
|
+
at: lease.at,
|
|
1241
|
+
error: error.message,
|
|
1242
|
+
block
|
|
1243
|
+
};
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1208
1246
|
/**
|
|
1209
1247
|
* Processes pending reactions by draining uncommitted events from the event store.
|
|
1210
1248
|
*
|
|
@@ -1299,10 +1337,12 @@ var Act = class {
|
|
|
1299
1337
|
leased.map((lease) => {
|
|
1300
1338
|
const streamFetch = fetched.find((f) => f.stream === lease.stream);
|
|
1301
1339
|
const at = streamFetch?.events.at(-1)?.id || fetch_window_at;
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1340
|
+
const payloads = payloadsMap.get(lease.stream);
|
|
1341
|
+
const batchHandler = this._batch_handlers.get(lease.stream);
|
|
1342
|
+
if (batchHandler && payloads.length > 0) {
|
|
1343
|
+
return this.handleBatch({ ...lease, at }, payloads, batchHandler);
|
|
1344
|
+
}
|
|
1345
|
+
return this.handle({ ...lease, at }, payloads);
|
|
1306
1346
|
})
|
|
1307
1347
|
);
|
|
1308
1348
|
const [lagging_handled, leading_handled] = handled.reduce(
|
|
@@ -1687,7 +1727,11 @@ function registerState(state2, states, actions, events) {
|
|
|
1687
1727
|
patch: mergedPatch,
|
|
1688
1728
|
on: { ...existing.on, ...state2.on },
|
|
1689
1729
|
given: { ...existing.given, ...state2.given },
|
|
1690
|
-
snap: state2.snap
|
|
1730
|
+
snap: state2.snap && existing.snap && state2.snap !== existing.snap ? (() => {
|
|
1731
|
+
throw new Error(
|
|
1732
|
+
`Duplicate snap strategy for state "${state2.name}"`
|
|
1733
|
+
);
|
|
1734
|
+
})() : state2.snap || existing.snap
|
|
1691
1735
|
};
|
|
1692
1736
|
states.set(state2.name, merged);
|
|
1693
1737
|
for (const name of Object.keys(merged.actions)) {
|
|
@@ -1743,14 +1787,15 @@ var _void_ = () => void 0;
|
|
|
1743
1787
|
function act(states = /* @__PURE__ */ new Map(), registry = {
|
|
1744
1788
|
actions: {},
|
|
1745
1789
|
events: {}
|
|
1746
|
-
}, pendingProjections = []) {
|
|
1790
|
+
}, pendingProjections = [], batchHandlers = /* @__PURE__ */ new Map()) {
|
|
1747
1791
|
const builder = {
|
|
1748
1792
|
withState: (state2) => {
|
|
1749
1793
|
registerState(state2, states, registry.actions, registry.events);
|
|
1750
1794
|
return act(
|
|
1751
1795
|
states,
|
|
1752
1796
|
registry,
|
|
1753
|
-
pendingProjections
|
|
1797
|
+
pendingProjections,
|
|
1798
|
+
batchHandlers
|
|
1754
1799
|
);
|
|
1755
1800
|
},
|
|
1756
1801
|
withSlice: (input) => {
|
|
@@ -1767,22 +1812,28 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
|
|
|
1767
1812
|
return act(
|
|
1768
1813
|
states,
|
|
1769
1814
|
registry,
|
|
1770
|
-
pendingProjections
|
|
1815
|
+
pendingProjections,
|
|
1816
|
+
batchHandlers
|
|
1771
1817
|
);
|
|
1772
1818
|
},
|
|
1773
1819
|
withProjection: (proj) => {
|
|
1774
1820
|
mergeProjection(proj, registry.events);
|
|
1821
|
+
if (proj.batchHandler && proj.target) {
|
|
1822
|
+
batchHandlers.set(proj.target, proj.batchHandler);
|
|
1823
|
+
}
|
|
1775
1824
|
return act(
|
|
1776
1825
|
states,
|
|
1777
1826
|
registry,
|
|
1778
|
-
pendingProjections
|
|
1827
|
+
pendingProjections,
|
|
1828
|
+
batchHandlers
|
|
1779
1829
|
);
|
|
1780
1830
|
},
|
|
1781
1831
|
withActor: () => {
|
|
1782
1832
|
return act(
|
|
1783
1833
|
states,
|
|
1784
1834
|
registry,
|
|
1785
|
-
pendingProjections
|
|
1835
|
+
pendingProjections,
|
|
1836
|
+
batchHandlers
|
|
1786
1837
|
);
|
|
1787
1838
|
},
|
|
1788
1839
|
on: (event) => ({
|
|
@@ -1795,19 +1846,22 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
|
|
|
1795
1846
|
maxRetries: options?.maxRetries ?? 3
|
|
1796
1847
|
}
|
|
1797
1848
|
};
|
|
1798
|
-
|
|
1799
|
-
|
|
1849
|
+
if (!handler.name)
|
|
1850
|
+
throw new Error(
|
|
1851
|
+
`Reaction handler for "${String(event)}" must be a named function`
|
|
1852
|
+
);
|
|
1853
|
+
registry.events[event].reactions.set(handler.name, reaction);
|
|
1800
1854
|
return {
|
|
1801
1855
|
...builder,
|
|
1802
1856
|
to(resolver) {
|
|
1803
|
-
registry.events[event].reactions.set(name, {
|
|
1857
|
+
registry.events[event].reactions.set(handler.name, {
|
|
1804
1858
|
...reaction,
|
|
1805
1859
|
resolver: typeof resolver === "string" ? { target: resolver } : resolver
|
|
1806
1860
|
});
|
|
1807
1861
|
return builder;
|
|
1808
1862
|
},
|
|
1809
1863
|
void() {
|
|
1810
|
-
registry.events[event].reactions.set(name, {
|
|
1864
|
+
registry.events[event].reactions.set(handler.name, {
|
|
1811
1865
|
...reaction,
|
|
1812
1866
|
resolver: _void_
|
|
1813
1867
|
});
|
|
@@ -1819,10 +1873,14 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
|
|
|
1819
1873
|
build: () => {
|
|
1820
1874
|
for (const proj of pendingProjections) {
|
|
1821
1875
|
mergeProjection(proj, registry.events);
|
|
1876
|
+
if (proj.batchHandler && proj.target) {
|
|
1877
|
+
batchHandlers.set(proj.target, proj.batchHandler);
|
|
1878
|
+
}
|
|
1822
1879
|
}
|
|
1823
1880
|
return new Act(
|
|
1824
1881
|
registry,
|
|
1825
|
-
states
|
|
1882
|
+
states,
|
|
1883
|
+
batchHandlers
|
|
1826
1884
|
);
|
|
1827
1885
|
},
|
|
1828
1886
|
events: registry.events
|
|
@@ -1831,9 +1889,9 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
|
|
|
1831
1889
|
}
|
|
1832
1890
|
|
|
1833
1891
|
// src/projection-builder.ts
|
|
1834
|
-
function
|
|
1835
|
-
const defaultResolver = target ? { target } : void 0;
|
|
1836
|
-
const
|
|
1892
|
+
function _projection(target, events) {
|
|
1893
|
+
const defaultResolver = typeof target === "string" ? { target } : void 0;
|
|
1894
|
+
const base = {
|
|
1837
1895
|
on: (entry) => {
|
|
1838
1896
|
const keys = Object.keys(entry);
|
|
1839
1897
|
if (keys.length !== 1) throw new Error(".on() requires exactly one key");
|
|
@@ -1856,23 +1914,23 @@ function projection(target, events = {}) {
|
|
|
1856
1914
|
}
|
|
1857
1915
|
};
|
|
1858
1916
|
const register = events[event];
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
);
|
|
1917
|
+
if (!handler.name)
|
|
1918
|
+
throw new Error(
|
|
1919
|
+
`Projection handler for "${event}" must be a named function`
|
|
1920
|
+
);
|
|
1921
|
+
register.reactions.set(handler.name, reaction);
|
|
1922
|
+
const nextBuilder = _projection(target, events);
|
|
1865
1923
|
return {
|
|
1866
1924
|
...nextBuilder,
|
|
1867
1925
|
to(resolver) {
|
|
1868
|
-
register.reactions.set(name, {
|
|
1926
|
+
register.reactions.set(handler.name, {
|
|
1869
1927
|
...reaction,
|
|
1870
1928
|
resolver: typeof resolver === "string" ? { target: resolver } : resolver
|
|
1871
1929
|
});
|
|
1872
1930
|
return nextBuilder;
|
|
1873
1931
|
},
|
|
1874
1932
|
void() {
|
|
1875
|
-
register.reactions.set(name, {
|
|
1933
|
+
register.reactions.set(handler.name, {
|
|
1876
1934
|
...reaction,
|
|
1877
1935
|
resolver: _void_
|
|
1878
1936
|
});
|
|
@@ -1884,11 +1942,28 @@ function projection(target, events = {}) {
|
|
|
1884
1942
|
},
|
|
1885
1943
|
build: () => ({
|
|
1886
1944
|
_tag: "Projection",
|
|
1887
|
-
events
|
|
1945
|
+
events,
|
|
1946
|
+
...target !== void 0 && { target }
|
|
1888
1947
|
}),
|
|
1889
1948
|
events
|
|
1890
1949
|
};
|
|
1891
|
-
|
|
1950
|
+
if (typeof target === "string") {
|
|
1951
|
+
return {
|
|
1952
|
+
...base,
|
|
1953
|
+
batch: (handler) => ({
|
|
1954
|
+
build: () => ({
|
|
1955
|
+
_tag: "Projection",
|
|
1956
|
+
events,
|
|
1957
|
+
target,
|
|
1958
|
+
batchHandler: handler
|
|
1959
|
+
})
|
|
1960
|
+
})
|
|
1961
|
+
};
|
|
1962
|
+
}
|
|
1963
|
+
return base;
|
|
1964
|
+
}
|
|
1965
|
+
function projection(target, events = {}) {
|
|
1966
|
+
return _projection(target, events);
|
|
1892
1967
|
}
|
|
1893
1968
|
|
|
1894
1969
|
// src/slice-builder.ts
|
|
@@ -1922,19 +1997,22 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
|
|
|
1922
1997
|
maxRetries: options?.maxRetries ?? 3
|
|
1923
1998
|
}
|
|
1924
1999
|
};
|
|
1925
|
-
|
|
1926
|
-
|
|
2000
|
+
if (!handler.name)
|
|
2001
|
+
throw new Error(
|
|
2002
|
+
`Reaction handler for "${String(event)}" must be a named function`
|
|
2003
|
+
);
|
|
2004
|
+
events[event].reactions.set(handler.name, reaction);
|
|
1927
2005
|
return {
|
|
1928
2006
|
...builder,
|
|
1929
2007
|
to(resolver) {
|
|
1930
|
-
events[event].reactions.set(name, {
|
|
2008
|
+
events[event].reactions.set(handler.name, {
|
|
1931
2009
|
...reaction,
|
|
1932
2010
|
resolver: typeof resolver === "string" ? { target: resolver } : resolver
|
|
1933
2011
|
});
|
|
1934
2012
|
return builder;
|
|
1935
2013
|
},
|
|
1936
2014
|
void() {
|
|
1937
|
-
events[event].reactions.set(name, {
|
|
2015
|
+
events[event].reactions.set(handler.name, {
|
|
1938
2016
|
...reaction,
|
|
1939
2017
|
resolver: _void_
|
|
1940
2018
|
});
|