@rotorsoft/act 1.10.1 → 1.11.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 +71 -9
- package/dist/@types/act.d.ts.map +1 -1
- package/dist/@types/builders/act-builder.d.ts.map +1 -1
- package/dist/@types/builders/slice-builder.d.ts +1 -1
- package/dist/@types/builders/state-builder.d.ts +88 -1
- package/dist/@types/builders/state-builder.d.ts.map +1 -1
- package/dist/@types/internal/autoclose-config.d.ts +72 -0
- package/dist/@types/internal/autoclose-config.d.ts.map +1 -0
- package/dist/@types/internal/autoclose-cycle.d.ts +171 -0
- package/dist/@types/internal/autoclose-cycle.d.ts.map +1 -0
- package/dist/@types/internal/event-sourcing.d.ts +7 -7
- package/dist/@types/internal/event-sourcing.d.ts.map +1 -1
- package/dist/@types/internal/index.d.ts +3 -1
- package/dist/@types/internal/index.d.ts.map +1 -1
- package/dist/@types/internal/reactions.d.ts.map +1 -1
- package/dist/@types/internal/sensitive.d.ts +6 -23
- package/dist/@types/internal/sensitive.d.ts.map +1 -1
- package/dist/@types/internal/tracing.d.ts.map +1 -1
- package/dist/@types/types/action.d.ts +141 -16
- package/dist/@types/types/action.d.ts.map +1 -1
- package/dist/@types/types/registry.d.ts +35 -3
- package/dist/@types/types/registry.d.ts.map +1 -1
- package/dist/{chunk-3Z2HU726.js → chunk-5PWLGL5E.js} +2 -2
- package/dist/{chunk-BY5JPOZR.js → chunk-NGVWJXEF.js} +9 -24
- package/dist/{chunk-BY5JPOZR.js.map → chunk-NGVWJXEF.js.map} +1 -1
- package/dist/index.cjs +411 -195
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +399 -174
- package/dist/index.js.map +1 -1
- package/dist/test/index.cjs +2 -2
- package/dist/test/index.cjs.map +1 -1
- package/dist/test/index.js +4 -4
- package/dist/test/index.js.map +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.js +1 -1
- package/package.json +2 -2
- /package/dist/{chunk-3Z2HU726.js.map → chunk-5PWLGL5E.js.map} +0 -0
package/dist/@types/act.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Scoped } from "./ports.js";
|
|
2
|
-
import type { Actor, AsOf, AuditCategory, AuditFinding, AuditOptions, BatchHandler, BlockedLease, CloseResult, CloseTarget, Committed, Correlator, Drain, DrainOptions, EventSink, EventSource, IAct, LaneConfig, Lease, Query, Registry, ScanOptions, ScanResult, Schema, SchemaRegister, Schemas, SettleOptions, Snapshot, State, StoreNotification, StreamFilter, StreamPosition, Target } from "./types/index.js";
|
|
2
|
+
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";
|
|
3
3
|
/**
|
|
4
4
|
* @category Orchestrator
|
|
5
5
|
* @see Store
|
|
@@ -39,6 +39,7 @@ export declare const DEFAULT_MAX_SUBSCRIBED_STREAMS = 1000;
|
|
|
39
39
|
* latency on the `"settled"` signal.
|
|
40
40
|
*/
|
|
41
41
|
export declare const DEFAULT_SETTLE_DEBOUNCE_MS = 10;
|
|
42
|
+
export { type AutocloseConfig, DEFAULT_AUTOCLOSE_CYCLE_MS, DEFAULT_CLOSE_BATCH_SIZE, DEFAULT_CLOSE_YIELD_MS, resolveAutocloseConfig, } from "./internal/index.js";
|
|
42
43
|
/**
|
|
43
44
|
* Lifecycle events emitted by {@link Act}, mapped to their payload type.
|
|
44
45
|
* Drives the typing of `emit` / `on` / `off` — the event-name argument
|
|
@@ -134,6 +135,48 @@ export type ActOptions<TLanes extends string = string> = {
|
|
|
134
135
|
* lifecycle event so observability sidecars work).
|
|
135
136
|
*/
|
|
136
137
|
readonly drain?: boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Online close cycle cadence in ms (#837 / epic #802). The
|
|
140
|
+
* app-level autoclose controller ticks at this interval, iterates
|
|
141
|
+
* states with `.autocloses(...)` declared, and schedules
|
|
142
|
+
* truncate-and-seed for streams whose predicate returned `true`.
|
|
143
|
+
*
|
|
144
|
+
* Default {@link DEFAULT_AUTOCLOSE_CYCLE_MS} (60 s). Validated
|
|
145
|
+
* `[10_000, 3_600_000]` at `act().build()`; out-of-range throws.
|
|
146
|
+
*
|
|
147
|
+
* Zero-cost when no state declares `.autocloses(...)` — the
|
|
148
|
+
* controller is never constructed in that case.
|
|
149
|
+
*/
|
|
150
|
+
readonly autocloseCycleMs?: number;
|
|
151
|
+
/**
|
|
152
|
+
* Max number of streams the autoclose cycle considers per tick per
|
|
153
|
+
* state (#837). Bounds memory + truncate fan-out so a misconfigured
|
|
154
|
+
* predicate that matches "everything" can't take down the writer.
|
|
155
|
+
*
|
|
156
|
+
* Default {@link DEFAULT_CLOSE_BATCH_SIZE} (64). Validated
|
|
157
|
+
* `[1, 1024]`. Above 1024, the builder throws — operators with
|
|
158
|
+
* genuine high-throughput needs opt out by passing a custom
|
|
159
|
+
* predicate that pre-filters.
|
|
160
|
+
*/
|
|
161
|
+
readonly closeBatchSize?: number;
|
|
162
|
+
/**
|
|
163
|
+
* Microsecond yield delay between successive `Store.truncate`
|
|
164
|
+
* calls within one cycle tick (#837). Defaults to `0` (microtask
|
|
165
|
+
* yield only). SQLite operators set a positive value to let the
|
|
166
|
+
* writer lock release between rows; PG / InMemory adapters
|
|
167
|
+
* generally don't need it because they don't serialize writers
|
|
168
|
+
* globally.
|
|
169
|
+
*
|
|
170
|
+
* Validated `[0, 1000]`.
|
|
171
|
+
*/
|
|
172
|
+
readonly closeYieldMs?: number;
|
|
173
|
+
/**
|
|
174
|
+
* Whether predicate exceptions should mark the stream as closed
|
|
175
|
+
* (#837). Default `false` — a thrown predicate is logged and the
|
|
176
|
+
* stream is skipped that cycle. Set `true` to close on error
|
|
177
|
+
* (defensive policy for "if I can't evaluate, assume terminal").
|
|
178
|
+
*/
|
|
179
|
+
readonly closeOnError?: boolean;
|
|
137
180
|
};
|
|
138
181
|
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> {
|
|
139
182
|
private _emitter;
|
|
@@ -164,9 +207,25 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
164
207
|
*/
|
|
165
208
|
private readonly _notify_disposer;
|
|
166
209
|
/** Public registry — kept as-is per the no-prefix-on-public convention. */
|
|
167
|
-
readonly registry: Registry<TSchemaReg, TEvents, TActions>;
|
|
210
|
+
readonly registry: Registry<TSchemaReg, TEvents, TActions, keyof TStateMap & string>;
|
|
168
211
|
/** Map of state name → state definition; populated by the builder. */
|
|
169
212
|
private readonly _states;
|
|
213
|
+
/**
|
|
214
|
+
* Resolved autoclose configuration (#837 / epic #802). Frozen at
|
|
215
|
+
* `act().build()` via {@link resolveAutocloseConfig}.
|
|
216
|
+
*
|
|
217
|
+
* @internal
|
|
218
|
+
*/
|
|
219
|
+
private readonly _autoclose_config;
|
|
220
|
+
/**
|
|
221
|
+
* App-level autoclose controller. `undefined` when no state declares
|
|
222
|
+
* `.autocloses(...)` — the controller is never constructed, so
|
|
223
|
+
* `start_correlations()` / `stop_correlations()` skip the autoclose
|
|
224
|
+
* lifecycle and the orchestrator pays zero per-tick cost.
|
|
225
|
+
*
|
|
226
|
+
* @internal
|
|
227
|
+
*/
|
|
228
|
+
private readonly _autoclose;
|
|
170
229
|
/**
|
|
171
230
|
* Emit a lifecycle event. The payload type is inferred from the event name
|
|
172
231
|
* via {@link ActLifecycleEvents}.
|
|
@@ -252,7 +311,7 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
252
311
|
* these from `.withLane(...)` calls. Slice 1 records them on the
|
|
253
312
|
* instance; later slices fan out one `DrainController` per lane.
|
|
254
313
|
*/
|
|
255
|
-
constructor(registry: Registry<TSchemaReg, TEvents, TActions>, states?: Map<string, State<any, any, any>>, batch_handlers?: Map<string, BatchHandler<any>>, options?: ActOptions, lanes?: ReadonlyArray<LaneConfig>);
|
|
314
|
+
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>);
|
|
256
315
|
/** True after the first `shutdown()` call. Guards idempotency. */
|
|
257
316
|
private _shutdown_promise;
|
|
258
317
|
/**
|
|
@@ -288,8 +347,9 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
288
347
|
* @param action - The name of the action to execute
|
|
289
348
|
* @param target - Target specification with stream ID and actor context
|
|
290
349
|
* @param payload - Action payload matching the action's schema
|
|
291
|
-
* @param
|
|
292
|
-
*
|
|
350
|
+
* @param options - Per-call dispatch options ({@link DoOptions}) —
|
|
351
|
+
* `reactingTo` to thread correlation, `correlator` to override the
|
|
352
|
+
* framework or orchestrator-level correlator for this call only.
|
|
293
353
|
* @returns Array of snapshots for all affected states (usually one)
|
|
294
354
|
*
|
|
295
355
|
* @throws {ValidationError} If payload doesn't match action schema
|
|
@@ -344,7 +404,7 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
344
404
|
* { amount: event.data.items.length }
|
|
345
405
|
* );
|
|
346
406
|
* // To use a different correlation, pass reactingTo explicitly:
|
|
347
|
-
* // await app.do("reduceStock", target, payload, customEvent);
|
|
407
|
+
* // await app.do("reduceStock", target, payload, { reactingTo: customEvent });
|
|
348
408
|
* })
|
|
349
409
|
* .to("inventory-1")
|
|
350
410
|
* .build();
|
|
@@ -354,7 +414,7 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
354
414
|
* @see {@link Snapshot} for return value structure
|
|
355
415
|
* @see {@link ValidationError}, {@link InvariantError}, {@link ConcurrencyError}
|
|
356
416
|
*/
|
|
357
|
-
do<TKey extends keyof TActions>(action: TKey, target: Target<TActor>, payload: Readonly<TActions[TKey]>,
|
|
417
|
+
do<TKey extends keyof TActions>(action: TKey, target: Target<TActor>, payload: Readonly<TActions[TKey]>, options?: DoOptions<TEvents>): Promise<Snapshot<TSchemaReg[TKey], TEvents>[]>;
|
|
358
418
|
/**
|
|
359
419
|
* Loads the current state snapshot for a specific stream.
|
|
360
420
|
*
|
|
@@ -396,8 +456,10 @@ export declare class Act<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
396
456
|
*
|
|
397
457
|
* @see {@link Snapshot} for snapshot structure
|
|
398
458
|
*/
|
|
399
|
-
load<TNewState extends Schema, TNewEvents extends Schemas, TNewActions extends Schemas>(state: State<TNewState, TNewEvents, TNewActions>, stream: string, callback?: (snapshot: Snapshot<TNewState, TNewEvents>) => void, asOf?: AsOf
|
|
400
|
-
load<TKey extends keyof TStateMap & string>(name: TKey, stream: string, callback?: (snapshot: Snapshot<TStateMap[TKey], TEvents>) => void, asOf?: AsOf
|
|
459
|
+
load<TNewState extends Schema, TNewEvents extends Schemas, TNewActions extends Schemas>(state: State<TNewState, TNewEvents, TNewActions>, stream: string, callback?: (snapshot: Snapshot<TNewState, TNewEvents>) => void, asOf?: AsOf): Promise<Snapshot<TNewState, TNewEvents>>;
|
|
460
|
+
load<TKey extends keyof TStateMap & string>(name: TKey, stream: string, callback?: (snapshot: Snapshot<TStateMap[TKey], TEvents>) => void, asOf?: AsOf): Promise<Snapshot<TStateMap[TKey], TEvents>>;
|
|
461
|
+
load<TNewState extends Schema, TNewEvents extends Schemas, TNewActions extends Schemas>(state: State<TNewState, TNewEvents, TNewActions>, target: LoadTarget<TActor>, callback?: (snapshot: Snapshot<TNewState, TNewEvents>) => void): Promise<Snapshot<TNewState, TNewEvents>>;
|
|
462
|
+
load<TKey extends keyof TStateMap & string>(name: TKey, target: LoadTarget<TActor>, callback?: (snapshot: Snapshot<TStateMap[TKey], TEvents>) => void): Promise<Snapshot<TStateMap[TKey], TEvents>>;
|
|
401
463
|
/**
|
|
402
464
|
* Queries the event store for events matching a filter.
|
|
403
465
|
*
|
package/dist/@types/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"
|
|
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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"}
|
|
@@ -112,7 +112,7 @@ export type SliceBuilder<TSchemaReg extends SchemaRegister<TActions>, TEvents ex
|
|
|
112
112
|
* .withState(TicketCreation)
|
|
113
113
|
* .withState(TicketOperations) // handler can dispatch AssignTicket
|
|
114
114
|
* .on("TicketOpened").do(async (event, _stream, app) => {
|
|
115
|
-
* await app.do("AssignTicket", target, payload, event);
|
|
115
|
+
* await app.do("AssignTicket", target, payload, { reactingTo: event });
|
|
116
116
|
* })
|
|
117
117
|
* .build();
|
|
118
118
|
* ```
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Fluent interface for defining a strongly-typed state machine using Zod schemas.
|
|
6
6
|
*/
|
|
7
7
|
import type { ZodType } from "zod";
|
|
8
|
-
import type { ActionHandler, ActionOptions, Actor, Committed, Invariant, PatchHandlers, Schema, Schemas, Snapshot, State, ZodTypes } from "../types/index.js";
|
|
8
|
+
import type { ActionHandler, ActionOptions, Actor, AutocloseArchiver, AutoclosePredicate, Committed, Invariant, PatchHandlers, Schema, Schemas, Snapshot, State, ZodTypes } from "../types/index.js";
|
|
9
9
|
/**
|
|
10
10
|
* Builder interface for defining a state with event sourcing.
|
|
11
11
|
*
|
|
@@ -332,6 +332,93 @@ export type ActionBuilder<TState extends Schema, TEvents extends Schemas, TActio
|
|
|
332
332
|
* ```
|
|
333
333
|
*/
|
|
334
334
|
discloses: (disclose: (event: Committed<TEvents, keyof TEvents & string>, actor: Actor) => boolean) => ActionBuilder<TState, TEvents, TActions, TName>;
|
|
335
|
+
/**
|
|
336
|
+
* Declares the online close predicate for this state. The
|
|
337
|
+
* orchestrator's autoclose cycle iterates the state's streams once
|
|
338
|
+
* per tick and calls the predicate per candidate; truthy results are
|
|
339
|
+
* scheduled for atomic truncate-and-seed via `Store.truncate` on the
|
|
340
|
+
* next batch.
|
|
341
|
+
*
|
|
342
|
+
* One predicate per state. A second `.autocloses(...)` call replaces
|
|
343
|
+
* the first (same shape as `.snap` / `.discloses` — state-level, not
|
|
344
|
+
* per-event). Absent → the state opts out of online close entirely;
|
|
345
|
+
* the cycle skips it and pays zero per-tick cost for it.
|
|
346
|
+
*
|
|
347
|
+
* The predicate receives `head: Committed<TEvents, ...>` so reading
|
|
348
|
+
* `head.event.name` autocompletes to the state's declared event
|
|
349
|
+
* union — exactly the signature the policy factories from sub
|
|
350
|
+
* #839 (terminal-event), #838 (retention), and #840 (cardinality)
|
|
351
|
+
* produce.
|
|
352
|
+
*
|
|
353
|
+
* Custom policies that don't fit the three factories drop in as
|
|
354
|
+
* inline predicates — the factories return the same shape, so
|
|
355
|
+
* mixing is friction-free.
|
|
356
|
+
*
|
|
357
|
+
* @param predicate `(stream, head, count) => boolean`. `true`
|
|
358
|
+
* schedules the stream for the next truncate batch.
|
|
359
|
+
* @returns The ActionBuilder for chaining.
|
|
360
|
+
*
|
|
361
|
+
* @example Terminal-event close (a Ticket closes when it's resolved).
|
|
362
|
+
* ```typescript
|
|
363
|
+
* state({ Ticket: ticketSchema })
|
|
364
|
+
* .init(() => defaults)
|
|
365
|
+
* .emits({ TicketOpened, TicketResolved })
|
|
366
|
+
* // ...
|
|
367
|
+
* .autocloses((_stream, head) => head.name === "TicketResolved")
|
|
368
|
+
* ```
|
|
369
|
+
*
|
|
370
|
+
* @example Retention-window close (a Session closes when it's older
|
|
371
|
+
* than 24h).
|
|
372
|
+
* ```typescript
|
|
373
|
+
* .autocloses((_stream, head) =>
|
|
374
|
+
* Date.now() - head.created.getTime() > 24 * 60 * 60 * 1000)
|
|
375
|
+
* ```
|
|
376
|
+
*
|
|
377
|
+
* @example Cardinality-bound close (an audit log rotates after 10k
|
|
378
|
+
* events).
|
|
379
|
+
* ```typescript
|
|
380
|
+
* .autocloses((_stream, _head, count) => count >= 10_000)
|
|
381
|
+
* ```
|
|
382
|
+
*/
|
|
383
|
+
autocloses: (predicate: AutoclosePredicate<TEvents>) => ActionBuilder<TState, TEvents, TActions, TName>;
|
|
384
|
+
/**
|
|
385
|
+
* Declares the archiver the online close cycle runs **before**
|
|
386
|
+
* truncating a stream this state's `.autocloses(...)` predicate
|
|
387
|
+
* accepted. Hosts use it to write events to durable storage (S3,
|
|
388
|
+
* an analytics warehouse, cold tier) before the tombstone lands,
|
|
389
|
+
* so the truncate doesn't lose history that the operator still
|
|
390
|
+
* needs.
|
|
391
|
+
*
|
|
392
|
+
* Threads into `CloseTarget.archive` via the same plumbing
|
|
393
|
+
* `app.close({ stream, archive })` already uses — the cycle holds
|
|
394
|
+
* the stream's guard while the archiver runs, and a thrown
|
|
395
|
+
* archiver leaves the stream guarded but un-truncated. No partial
|
|
396
|
+
* truncate state, no data loss; the cycle retries the candidate
|
|
397
|
+
* on the next tick.
|
|
398
|
+
*
|
|
399
|
+
* One archiver per state. A second `.archives(...)` call replaces
|
|
400
|
+
* the first (same shape as `.snap` / `.discloses` /
|
|
401
|
+
* `.autocloses`). Absent → the cycle truncates without an archive
|
|
402
|
+
* step.
|
|
403
|
+
*
|
|
404
|
+
* @param archive `(stream, head) => Promise<void>`. Runs while
|
|
405
|
+
* the stream is locked against new writes; the truncate runs
|
|
406
|
+
* immediately after a successful resolve.
|
|
407
|
+
* @returns The ActionBuilder for chaining.
|
|
408
|
+
*
|
|
409
|
+
* @example Archive to S3 before truncate.
|
|
410
|
+
* ```typescript
|
|
411
|
+
* state({ Ticket: ticketSchema })
|
|
412
|
+
* .emits({ TicketOpened, TicketResolved })
|
|
413
|
+
* // ...
|
|
414
|
+
* .autocloses((_stream, head) => head.name === "TicketResolved")
|
|
415
|
+
* .archives(async (stream) => {
|
|
416
|
+
* const events = await loadEvents(stream);
|
|
417
|
+
* await s3.upload(`tickets/${stream}.jsonl`, events);
|
|
418
|
+
* })
|
|
419
|
+
* ```
|
|
420
|
+
*/
|
|
421
|
+
archives: (archive: AutocloseArchiver<TEvents>) => ActionBuilder<TState, TEvents, TActions, TName>;
|
|
335
422
|
/**
|
|
336
423
|
* Finalizes and builds the state definition.
|
|
337
424
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/state-builder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/state-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EAET,SAAS,EAET,aAAa,EACb,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,CACtB,MAAM,SAAS,MAAM,EACrB,KAAK,SAAS,MAAM,GAAG,MAAM,IAC3B;IACF;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK;QACtC;;;;;;;;;;;;;;;;;;WAkBG;QACH,KAAK,EAAE,CAAC,OAAO,SAAS,OAAO,EAC7B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAEtB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG;YAC/C;;;;;;;;;;;;;;;;;;;eAmBG;YACH,KAAK,EAAE,CACL,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAE3C,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SAChD,CAAC;KACH,CAAC;CACH,CAAC;AAEF,0EAA0E;AAC1E,KAAK,UAAU,CACb,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,IAC5B;KACD,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAC7B,CAAC;AAEF,4EAA4E;AAC5E,KAAK,WAAW,CACd,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,WAAW,SAAS,MAAM,GAAG,MAAM,IACjC;KACD,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,CACvB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,KAAK,SAAS,MAAM,GAAG,MAAM,IAC3B;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2DG;IACH,EAAE,EAAE,CAAC,IAAI,SAAS,MAAM,EAAE,WAAW,SAAS,MAAM,EAClD,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,EACrC,OAAO,CAAC,EAAE,aAAa,KACpB;QACH;;;;;;;;;;;;;;;;;WAiBG;QACH,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK;YACrC;;;;;;;;;;;;;;;;;;;;;;;;;eAyBG;YACH,IAAI,EAAE;gBACJ;2EAC2D;gBAC3D,CACE,OAAO,EAAE,aAAa,CACpB,MAAM,EACN,OAAO,EACP;qBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;iBAAE,EAC5B,IAAI,CACL,GACA,aAAa,CACd,MAAM,EACN,OAAO,EACP,QAAQ,GAAG;qBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;iBAAE,EACvC,KAAK,CACN,CAAC;gBACF;gFACgE;gBAChE,CACE,UAAU,EAAE,MAAM,OAAO,GAAG,MAAM,GACjC,aAAa,CACd,MAAM,EACN,OAAO,EACP,QAAQ,GAAG;qBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;iBAAE,EACvC,KAAK,CACN,CAAC;aACH,CAAC;SACH,CAAC;QACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAgCG;QACH,IAAI,EAAE;YACJ,CACE,OAAO,EAAE,aAAa,CACpB,MAAM,EACN,OAAO,EACP;iBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;aAAE,EAC5B,IAAI,CACL,GACA,aAAa,CACd,MAAM,EACN,OAAO,EACP,QAAQ,GAAG;iBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;aAAE,EACvC,KAAK,CACN,CAAC;YACF,CACE,UAAU,EAAE,MAAM,OAAO,GAAG,MAAM,GACjC,aAAa,CACd,MAAM,EACN,OAAO,EACP,QAAQ,GAAG;iBAAG,CAAC,IAAI,IAAI,GAAG,WAAW;aAAE,EACvC,KAAK,CACN,CAAC;SACH,CAAC;KACH,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,IAAI,EAAE,CACJ,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,KACnD,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,SAAS,EAAE,CACT,QAAQ,EAAE,CACR,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,GAAG,MAAM,CAAC,EACjD,KAAK,EAAE,KAAK,KACT,OAAO,KACT,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+CG;IACH,UAAU,EAAE,CACV,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,KACnC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,QAAQ,EAAE,CACR,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAChC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHG;AACH,wBAAgB,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,MAAM,SAAS,MAAM,EAC/D,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,GAC/B,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAmD7B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module autoclose-config
|
|
3
|
+
* @category Internal
|
|
4
|
+
*
|
|
5
|
+
* Defaults, Zod schema, and resolver for the autoclose knobs on
|
|
6
|
+
* {@link ActOptions} (#837 / epic #802). Split out of `act.ts` so the
|
|
7
|
+
* orchestrator file stays focused on the `Act` class and the
|
|
8
|
+
* autoclose surface lives with the cycle + controller that consume
|
|
9
|
+
* it. The validation pattern matches the rest of the framework —
|
|
10
|
+
* Zod schema with `.min().max().default(...)` per field — so the
|
|
11
|
+
* upcoming policy-factory subs (#838 retention, #839 terminal,
|
|
12
|
+
* #840 cardinality) can `.extend(...)` it for their own
|
|
13
|
+
* per-policy options without reinventing range checks.
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import type { ActOptions } from "../act.js";
|
|
19
|
+
/**
|
|
20
|
+
* Default {@link ActOptions.autocloseCycleMs}: 60 s. Sized for typical
|
|
21
|
+
* business-app close cadences (close-when-resolved on tickets,
|
|
22
|
+
* close-when-stale on sessions) where same-second response is not the
|
|
23
|
+
* goal. Operators with tighter requirements override; the floor is
|
|
24
|
+
* 10 s (any tighter is the wrong primitive).
|
|
25
|
+
*/
|
|
26
|
+
export declare const DEFAULT_AUTOCLOSE_CYCLE_MS = 60000;
|
|
27
|
+
/**
|
|
28
|
+
* Default {@link ActOptions.closeBatchSize}: 64. Bounds the
|
|
29
|
+
* `Store.query_streams` page size + the truncate fan-out per cycle
|
|
30
|
+
* tick so a "close everything" misconfiguration can't take down the
|
|
31
|
+
* writer.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEFAULT_CLOSE_BATCH_SIZE = 64;
|
|
34
|
+
/**
|
|
35
|
+
* Default {@link ActOptions.closeYieldMs}: 0. The cycle yields a
|
|
36
|
+
* microtask between truncates by default; SQLite operators set a
|
|
37
|
+
* positive value to release the writer lock.
|
|
38
|
+
*/
|
|
39
|
+
export declare const DEFAULT_CLOSE_YIELD_MS = 0;
|
|
40
|
+
/**
|
|
41
|
+
* Zod schema for the autoclose knobs on {@link ActOptions}. Same
|
|
42
|
+
* declarative-validation pattern the framework uses elsewhere
|
|
43
|
+
* (`libs/act/src/config.ts`, every event/action schema, every
|
|
44
|
+
* reaction-option shape). Defaults, ranges, and integer constraints
|
|
45
|
+
* live in one place — no parallel `DEFAULT_*` + `*_MIN` / `*_MAX`
|
|
46
|
+
* declarations to keep in sync. Out-of-range values throw `ZodError`
|
|
47
|
+
* at `act().build()` so misconfiguration surfaces at startup, not
|
|
48
|
+
* on the first cycle tick.
|
|
49
|
+
*
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
52
|
+
declare const AutocloseOptionsSchema: z.ZodObject<{
|
|
53
|
+
autocloseCycleMs: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
closeBatchSize: z.ZodDefault<z.ZodNumber>;
|
|
55
|
+
closeYieldMs: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
closeOnError: z.ZodDefault<z.ZodBoolean>;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
/**
|
|
59
|
+
* Resolved autoclose configuration after validation and default
|
|
60
|
+
* expansion. Reachable through the public root (`@rotorsoft/act`) so
|
|
61
|
+
* fields follow the public-camelCase convention and mirror the
|
|
62
|
+
* `ActOptions` knob names directly — no per-resolver renaming layer.
|
|
63
|
+
*/
|
|
64
|
+
export type AutocloseConfig = z.infer<typeof AutocloseOptionsSchema>;
|
|
65
|
+
/**
|
|
66
|
+
* Validate and apply defaults for the autoclose knobs on
|
|
67
|
+
* {@link ActOptions}. Called from `act().build()`. Out-of-range
|
|
68
|
+
* values throw `ZodError` at startup, not on the first cycle tick.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveAutocloseConfig(options: ActOptions | undefined): AutocloseConfig;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=autoclose-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoclose-config.d.ts","sourceRoot":"","sources":["../../../src/internal/autoclose-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,sBAAsB;;;;;iBAc1B,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAErE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,UAAU,GAAG,SAAS,GAC9B,eAAe,CAOjB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module autoclose-cycle
|
|
3
|
+
* @category Internal
|
|
4
|
+
*
|
|
5
|
+
* The online close-the-books cycle (#837 / epic #802). Paginates the
|
|
6
|
+
* store's streams, applies each state's `.autocloses(predicate)` to
|
|
7
|
+
* the matching candidates, then hands the eligible streams to the
|
|
8
|
+
* existing {@link run_close_cycle} so the tombstone-guard +
|
|
9
|
+
* archive-while-guarded + atomic-truncate invariants carry over from
|
|
10
|
+
* the explicit `app.close(targets)` path.
|
|
11
|
+
*
|
|
12
|
+
* Pure orchestration. The caller (the app-level controller in slice
|
|
13
|
+
* 3) owns the cadence (`setInterval(...)`), the lifecycle events
|
|
14
|
+
* (`emit("closed", ...)`), and the per-tick correlation id.
|
|
15
|
+
*
|
|
16
|
+
* Zero-cost when no state declares `.autocloses(...)` — the caller
|
|
17
|
+
* never invokes this function in that case (the controller isn't
|
|
18
|
+
* constructed).
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
import type { AutocloseConfig } from "../act.js";
|
|
23
|
+
import type { Actor, CloseResult, Correlator, Logger, State } from "../types/index.js";
|
|
24
|
+
import type { EsOps } from "./event-sourcing.js";
|
|
25
|
+
/**
|
|
26
|
+
* Dependencies the autoclose cycle needs. Decoupled from `Act` so
|
|
27
|
+
* the cycle can be exercised from tests in isolation against an
|
|
28
|
+
* `InMemoryStore` without spinning a full Act.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export type AutocloseCycleDeps = {
|
|
33
|
+
/**
|
|
34
|
+
* Lookup of `.autocloses(predicate)` per state name. The cycle
|
|
35
|
+
* skips streams whose owning state returns `null` here, so opt-out
|
|
36
|
+
* states pay zero per-stream cost beyond the `event_to_state`
|
|
37
|
+
* lookup.
|
|
38
|
+
*/
|
|
39
|
+
readonly autoclose_policy: (state_name: string) => ((stream: string, head: any, count: number) => boolean) | null;
|
|
40
|
+
/**
|
|
41
|
+
* Lookup of `.archives(fn)` per state name. When present, the
|
|
42
|
+
* cycle threads it into the corresponding {@link CloseTarget.archive}
|
|
43
|
+
* so the existing close-cycle's archive-while-guarded invariant
|
|
44
|
+
* applies — a thrown archiver leaves the stream guarded but
|
|
45
|
+
* un-truncated, and the cycle re-evaluates the candidate next
|
|
46
|
+
* tick.
|
|
47
|
+
*/
|
|
48
|
+
readonly autoclose_archiver: (state_name: string) => ((stream: string, head: any) => Promise<void>) | null;
|
|
49
|
+
/** event-name → owning-state lookup (already computed at build). */
|
|
50
|
+
readonly event_to_state: ReadonlyMap<string, State<any, any, any>>;
|
|
51
|
+
/** Reactive-event count, forwarded to {@link run_close_cycle}. */
|
|
52
|
+
readonly reactive_events_size: number;
|
|
53
|
+
/** `EsOps.load`, forwarded to {@link run_close_cycle}. */
|
|
54
|
+
readonly load: EsOps["load"];
|
|
55
|
+
/** `EsOps.tombstone`, forwarded to {@link run_close_cycle}. */
|
|
56
|
+
readonly tombstone: EsOps["tombstone"];
|
|
57
|
+
readonly logger: Logger;
|
|
58
|
+
readonly config: AutocloseConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Correlation id for this tick. The caller computes it via the
|
|
61
|
+
* configured {@link Correlator}; every truncate the cycle stages
|
|
62
|
+
* shares this id so close-cycle commits land under one correlation
|
|
63
|
+
* key (matching the existing `app.close(targets)` behavior).
|
|
64
|
+
*/
|
|
65
|
+
readonly correlation: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Aggregated result of one autoclose tick. The caller forwards
|
|
69
|
+
* `close_result` to the `closed` lifecycle event; `inspected` /
|
|
70
|
+
* `evaluated` / `predicate_errors` feed observability sidecars.
|
|
71
|
+
*
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
export type AutocloseCycleResult = {
|
|
75
|
+
/** Total streams the cycle paginated through this tick. */
|
|
76
|
+
readonly inspected: number;
|
|
77
|
+
/** Streams whose owning state had a policy and the predicate ran. */
|
|
78
|
+
readonly evaluated: number;
|
|
79
|
+
/** Predicate exceptions caught + classified per `closeOnError`. */
|
|
80
|
+
readonly predicate_errors: number;
|
|
81
|
+
/** Forwarded from {@link run_close_cycle} — truncated + skipped. */
|
|
82
|
+
readonly close_result: CloseResult;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Run one autoclose tick against the configured store. Returns
|
|
86
|
+
* after every stream has been paginated through and every eligible
|
|
87
|
+
* batch handed to {@link run_close_cycle}.
|
|
88
|
+
*
|
|
89
|
+
* The cycle never throws — predicate exceptions are caught and
|
|
90
|
+
* logged (counted in `predicate_errors`; `closeOnError` controls
|
|
91
|
+
* whether they count as "close this stream"). Store errors during
|
|
92
|
+
* pagination propagate to the caller (the controller logs them and
|
|
93
|
+
* skips to the next tick).
|
|
94
|
+
*
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
export declare function run_autoclose_cycle(deps: AutocloseCycleDeps): Promise<AutocloseCycleResult>;
|
|
98
|
+
/**
|
|
99
|
+
* Dependencies the app-level autoclose controller needs. Same shape
|
|
100
|
+
* as {@link AutocloseCycleDeps} minus `correlation` (the controller
|
|
101
|
+
* computes one per tick from the supplied {@link Correlator}) and
|
|
102
|
+
* plus the lifecycle-event sink (`on_closed`) and the actor sentinel
|
|
103
|
+
* for the correlator (`close_actor`).
|
|
104
|
+
*
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
export type AutocloseControllerDeps = Omit<AutocloseCycleDeps, "correlation"> & {
|
|
108
|
+
/**
|
|
109
|
+
* Correlator the controller invokes per tick to stamp the cycle's
|
|
110
|
+
* truncate commits. Reuses the orchestrator's configured
|
|
111
|
+
* correlator so close commits share the app's id scheme — same as
|
|
112
|
+
* the existing `app.close(targets)` path.
|
|
113
|
+
*/
|
|
114
|
+
readonly correlator: Correlator;
|
|
115
|
+
/** Sentinel actor for the close correlation (matches `Act.close`). */
|
|
116
|
+
readonly close_actor: Actor;
|
|
117
|
+
/**
|
|
118
|
+
* Fan-out for the per-tick result. The controller calls this once
|
|
119
|
+
* per tick that closes at least one stream, with the cycle's
|
|
120
|
+
* {@link CloseResult}. The Act orchestrator wires this to
|
|
121
|
+
* `emit("closed", result)`.
|
|
122
|
+
*/
|
|
123
|
+
readonly on_closed: (result: CloseResult) => void;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* App-level autoclose controller. Owns the ticker (`setInterval`),
|
|
127
|
+
* the per-tick reentrancy guard (a slow tick doesn't pile on the
|
|
128
|
+
* next interval), and the lifecycle-event fan-out. Tests invoke
|
|
129
|
+
* {@link run_once} directly; the orchestrator's
|
|
130
|
+
* `start_correlations()` / `stop_correlations()` lifecycle starts +
|
|
131
|
+
* stops the ticker.
|
|
132
|
+
*
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
export declare class AutocloseController {
|
|
136
|
+
readonly deps: AutocloseControllerDeps;
|
|
137
|
+
private _timer;
|
|
138
|
+
/**
|
|
139
|
+
* Reentrancy guard. The interval fires the next tick on cadence
|
|
140
|
+
* regardless of how long the previous one took; this flag drops
|
|
141
|
+
* overlapping ticks so the cycle stays sequential per controller.
|
|
142
|
+
*/
|
|
143
|
+
private _running;
|
|
144
|
+
constructor(deps: AutocloseControllerDeps);
|
|
145
|
+
/**
|
|
146
|
+
* Start the cycle ticker. Returns `false` if already running so
|
|
147
|
+
* accidental double-start doesn't stack timers (matches
|
|
148
|
+
* `_correlate.start_polling` semantics).
|
|
149
|
+
*/
|
|
150
|
+
start(): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Stop the cycle ticker. Idempotent.
|
|
153
|
+
*/
|
|
154
|
+
stop(): void;
|
|
155
|
+
/**
|
|
156
|
+
* Whether the ticker is currently running.
|
|
157
|
+
*/
|
|
158
|
+
get is_running(): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Run one cycle synchronously. The controller's interval callback
|
|
161
|
+
* delegates here; tests can invoke it directly to deterministically
|
|
162
|
+
* exercise the cycle without spinning real timers.
|
|
163
|
+
*
|
|
164
|
+
* Overlapping invocations short-circuit: if a previous tick is
|
|
165
|
+
* still running, this one drops and returns `null`. The orchestrator
|
|
166
|
+
* never sees a queue of pending ticks regardless of how slow the
|
|
167
|
+
* predicate / archive / truncate are.
|
|
168
|
+
*/
|
|
169
|
+
run_once(): Promise<AutocloseCycleResult | null>;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=autoclose-cycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoclose-cycle.d.ts","sourceRoot":"","sources":["../../../src/internal/autoclose-cycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EAEX,UAAU,EACV,MAAM,EACN,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,CACzB,UAAU,EAAE,MAAM,KACf,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IACpE;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,UAAU,EAAE,MAAM,KACf,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3D,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACnE,kEAAkE;IAClE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;CACpC,CAAC;AAgBF;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAkF/B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,kBAAkB,EAClB,aAAa,CACd,GAAG;IACF;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC9B,SAAgB,IAAI,EAAE,uBAAuB,CAAC;IAC9C,OAAO,CAAC,MAAM,CAA6C;IAC3D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,uBAAuB;IAIzC;;;;OAIG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;;;;;OASG;IACG,QAAQ,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CA2BvD"}
|
|
@@ -14,15 +14,14 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
|
-
import type {
|
|
18
|
-
import type { AsOf, Committed, Correlator, EventSource, ScanOptions, ScanResult, Schema, Schemas, Snapshot, State, Target } from "../types/index.js";
|
|
17
|
+
import type { Committed, DoOptions, EventSource, LoadTarget, ScanOptions, ScanResult, Schema, Schemas, Snapshot, State, Target } from "../types/index.js";
|
|
19
18
|
/**
|
|
20
19
|
* Internal action signature seen by the orchestrator — the {@link Correlator}
|
|
21
20
|
* is bound at `build_es` time, so callers don't pass it through.
|
|
22
21
|
*
|
|
23
22
|
* @internal
|
|
24
23
|
*/
|
|
25
|
-
export type BoundAction = <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]>,
|
|
24
|
+
export type BoundAction = <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>) => Promise<Snapshot<TState, TEvents>[]>;
|
|
26
25
|
/** @internal */
|
|
27
26
|
export interface EsOps {
|
|
28
27
|
snap: typeof snap;
|
|
@@ -108,7 +107,7 @@ export declare function scan(source: EventSource, opts?: ScanOptions, callback?:
|
|
|
108
107
|
* @example
|
|
109
108
|
* const snapshot = await load(Counter, "counter1");
|
|
110
109
|
*/
|
|
111
|
-
export declare function load<TState extends Schema, TEvents extends Schemas, TActions extends Schemas>(me: State<TState, TEvents, TActions>,
|
|
110
|
+
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>>;
|
|
112
111
|
/**
|
|
113
112
|
* Executes an action and emits an event to be committed by the store.
|
|
114
113
|
*
|
|
@@ -132,12 +131,13 @@ export declare function load<TState extends Schema, TEvents extends Schemas, TAc
|
|
|
132
131
|
* @param action The action to execute
|
|
133
132
|
* @param target The target (stream, actor, etc.)
|
|
134
133
|
* @param payload The payload of the action
|
|
135
|
-
* @param
|
|
136
|
-
*
|
|
134
|
+
* @param options Per-call dispatch options ({@link DoOptions}) —
|
|
135
|
+
* `reactingTo` to thread correlation, `correlator` to override the
|
|
136
|
+
* framework or orchestrator-level correlator for this call only.
|
|
137
137
|
* @returns The snapshot of the committed event
|
|
138
138
|
*
|
|
139
139
|
* @example
|
|
140
140
|
* const snapshot = await action(Counter, "increment", { stream: "counter1", actor }, { by: 1 });
|
|
141
141
|
*/
|
|
142
|
-
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]>,
|
|
142
|
+
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>): Promise<Snapshot<TState, TEvents>[]>;
|
|
143
143
|
//# sourceMappingURL=event-sourcing.d.ts.map
|