@rotorsoft/act 1.22.9 → 1.23.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/.tsbuildinfo +1 -1
- package/dist/@types/act.d.ts +33 -2
- package/dist/@types/act.d.ts.map +1 -1
- package/dist/@types/builders/act-builder.d.ts.map +1 -1
- package/dist/@types/internal/event-sourcing.d.ts +59 -2
- package/dist/@types/internal/event-sourcing.d.ts.map +1 -1
- package/dist/@types/internal/index.d.ts +3 -3
- package/dist/@types/internal/index.d.ts.map +1 -1
- package/dist/@types/internal/projection-fold.d.ts +46 -0
- package/dist/@types/internal/projection-fold.d.ts.map +1 -0
- package/dist/@types/internal/tracing.d.ts +2 -2
- package/dist/@types/internal/tracing.d.ts.map +1 -1
- package/dist/index.cjs +120 -89
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +120 -89
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/@types/internal/state-fold.d.ts +0 -18
- package/dist/@types/internal/state-fold.d.ts.map +0 -1
package/dist/@types/act.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CircuitBreakerOptions, type CircuitState } from "./internal/index.js";
|
|
1
|
+
import { type CircuitBreakerOptions, type CircuitState, type PatchFn } from "./internal/index.js";
|
|
2
2
|
export type { CircuitBreakerOptions, CircuitState } from "./internal/index.js";
|
|
3
3
|
import { type Scoped } from "./ports.js";
|
|
4
4
|
import type { Actor, AsOf, AuditCategory, AuditFinding, AuditOptions, BatchHandler, BlockedLease, CloseResult, CloseTarget, Committed, Correlator, DoOptions, Drain, DrainOptions, EventSink, EventSource, IAct, LaneConfig, Lease, LoadTarget, Query, Registry, ScanOptions, ScanResult, Schema, SchemaRegister, Schemas, SettleOptions, Snapshot, State, StoreNotification, StreamFilter, StreamPosition, Target } from "./types/index.js";
|
|
@@ -211,6 +211,31 @@ export type ActOptions<TLanes extends string = string> = {
|
|
|
211
211
|
readonly end: number;
|
|
212
212
|
readonly timeZone?: string;
|
|
213
213
|
};
|
|
214
|
+
/**
|
|
215
|
+
* Validate folded state against its declared Zod schema after every
|
|
216
|
+
* reduction (ACT-1238). Off by default.
|
|
217
|
+
*
|
|
218
|
+
* When `true`, each time an event is folded into state — on the
|
|
219
|
+
* command path (`do`), on `load`/replay, and inside projection-fold
|
|
220
|
+
* projections — the merged full state is parsed against the owning
|
|
221
|
+
* state's `state({ Name: schema })` schema. A reducer that produces
|
|
222
|
+
* schema-violating state (the calculator divide-by-zero NaN class,
|
|
223
|
+
* #1230) throws a {@link ValidationError} at the triggering event,
|
|
224
|
+
* whose `target` names the state and the event (`<state>.<event>#<id>`)
|
|
225
|
+
* — instead of the bad value propagating and surfacing hops later as a
|
|
226
|
+
* confusing downstream error.
|
|
227
|
+
*
|
|
228
|
+
* This is a **debugging / CI aid, not a production guard**. Turn it on
|
|
229
|
+
* in development and CI to catch total-reducer bugs at the source; the
|
|
230
|
+
* framework already validates action inputs and emitted events, so the
|
|
231
|
+
* reduced state is the one shape it otherwise trusts. The per-event
|
|
232
|
+
* patch step is selected **once at `build()`** (the same way the
|
|
233
|
+
* orchestrator picks bare vs trace-decorated store ops from the log
|
|
234
|
+
* level): when `false` (the default) the fold loop is byte-identical to
|
|
235
|
+
* a bare reduction — the validating patch step is never selected, so
|
|
236
|
+
* there is no per-event cost, not even a branch.
|
|
237
|
+
*/
|
|
238
|
+
readonly validateFoldedState?: boolean;
|
|
214
239
|
};
|
|
215
240
|
export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents extends Schemas, TActions extends Schemas, TStateMap extends Record<string, Schema> = Record<string, never>, TActor extends Actor = Actor> implements IAct<TEvents, TActions, TActor, TSchemaReg> {
|
|
216
241
|
private _emitter;
|
|
@@ -342,8 +367,14 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
342
367
|
* @param lanes Declared drain lanes (ACT-1103). The builder collects
|
|
343
368
|
* these from `.withLane(...)` calls. Slice 1 records them on the
|
|
344
369
|
* instance; later slices fan out one `DrainController` per lane.
|
|
370
|
+
* @param patch_fn The per-event patch step selected once by the builder
|
|
371
|
+
* from `ActOptions.validateFoldedState` (ACT-1238) — `bare_patch` by
|
|
372
|
+
* default, `validating_patch` when the flag is on. The builder uses
|
|
373
|
+
* the same value for its projection-fold handlers, so there is a
|
|
374
|
+
* single selection site. Defaults to `bare_patch` for direct
|
|
375
|
+
* construction.
|
|
345
376
|
*/
|
|
346
|
-
constructor(registry: Registry<TSchemaReg, TEvents, TActions, keyof TStateMap & string>, states?: Map<string, State<any, any, any>>, batch_handlers?: Map<string, BatchHandler<any>>, options?: ActOptions, lanes?: ReadonlyArray<LaneConfig
|
|
377
|
+
constructor(registry: Registry<TSchemaReg, TEvents, TActions, keyof TStateMap & string>, states?: Map<string, State<any, any, any>>, batch_handlers?: Map<string, BatchHandler<any>>, options?: ActOptions, lanes?: ReadonlyArray<LaneConfig>, patch_fn?: PatchFn);
|
|
347
378
|
/**
|
|
348
379
|
* Circuit breaker shared by every store-polling loop (drain, the settle
|
|
349
380
|
* correlate, autoclose). Validates the knobs eagerly so out-of-range
|
package/dist/@types/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/act-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"act-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/act-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,64 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
|
+
import { type Patch } from "@rotorsoft/act-patch";
|
|
17
18
|
import type { Committed, DoOptions, EventSource, LoadTarget, ScanOptions, ScanResult, Schema, Schemas, Snapshot, State, Target } from "../types/index.js";
|
|
19
|
+
/**
|
|
20
|
+
* The reduction pipeline names three distinct things, and each word means
|
|
21
|
+
* exactly one of them:
|
|
22
|
+
*
|
|
23
|
+
* - a **reducer** is a state's `.patch()` handler — it takes one event and
|
|
24
|
+
* returns a {@link Patch} *partial*;
|
|
25
|
+
* - a **patch step** ({@link bare_patch} / {@link validating_patch}) merges
|
|
26
|
+
* that partial into the current state, yielding the next full state;
|
|
27
|
+
* - the **fold** is the loop that applies the patch step across a stream's
|
|
28
|
+
* events (the reader loop in {@link load} / {@link action}, and the
|
|
29
|
+
* projection engine in {@link "projection-fold"}).
|
|
30
|
+
*
|
|
31
|
+
* `PatchFn` is the per-event patch step. The fold loop calls one of two
|
|
32
|
+
* implementations, selected **once** at construction (in
|
|
33
|
+
* {@link "tracing".build_es}) — never branched per event:
|
|
34
|
+
*
|
|
35
|
+
* - {@link bare_patch} — the default. Literally `patch(state, partial)`,
|
|
36
|
+
* no wrapper. This is the pre-ACT-1238 hot path, byte-for-byte.
|
|
37
|
+
* - {@link validating_patch} — the opt-in `ActOptions.validateFoldedState`
|
|
38
|
+
* path. Merges, then parses the merged full state against the state's
|
|
39
|
+
* declared Zod schema.
|
|
40
|
+
*
|
|
41
|
+
* The `me`/`event` arguments are unused by the bare implementation but
|
|
42
|
+
* carried on the shared signature so the fold loop is call-shape-identical
|
|
43
|
+
* regardless of which patch step was selected — the validating
|
|
44
|
+
* implementation needs them to name the failing reduction.
|
|
45
|
+
*
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export type PatchFn = <TState extends Schema, TEvents extends Schemas, TActions extends Schemas>(me: State<TState, TEvents, TActions>, state: TState, partial: Readonly<Patch<TState>>, event: Committed<TEvents, keyof TEvents>) => TState;
|
|
49
|
+
/**
|
|
50
|
+
* The default patch step: a bare `patch()` merge with no wrapper and no
|
|
51
|
+
* branch. The off-path is byte-for-byte the pre-ACT-1238 reduction, so an
|
|
52
|
+
* app that leaves `validateFoldedState` off pays nothing — not even a
|
|
53
|
+
* comparison.
|
|
54
|
+
*
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export declare const bare_patch: PatchFn;
|
|
58
|
+
/**
|
|
59
|
+
* The opt-in patch step (ACT-1238): merge the partial into state, then
|
|
60
|
+
* parse the merged full state against the owning state's declared Zod
|
|
61
|
+
* schema. A reducer that produces schema-violating state (the calculator
|
|
62
|
+
* divide-by-zero NaN class, #1230) fails here, at the triggering event,
|
|
63
|
+
* instead of propagating and surfacing hops later as a confusing
|
|
64
|
+
* downstream error.
|
|
65
|
+
*
|
|
66
|
+
* The `target` string names the state and the triggering event
|
|
67
|
+
* (`"<state>.<event>#<id>"`) so the resulting {@link ValidationError}
|
|
68
|
+
* points straight at the reduction that produced bad state. A debugging /
|
|
69
|
+
* CI aid, not a production guard — selected only when the operator opts
|
|
70
|
+
* in.
|
|
71
|
+
*
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
export declare const validating_patch: PatchFn;
|
|
18
75
|
/**
|
|
19
76
|
* Internal action signature seen by the orchestrator — the {@link Correlator}
|
|
20
77
|
* is bound at `build_es` time, so callers don't pass it through.
|
|
@@ -108,7 +165,7 @@ export declare function scan(source: EventSource, opts?: ScanOptions, callback?:
|
|
|
108
165
|
* @example
|
|
109
166
|
* const snapshot = await load(Counter, "counter1");
|
|
110
167
|
*/
|
|
111
|
-
export declare function load<TState extends Schema, TEvents extends Schemas, TActions extends Schemas>(me: State<TState, TEvents, TActions>, target: LoadTarget, callback?: (snapshot: Snapshot<TState, TEvents>) => void): Promise<Snapshot<TState, TEvents>>;
|
|
168
|
+
export declare function load<TState extends Schema, TEvents extends Schemas, TActions extends Schemas>(me: State<TState, TEvents, TActions>, target: LoadTarget, callback?: (snapshot: Snapshot<TState, TEvents>) => void, patch_fn?: PatchFn): Promise<Snapshot<TState, TEvents>>;
|
|
112
169
|
/**
|
|
113
170
|
* Executes an action and emits an event to be committed by the store.
|
|
114
171
|
*
|
|
@@ -140,5 +197,5 @@ export declare function load<TState extends Schema, TEvents extends Schemas, TAc
|
|
|
140
197
|
* @example
|
|
141
198
|
* const snapshot = await action(Counter, "increment", { stream: "counter1", actor }, { by: 1 });
|
|
142
199
|
*/
|
|
143
|
-
export declare function action<TState extends Schema, TEvents extends Schemas, TActions extends Schemas, TKey extends keyof TActions>(me: State<TState, TEvents, TActions>, action: TKey, target: Target, payload: Readonly<TActions[TKey]>, options?: DoOptions<TEvents
|
|
200
|
+
export declare function action<TState extends Schema, TEvents extends Schemas, TActions extends Schemas, TKey extends keyof TActions>(me: State<TState, TEvents, TActions>, action: TKey, target: Target, payload: Readonly<TActions[TKey]>, options?: DoOptions<TEvents>, patch_fn?: PatchFn): Promise<Snapshot<TState, TEvents>[]>;
|
|
144
201
|
//# sourceMappingURL=event-sourcing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-sourcing.d.ts","sourceRoot":"","sources":["../../../src/internal/event-sourcing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"event-sourcing.d.ts","sourceRoot":"","sources":["../../../src/internal/event-sourcing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,sBAAsB,CAAC;AAOzD,OAAO,KAAK,EACV,SAAS,EAET,SAAS,EAGT,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EACL,MAAM,EACP,MAAM,mBAAmB,CAAC;AAK3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EAExB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAChC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,KACrC,MAAM,CAAC;AAEZ;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,OACc,CAAC;AAExC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAO9B,CAAC;AAUF;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,IAAI,SAAS,MAAM,QAAQ,EAE3B,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACjC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,KACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAE1C,gBAAgB;AAChB,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,OAAO,SAAS,CAAC;CAC7B;AAED;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,IAAI,CAAC,MAAM,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,EACvE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC,CAsBxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC,CAaxD;AA+BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,WAAgB,EACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GACvE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CA2J1C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,IAAI,CACxB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EAExB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EACxD,QAAQ,GAAE,OAAoB,GAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiHpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,MAAM,CAC1B,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,IAAI,SAAS,MAAM,QAAQ,EAE3B,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACjC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,EAC5B,QAAQ,GAAE,OAAoB,GAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAqMtC"}
|
|
@@ -31,13 +31,13 @@ export { close_correlation, default_correlator } from "./correlator.js";
|
|
|
31
31
|
export { DeferSignal } from "./defer-signal.js";
|
|
32
32
|
export type { DrainOps } from "./drain.js";
|
|
33
33
|
export { DrainController, type Handle, type HandleBatch, } from "./drain-cycle.js";
|
|
34
|
-
export type { EsOps } from "./event-sourcing.js";
|
|
35
|
-
export { scan } from "./event-sourcing.js";
|
|
34
|
+
export type { EsOps, PatchFn } from "./event-sourcing.js";
|
|
35
|
+
export { bare_patch, scan, validating_patch } from "./event-sourcing.js";
|
|
36
36
|
export { current_version_of, deprecated_event_names, } from "./event-versions.js";
|
|
37
37
|
export { _this_, merge_event_register, merge_projection, register_state, } from "./merge.js";
|
|
38
|
+
export * from "./projection-fold.js";
|
|
38
39
|
export { build_handle, build_handle_batch } from "./reactions.js";
|
|
39
40
|
export { _registry, pii_fields, pii_gate, pii_split, pii_strip, REDACTED, SHREDDED, } from "./sensitive.js";
|
|
40
41
|
export { SettleLoop } from "./settle.js";
|
|
41
|
-
export * from "./state-fold.js";
|
|
42
42
|
export { build_drain, build_es, trace_cycle } from "./tracing.js";
|
|
43
43
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/internal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,KAAK,eAAe,EACpB,+BAA+B,EAC/B,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,eAAe,EACpB,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/internal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,KAAK,eAAe,EACpB,+BAA+B,EAC/B,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,eAAe,EACpB,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,MAAM,EACN,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module projection-fold
|
|
3
|
+
* @category Internal
|
|
4
|
+
*
|
|
5
|
+
* Fold engine behind `projection(name).of(state)` — maintains per-stream
|
|
6
|
+
* folded states in a bounded in-memory cache and flushes one row per dirty
|
|
7
|
+
* stream per round, so write amplification tracks the distinct-key count
|
|
8
|
+
* instead of the event count.
|
|
9
|
+
*
|
|
10
|
+
* The flush payload deliberately has no type of its own: a state
|
|
11
|
+
* projection flushes the cache layer outward — the rows ARE the
|
|
12
|
+
* streams' {@link CacheEntry} values.
|
|
13
|
+
*
|
|
14
|
+
* Correctness discipline:
|
|
15
|
+
* - The engine runs as the projection's batch handler, so the watermark
|
|
16
|
+
* acks only after a fully-flushed batch — fold work is never
|
|
17
|
+
* acknowledged before it is durable.
|
|
18
|
+
* - On first sight of a stream the engine loads its head state through
|
|
19
|
+
* the same `load()` the command path uses (cache, snapshots and all).
|
|
20
|
+
* The loaded snapshot carries its own head position (`version` and the
|
|
21
|
+
* global event `id`), captured atomically with `state`, so the engine
|
|
22
|
+
* never pairs a stale state with a newer head id read separately from
|
|
23
|
+
* the cache (ACT-1204). Fetched events at or below the loaded id are
|
|
24
|
+
* skipped, later ones fold through the state's own patch reducers.
|
|
25
|
+
* - Eviction under `maxCachedStates` pressure flushes the evictee first
|
|
26
|
+
* (flush-before-evict) — eviction never loses folded work.
|
|
27
|
+
*/
|
|
28
|
+
import { z } from "zod";
|
|
29
|
+
import type { BatchHandler, CacheEntry, FoldOptions, Schema, Schemas, State } from "../types/index.js";
|
|
30
|
+
import { type PatchFn } from "./event-sourcing.js";
|
|
31
|
+
export declare const DEFAULT_FOLD_FLUSH_EVERY = 1000;
|
|
32
|
+
export declare const DEFAULT_MAX_CACHED_STATES = 10000;
|
|
33
|
+
declare const FoldOptionsSchema: z.ZodObject<{
|
|
34
|
+
flushEvery: z.ZodDefault<z.ZodNumber>;
|
|
35
|
+
maxCachedStates: z.ZodDefault<z.ZodNumber>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export type FoldConfig = z.infer<typeof FoldOptionsSchema>;
|
|
38
|
+
export declare function resolveFoldConfig(options: FoldOptions): FoldConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Build the batch handler that folds a state's events into per-stream rows.
|
|
41
|
+
* The returned closure is long-lived (one per built projection): its cache
|
|
42
|
+
* survives across drain cycles, so warm streams fold without I/O.
|
|
43
|
+
*/
|
|
44
|
+
export declare function make_fold_handler<TState extends Schema, TEvents extends Schemas, TActions extends Schemas>(me: State<TState, TEvents, TActions>, flush: (rows: ReadonlyArray<CacheEntry<TState>>) => Promise<void>, config: FoldConfig, patch_fn?: PatchFn): BatchHandler<TEvents>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=projection-fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-fold.d.ts","sourceRoot":"","sources":["../../../src/internal/projection-fold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,MAAM,EACN,OAAO,EACP,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAErE,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,QAAA,MAAM,iBAAiB;;;iBAGrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAElE;AAcD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EAExB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,KAAK,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACjE,MAAM,EAAE,UAAU,EAClB,QAAQ,GAAE,OAAoB,GAC7B,YAAY,CAAC,OAAO,CAAC,CAyFvB"}
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import type { Correlator, Logger, Schemas } from "../types/index.js";
|
|
29
29
|
import type { DrainOps } from "./drain.js";
|
|
30
|
-
import type { EsOps } from "./event-sourcing.js";
|
|
30
|
+
import type { EsOps, PatchFn } from "./event-sourcing.js";
|
|
31
31
|
/**
|
|
32
32
|
* Selects bare or traced event-sourcing handlers. Called once by the
|
|
33
33
|
* orchestrator constructor.
|
|
34
34
|
*
|
|
35
35
|
* @internal
|
|
36
36
|
*/
|
|
37
|
-
export declare function build_es(logger: Logger, correlator?: Correlator): EsOps;
|
|
37
|
+
export declare function build_es(logger: Logger, correlator?: Correlator, patch_fn?: PatchFn): EsOps;
|
|
38
38
|
/**
|
|
39
39
|
* Selects bare or traced drain-pipeline ops. Called once by the orchestrator
|
|
40
40
|
* constructor.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/internal/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAQ,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/internal/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAQ,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiI1D;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,UAA+B,EAC3C,QAAQ,GAAE,OAAuB,GAChC,KAAK,CA4FP;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,SAAS,OAAO,EACjD,MAAM,EAAE,MAAM,GACb,QAAQ,CAAC,OAAO,CAAC,CAoCnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,WAAW,CAAC,OAAO,SAAS,OAAO,EACjD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,EACF,OAAO,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;KAC9B,CAAC,CAAC;CACJ,CAAC,EACF,OAAO,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC,EACF,KAAK,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EACtE,OAAO,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1E,IAAI,CAwDN"}
|
package/dist/index.cjs
CHANGED
|
@@ -3260,6 +3260,15 @@ function compute_backoff_delay(retry, opts) {
|
|
|
3260
3260
|
}
|
|
3261
3261
|
|
|
3262
3262
|
// src/internal/event-sourcing.ts
|
|
3263
|
+
var bare_patch = (_me, state2, partial) => (0, import_act_patch.patch)(state2, partial);
|
|
3264
|
+
var validating_patch = (me, state2, partial, event) => {
|
|
3265
|
+
const next = (0, import_act_patch.patch)(state2, partial);
|
|
3266
|
+
return validate(
|
|
3267
|
+
`${me.name}.${String(event.name)}#${event.id}`,
|
|
3268
|
+
next,
|
|
3269
|
+
me.state
|
|
3270
|
+
);
|
|
3271
|
+
};
|
|
3263
3272
|
var DEFAULT_BATCH = 500;
|
|
3264
3273
|
async function snap(snapshot) {
|
|
3265
3274
|
const { id, stream, name, meta, version } = snapshot.event;
|
|
@@ -3414,7 +3423,7 @@ async function scan(source, opts = {}, callback) {
|
|
|
3414
3423
|
}
|
|
3415
3424
|
};
|
|
3416
3425
|
}
|
|
3417
|
-
async function load(me, target, callback) {
|
|
3426
|
+
async function load(me, target, callback, patch_fn = bare_patch) {
|
|
3418
3427
|
const { stream, actor, asOf } = target;
|
|
3419
3428
|
const time_travel = !!asOf && Object.values(asOf).some((v) => v !== void 0);
|
|
3420
3429
|
const cached = time_travel ? void 0 : await cache2().get(stream);
|
|
@@ -3433,7 +3442,7 @@ async function load(me, target, callback) {
|
|
|
3433
3442
|
patches = 0;
|
|
3434
3443
|
replayed++;
|
|
3435
3444
|
} else if (me.patch[event.name]) {
|
|
3436
|
-
state2 = (
|
|
3445
|
+
state2 = patch_fn(me, state2, me.patch[event.name](event, state2), event);
|
|
3437
3446
|
patches++;
|
|
3438
3447
|
replayed++;
|
|
3439
3448
|
} else if (event.name !== TOMBSTONE_EVENT) {
|
|
@@ -3484,7 +3493,7 @@ async function load(me, target, callback) {
|
|
|
3484
3493
|
replayed
|
|
3485
3494
|
};
|
|
3486
3495
|
}
|
|
3487
|
-
async function action(me, action2, target, payload, options) {
|
|
3496
|
+
async function action(me, action2, target, payload, options, patch_fn = bare_patch) {
|
|
3488
3497
|
const { stream, expectedVersion, actor } = target;
|
|
3489
3498
|
if (!stream) throw new Error("Missing target stream");
|
|
3490
3499
|
const reactingTo = options?.reactingTo;
|
|
@@ -3494,7 +3503,12 @@ async function action(me, action2, target, payload, options) {
|
|
|
3494
3503
|
const max_retries = opts?.maxRetries ?? 0;
|
|
3495
3504
|
for (let attempt = 0; ; attempt++) {
|
|
3496
3505
|
try {
|
|
3497
|
-
const snapshot = await load(
|
|
3506
|
+
const snapshot = await load(
|
|
3507
|
+
me,
|
|
3508
|
+
{ stream, actor: target.actor },
|
|
3509
|
+
void 0,
|
|
3510
|
+
patch_fn
|
|
3511
|
+
);
|
|
3498
3512
|
if (snapshot.event?.name === TOMBSTONE_EVENT)
|
|
3499
3513
|
throw new StreamClosedError(stream);
|
|
3500
3514
|
const expected = expectedVersion ?? (snapshot.version >= 0 ? snapshot.version : void 0);
|
|
@@ -3565,7 +3579,7 @@ async function action(me, action2, target, payload, options) {
|
|
|
3565
3579
|
const snapshots = committed.map((row, i) => {
|
|
3566
3580
|
const event = { ...row, data: valid[i].data };
|
|
3567
3581
|
const p = me.patch[event.name](event, state2);
|
|
3568
|
-
state2 = (
|
|
3582
|
+
state2 = patch_fn(me, state2, p, event);
|
|
3569
3583
|
patches++;
|
|
3570
3584
|
return {
|
|
3571
3585
|
event,
|
|
@@ -3661,12 +3675,20 @@ var traced = (inner, exit, entry) => (async (...args) => {
|
|
|
3661
3675
|
exit?.(result, ...args);
|
|
3662
3676
|
return result;
|
|
3663
3677
|
});
|
|
3664
|
-
function build_es(logger, correlator = default_correlator) {
|
|
3665
|
-
const bound_action = (me, action_name, target, payload, options) => action(
|
|
3678
|
+
function build_es(logger, correlator = default_correlator, patch_fn = bare_patch) {
|
|
3679
|
+
const bound_action = (me, action_name, target, payload, options) => action(
|
|
3680
|
+
me,
|
|
3681
|
+
action_name,
|
|
3682
|
+
target,
|
|
3683
|
+
payload,
|
|
3684
|
+
{ correlator, ...options },
|
|
3685
|
+
patch_fn
|
|
3686
|
+
);
|
|
3687
|
+
const bound_load = (me, target, callback) => load(me, target, callback, patch_fn);
|
|
3666
3688
|
if (logger.level !== "trace") {
|
|
3667
3689
|
return {
|
|
3668
3690
|
snap,
|
|
3669
|
-
load,
|
|
3691
|
+
load: bound_load,
|
|
3670
3692
|
action: bound_action,
|
|
3671
3693
|
tombstone
|
|
3672
3694
|
};
|
|
@@ -3681,7 +3703,7 @@ function build_es(logger, correlator = default_correlator) {
|
|
|
3681
3703
|
)
|
|
3682
3704
|
);
|
|
3683
3705
|
}),
|
|
3684
|
-
load: traced(
|
|
3706
|
+
load: traced(bound_load, (result, _me, target) => {
|
|
3685
3707
|
const stats = stats_marker(
|
|
3686
3708
|
result.version,
|
|
3687
3709
|
result.replayed,
|
|
@@ -3992,6 +4014,83 @@ var DrainController = class {
|
|
|
3992
4014
|
}
|
|
3993
4015
|
};
|
|
3994
4016
|
|
|
4017
|
+
// src/internal/projection-fold.ts
|
|
4018
|
+
var import_zod10 = require("zod");
|
|
4019
|
+
var DEFAULT_FOLD_FLUSH_EVERY = 1e3;
|
|
4020
|
+
var DEFAULT_MAX_CACHED_STATES = 1e4;
|
|
4021
|
+
var FoldOptionsSchema = import_zod10.z.object({
|
|
4022
|
+
flushEvery: import_zod10.z.number().int().min(1).default(DEFAULT_FOLD_FLUSH_EVERY),
|
|
4023
|
+
maxCachedStates: import_zod10.z.number().int().min(1).default(DEFAULT_MAX_CACHED_STATES)
|
|
4024
|
+
});
|
|
4025
|
+
function resolveFoldConfig(options) {
|
|
4026
|
+
return FoldOptionsSchema.parse(options);
|
|
4027
|
+
}
|
|
4028
|
+
function make_fold_handler(me, flush, config2, patch_fn = bare_patch) {
|
|
4029
|
+
const cache3 = /* @__PURE__ */ new Map();
|
|
4030
|
+
const row = ({ dirty: _, ...row2 }) => row2;
|
|
4031
|
+
const flush_dirty = async () => {
|
|
4032
|
+
const rows = [];
|
|
4033
|
+
const flushed = [];
|
|
4034
|
+
for (const f of cache3.values())
|
|
4035
|
+
if (f.dirty) {
|
|
4036
|
+
rows.push(row(f));
|
|
4037
|
+
flushed.push(f);
|
|
4038
|
+
}
|
|
4039
|
+
if (rows.length === 0) return;
|
|
4040
|
+
await flush(rows);
|
|
4041
|
+
for (const f of flushed) f.dirty = false;
|
|
4042
|
+
};
|
|
4043
|
+
return async (events) => {
|
|
4044
|
+
let folded_since_flush = 0;
|
|
4045
|
+
for (const event of events) {
|
|
4046
|
+
const stream = event.stream;
|
|
4047
|
+
let fold = cache3.get(stream);
|
|
4048
|
+
if (fold) {
|
|
4049
|
+
cache3.delete(stream);
|
|
4050
|
+
cache3.set(stream, fold);
|
|
4051
|
+
} else {
|
|
4052
|
+
if (cache3.size >= config2.maxCachedStates) {
|
|
4053
|
+
const oldest = cache3.keys().next().value;
|
|
4054
|
+
const evictee = cache3.get(oldest);
|
|
4055
|
+
if (evictee.dirty) await flush([row(evictee)]);
|
|
4056
|
+
cache3.delete(oldest);
|
|
4057
|
+
}
|
|
4058
|
+
const snapshot = await load(me, { stream }, void 0, patch_fn);
|
|
4059
|
+
fold = {
|
|
4060
|
+
stream,
|
|
4061
|
+
state: snapshot.state,
|
|
4062
|
+
version: snapshot.version,
|
|
4063
|
+
event_id: snapshot.id,
|
|
4064
|
+
patches: snapshot.patches,
|
|
4065
|
+
snaps: snapshot.snaps,
|
|
4066
|
+
dirty: true
|
|
4067
|
+
};
|
|
4068
|
+
cache3.set(stream, fold);
|
|
4069
|
+
}
|
|
4070
|
+
if (event.id > fold.event_id) {
|
|
4071
|
+
const reducer = me.patch[event.name];
|
|
4072
|
+
fold.state = patch_fn(
|
|
4073
|
+
me,
|
|
4074
|
+
fold.state,
|
|
4075
|
+
reducer(event, fold.state),
|
|
4076
|
+
event
|
|
4077
|
+
);
|
|
4078
|
+
fold.version = event.version;
|
|
4079
|
+
fold.event_id = event.id;
|
|
4080
|
+
fold.patches++;
|
|
4081
|
+
fold.dirty = true;
|
|
4082
|
+
} else {
|
|
4083
|
+
fold.dirty = true;
|
|
4084
|
+
}
|
|
4085
|
+
if (++folded_since_flush >= config2.flushEvery) {
|
|
4086
|
+
await flush_dirty();
|
|
4087
|
+
folded_since_flush = 0;
|
|
4088
|
+
}
|
|
4089
|
+
}
|
|
4090
|
+
await flush_dirty();
|
|
4091
|
+
};
|
|
4092
|
+
}
|
|
4093
|
+
|
|
3995
4094
|
// src/internal/reactions.ts
|
|
3996
4095
|
function finalize(lease, handled, at, error, options, logger, failed_at) {
|
|
3997
4096
|
if (!error) return { lease, handled, acked_at: at };
|
|
@@ -4197,82 +4296,6 @@ var SettleLoop = class {
|
|
|
4197
4296
|
}
|
|
4198
4297
|
};
|
|
4199
4298
|
|
|
4200
|
-
// src/internal/state-fold.ts
|
|
4201
|
-
var import_act_patch2 = require("@rotorsoft/act-patch");
|
|
4202
|
-
var import_zod10 = require("zod");
|
|
4203
|
-
var DEFAULT_FOLD_FLUSH_EVERY = 1e3;
|
|
4204
|
-
var DEFAULT_MAX_CACHED_STATES = 1e4;
|
|
4205
|
-
var FoldOptionsSchema = import_zod10.z.object({
|
|
4206
|
-
flushEvery: import_zod10.z.number().int().min(1).default(DEFAULT_FOLD_FLUSH_EVERY),
|
|
4207
|
-
maxCachedStates: import_zod10.z.number().int().min(1).default(DEFAULT_MAX_CACHED_STATES)
|
|
4208
|
-
});
|
|
4209
|
-
function resolveFoldConfig(options) {
|
|
4210
|
-
return FoldOptionsSchema.parse(options);
|
|
4211
|
-
}
|
|
4212
|
-
function make_fold_handler(me, flush, config2) {
|
|
4213
|
-
const cache3 = /* @__PURE__ */ new Map();
|
|
4214
|
-
const row = ({ dirty: _, ...row2 }) => row2;
|
|
4215
|
-
const flush_dirty = async () => {
|
|
4216
|
-
const rows = [];
|
|
4217
|
-
const flushed = [];
|
|
4218
|
-
for (const f of cache3.values())
|
|
4219
|
-
if (f.dirty) {
|
|
4220
|
-
rows.push(row(f));
|
|
4221
|
-
flushed.push(f);
|
|
4222
|
-
}
|
|
4223
|
-
if (rows.length === 0) return;
|
|
4224
|
-
await flush(rows);
|
|
4225
|
-
for (const f of flushed) f.dirty = false;
|
|
4226
|
-
};
|
|
4227
|
-
return async (events) => {
|
|
4228
|
-
let folded_since_flush = 0;
|
|
4229
|
-
for (const event of events) {
|
|
4230
|
-
const stream = event.stream;
|
|
4231
|
-
let fold = cache3.get(stream);
|
|
4232
|
-
if (fold) {
|
|
4233
|
-
cache3.delete(stream);
|
|
4234
|
-
cache3.set(stream, fold);
|
|
4235
|
-
} else {
|
|
4236
|
-
if (cache3.size >= config2.maxCachedStates) {
|
|
4237
|
-
const oldest = cache3.keys().next().value;
|
|
4238
|
-
const evictee = cache3.get(oldest);
|
|
4239
|
-
if (evictee.dirty) await flush([row(evictee)]);
|
|
4240
|
-
cache3.delete(oldest);
|
|
4241
|
-
}
|
|
4242
|
-
const snapshot = await load(me, { stream });
|
|
4243
|
-
fold = {
|
|
4244
|
-
stream,
|
|
4245
|
-
state: snapshot.state,
|
|
4246
|
-
version: snapshot.version,
|
|
4247
|
-
event_id: snapshot.id,
|
|
4248
|
-
patches: snapshot.patches,
|
|
4249
|
-
snaps: snapshot.snaps,
|
|
4250
|
-
dirty: true
|
|
4251
|
-
};
|
|
4252
|
-
cache3.set(stream, fold);
|
|
4253
|
-
}
|
|
4254
|
-
if (event.id > fold.event_id) {
|
|
4255
|
-
const reducer = me.patch[event.name];
|
|
4256
|
-
fold.state = (0, import_act_patch2.patch)(
|
|
4257
|
-
fold.state,
|
|
4258
|
-
reducer(event, fold.state)
|
|
4259
|
-
);
|
|
4260
|
-
fold.version = event.version;
|
|
4261
|
-
fold.event_id = event.id;
|
|
4262
|
-
fold.patches++;
|
|
4263
|
-
fold.dirty = true;
|
|
4264
|
-
} else {
|
|
4265
|
-
fold.dirty = true;
|
|
4266
|
-
}
|
|
4267
|
-
if (++folded_since_flush >= config2.flushEvery) {
|
|
4268
|
-
await flush_dirty();
|
|
4269
|
-
folded_since_flush = 0;
|
|
4270
|
-
}
|
|
4271
|
-
}
|
|
4272
|
-
await flush_dirty();
|
|
4273
|
-
};
|
|
4274
|
-
}
|
|
4275
|
-
|
|
4276
4299
|
// src/act.ts
|
|
4277
4300
|
var DEFAULT_MAX_SUBSCRIBED_STREAMS = 1e3;
|
|
4278
4301
|
var DEFAULT_SETTLE_DEBOUNCE_MS = 10;
|
|
@@ -4429,8 +4452,14 @@ var Act = class {
|
|
|
4429
4452
|
* @param lanes Declared drain lanes (ACT-1103). The builder collects
|
|
4430
4453
|
* these from `.withLane(...)` calls. Slice 1 records them on the
|
|
4431
4454
|
* instance; later slices fan out one `DrainController` per lane.
|
|
4455
|
+
* @param patch_fn The per-event patch step selected once by the builder
|
|
4456
|
+
* from `ActOptions.validateFoldedState` (ACT-1238) — `bare_patch` by
|
|
4457
|
+
* default, `validating_patch` when the flag is on. The builder uses
|
|
4458
|
+
* the same value for its projection-fold handlers, so there is a
|
|
4459
|
+
* single selection site. Defaults to `bare_patch` for direct
|
|
4460
|
+
* construction.
|
|
4432
4461
|
*/
|
|
4433
|
-
constructor(registry, states = /* @__PURE__ */ new Map(), batch_handlers = /* @__PURE__ */ new Map(), options = {}, lanes = []) {
|
|
4462
|
+
constructor(registry, states = /* @__PURE__ */ new Map(), batch_handlers = /* @__PURE__ */ new Map(), options = {}, lanes = [], patch_fn = bare_patch) {
|
|
4434
4463
|
this.registry = registry;
|
|
4435
4464
|
this._states = states;
|
|
4436
4465
|
this._batch_handlers = batch_handlers;
|
|
@@ -4438,7 +4467,7 @@ var Act = class {
|
|
|
4438
4467
|
validate_only_lanes(options, lanes);
|
|
4439
4468
|
this._scoped = options.scoped ? (fn) => scoped.run(options.scoped, fn) : (fn) => fn();
|
|
4440
4469
|
this._correlator = options.correlator ?? default_correlator;
|
|
4441
|
-
this._es = build_es(this._logger, this._correlator);
|
|
4470
|
+
this._es = build_es(this._logger, this._correlator, patch_fn);
|
|
4442
4471
|
this._cd = build_drain(this._logger);
|
|
4443
4472
|
this._handle = build_handle({
|
|
4444
4473
|
logger: this._logger,
|
|
@@ -5679,6 +5708,7 @@ function act() {
|
|
|
5679
5708
|
},
|
|
5680
5709
|
on: (event) => reaction_on(event, registry.events, builder),
|
|
5681
5710
|
build: (options) => {
|
|
5711
|
+
const patch_fn = options?.validateFoldedState === true ? validating_patch : bare_patch;
|
|
5682
5712
|
if (!_built) {
|
|
5683
5713
|
for (const proj of pending_projections) {
|
|
5684
5714
|
merge_projection(proj, registry.events);
|
|
@@ -5701,7 +5731,7 @@ function act() {
|
|
|
5701
5731
|
);
|
|
5702
5732
|
batch_handlers.set(
|
|
5703
5733
|
proj.target,
|
|
5704
|
-
make_fold_handler(merged, fold.flush, fold.config)
|
|
5734
|
+
make_fold_handler(merged, fold.flush, fold.config, patch_fn)
|
|
5705
5735
|
);
|
|
5706
5736
|
}
|
|
5707
5737
|
finalize_deprecations();
|
|
@@ -5774,7 +5804,8 @@ function act() {
|
|
|
5774
5804
|
states,
|
|
5775
5805
|
batch_handlers,
|
|
5776
5806
|
options,
|
|
5777
|
-
lanes
|
|
5807
|
+
lanes,
|
|
5808
|
+
patch_fn
|
|
5778
5809
|
);
|
|
5779
5810
|
},
|
|
5780
5811
|
events: registry.events
|