@requence/event-sourcing 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,6 +9,7 @@ Build resilient, auditable systems by storing every state change as an immutable
9
9
  - **Aggregate Roots** — define your domain model with events, business rules, and commands using a fluent builder API.
10
10
  - **Automatic Concurrency Control** — aggregate root streams are automatically locked to prevent simultaneous edits and event stream version collisions.
11
11
  - **Distributed Locking** — use `redisLock` to make the write path safe across multiple instances. Combined with the storage adapter's optimistic-concurrency checks, stream appends are collision-free even when many instances accept commands. See the [multi-instance guide](https://event-sourcing.docs.requence.cloud/reference/01-create-event-store/#running-multiple-instances) for how projections, listeners, and process managers behave when scaling.
12
+ - **Concurrency Retry** — for the residual races a lock can't cover, pass `settled({ maxRetries })` to reload the stream and re-apply the commands on a `ConcurrencyError` instead of surfacing it (opt-in; defaults to no retry).
12
13
  - **Projections** — build query-optimized read models from events, with full replay support.
13
14
  - **Process Managers** — coordinate workflows across multiple aggregates.
14
15
  - **Event Listeners** — react to events with lightweight, stateless side effects.
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n Stream,\n StreamEvents,\n StreamId,\n StreamIdEvents,\n} from './utilityTypes.ts'\n\nexport { createEventStore } from './createEventStore.ts'\nexport type { BaseOutputEvent as Event } from './utilityTypes.d.ts'\nexport {\n type Snapshot as ProjectionSnapshot,\n isInsideProjection,\n getProjectionInfo,\n} from './createProjection.ts'\nexport type { Checkpoint } from './createCheckpointApi.ts'\nexport {\n isInsideProcessManager,\n getProcessManagerInfo,\n} from './createProcessManager.ts'\nexport {\n isInsideEventListener,\n getEventListenerInfo,\n} from './createEventListener.ts'\nexport * from './errors.ts'\nexport {\n type Snapshot as AggregateRootSnapshot,\n type AnyAggregateRoot,\n type AnyStream,\n createAggregateRoot,\n} from './createAggregateRoot.ts'\n\nexport { skipRefreshing } from './refresh.ts'\nexport { skipReplay } from './replay.ts'\n\nexport function isStreamId(\n stream: Stream,\n): stream is StreamId | StreamIdEvents {\n return 'id' in stream\n}\nexport function isStreamEvents(\n stream: Stream,\n): stream is StreamEvents | StreamIdEvents {\n return 'events' in stream && Array.isArray(stream.events)\n}\nexport type { WrappedEvent } from './wrappedEventBuilder.ts'\n"
5
+ "import type {\n Stream,\n StreamEvents,\n StreamId,\n StreamIdEvents,\n} from './utilityTypes.ts'\n\nexport { createEventStore } from './createEventStore.ts'\nexport type { BaseOutputEvent as Event } from './utilityTypes.d.ts'\nexport {\n type Snapshot as ProjectionSnapshot,\n isInsideProjection,\n getProjectionInfo,\n} from './createProjection.ts'\nexport type { Checkpoint } from './createCheckpointApi.ts'\nexport {\n isInsideProcessManager,\n getProcessManagerInfo,\n} from './createProcessManager.ts'\nexport {\n isInsideEventListener,\n getEventListenerInfo,\n} from './createEventListener.ts'\nexport * from './errors.ts'\nexport {\n type Snapshot as AggregateRootSnapshot,\n type AnyAggregateRoot,\n type AnyStream,\n type SettledOptions,\n createAggregateRoot,\n} from './createAggregateRoot.ts'\n\nexport { skipRefreshing } from './refresh.ts'\nexport { skipReplay } from './replay.ts'\n\nexport function isStreamId(\n stream: Stream,\n): stream is StreamId | StreamIdEvents {\n return 'id' in stream\n}\nexport function isStreamEvents(\n stream: Stream,\n): stream is StreamEvents | StreamIdEvents {\n return 'events' in stream && Array.isArray(stream.events)\n}\nexport type { WrappedEvent } from './wrappedEventBuilder.ts'\n"
6
6
  ],
7
- "mappings": ";AAkCO,SAAS,UAAU,CACxB,QACqC;AAAA,EACrC,OAAO,QAAQ;AAAA;AAEV,SAAS,cAAc,CAC5B,QACyC;AAAA,EACzC,OAAO,YAAY,UAAU,MAAM,QAAQ,OAAO,MAAM;AAAA;",
7
+ "mappings": ";AAmCO,SAAS,UAAU,CACxB,QACqC;AAAA,EACrC,OAAO,QAAQ;AAAA;AAEV,SAAS,cAAc,CAC5B,QACyC;AAAA,EACzC,OAAO,YAAY,UAAU,MAAM,QAAQ,OAAO,MAAM;AAAA;",
8
8
  "debugId": "EF89CA439C05547264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -24,6 +24,7 @@ import {
24
24
  } from "./chunk-6yrb30rx.js";
25
25
  import {
26
26
  CommandError,
27
+ ConcurrencyError,
27
28
  EventValidationError,
28
29
  InfiniteLoopError,
29
30
  ValidationError
@@ -98,10 +99,11 @@ function createAggregateRoot(type) {
98
99
  }
99
100
  return version;
100
101
  };
101
- const createStream = (state, streamId) => {
102
+ const createStream = (state, streamId, config = {}) => {
102
103
  let version = 0;
103
104
  const snapshotApi = createSnapshotApi?.(state, createSnapshotGenerator(), { z });
104
- const errorHandlers = new Map;
105
+ const errorHandlers = new Map(config.errorHandlerEntries);
106
+ const dispatchedCommands = [];
105
107
  let downstreamSettledPromise = () => Promise.resolve();
106
108
  let releaseLock;
107
109
  let extendLock;
@@ -153,6 +155,7 @@ function createAggregateRoot(type) {
153
155
  if (isRefreshing()) {
154
156
  return api2.commands;
155
157
  }
158
+ dispatchedCommands.push({ name: commandName, args });
156
159
  const commandId = crypto.randomUUID();
157
160
  transactionDelay ??= transaction.delay();
158
161
  commandChainTouched = true;
@@ -268,7 +271,7 @@ function createAggregateRoot(type) {
268
271
  }
269
272
  return state;
270
273
  },
271
- async settled() {
274
+ async settled(options) {
272
275
  const parentProcessManager = getProcessManagerInfo();
273
276
  if (parentProcessManager) {
274
277
  const error = new Error(`aggregateRoot.settled() cannot be called inside a process manager. Attempted on aggregate stream "${type}" within Process Manager ${parentProcessManager.name}.`);
@@ -280,7 +283,25 @@ function createAggregateRoot(type) {
280
283
  commandChain = commandChain.then(() => error);
281
284
  throw error;
282
285
  }
283
- await awaitAll(() => commandChain);
286
+ const maxRetries = options?.maxRetries ?? 0;
287
+ try {
288
+ await awaitAll(() => commandChain);
289
+ } catch (error) {
290
+ if (maxRetries > 0 && error instanceof ConcurrencyError) {
291
+ await releaseLock?.();
292
+ const retryStream = createStream(clone(initialState), streamId, {
293
+ load: true,
294
+ filter: config.filter,
295
+ replayCommands: dispatchedCommands,
296
+ errorHandlerEntries: Array.from(errorHandlers)
297
+ });
298
+ return retryStream.commands.settled({
299
+ ...options,
300
+ maxRetries: maxRetries - 1
301
+ });
302
+ }
303
+ throw error;
304
+ }
284
305
  await downstreamSettledPromise();
285
306
  return api2.commands;
286
307
  },
@@ -293,6 +314,12 @@ function createAggregateRoot(type) {
293
314
  };
294
315
  registerRootPromiseToUpstream(() => api2.commands.settled());
295
316
  transaction.after(() => api2.commands.settled());
317
+ if (config.load) {
318
+ api2.load(config.filter);
319
+ }
320
+ for (const { name, args } of config.replayCommands ?? []) {
321
+ api2.commands[name](...args);
322
+ }
296
323
  return api2;
297
324
  };
298
325
  const api = {
@@ -351,7 +378,9 @@ function createAggregateRoot(type) {
351
378
  if (parentProjectionName) {
352
379
  throw new Error(`aggregateRoot.newStream() cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`);
353
380
  }
354
- return createStream(clone(initialState), id ?? crypto.randomUUID()).commands;
381
+ return createStream(clone(initialState), id ?? crypto.randomUUID(), {
382
+ load: false
383
+ }).commands;
355
384
  },
356
385
  loadStream(id, filter) {
357
386
  if (!loadEvents) {
@@ -361,9 +390,10 @@ function createAggregateRoot(type) {
361
390
  if (parentProjectionName) {
362
391
  throw new Error(`aggregateRoot.loadStream("${id}") cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`);
363
392
  }
364
- const root = createStream(clone(initialState), id);
365
- root.load(filter);
366
- return root.commands;
393
+ return createStream(clone(initialState), id, {
394
+ load: true,
395
+ filter
396
+ }).commands;
367
397
  },
368
398
  linkEventStore(load, append, emit, trans, lock, snap) {
369
399
  loadEvents = load;
@@ -386,4 +416,4 @@ function createAggregateRoot(type) {
386
416
 
387
417
  export { createAggregateRoot };
388
418
 
389
- //# debugId=A787501EC5E8BAB064756E2164756E21
419
+ //# debugId=27B830D34C48B63764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/createAggregateRoot.ts"],
4
+ "sourcesContent": [
5
+ "import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { deepEqual } from 'fast-equals'\nimport { z } from 'zod/v4'\n\nimport type {\n EmitEvents,\n InternalAppendEvents,\n LoadEvents,\n} from './createEventStore.ts'\nimport { getProcessManagerInfo } from './createProcessManager.ts'\nimport { getProjectionInfo } from './createProjection.ts'\nimport {\n CommandError,\n ConcurrencyError,\n EventValidationError,\n InfiniteLoopError,\n ValidationError,\n} from './errors.ts'\nimport type { LockCreator } from './lock.ts'\nimport { isRefreshing } from './refresh.ts'\nimport createSnapshotGenerator, {\n type CompleteSnapshotGenerator,\n type InternalSnapshotGenerator,\n type SnapshotGenerator,\n} from './snapshotGenerator.ts'\nimport { clone } from './superjson.ts'\nimport type { Transaction, TransactionDelay } from './transaction.ts'\nimport type {\n BaseInputEvent,\n BaseOutputEvent,\n EventTemplate,\n Keys,\n MaybePromise,\n Merge,\n OutputEvents,\n Prettify,\n} from './utilityTypes.ts'\nimport { awaitAll, normalizeArray } from './utils.ts'\nimport {\n type WrappedEvent,\n type WrappedEventBuilder,\n handleEventError,\n unwrapEvent,\n wrappedEventBuilder,\n} from './wrappedEventBuilder.ts'\n\ntype UppercaseRecord<T extends Record<string, any>> = {\n [K in keyof T]: K extends Capitalize<K & string>\n ? any\n : `Error: Key '${K & string}' must be Capitalized`\n}\n\ntype BaseEventMap = Record<\n string,\n z.ZodType | (z.ZodType | { schema: z.ZodType; version: number })[]\n>\n\ntype DownstreamRootPromise = () => Promise<unknown>\nconst downstreamRootsPromiseStore = new AsyncLocalStorage<\n DownstreamRootPromise[]\n>()\n\nfunction registerRootPromiseToUpstream(rootPromise: DownstreamRootPromise) {\n downstreamRootsPromiseStore.getStore()?.push(rootPromise)\n}\n\nasync function collectDownstreamRootPromise(handler: () => Promise<void>) {\n const rootPromises: DownstreamRootPromise[] = []\n await downstreamRootsPromiseStore.run(rootPromises, handler)\n return async () => {\n await Promise.all(rootPromises.map((promise) => promise()))\n }\n}\n\ntype BaseInternalEvent<\n Type extends string,\n Version extends number,\n Payload = unknown,\n> = BaseOutputEvent<Type, Version, Payload>\n\ntype InternalEvent<Event extends EventTemplate> = Prettify<\n {\n [K in Event as K['version']]: Omit<\n BaseInternalEvent<K['type'], K['version'], z.output<K['schema']>>,\n 'createdAt' | 'position' | 'streamVersion'\n > & {\n // only set when folding persisted events (stream loading/replay);\n // events yielded by a command fold before they are appended and have\n // no position yet\n position?: number\n }\n }[Event['version']]\n>\n\ntype InternalEventHandlers<Events extends EventTemplate> = {\n [K in Events as `on${K['type']}`]?: (\n event: InternalEvent<K>,\n ) => MaybePromise<void>\n}\n\ntype EventsFromMap<EventMap extends BaseEventMap> = Prettify<\n {\n [K in keyof EventMap]: { type: K & string } & (EventMap[K] extends z.ZodType\n ? { schema: EventMap[K]; version: 0 }\n : EventMap[K] extends { schema: infer S; version: infer V }\n ? S extends z.ZodType\n ? { schema: S; version: V }\n : never\n : EventMap[K] extends Array<infer I>\n ? I extends z.ZodType\n ? { schema: I; version: 0 }\n : I extends { schema: infer S; version: infer V }\n ? { schema: S; version: V }\n : never\n : never)\n }[keyof EventMap]\n>\n\ntype Constructor<T> = new (...args: any[]) => T\n\ntype Command = (\n ...args: any[]\n) =>\n | MaybePromise<void | WrappedEvent | WrappedEvent[]>\n | Iterable<WrappedEvent>\n | AsyncIterable<WrappedEvent>\n\ntype Utils = {\n reset: () => void\n replayUntil: (streamVersion: number) => Promise<void>\n}\n\ntype VersionBuilder = <V extends number, S extends z.ZodType>(\n version: V,\n schema: S,\n) => { schema: S; version: V }\n\n/**\n * Options for {@link Stream.settled}.\n *\n * `maxRetries` — how many times to reload the stream and re-apply the dispatched\n * commands when the append loses the optimistic-concurrency race\n * ({@link ConcurrencyError}). Defaults to `0` (no retry — surface the error, the\n * historical behaviour). Only the append is retried; command handlers must be\n * pure functions of loaded state and their arguments for retries to be safe.\n */\nexport type SettledOptions = {\n maxRetries?: number\n}\n\ntype Stream<Commands extends Record<string, Command>, State> = {\n [A in keyof Commands]: (\n ...args: Parameters<Commands[A]>\n ) => Stream<Commands, State>\n} & {\n settled: (options?: SettledOptions) => Promise<Stream<Commands, State>>\n state: () => Promise<State>\n transformError: <T extends Error>(\n error: Constructor<T>,\n errorHandler: (commandError: CommandError<T>) => Error,\n ) => Stream<Commands, State>\n readonly streamId: string\n}\n\nexport type AnyStream = {\n settled: (options?: SettledOptions) => Promise<AnyStream>\n state: () => Promise<unknown>\n transformError: <T extends Error>(\n error: Constructor<T>,\n errorHandler: (error: CommandError<T>) => Error,\n ) => AnyStream\n}\n\nexport type AnyAggregateRoot = {\n type: string\n loadStream: (\n id: string,\n filter?: (event: BaseOutputEvent) => MaybePromise<boolean>,\n ) => AnyStream\n newStream: () => AnyStream\n $inferState: any\n $inferEvents: any\n $inferEvent: any\n $inferCommandParameters: any\n}\n\ntype EventHandlerOptions = {\n streamId: string\n extendLock: (ms?: number) => Promise<boolean>\n}\n\nexport type AggregateRootApi<\n Name,\n State = never,\n Events extends EventTemplate = never,\n Commands extends Record<string, Command> = Record<string, Command>,\n Flags extends {\n withInitialState: boolean\n withEvents: boolean\n withCommands: boolean\n withEventHandlers: boolean\n withSnapshots: boolean\n } = {\n withInitialState: false\n withEvents: false\n withCommands: true\n withEventHandlers: true\n withSnapshots: false\n },\n> = {\n withInitialState: <NextState extends Record<string, unknown>>(\n state: NextState,\n ) => Omit<\n AggregateRootApi<\n Name,\n NextState,\n Events,\n Commands,\n Merge<Flags, { withInitialState: true; withEventHandlers: false }>\n >,\n Keys<Merge<Flags, { withInitialState: true; withEventHandlers: false }>>\n >\n withCommands: <\n NextCommands extends Record<\n Exclude<string, 'state' | 'settled' | 'transformError' | 'streamId'>,\n Command\n >,\n >(\n handlers: [State] extends [never]\n ? (\n event: WrappedEventBuilder<Events>,\n options: EventHandlerOptions,\n ) => NextCommands\n : (\n state: Readonly<State>,\n event: WrappedEventBuilder<Events>,\n options: EventHandlerOptions,\n ) => NextCommands,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n NextCommands,\n Merge<\n Flags,\n { withInitialState: true; withCommands: true; withEvents: true }\n >\n >,\n Keys<\n Merge<\n Flags,\n { withInitialState: true; withCommands: true; withEvents: true }\n >\n >\n >\n withEvents: {\n <EventMap extends BaseEventMap>(\n handler: EventMap & UppercaseRecord<EventMap>,\n ): Omit<\n AggregateRootApi<\n Name,\n State,\n EventsFromMap<EventMap>,\n Commands,\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >,\n Keys<\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >\n >\n <EventMap extends BaseEventMap>(\n handler: (utils: {\n version: VersionBuilder\n z: typeof z\n }) => EventMap & UppercaseRecord<EventMap>,\n ): Omit<\n AggregateRootApi<\n Name,\n State,\n EventsFromMap<EventMap>,\n Commands,\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >,\n Keys<\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >\n >\n }\n withEventHandlers: (\n handler: (state: State, utils: Utils) => InternalEventHandlers<Events>,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n Commands,\n Merge<\n Flags,\n { withInitialState: true; withEventHandlers: true; withEvents: true }\n >\n >,\n Keys<\n Merge<\n Flags,\n { withInitialState: true; withEventHandlers: true; withEvents: true }\n >\n >\n >\n withSnapshots: (\n handler: (\n state: State,\n generate: SnapshotGenerator<Omit<Snapshot, 'schemaVersion' | 'state'>>,\n utils: { z: typeof z },\n ) => CompleteSnapshotGenerator,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n Commands,\n Merge<Flags, { withSnapshots: true }>\n >,\n Keys<Merge<Flags, { withSnapshots: true }>>\n >\n loadStream: (\n id: string,\n filter?: (event: OutputEvents<Events>) => MaybePromise<boolean>,\n ) => Stream<Commands, State>\n newStream: (id?: string) => Stream<Commands, State>\n\n $inferEvents: OutputEvents<Events>\n $inferEvent: OutputEvents<Events> extends BaseOutputEvent\n ? { [E in OutputEvents<Events> as E['type']]: E }\n : never\n $inferState: State\n $inferCommandParameters: {\n [CommandName in keyof Commands]: Parameters<Commands[CommandName]>\n }\n readonly type: Name\n}\n\nexport type InternalAggregateRootApi = {\n linkEventStore: (\n loadEvents: LoadEvents,\n appendEvents: InternalAppendEvents,\n emitEvents: EmitEvents,\n transaction: Transaction,\n lock: LockCreator,\n snapshots?: AggregateRootSnapshotMethods,\n ) => void\n eventTypes: string[]\n readonly type: string\n}\n\nconst snapshotSchema = z.object({\n streamId: z.string(),\n schemaVersion: z.int(),\n state: z.unknown(),\n createdAt: z.date(),\n streamVersion: z.int(),\n streamType: z.string(),\n lastEventPosition: z.int(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport type Snapshot = z.output<typeof snapshotSchema>\n\nexport type AggregateRootSnapshotMethods = {\n get: (select: {\n stream: string\n id: string\n }) => MaybePromise<Snapshot | null | undefined>\n put: (snapshot: Snapshot) => MaybePromise<void>\n delete: (\n target: {\n stream: string\n id: string\n },\n fromPosition: number,\n ) => MaybePromise<void>\n}\n\nexport function createAggregateRoot<Name extends string>(type: Name) {\n let initialState: any = null\n let createEventHandlers: (\n state: any,\n ) => InternalEventHandlers<any> = () => ({})\n\n let loadEvents!: LoadEvents\n let appendEvents!: InternalAppendEvents\n let emitEvents!: EmitEvents\n let snapshots: AggregateRootSnapshotMethods | undefined\n let createLock!: LockCreator\n let transaction!: Transaction\n\n let createCommands: (\n state: any,\n eventBuilder: (name: string, payload: unknown) => WrappedEvent,\n options: EventHandlerOptions,\n ) => Record<string, Command> = () => ({})\n\n const registeredEvents = new Map<string, Map<number, z.ZodType>>()\n let createSnapshotApi:\n | ((\n state: any,\n generate: SnapshotGenerator<any>,\n utils: { z: typeof z },\n ) => CompleteSnapshotGenerator & InternalSnapshotGenerator)\n | null = null\n\n const loadUntil = async (\n state: any,\n snapshotApi:\n | (CompleteSnapshotGenerator & InternalSnapshotGenerator)\n | undefined,\n id: string,\n untilPosition?: number,\n filter?: (event: BaseOutputEvent) => MaybePromise<boolean>,\n ) => {\n let position = 0\n let version = 0\n if (snapshotApi) {\n const snapshot = await snapshots?.get({\n stream: type,\n id,\n })\n if (snapshot) {\n const result = snapshotSchema.safeParse(snapshot)\n\n if (!result.success) {\n throw new ValidationError(\n 'loaded aggregate root snapshot does not comply with schema',\n result.error,\n )\n }\n\n snapshotApi.internalApply(result.data)\n position = snapshot.lastEventPosition\n version = snapshot.streamVersion\n }\n }\n\n const events = loadEvents(\n { stream: type, id },\n {\n from: position,\n to: untilPosition,\n },\n )\n const eventHandlers = createEventHandlers(state)\n for await (const event of events) {\n version += 1\n if ((await filter?.(event)) === false) {\n continue\n }\n await (eventHandlers as any)[`on${event.type}`]?.(event)\n }\n\n return version\n }\n\n // A command as dispatched by the caller, recorded so it can be re-applied\n // against a freshly-loaded stream when a settle() retries a ConcurrencyError.\n type RecordedCommand = { name: string; args: any[] }\n\n type CreateStreamConfig = {\n // Whether to load the existing stream before commands run. `false` for\n // newStream (expects version 0); `true` for loadStream and every retry.\n load?: boolean\n filter?: (event: BaseOutputEvent) => MaybePromise<boolean>\n // Seeded on a retry so replayed commands re-apply automatically, and\n // transformError handlers registered before settle() carry over.\n replayCommands?: RecordedCommand[]\n errorHandlerEntries?: [\n Constructor<Error>,\n (error: CommandError<Error>) => Error,\n ][]\n }\n\n const createStream = (\n state: any,\n streamId: string,\n config: CreateStreamConfig = {},\n ) => {\n let version = 0\n const snapshotApi = createSnapshotApi?.(\n state,\n createSnapshotGenerator() as any,\n { z },\n )\n const errorHandlers = new Map<\n Constructor<Error>,\n (error: CommandError<Error>) => Error\n >(config.errorHandlerEntries)\n const dispatchedCommands: RecordedCommand[] = []\n let downstreamSettledPromise = () => Promise.resolve()\n let releaseLock!: () => Promise<void>\n let extendLock!: EventHandlerOptions['extendLock']\n\n const warnReleaseLock = () => {\n if (releasedAfterChain) {\n console.warn(`aggregate root for ${type}:${streamId} was open too long`)\n }\n releaseLock()\n }\n\n const processEvents = async (events: BaseInputEvent[]) => {\n if (!appendEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const persistedEvents = await appendEvents(\n { stream: type, id: streamId },\n events,\n version,\n )\n\n warnReleaseLock()\n\n for (const persistedEvent of persistedEvents) {\n const snapshot = await snapshotApi?.internalCapture(\n persistedEvent,\n persistedEvent.streamVersion,\n )\n\n if (snapshot) {\n await snapshots?.put({\n state: snapshot.state,\n lastEventPosition: persistedEvent.position,\n streamId,\n streamVersion: version,\n streamType: type,\n schemaVersion: snapshot.version,\n createdAt: new Date(),\n })\n }\n }\n\n version += events.length\n\n downstreamSettledPromise = await collectDownstreamRootPromise(() =>\n emitEvents(persistedEvents),\n )\n }\n\n let commandChain = createLock([type, streamId]).then((lock) => {\n releaseLock = lock.release\n extendLock = lock.extend\n return [] as Error | BaseInputEvent[]\n })\n let commandChainTouched = false\n let releasedAfterChain = false\n let transactionDelay: TransactionDelay | undefined\n\n const stateReady = Promise.withResolvers<Error | undefined>()\n\n const rawCommands = createCommands(state, wrappedEventBuilder, {\n streamId,\n extendLock,\n })\n\n const commands = Object.fromEntries(\n Object.entries(rawCommands).map(([commandName, commandFn]) => [\n commandName,\n (...args: any[]) => {\n // don't create new events when refreshing the process manager\n if (isRefreshing()) {\n return api.commands\n }\n\n // Record for a potential settle() retry (reload + re-apply).\n dispatchedCommands.push({ name: commandName, args })\n\n const commandId = crypto.randomUUID()\n transactionDelay ??= transaction.delay()\n commandChainTouched = true\n commandChain = commandChain\n .then(async (previousEvents) => {\n if (previousEvents instanceof Error) {\n return previousEvents\n }\n const events = (\n await normalizeArray(\n commandFn.apply(rawCommands, args),\n () => extendLock(),\n )\n ).filter((event) => Boolean(event))\n\n const baseInputEvents = await Promise.all(\n events.map(async (event) => {\n event.withAdditionalMetadata({ commandName })\n event.withDefaultCausationId(commandId)\n\n const unwrappedEvent = unwrapEvent(event)\n\n const eventVersions = registeredEvents.get(\n unwrappedEvent.type,\n )\n if (!eventVersions) {\n throw new Error(\n `cannot append unknown event ${unwrappedEvent.type}`,\n )\n }\n const latestVersion = Math.max(\n ...Array.from(eventVersions.keys()),\n )\n const schema = eventVersions.get(latestVersion)!\n\n const result = schema.safeParse(unwrappedEvent.payload)\n if (!result.success) {\n const error = new EventValidationError(\n `payload does not comply with schema for event ${unwrappedEvent.type}@${latestVersion} at stream ${streamId}`,\n result.error,\n )\n\n await handleEventError(event, error)\n throw error\n }\n\n unwrappedEvent.payload = result.data\n\n return {\n ...unwrappedEvent,\n schemaVersion: latestVersion,\n }\n }),\n )\n\n const eventHandlers = createEventHandlers(state)\n for (const event of baseInputEvents) {\n const processManagerInfo = getProcessManagerInfo()\n if (processManagerInfo) {\n if (\n processManagerInfo.event.streamId === streamId &&\n processManagerInfo.event.streamType === type &&\n processManagerInfo.event.type === event.type &&\n deepEqual(processManagerInfo.event.payload, event.payload)\n ) {\n return new InfiniteLoopError(\n `Infinite loop detected. Process Manager \"${processManagerInfo.name}\" listens and emits same event \"${event.type}\" for stream ${type}:${streamId}, causing a recurring event cycle`,\n )\n }\n }\n\n await eventHandlers[`on${event.type}`]?.({\n ...event,\n streamId,\n streamType: type,\n })\n }\n\n return [...previousEvents, ...baseInputEvents]\n })\n .catch((error) => {\n if (!(error instanceof Error)) {\n throw error\n }\n\n const commandError = new CommandError(\n type,\n commandName,\n streamId,\n error,\n )\n for (const [ErrorType, handler] of errorHandlers) {\n if (error instanceof ErrorType) {\n return new CommandError(\n type,\n commandName,\n streamId,\n handler(commandError),\n )\n }\n }\n\n return commandError\n })\n\n const currentCommandChain = commandChain\n currentCommandChain.then(async (allEvents) => {\n if (\n // we are the last command\n currentCommandChain === commandChain\n ) {\n stateReady.resolve(\n allEvents instanceof Error ? allEvents : undefined,\n )\n\n commandChain = commandChain.then(async () => {\n // no Error in chain\n if (Array.isArray(allEvents)) {\n transactionDelay?.resolve()\n try {\n await transactionDelay?.commit()\n } catch (error) {\n if (error instanceof Error) {\n warnReleaseLock()\n return error\n }\n }\n\n await processEvents(allEvents)\n return []\n }\n\n warnReleaseLock()\n transactionDelay?.reject(allEvents)\n if (transaction.active) {\n return []\n }\n\n throw allEvents\n })\n }\n })\n\n return api.commands\n },\n ]),\n )\n\n setImmediate(() => {\n if (!commandChainTouched) {\n releasedAfterChain = true\n commandChain = commandChain.then((v) => {\n releaseLock()\n return v\n })\n }\n })\n\n const api = {\n load(filter?: (event: BaseOutputEvent) => MaybePromise<boolean>) {\n // ensure commands are executed after load is finished\n commandChain = commandChain\n .then(() =>\n loadUntil(state, snapshotApi, streamId, undefined, filter),\n )\n .then((loadedVersion) => {\n version = loadedVersion\n return []\n })\n },\n commands: {\n ...commands,\n async state() {\n const maybeError = await Promise.race([\n stateReady.promise,\n awaitAll(() => commandChain),\n ])\n\n if (maybeError) {\n throw maybeError\n }\n\n return state\n },\n async settled(options?: SettledOptions): Promise<any> {\n const parentProcessManager = getProcessManagerInfo()\n if (parentProcessManager) {\n const error = new Error(\n `aggregateRoot.settled() cannot be called inside a process manager. Attempted on aggregate stream \"${type}\" within Process Manager ${parentProcessManager.name}.`,\n )\n commandChain = commandChain.then(() => error)\n throw error\n }\n\n if (transaction.active) {\n const error = new Error(\n `aggregateRoot.settled() cannot be called inside a transaction. Attempted on aggregate stream \"${type}\".`,\n )\n commandChain = commandChain.then(() => error)\n throw error\n }\n\n const maxRetries = options?.maxRetries ?? 0\n\n try {\n await awaitAll(() => commandChain)\n } catch (error) {\n // Optimistic-concurrency recovery: another writer advanced the\n // stream between load and append. Reload and re-apply the same\n // commands against the fresh version. A failed append leaves this\n // attempt's lock held (it never reached releaseLock), so release it\n // before the retry re-acquires — otherwise the retry blocks until\n // the lock's TTL lapses.\n if (maxRetries > 0 && error instanceof ConcurrencyError) {\n await releaseLock?.()\n\n const retryStream = createStream(clone(initialState), streamId, {\n load: true,\n filter: config.filter,\n replayCommands: dispatchedCommands,\n errorHandlerEntries: Array.from(errorHandlers),\n })\n\n return retryStream.commands.settled({\n ...options,\n maxRetries: maxRetries - 1,\n })\n }\n\n throw error\n }\n\n await downstreamSettledPromise()\n return api.commands\n },\n transformError(\n error: Constructor<Error>,\n handler: (error: Error) => never,\n ) {\n errorHandlers.set(error, handler)\n return api.commands\n },\n streamId,\n },\n }\n\n registerRootPromiseToUpstream(() => api.commands.settled())\n transaction.after(() => api.commands.settled())\n\n // Fold existing events before commands run (loadStream, and every retry).\n if (config.load) {\n api.load(config.filter)\n }\n\n // Re-apply the caller's commands on a retry so the fresh, reloaded stream\n // reproduces the original intent against the current version.\n for (const { name, args } of config.replayCommands ?? []) {\n ;(api.commands as any)[name](...args)\n }\n\n return api\n }\n\n const api: AggregateRootApi<Name> & InternalAggregateRootApi = {\n type,\n withInitialState: (state) => {\n initialState = clone(state)\n return api as any\n },\n\n withCommands(handlers) {\n createCommands = (state, eventBuilder, options) => {\n if (state === null) {\n return (handlers as any)(eventBuilder, options)\n }\n\n return (handlers as any)(state, eventBuilder, options)\n }\n\n return api as any\n },\n\n withEvents(handler) {\n const eventMap: BaseEventMap =\n typeof handler === 'function'\n ? handler({ version: (version, schema) => ({ version, schema }), z })\n : handler\n\n for (const [type, config] of Object.entries(eventMap)) {\n const versions = Array.isArray(config) ? config : [config]\n for (const v of versions) {\n let schema: z.ZodType\n let version: number\n if (typeof v === 'object' && 'version' in v) {\n schema = v.schema\n version = v.version\n } else {\n schema = v\n version = 0\n }\n\n if (registeredEvents.get(type)?.has(version)) {\n throw new Error(\n `event ${type} is already registered in version ${version}`,\n )\n }\n\n if (!registeredEvents.has(type)) {\n registeredEvents.set(type, new Map())\n }\n registeredEvents.get(type)!.set(version, schema)\n }\n }\n return api as any\n },\n\n withEventHandlers(handler) {\n createEventHandlers = handler as any\n return api as any\n },\n\n withSnapshots: (handler) => {\n createSnapshotApi = handler as any\n return api as any\n },\n\n newStream(id) {\n if (!loadEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const parentProjectionName = getProjectionInfo()?.name\n if (parentProjectionName) {\n throw new Error(\n `aggregateRoot.newStream() cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,\n )\n }\n return createStream(clone(initialState), id ?? crypto.randomUUID(), {\n load: false,\n }).commands as any\n },\n\n loadStream(id, filter) {\n if (!loadEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const parentProjectionName = getProjectionInfo()?.name\n if (parentProjectionName) {\n throw new Error(\n `aggregateRoot.loadStream(\"${id}\") cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,\n )\n }\n return createStream(clone(initialState), id, {\n load: true,\n filter: filter as any,\n }).commands as any\n },\n\n linkEventStore(load, append, emit, trans, lock, snap) {\n loadEvents = load\n appendEvents = append\n emitEvents = emit\n transaction = trans\n createLock = lock\n snapshots = snap\n },\n get eventTypes() {\n return Array.from(registeredEvents.keys())\n },\n $inferEvents: null as never,\n $inferEvent: null as never,\n $inferState: null as never,\n $inferCommandParameters: null as never,\n }\n\n return api as Omit<\n AggregateRootApi<Name>,\n 'withCommands' | 'withEventHandlers'\n >\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "27B830D34C48B63764756E2164756E21",
9
+ "names": []
10
+ }
@@ -55,16 +55,28 @@ type VersionBuilder = <V extends number, S extends z.ZodType>(version: V, schema
55
55
  schema: S;
56
56
  version: V;
57
57
  };
58
+ /**
59
+ * Options for {@link Stream.settled}.
60
+ *
61
+ * `maxRetries` — how many times to reload the stream and re-apply the dispatched
62
+ * commands when the append loses the optimistic-concurrency race
63
+ * ({@link ConcurrencyError}). Defaults to `0` (no retry — surface the error, the
64
+ * historical behaviour). Only the append is retried; command handlers must be
65
+ * pure functions of loaded state and their arguments for retries to be safe.
66
+ */
67
+ export type SettledOptions = {
68
+ maxRetries?: number;
69
+ };
58
70
  type Stream<Commands extends Record<string, Command>, State> = {
59
71
  [A in keyof Commands]: (...args: Parameters<Commands[A]>) => Stream<Commands, State>;
60
72
  } & {
61
- settled: () => Promise<Stream<Commands, State>>;
73
+ settled: (options?: SettledOptions) => Promise<Stream<Commands, State>>;
62
74
  state: () => Promise<State>;
63
75
  transformError: <T extends Error>(error: Constructor<T>, errorHandler: (commandError: CommandError<T>) => Error) => Stream<Commands, State>;
64
76
  readonly streamId: string;
65
77
  };
66
78
  export type AnyStream = {
67
- settled: () => Promise<AnyStream>;
79
+ settled: (options?: SettledOptions) => Promise<AnyStream>;
68
80
  state: () => Promise<unknown>;
69
81
  transformError: <T extends Error>(error: Constructor<T>, errorHandler: (error: CommandError<T>) => Error) => AnyStream;
70
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createAggregateRoot.d.ts","sourceRoot":"","sources":["../src/createAggregateRoot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createAggregateRoot.d.ts","sourceRoot":"","sources":["../src/createAggregateRoot.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createAggregateRoot
3
- } from "./chunk-t7t9mfgn.js";
3
+ } from "./chunk-wzw95hzk.js";
4
4
  import"./chunk-fkzd741s.js";
5
5
  import"./chunk-6q8mr1sg.js";
6
6
  import"./chunk-z388cd25.js";
@@ -15,7 +15,7 @@ import {
15
15
  import"../chunk-24xjphpk.js";
16
16
  import {
17
17
  createAggregateRoot
18
- } from "../chunk-t7t9mfgn.js";
18
+ } from "../chunk-wzw95hzk.js";
19
19
  import"../chunk-ty9bhdvx.js";
20
20
  import"../chunk-fkzd741s.js";
21
21
  import {
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export type { Checkpoint } from './createCheckpointApi.ts';
6
6
  export { isInsideProcessManager, getProcessManagerInfo, } from './createProcessManager.ts';
7
7
  export { isInsideEventListener, getEventListenerInfo, } from './createEventListener.ts';
8
8
  export * from './errors.ts';
9
- export { type Snapshot as AggregateRootSnapshot, type AnyAggregateRoot, type AnyStream, createAggregateRoot, } from './createAggregateRoot.ts';
9
+ export { type Snapshot as AggregateRootSnapshot, type AnyAggregateRoot, type AnyStream, type SettledOptions, createAggregateRoot, } from './createAggregateRoot.ts';
10
10
  export { skipRefreshing } from './refresh.ts';
11
11
  export { skipReplay } from './replay.ts';
12
12
  export declare function isStreamId(stream: Stream): stream is StreamId | StreamIdEvents;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,eAAe,IAAI,KAAK,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EACL,KAAK,QAAQ,IAAI,kBAAkB,EACnC,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,OAAO,EACL,KAAK,QAAQ,IAAI,qBAAqB,EACtC,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,QAAQ,GAAG,cAAc,CAErC;AACD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,YAAY,GAAG,cAAc,CAEzC;AACD,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,eAAe,IAAI,KAAK,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EACL,KAAK,QAAQ,IAAI,kBAAkB,EACnC,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,OAAO,EACL,KAAK,QAAQ,IAAI,qBAAqB,EACtC,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,QAAQ,GAAG,cAAc,CAErC;AACD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,YAAY,GAAG,cAAc,CAEzC;AACD,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-24xjphpk.js";
12
12
  import {
13
13
  createAggregateRoot
14
- } from "./chunk-t7t9mfgn.js";
14
+ } from "./chunk-wzw95hzk.js";
15
15
  import"./chunk-ty9bhdvx.js";
16
16
  import {
17
17
  getProcessManagerInfo,
@@ -8,7 +8,7 @@ import {
8
8
  import"../chunk-24xjphpk.js";
9
9
  import {
10
10
  createAggregateRoot
11
- } from "../chunk-t7t9mfgn.js";
11
+ } from "../chunk-wzw95hzk.js";
12
12
  import"../chunk-ty9bhdvx.js";
13
13
  import"../chunk-fkzd741s.js";
14
14
  import"../chunk-6q8mr1sg.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@requence/event-sourcing",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Event sourcing primitives — aggregate roots, projections, process managers, and event listeners",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -12,6 +12,7 @@ import { getProcessManagerInfo } from './createProcessManager.ts'
12
12
  import { getProjectionInfo } from './createProjection.ts'
13
13
  import {
14
14
  CommandError,
15
+ ConcurrencyError,
15
16
  EventValidationError,
16
17
  InfiniteLoopError,
17
18
  ValidationError,
@@ -135,12 +136,25 @@ type VersionBuilder = <V extends number, S extends z.ZodType>(
135
136
  schema: S,
136
137
  ) => { schema: S; version: V }
137
138
 
139
+ /**
140
+ * Options for {@link Stream.settled}.
141
+ *
142
+ * `maxRetries` — how many times to reload the stream and re-apply the dispatched
143
+ * commands when the append loses the optimistic-concurrency race
144
+ * ({@link ConcurrencyError}). Defaults to `0` (no retry — surface the error, the
145
+ * historical behaviour). Only the append is retried; command handlers must be
146
+ * pure functions of loaded state and their arguments for retries to be safe.
147
+ */
148
+ export type SettledOptions = {
149
+ maxRetries?: number
150
+ }
151
+
138
152
  type Stream<Commands extends Record<string, Command>, State> = {
139
153
  [A in keyof Commands]: (
140
154
  ...args: Parameters<Commands[A]>
141
155
  ) => Stream<Commands, State>
142
156
  } & {
143
- settled: () => Promise<Stream<Commands, State>>
157
+ settled: (options?: SettledOptions) => Promise<Stream<Commands, State>>
144
158
  state: () => Promise<State>
145
159
  transformError: <T extends Error>(
146
160
  error: Constructor<T>,
@@ -150,7 +164,7 @@ type Stream<Commands extends Record<string, Command>, State> = {
150
164
  }
151
165
 
152
166
  export type AnyStream = {
153
- settled: () => Promise<AnyStream>
167
+ settled: (options?: SettledOptions) => Promise<AnyStream>
154
168
  state: () => Promise<unknown>
155
169
  transformError: <T extends Error>(
156
170
  error: Constructor<T>,
@@ -475,7 +489,29 @@ export function createAggregateRoot<Name extends string>(type: Name) {
475
489
  return version
476
490
  }
477
491
 
478
- const createStream = (state: any, streamId: string) => {
492
+ // A command as dispatched by the caller, recorded so it can be re-applied
493
+ // against a freshly-loaded stream when a settle() retries a ConcurrencyError.
494
+ type RecordedCommand = { name: string; args: any[] }
495
+
496
+ type CreateStreamConfig = {
497
+ // Whether to load the existing stream before commands run. `false` for
498
+ // newStream (expects version 0); `true` for loadStream and every retry.
499
+ load?: boolean
500
+ filter?: (event: BaseOutputEvent) => MaybePromise<boolean>
501
+ // Seeded on a retry so replayed commands re-apply automatically, and
502
+ // transformError handlers registered before settle() carry over.
503
+ replayCommands?: RecordedCommand[]
504
+ errorHandlerEntries?: [
505
+ Constructor<Error>,
506
+ (error: CommandError<Error>) => Error,
507
+ ][]
508
+ }
509
+
510
+ const createStream = (
511
+ state: any,
512
+ streamId: string,
513
+ config: CreateStreamConfig = {},
514
+ ) => {
479
515
  let version = 0
480
516
  const snapshotApi = createSnapshotApi?.(
481
517
  state,
@@ -485,7 +521,8 @@ export function createAggregateRoot<Name extends string>(type: Name) {
485
521
  const errorHandlers = new Map<
486
522
  Constructor<Error>,
487
523
  (error: CommandError<Error>) => Error
488
- >()
524
+ >(config.errorHandlerEntries)
525
+ const dispatchedCommands: RecordedCommand[] = []
489
526
  let downstreamSettledPromise = () => Promise.resolve()
490
527
  let releaseLock!: () => Promise<void>
491
528
  let extendLock!: EventHandlerOptions['extendLock']
@@ -563,6 +600,9 @@ export function createAggregateRoot<Name extends string>(type: Name) {
563
600
  return api.commands
564
601
  }
565
602
 
603
+ // Record for a potential settle() retry (reload + re-apply).
604
+ dispatchedCommands.push({ name: commandName, args })
605
+
566
606
  const commandId = crypto.randomUUID()
567
607
  transactionDelay ??= transaction.delay()
568
608
  commandChainTouched = true
@@ -747,7 +787,7 @@ export function createAggregateRoot<Name extends string>(type: Name) {
747
787
 
748
788
  return state
749
789
  },
750
- async settled() {
790
+ async settled(options?: SettledOptions): Promise<any> {
751
791
  const parentProcessManager = getProcessManagerInfo()
752
792
  if (parentProcessManager) {
753
793
  const error = new Error(
@@ -765,7 +805,36 @@ export function createAggregateRoot<Name extends string>(type: Name) {
765
805
  throw error
766
806
  }
767
807
 
768
- await awaitAll(() => commandChain)
808
+ const maxRetries = options?.maxRetries ?? 0
809
+
810
+ try {
811
+ await awaitAll(() => commandChain)
812
+ } catch (error) {
813
+ // Optimistic-concurrency recovery: another writer advanced the
814
+ // stream between load and append. Reload and re-apply the same
815
+ // commands against the fresh version. A failed append leaves this
816
+ // attempt's lock held (it never reached releaseLock), so release it
817
+ // before the retry re-acquires — otherwise the retry blocks until
818
+ // the lock's TTL lapses.
819
+ if (maxRetries > 0 && error instanceof ConcurrencyError) {
820
+ await releaseLock?.()
821
+
822
+ const retryStream = createStream(clone(initialState), streamId, {
823
+ load: true,
824
+ filter: config.filter,
825
+ replayCommands: dispatchedCommands,
826
+ errorHandlerEntries: Array.from(errorHandlers),
827
+ })
828
+
829
+ return retryStream.commands.settled({
830
+ ...options,
831
+ maxRetries: maxRetries - 1,
832
+ })
833
+ }
834
+
835
+ throw error
836
+ }
837
+
769
838
  await downstreamSettledPromise()
770
839
  return api.commands
771
840
  },
@@ -782,6 +851,18 @@ export function createAggregateRoot<Name extends string>(type: Name) {
782
851
 
783
852
  registerRootPromiseToUpstream(() => api.commands.settled())
784
853
  transaction.after(() => api.commands.settled())
854
+
855
+ // Fold existing events before commands run (loadStream, and every retry).
856
+ if (config.load) {
857
+ api.load(config.filter)
858
+ }
859
+
860
+ // Re-apply the caller's commands on a retry so the fresh, reloaded stream
861
+ // reproduces the original intent against the current version.
862
+ for (const { name, args } of config.replayCommands ?? []) {
863
+ ;(api.commands as any)[name](...args)
864
+ }
865
+
785
866
  return api
786
867
  }
787
868
 
@@ -861,8 +942,9 @@ export function createAggregateRoot<Name extends string>(type: Name) {
861
942
  `aggregateRoot.newStream() cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,
862
943
  )
863
944
  }
864
- return createStream(clone(initialState), id ?? crypto.randomUUID())
865
- .commands as any
945
+ return createStream(clone(initialState), id ?? crypto.randomUUID(), {
946
+ load: false,
947
+ }).commands as any
866
948
  },
867
949
 
868
950
  loadStream(id, filter) {
@@ -878,9 +960,10 @@ export function createAggregateRoot<Name extends string>(type: Name) {
878
960
  `aggregateRoot.loadStream("${id}") cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,
879
961
  )
880
962
  }
881
- const root = createStream(clone(initialState), id)
882
- root.load(filter as any)
883
- return root.commands as any
963
+ return createStream(clone(initialState), id, {
964
+ load: true,
965
+ filter: filter as any,
966
+ }).commands as any
884
967
  },
885
968
 
886
969
  linkEventStore(load, append, emit, trans, lock, snap) {
package/src/index.ts CHANGED
@@ -26,6 +26,7 @@ export {
26
26
  type Snapshot as AggregateRootSnapshot,
27
27
  type AnyAggregateRoot,
28
28
  type AnyStream,
29
+ type SettledOptions,
29
30
  createAggregateRoot,
30
31
  } from './createAggregateRoot.ts'
31
32
 
@@ -540,6 +540,48 @@ describe('hotAggregateRoot', () => {
540
540
  expect(name).toBe('B') // 'A' never made it
541
541
  })
542
542
 
543
+ it('retries the losing write on ConcurrencyError when maxRetries is set', async () => {
544
+ const slowAggregateRoot = createAggregateRoot('slow')
545
+ .withEvents(({ z }) => ({
546
+ Created: z.string(),
547
+ }))
548
+ .withCommands((event) => ({
549
+ async create(delay: number, name: string) {
550
+ await setTimeout(delay)
551
+ return event('Created', name)
552
+ },
553
+ }))
554
+
555
+ const { eventStore, pseudoEventStore } = setupEventStore(slowAggregateRoot, {
556
+ lock: lock(40), // 40ms
557
+ })
558
+
559
+ const called: string[] = []
560
+ eventStore.createEventListener('test').withEventHandlers({
561
+ onCreated(event) {
562
+ called.push(event.payload)
563
+ },
564
+ })
565
+
566
+ // Same race as the test above: A locks stream:a, the lock auto-releases
567
+ // after 40ms while A is still in its 100ms command, so B slips in and
568
+ // advances the stream to v1. A then loses the append race — but with
569
+ // maxRetries it reloads (now seeing B's event) and re-appends at v2 instead
570
+ // of surfacing the ConcurrencyError.
571
+ await Promise.all([
572
+ slowAggregateRoot
573
+ .loadStream('a')
574
+ .create(100, 'A')
575
+ .settled({ maxRetries: 3 }),
576
+ slowAggregateRoot.loadStream('a').create(5, 'B').settled(),
577
+ ])
578
+
579
+ const persisted = pseudoEventStore.filter((e) => e.streamType === 'slow')
580
+ expect(persisted.map((e) => e.payload)).toEqual(['B', 'A'])
581
+ expect(persisted.map((e) => e.streamVersion)).toEqual([1, 2])
582
+ expect(called).toEqual(['B', 'A'])
583
+ })
584
+
543
585
  it('auto extends locks', async () => {
544
586
  const aggregateRoot = createAggregateRoot('slow')
545
587
  .withEvents(({ z }) => ({
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/createAggregateRoot.ts"],
4
- "sourcesContent": [
5
- "import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { deepEqual } from 'fast-equals'\nimport { z } from 'zod/v4'\n\nimport type {\n EmitEvents,\n InternalAppendEvents,\n LoadEvents,\n} from './createEventStore.ts'\nimport { getProcessManagerInfo } from './createProcessManager.ts'\nimport { getProjectionInfo } from './createProjection.ts'\nimport {\n CommandError,\n EventValidationError,\n InfiniteLoopError,\n ValidationError,\n} from './errors.ts'\nimport type { LockCreator } from './lock.ts'\nimport { isRefreshing } from './refresh.ts'\nimport createSnapshotGenerator, {\n type CompleteSnapshotGenerator,\n type InternalSnapshotGenerator,\n type SnapshotGenerator,\n} from './snapshotGenerator.ts'\nimport { clone } from './superjson.ts'\nimport type { Transaction, TransactionDelay } from './transaction.ts'\nimport type {\n BaseInputEvent,\n BaseOutputEvent,\n EventTemplate,\n Keys,\n MaybePromise,\n Merge,\n OutputEvents,\n Prettify,\n} from './utilityTypes.ts'\nimport { awaitAll, normalizeArray } from './utils.ts'\nimport {\n type WrappedEvent,\n type WrappedEventBuilder,\n handleEventError,\n unwrapEvent,\n wrappedEventBuilder,\n} from './wrappedEventBuilder.ts'\n\ntype UppercaseRecord<T extends Record<string, any>> = {\n [K in keyof T]: K extends Capitalize<K & string>\n ? any\n : `Error: Key '${K & string}' must be Capitalized`\n}\n\ntype BaseEventMap = Record<\n string,\n z.ZodType | (z.ZodType | { schema: z.ZodType; version: number })[]\n>\n\ntype DownstreamRootPromise = () => Promise<unknown>\nconst downstreamRootsPromiseStore = new AsyncLocalStorage<\n DownstreamRootPromise[]\n>()\n\nfunction registerRootPromiseToUpstream(rootPromise: DownstreamRootPromise) {\n downstreamRootsPromiseStore.getStore()?.push(rootPromise)\n}\n\nasync function collectDownstreamRootPromise(handler: () => Promise<void>) {\n const rootPromises: DownstreamRootPromise[] = []\n await downstreamRootsPromiseStore.run(rootPromises, handler)\n return async () => {\n await Promise.all(rootPromises.map((promise) => promise()))\n }\n}\n\ntype BaseInternalEvent<\n Type extends string,\n Version extends number,\n Payload = unknown,\n> = BaseOutputEvent<Type, Version, Payload>\n\ntype InternalEvent<Event extends EventTemplate> = Prettify<\n {\n [K in Event as K['version']]: Omit<\n BaseInternalEvent<K['type'], K['version'], z.output<K['schema']>>,\n 'createdAt' | 'position' | 'streamVersion'\n > & {\n // only set when folding persisted events (stream loading/replay);\n // events yielded by a command fold before they are appended and have\n // no position yet\n position?: number\n }\n }[Event['version']]\n>\n\ntype InternalEventHandlers<Events extends EventTemplate> = {\n [K in Events as `on${K['type']}`]?: (\n event: InternalEvent<K>,\n ) => MaybePromise<void>\n}\n\ntype EventsFromMap<EventMap extends BaseEventMap> = Prettify<\n {\n [K in keyof EventMap]: { type: K & string } & (EventMap[K] extends z.ZodType\n ? { schema: EventMap[K]; version: 0 }\n : EventMap[K] extends { schema: infer S; version: infer V }\n ? S extends z.ZodType\n ? { schema: S; version: V }\n : never\n : EventMap[K] extends Array<infer I>\n ? I extends z.ZodType\n ? { schema: I; version: 0 }\n : I extends { schema: infer S; version: infer V }\n ? { schema: S; version: V }\n : never\n : never)\n }[keyof EventMap]\n>\n\ntype Constructor<T> = new (...args: any[]) => T\n\ntype Command = (\n ...args: any[]\n) =>\n | MaybePromise<void | WrappedEvent | WrappedEvent[]>\n | Iterable<WrappedEvent>\n | AsyncIterable<WrappedEvent>\n\ntype Utils = {\n reset: () => void\n replayUntil: (streamVersion: number) => Promise<void>\n}\n\ntype VersionBuilder = <V extends number, S extends z.ZodType>(\n version: V,\n schema: S,\n) => { schema: S; version: V }\n\ntype Stream<Commands extends Record<string, Command>, State> = {\n [A in keyof Commands]: (\n ...args: Parameters<Commands[A]>\n ) => Stream<Commands, State>\n} & {\n settled: () => Promise<Stream<Commands, State>>\n state: () => Promise<State>\n transformError: <T extends Error>(\n error: Constructor<T>,\n errorHandler: (commandError: CommandError<T>) => Error,\n ) => Stream<Commands, State>\n readonly streamId: string\n}\n\nexport type AnyStream = {\n settled: () => Promise<AnyStream>\n state: () => Promise<unknown>\n transformError: <T extends Error>(\n error: Constructor<T>,\n errorHandler: (error: CommandError<T>) => Error,\n ) => AnyStream\n}\n\nexport type AnyAggregateRoot = {\n type: string\n loadStream: (\n id: string,\n filter?: (event: BaseOutputEvent) => MaybePromise<boolean>,\n ) => AnyStream\n newStream: () => AnyStream\n $inferState: any\n $inferEvents: any\n $inferEvent: any\n $inferCommandParameters: any\n}\n\ntype EventHandlerOptions = {\n streamId: string\n extendLock: (ms?: number) => Promise<boolean>\n}\n\nexport type AggregateRootApi<\n Name,\n State = never,\n Events extends EventTemplate = never,\n Commands extends Record<string, Command> = Record<string, Command>,\n Flags extends {\n withInitialState: boolean\n withEvents: boolean\n withCommands: boolean\n withEventHandlers: boolean\n withSnapshots: boolean\n } = {\n withInitialState: false\n withEvents: false\n withCommands: true\n withEventHandlers: true\n withSnapshots: false\n },\n> = {\n withInitialState: <NextState extends Record<string, unknown>>(\n state: NextState,\n ) => Omit<\n AggregateRootApi<\n Name,\n NextState,\n Events,\n Commands,\n Merge<Flags, { withInitialState: true; withEventHandlers: false }>\n >,\n Keys<Merge<Flags, { withInitialState: true; withEventHandlers: false }>>\n >\n withCommands: <\n NextCommands extends Record<\n Exclude<string, 'state' | 'settled' | 'transformError' | 'streamId'>,\n Command\n >,\n >(\n handlers: [State] extends [never]\n ? (\n event: WrappedEventBuilder<Events>,\n options: EventHandlerOptions,\n ) => NextCommands\n : (\n state: Readonly<State>,\n event: WrappedEventBuilder<Events>,\n options: EventHandlerOptions,\n ) => NextCommands,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n NextCommands,\n Merge<\n Flags,\n { withInitialState: true; withCommands: true; withEvents: true }\n >\n >,\n Keys<\n Merge<\n Flags,\n { withInitialState: true; withCommands: true; withEvents: true }\n >\n >\n >\n withEvents: {\n <EventMap extends BaseEventMap>(\n handler: EventMap & UppercaseRecord<EventMap>,\n ): Omit<\n AggregateRootApi<\n Name,\n State,\n EventsFromMap<EventMap>,\n Commands,\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >,\n Keys<\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >\n >\n <EventMap extends BaseEventMap>(\n handler: (utils: {\n version: VersionBuilder\n z: typeof z\n }) => EventMap & UppercaseRecord<EventMap>,\n ): Omit<\n AggregateRootApi<\n Name,\n State,\n EventsFromMap<EventMap>,\n Commands,\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >,\n Keys<\n Merge<\n Flags,\n {\n withInitialState: true\n withEvents: true\n withCommands: false\n }\n >\n >\n >\n }\n withEventHandlers: (\n handler: (state: State, utils: Utils) => InternalEventHandlers<Events>,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n Commands,\n Merge<\n Flags,\n { withInitialState: true; withEventHandlers: true; withEvents: true }\n >\n >,\n Keys<\n Merge<\n Flags,\n { withInitialState: true; withEventHandlers: true; withEvents: true }\n >\n >\n >\n withSnapshots: (\n handler: (\n state: State,\n generate: SnapshotGenerator<Omit<Snapshot, 'schemaVersion' | 'state'>>,\n utils: { z: typeof z },\n ) => CompleteSnapshotGenerator,\n ) => Omit<\n AggregateRootApi<\n Name,\n State,\n Events,\n Commands,\n Merge<Flags, { withSnapshots: true }>\n >,\n Keys<Merge<Flags, { withSnapshots: true }>>\n >\n loadStream: (\n id: string,\n filter?: (event: OutputEvents<Events>) => MaybePromise<boolean>,\n ) => Stream<Commands, State>\n newStream: (id?: string) => Stream<Commands, State>\n\n $inferEvents: OutputEvents<Events>\n $inferEvent: OutputEvents<Events> extends BaseOutputEvent\n ? { [E in OutputEvents<Events> as E['type']]: E }\n : never\n $inferState: State\n $inferCommandParameters: {\n [CommandName in keyof Commands]: Parameters<Commands[CommandName]>\n }\n readonly type: Name\n}\n\nexport type InternalAggregateRootApi = {\n linkEventStore: (\n loadEvents: LoadEvents,\n appendEvents: InternalAppendEvents,\n emitEvents: EmitEvents,\n transaction: Transaction,\n lock: LockCreator,\n snapshots?: AggregateRootSnapshotMethods,\n ) => void\n eventTypes: string[]\n readonly type: string\n}\n\nconst snapshotSchema = z.object({\n streamId: z.string(),\n schemaVersion: z.int(),\n state: z.unknown(),\n createdAt: z.date(),\n streamVersion: z.int(),\n streamType: z.string(),\n lastEventPosition: z.int(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport type Snapshot = z.output<typeof snapshotSchema>\n\nexport type AggregateRootSnapshotMethods = {\n get: (select: {\n stream: string\n id: string\n }) => MaybePromise<Snapshot | null | undefined>\n put: (snapshot: Snapshot) => MaybePromise<void>\n delete: (\n target: {\n stream: string\n id: string\n },\n fromPosition: number,\n ) => MaybePromise<void>\n}\n\nexport function createAggregateRoot<Name extends string>(type: Name) {\n let initialState: any = null\n let createEventHandlers: (\n state: any,\n ) => InternalEventHandlers<any> = () => ({})\n\n let loadEvents!: LoadEvents\n let appendEvents!: InternalAppendEvents\n let emitEvents!: EmitEvents\n let snapshots: AggregateRootSnapshotMethods | undefined\n let createLock!: LockCreator\n let transaction!: Transaction\n\n let createCommands: (\n state: any,\n eventBuilder: (name: string, payload: unknown) => WrappedEvent,\n options: EventHandlerOptions,\n ) => Record<string, Command> = () => ({})\n\n const registeredEvents = new Map<string, Map<number, z.ZodType>>()\n let createSnapshotApi:\n | ((\n state: any,\n generate: SnapshotGenerator<any>,\n utils: { z: typeof z },\n ) => CompleteSnapshotGenerator & InternalSnapshotGenerator)\n | null = null\n\n const loadUntil = async (\n state: any,\n snapshotApi:\n | (CompleteSnapshotGenerator & InternalSnapshotGenerator)\n | undefined,\n id: string,\n untilPosition?: number,\n filter?: (event: BaseOutputEvent) => MaybePromise<boolean>,\n ) => {\n let position = 0\n let version = 0\n if (snapshotApi) {\n const snapshot = await snapshots?.get({\n stream: type,\n id,\n })\n if (snapshot) {\n const result = snapshotSchema.safeParse(snapshot)\n\n if (!result.success) {\n throw new ValidationError(\n 'loaded aggregate root snapshot does not comply with schema',\n result.error,\n )\n }\n\n snapshotApi.internalApply(result.data)\n position = snapshot.lastEventPosition\n version = snapshot.streamVersion\n }\n }\n\n const events = loadEvents(\n { stream: type, id },\n {\n from: position,\n to: untilPosition,\n },\n )\n const eventHandlers = createEventHandlers(state)\n for await (const event of events) {\n version += 1\n if ((await filter?.(event)) === false) {\n continue\n }\n await (eventHandlers as any)[`on${event.type}`]?.(event)\n }\n\n return version\n }\n\n const createStream = (state: any, streamId: string) => {\n let version = 0\n const snapshotApi = createSnapshotApi?.(\n state,\n createSnapshotGenerator() as any,\n { z },\n )\n const errorHandlers = new Map<\n Constructor<Error>,\n (error: CommandError<Error>) => Error\n >()\n let downstreamSettledPromise = () => Promise.resolve()\n let releaseLock!: () => Promise<void>\n let extendLock!: EventHandlerOptions['extendLock']\n\n const warnReleaseLock = () => {\n if (releasedAfterChain) {\n console.warn(`aggregate root for ${type}:${streamId} was open too long`)\n }\n releaseLock()\n }\n\n const processEvents = async (events: BaseInputEvent[]) => {\n if (!appendEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const persistedEvents = await appendEvents(\n { stream: type, id: streamId },\n events,\n version,\n )\n\n warnReleaseLock()\n\n for (const persistedEvent of persistedEvents) {\n const snapshot = await snapshotApi?.internalCapture(\n persistedEvent,\n persistedEvent.streamVersion,\n )\n\n if (snapshot) {\n await snapshots?.put({\n state: snapshot.state,\n lastEventPosition: persistedEvent.position,\n streamId,\n streamVersion: version,\n streamType: type,\n schemaVersion: snapshot.version,\n createdAt: new Date(),\n })\n }\n }\n\n version += events.length\n\n downstreamSettledPromise = await collectDownstreamRootPromise(() =>\n emitEvents(persistedEvents),\n )\n }\n\n let commandChain = createLock([type, streamId]).then((lock) => {\n releaseLock = lock.release\n extendLock = lock.extend\n return [] as Error | BaseInputEvent[]\n })\n let commandChainTouched = false\n let releasedAfterChain = false\n let transactionDelay: TransactionDelay | undefined\n\n const stateReady = Promise.withResolvers<Error | undefined>()\n\n const rawCommands = createCommands(state, wrappedEventBuilder, {\n streamId,\n extendLock,\n })\n\n const commands = Object.fromEntries(\n Object.entries(rawCommands).map(([commandName, commandFn]) => [\n commandName,\n (...args: any[]) => {\n // don't create new events when refreshing the process manager\n if (isRefreshing()) {\n return api.commands\n }\n\n const commandId = crypto.randomUUID()\n transactionDelay ??= transaction.delay()\n commandChainTouched = true\n commandChain = commandChain\n .then(async (previousEvents) => {\n if (previousEvents instanceof Error) {\n return previousEvents\n }\n const events = (\n await normalizeArray(\n commandFn.apply(rawCommands, args),\n () => extendLock(),\n )\n ).filter((event) => Boolean(event))\n\n const baseInputEvents = await Promise.all(\n events.map(async (event) => {\n event.withAdditionalMetadata({ commandName })\n event.withDefaultCausationId(commandId)\n\n const unwrappedEvent = unwrapEvent(event)\n\n const eventVersions = registeredEvents.get(\n unwrappedEvent.type,\n )\n if (!eventVersions) {\n throw new Error(\n `cannot append unknown event ${unwrappedEvent.type}`,\n )\n }\n const latestVersion = Math.max(\n ...Array.from(eventVersions.keys()),\n )\n const schema = eventVersions.get(latestVersion)!\n\n const result = schema.safeParse(unwrappedEvent.payload)\n if (!result.success) {\n const error = new EventValidationError(\n `payload does not comply with schema for event ${unwrappedEvent.type}@${latestVersion} at stream ${streamId}`,\n result.error,\n )\n\n await handleEventError(event, error)\n throw error\n }\n\n unwrappedEvent.payload = result.data\n\n return {\n ...unwrappedEvent,\n schemaVersion: latestVersion,\n }\n }),\n )\n\n const eventHandlers = createEventHandlers(state)\n for (const event of baseInputEvents) {\n const processManagerInfo = getProcessManagerInfo()\n if (processManagerInfo) {\n if (\n processManagerInfo.event.streamId === streamId &&\n processManagerInfo.event.streamType === type &&\n processManagerInfo.event.type === event.type &&\n deepEqual(processManagerInfo.event.payload, event.payload)\n ) {\n return new InfiniteLoopError(\n `Infinite loop detected. Process Manager \"${processManagerInfo.name}\" listens and emits same event \"${event.type}\" for stream ${type}:${streamId}, causing a recurring event cycle`,\n )\n }\n }\n\n await eventHandlers[`on${event.type}`]?.({\n ...event,\n streamId,\n streamType: type,\n })\n }\n\n return [...previousEvents, ...baseInputEvents]\n })\n .catch((error) => {\n if (!(error instanceof Error)) {\n throw error\n }\n\n const commandError = new CommandError(\n type,\n commandName,\n streamId,\n error,\n )\n for (const [ErrorType, handler] of errorHandlers) {\n if (error instanceof ErrorType) {\n return new CommandError(\n type,\n commandName,\n streamId,\n handler(commandError),\n )\n }\n }\n\n return commandError\n })\n\n const currentCommandChain = commandChain\n currentCommandChain.then(async (allEvents) => {\n if (\n // we are the last command\n currentCommandChain === commandChain\n ) {\n stateReady.resolve(\n allEvents instanceof Error ? allEvents : undefined,\n )\n\n commandChain = commandChain.then(async () => {\n // no Error in chain\n if (Array.isArray(allEvents)) {\n transactionDelay?.resolve()\n try {\n await transactionDelay?.commit()\n } catch (error) {\n if (error instanceof Error) {\n warnReleaseLock()\n return error\n }\n }\n\n await processEvents(allEvents)\n return []\n }\n\n warnReleaseLock()\n transactionDelay?.reject(allEvents)\n if (transaction.active) {\n return []\n }\n\n throw allEvents\n })\n }\n })\n\n return api.commands\n },\n ]),\n )\n\n setImmediate(() => {\n if (!commandChainTouched) {\n releasedAfterChain = true\n commandChain = commandChain.then((v) => {\n releaseLock()\n return v\n })\n }\n })\n\n const api = {\n load(filter?: (event: BaseOutputEvent) => MaybePromise<boolean>) {\n // ensure commands are executed after load is finished\n commandChain = commandChain\n .then(() =>\n loadUntil(state, snapshotApi, streamId, undefined, filter),\n )\n .then((loadedVersion) => {\n version = loadedVersion\n return []\n })\n },\n commands: {\n ...commands,\n async state() {\n const maybeError = await Promise.race([\n stateReady.promise,\n awaitAll(() => commandChain),\n ])\n\n if (maybeError) {\n throw maybeError\n }\n\n return state\n },\n async settled() {\n const parentProcessManager = getProcessManagerInfo()\n if (parentProcessManager) {\n const error = new Error(\n `aggregateRoot.settled() cannot be called inside a process manager. Attempted on aggregate stream \"${type}\" within Process Manager ${parentProcessManager.name}.`,\n )\n commandChain = commandChain.then(() => error)\n throw error\n }\n\n if (transaction.active) {\n const error = new Error(\n `aggregateRoot.settled() cannot be called inside a transaction. Attempted on aggregate stream \"${type}\".`,\n )\n commandChain = commandChain.then(() => error)\n throw error\n }\n\n await awaitAll(() => commandChain)\n await downstreamSettledPromise()\n return api.commands\n },\n transformError(\n error: Constructor<Error>,\n handler: (error: Error) => never,\n ) {\n errorHandlers.set(error, handler)\n return api.commands\n },\n streamId,\n },\n }\n\n registerRootPromiseToUpstream(() => api.commands.settled())\n transaction.after(() => api.commands.settled())\n return api\n }\n\n const api: AggregateRootApi<Name> & InternalAggregateRootApi = {\n type,\n withInitialState: (state) => {\n initialState = clone(state)\n return api as any\n },\n\n withCommands(handlers) {\n createCommands = (state, eventBuilder, options) => {\n if (state === null) {\n return (handlers as any)(eventBuilder, options)\n }\n\n return (handlers as any)(state, eventBuilder, options)\n }\n\n return api as any\n },\n\n withEvents(handler) {\n const eventMap: BaseEventMap =\n typeof handler === 'function'\n ? handler({ version: (version, schema) => ({ version, schema }), z })\n : handler\n\n for (const [type, config] of Object.entries(eventMap)) {\n const versions = Array.isArray(config) ? config : [config]\n for (const v of versions) {\n let schema: z.ZodType\n let version: number\n if (typeof v === 'object' && 'version' in v) {\n schema = v.schema\n version = v.version\n } else {\n schema = v\n version = 0\n }\n\n if (registeredEvents.get(type)?.has(version)) {\n throw new Error(\n `event ${type} is already registered in version ${version}`,\n )\n }\n\n if (!registeredEvents.has(type)) {\n registeredEvents.set(type, new Map())\n }\n registeredEvents.get(type)!.set(version, schema)\n }\n }\n return api as any\n },\n\n withEventHandlers(handler) {\n createEventHandlers = handler as any\n return api as any\n },\n\n withSnapshots: (handler) => {\n createSnapshotApi = handler as any\n return api as any\n },\n\n newStream(id) {\n if (!loadEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const parentProjectionName = getProjectionInfo()?.name\n if (parentProjectionName) {\n throw new Error(\n `aggregateRoot.newStream() cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,\n )\n }\n return createStream(clone(initialState), id ?? crypto.randomUUID())\n .commands as any\n },\n\n loadStream(id, filter) {\n if (!loadEvents) {\n throw new Error(\n `aggregate root ${type} is not linked to an event store`,\n )\n }\n\n const parentProjectionName = getProjectionInfo()?.name\n if (parentProjectionName) {\n throw new Error(\n `aggregateRoot.loadStream(\"${id}\") cannot be called inside a projection. Attempted on aggregate stream ${type} within Projection ${parentProjectionName}.`,\n )\n }\n const root = createStream(clone(initialState), id)\n root.load(filter as any)\n return root.commands as any\n },\n\n linkEventStore(load, append, emit, trans, lock, snap) {\n loadEvents = load\n appendEvents = append\n emitEvents = emit\n transaction = trans\n createLock = lock\n snapshots = snap\n },\n get eventTypes() {\n return Array.from(registeredEvents.keys())\n },\n $inferEvents: null as never,\n $inferEvent: null as never,\n $inferState: null as never,\n $inferCommandParameters: null as never,\n }\n\n return api as Omit<\n AggregateRootApi<Name>,\n 'withCommands' | 'withEventHandlers'\n >\n}\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "A787501EC5E8BAB064756E2164756E21",
9
- "names": []
10
- }