@requence/event-sourcing 1.0.0 → 1.0.2

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.
Files changed (59) hide show
  1. package/README.md +81 -0
  2. package/dist/{chunk-m07vf8q9.js → chunk-13wtyj2h.js} +26 -1
  3. package/dist/chunk-13wtyj2h.js.map +10 -0
  4. package/dist/{chunk-tkvj6x8k.js → chunk-6n3jfg84.js} +10 -10
  5. package/dist/{chunk-tkvj6x8k.js.map → chunk-6n3jfg84.js.map} +1 -1
  6. package/dist/{chunk-ncpk70p4.js → chunk-8ev7sb2v.js} +4 -4
  7. package/dist/{chunk-ncpk70p4.js.map → chunk-8ev7sb2v.js.map} +1 -1
  8. package/dist/{chunk-wmz6a1jk.js → chunk-8pchcyvm.js} +19 -12
  9. package/dist/chunk-8pchcyvm.js.map +10 -0
  10. package/dist/chunk-jd4q8fcf.js.map +1 -1
  11. package/dist/chunk-zf3x573k.js.map +1 -1
  12. package/dist/createAggregateRoot.js +5 -5
  13. package/dist/createCheckpointApi.d.ts +1 -1
  14. package/dist/createEventStore.d.ts +1 -1
  15. package/dist/createEventStore.js +4 -4
  16. package/dist/createProcessManager.d.ts +2 -0
  17. package/dist/createProcessManager.d.ts.map +1 -1
  18. package/dist/createProcessManager.js +1 -1
  19. package/dist/createProjection.js +2 -2
  20. package/dist/drizzle/index.js +7 -7
  21. package/dist/drizzle/index.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +7 -7
  25. package/dist/index.js.map +1 -1
  26. package/dist/memory/index.js +7 -7
  27. package/dist/memory/index.js.map +1 -1
  28. package/dist/tests/aggregateRoot.spec.d.ts +2 -0
  29. package/dist/tests/aggregateRoot.spec.d.ts.map +1 -0
  30. package/dist/tests/eventListener.spec.d.ts +2 -0
  31. package/dist/tests/eventListener.spec.d.ts.map +1 -0
  32. package/dist/tests/eventStore.spec.d.ts +2 -0
  33. package/dist/tests/eventStore.spec.d.ts.map +1 -0
  34. package/dist/tests/processManager.spec.d.ts +2 -0
  35. package/dist/tests/processManager.spec.d.ts.map +1 -0
  36. package/dist/tests/processManagerMultiInstance.spec.d.ts +2 -0
  37. package/dist/tests/processManagerMultiInstance.spec.d.ts.map +1 -0
  38. package/dist/tests/projection.spec.d.ts +2 -0
  39. package/dist/tests/projection.spec.d.ts.map +1 -0
  40. package/dist/tests/projectionProcessManager.spec.d.ts +2 -0
  41. package/dist/tests/projectionProcessManager.spec.d.ts.map +1 -0
  42. package/dist/tests/setup.d.ts +71 -0
  43. package/dist/tests/setup.d.ts.map +1 -0
  44. package/dist/tests/transaction.spec.d.ts +2 -0
  45. package/dist/tests/transaction.spec.d.ts.map +1 -0
  46. package/dist/utilityTypes.d.ts +72 -0
  47. package/dist/utilityTypes.d.ts.map +1 -0
  48. package/dist/utilityTypes.js +2 -0
  49. package/dist/{utilityTypes.d.js.map → utilityTypes.js.map} +1 -1
  50. package/package.json +19 -8
  51. package/src/createCheckpointApi.ts +1 -1
  52. package/src/createEventStore.ts +24 -16
  53. package/src/createProcessManager.ts +34 -0
  54. package/src/index.ts +1 -1
  55. package/src/tests/processManagerMultiInstance.spec.ts +214 -0
  56. package/src/{utilityTypes.d.ts → utilityTypes.ts} +4 -4
  57. package/dist/chunk-m07vf8q9.js.map +0 -10
  58. package/dist/chunk-wmz6a1jk.js.map +0 -10
  59. package/dist/utilityTypes.d.js +0 -2
package/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # @requence/event-sourcing
2
+
3
+ A high-performance, type-safe event sourcing library for TypeScript.
4
+
5
+ Build resilient, auditable systems by storing every state change as an immutable event — then derive your current state by replaying them.
6
+
7
+ ## Features
8
+
9
+ - **Aggregate Roots** — define your domain model with events, business rules, and commands using a fluent builder API.
10
+ - **Automatic Concurrency Control** — aggregate root streams are automatically locked to prevent simultaneous edits and event stream version collisions.
11
+ - **Distributed Locking** — use `redisLock` for multi-instance deployments to coordinate locks across processes via Redis.
12
+ - **Projections** — build query-optimized read models from events, with full replay support.
13
+ - **Process Managers** — coordinate workflows across multiple aggregates.
14
+ - **Event Listeners** — react to events with lightweight, stateless side effects.
15
+ - **Storage Adapters** — swap between an in-memory store (great for testing), PostgreSQL via Drizzle, or Redis.
16
+ - **Type-Safe Events** — leverage Zod schemas and TypeScript for compile-time and runtime guarantees on every event shape.
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ npm install @requence/event-sourcing zod
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ```typescript
27
+ import { createAggregateRoot } from '@requence/event-sourcing'
28
+ import { createEventStore } from '@requence/event-sourcing/memory'
29
+
30
+ // 1. Define an aggregate root
31
+ const counter = createAggregateRoot('counter')
32
+ .withInitialState({ count: 0 })
33
+ .withEvents(({ z }) => ({
34
+ Incremented: z.object({ amount: z.number() }),
35
+ }))
36
+ .withEventHandlers((state) => ({
37
+ onIncremented({ payload }) {
38
+ state.count += payload.amount
39
+ },
40
+ }))
41
+ .withCommands((state, event) => ({
42
+ increment(amount: number) {
43
+ return event('Incremented', { amount })
44
+ },
45
+ }))
46
+
47
+ // 2. Create an event store with the aggregate root
48
+ const eventStore = createEventStore({
49
+ aggregateRoots: [counter],
50
+ })
51
+
52
+ // 3. Build a read model with a projection
53
+ const totals = new Map<string, number>()
54
+
55
+ eventStore.createProjection('counter-totals').withEventHandlers({
56
+ onIncremented({ streamId, payload }) {
57
+ totals.set(streamId, (totals.get(streamId) ?? 0) + payload.amount)
58
+ },
59
+ })
60
+
61
+ // 4. Execute commands on a new stream
62
+ const stream = await counter.newStream().increment(1).increment(5).settled()
63
+ console.log(totals.get(stream.streamId)) // 6
64
+ ```
65
+
66
+ ## Storage Adapters
67
+
68
+ | Adapter | Import Path | Use Case |
69
+ |---------|------------|----------|
70
+ | In-Memory | `@requence/event-sourcing/memory` | Testing & prototyping |
71
+ | PostgreSQL (Drizzle) | `@requence/event-sourcing/drizzle/postgres` | Production |
72
+
73
+ ## Documentation
74
+
75
+ Full documentation — including concept guides, a step-by-step tutorial, and API reference — is available at:
76
+
77
+ **[https://event-sourcing.docs.requence.cloud](https://event-sourcing.docs.requence.cloud)**
78
+
79
+ ## License
80
+
81
+ [MIT](./LICENSE)
@@ -34,6 +34,7 @@ function buildProcessManagerCreator(params) {
34
34
  let state = null;
35
35
  let initialState = null;
36
36
  let exclusive = true;
37
+ let sessionActive = false;
37
38
  let generateRelatedStreamEvents;
38
39
  let checkpointApi;
39
40
  let lastEventPosition = -1;
@@ -97,6 +98,25 @@ function buildProcessManagerCreator(params) {
97
98
  async isReady() {
98
99
  await hydrated;
99
100
  },
101
+ async beginSession() {
102
+ if (!hasState)
103
+ return;
104
+ const checkpoint = await params.checkpoint.get("processManager", name);
105
+ if (checkpoint) {
106
+ state = checkpoint.metadata?.state ?? clone(initialState);
107
+ lastEventPosition = checkpoint.lastEventPosition;
108
+ } else {
109
+ state = clone(initialState);
110
+ lastEventPosition = -1;
111
+ }
112
+ sessionActive = true;
113
+ },
114
+ endSession() {
115
+ if (!hasState)
116
+ return;
117
+ state = null;
118
+ sessionActive = false;
119
+ },
100
120
  async apply(event) {
101
121
  await apply(event, false);
102
122
  },
@@ -151,6 +171,10 @@ function buildProcessManagerCreator(params) {
151
171
  },
152
172
  async state() {
153
173
  await hydrated;
174
+ if (!sessionActive && hasState) {
175
+ const checkpoint = await params.checkpoint.get("processManager", name);
176
+ return checkpoint?.metadata?.state ?? clone(initialState);
177
+ }
154
178
  return state;
155
179
  },
156
180
  async init(catchUp) {
@@ -183,6 +207,7 @@ function buildProcessManagerCreator(params) {
183
207
  state = metadata.state ?? state;
184
208
  }
185
209
  });
210
+ state = null;
186
211
  resolveHydrated();
187
212
  },
188
213
  $inferState: null
@@ -207,4 +232,4 @@ function buildProcessManagerCreator(params) {
207
232
 
208
233
  export { getProcessManagerInfo, isInsideProcessManager, buildProcessManagerCreator };
209
234
 
210
- //# debugId=F1319F7D0A1BF35E64756E2164756E21
235
+ //# debugId=1BE5E249A230C5FD64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/createProcessManager.ts"],
4
+ "sourcesContent": [
5
+ "import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n type CheckpointApi,\n type CheckpointMethods,\n createCheckpointApi,\n} from './createCheckpointApi.ts'\nimport type { LoadEvents, OnProgress } from './createEventStore.ts'\nimport {\n ProcessManagerEventHandlerExecutionError,\n RefreshingSkipError,\n} from './errors.ts'\nimport { isRefreshing, withRefreshing } from './refresh.ts'\nimport { clone } from './superjson.ts'\nimport type {\n AfterEffectHandlers,\n BaseOutputEvent,\n EventHandlers,\n EventTemplate,\n Keys,\n Merge,\n StreamEvents,\n} from './utilityTypes.js'\n\ntype ProcessManagerInfo = {\n name: string\n event: BaseOutputEvent\n}\nconst processManagerInfoStore = new AsyncLocalStorage<ProcessManagerInfo>()\n\nfunction withProcessManagerInfo(\n info: ProcessManagerInfo,\n handler: () => Promise<void>,\n) {\n return processManagerInfoStore.run(info, handler)\n}\n\nexport function getProcessManagerInfo() {\n return processManagerInfoStore.getStore()\n}\n\nexport function isInsideProcessManager() {\n return Boolean(getProcessManagerInfo())\n}\n\ntype ProcessManagerEventHandlers<Events extends EventTemplate> = EventHandlers<\n Events,\n { refreshing: boolean }\n>\n\ntype ProcessManagerAfterEffectHandlers<Events extends EventTemplate> =\n AfterEffectHandlers<Events, { refreshing: boolean }>\n\nexport type InternalProcessManager = {\n apply: (event: BaseOutputEvent) => Promise<void>\n applyAfter: (event: BaseOutputEvent) => Promise<void>\n beginSession: () => Promise<void>\n endSession: () => void\n setRelatedStreamEvents: (\n generateRelatedStreamEvents: (\n eventHandlers: EventHandlers<EventTemplate>,\n ) => StreamEvents[],\n ) => void\n isReady(): Promise<void>\n beginRefresh(): Promise<void>\n progressRefresh(\n index: number,\n event: BaseOutputEvent,\n after: boolean,\n ): Promise<void>\n endRefresh(): void\n init(catchUp: boolean): Promise<void>\n hasState(): boolean\n}\n\nexport type ProcessManagerApi<\n State = never,\n Events extends EventTemplate = never,\n Flags extends {\n withState: boolean\n withEventHandlers: boolean\n concurrent: boolean\n withAfterEffects: boolean\n } = {\n withState: false\n withEventHandlers: false\n concurrent: false\n withAfterEffects: false\n },\n> = {\n withState: <NextState>(\n state: NextState,\n ) => Omit<\n ProcessManagerApi<NextState, Events, Merge<Flags, { withState: true }>>,\n Keys<Merge<Flags, { withState: true }>>\n >\n withEventHandlers: (\n handlers: [State] extends [never]\n ? ProcessManagerEventHandlers<Events>\n : (state: State) => ProcessManagerEventHandlers<Events>,\n ) => Omit<\n ProcessManagerApi<State, Events, Merge<Flags, { withEventHandlers: true }>>,\n Keys<Merge<Flags, { withEventHandlers: true }>>\n >\n withAfterEffects: (\n handlers: [State] extends [never]\n ? ProcessManagerAfterEffectHandlers<Events>\n : (state: State) => ProcessManagerAfterEffectHandlers<Events>,\n ) => Omit<\n ProcessManagerApi<State, Events, Merge<Flags, { withAfterEffects: true }>>,\n Keys<Merge<Flags, { withAfterEffects: true }>>\n >\n concurrent: () => Omit<\n ProcessManagerApi<State, Events, Merge<Flags, { concurrent: true }>>,\n Keys<Merge<Flags, { concurrent: true }>>\n >\n isReady(): Promise<void>\n $inferState: State\n} & (Flags['withState'] extends true\n ? {\n refreshState: () => Promise<void>\n state: () => Promise<State>\n }\n : {})\n\nexport function buildProcessManagerCreator(params: {\n loadEvents: LoadEvents\n checkpoint: CheckpointMethods\n onRefresh?: OnProgress\n}) {\n return (name: string): ProcessManagerApi => {\n let idle = true\n let createEventHandlers: (\n state: any,\n ) => ProcessManagerEventHandlers<any> = () => ({})\n let createAfterEffects: (\n state: any,\n ) => ProcessManagerAfterEffectHandlers<any> = () => ({})\n\n let hasState = false\n let state: any = null\n let initialState: any = null\n let exclusive = true\n let sessionActive = false\n let generateRelatedStreamEvents: (\n eventHandlers: EventHandlers<any>,\n ) => StreamEvents[]\n let checkpointApi: CheckpointApi\n let lastEventPosition = -1\n const { promise: hydrated, resolve: resolveHydrated } =\n Promise.withResolvers<void>()\n\n const locks = new Map<string, Promise<void>>()\n const apply = async (\n event: BaseOutputEvent,\n after: boolean,\n hydrating = false,\n ) => {\n const handler = after\n ? createAfterEffects(state)[`after${event.type}`]\n : createEventHandlers(state)[`on${event.type}`]\n\n if (!handler) {\n return Promise.resolve()\n }\n\n if (hydrating) {\n lastEventPosition = event.position\n } else {\n await hydrated\n // event was already applied through hydration\n if (event.position <= lastEventPosition) {\n return\n }\n }\n const unlocked = !exclusive\n ? Promise.resolve()\n : (locks.get(event.streamId)?.catch(() => {}) ?? Promise.resolve())\n\n const runner = (async () => {\n await unlocked\n const refreshing = isRefreshing()\n await withProcessManagerInfo(\n {\n name,\n event,\n },\n async () => {\n try {\n await handler(event, { refreshing })\n } catch (error) {\n if (error instanceof RefreshingSkipError) {\n if (refreshing) {\n return\n }\n\n throw new Error(\n 'RefreshingSkipError should never be thrown outside refresh',\n )\n }\n\n if (!(error instanceof Error)) {\n throw error\n }\n\n throw new ProcessManagerEventHandlerExecutionError(\n name,\n after ? `after${event.type}` : `on${event.type}`,\n event,\n error,\n )\n }\n },\n )\n await checkpointApi.upsert(event, { state })\n })()\n\n if (exclusive) {\n locks.set(event.streamId, runner)\n\n runner\n .finally(() => {\n if (locks.get(event.streamId) === runner) {\n locks.delete(event.streamId)\n }\n })\n .catch(() => {})\n return runner\n }\n\n return Promise.resolve()\n }\n\n let resolveRefresh: null | (() => void) = null\n\n const api = {\n name,\n hasState() {\n return hasState\n },\n async isReady() {\n await hydrated\n },\n async beginSession() {\n if (!hasState) return\n const checkpoint = await params.checkpoint.get(\n 'processManager',\n name,\n )\n if (checkpoint) {\n state = checkpoint.metadata?.state ?? clone(initialState)\n lastEventPosition = checkpoint.lastEventPosition\n } else {\n state = clone(initialState)\n lastEventPosition = -1\n }\n sessionActive = true\n },\n endSession() {\n if (!hasState) return\n state = null\n sessionActive = false\n },\n async apply(event) {\n await apply(event, false)\n },\n async applyAfter(event) {\n await apply(event, true)\n },\n withState(nextState) {\n state = clone(nextState)\n initialState = clone(nextState)\n hasState = true\n return api as any\n },\n concurrent() {\n exclusive = false\n return api\n },\n withEventHandlers(handlers) {\n createEventHandlers =\n typeof handlers === 'function' ? (handlers as any) : () => handlers\n\n return api\n },\n withAfterEffects(handlers) {\n createAfterEffects =\n typeof handlers === 'function' ? (handlers as any) : () => handlers\n\n return api\n },\n setRelatedStreamEvents(generate) {\n generateRelatedStreamEvents = generate\n },\n async beginRefresh() {\n params.onRefresh?.begin?.(name)\n await checkpointApi.clear()\n lastEventPosition = -1\n state = initialState\n },\n async progressRefresh(index, event, after) {\n await apply(event, after, true)\n\n if (\n !checkpointApi.relatedStreamEvents ||\n checkpointApi.relatedStreamEvents.some((streamEvent) =>\n streamEvent.events.includes(event.type),\n )\n ) {\n params.onRefresh?.progress?.(name, index, event)\n }\n },\n endRefresh() {\n params.onRefresh?.end?.(name)\n resolveHydrated()\n },\n async refreshState() {\n if (!idle) {\n await refresh()\n return\n }\n const { promise, resolve } = Promise.withResolvers<void>()\n resolveRefresh = resolve\n return promise\n },\n async state() {\n await hydrated\n if (!sessionActive && hasState) {\n const checkpoint = await params.checkpoint.get(\n 'processManager',\n name,\n )\n return checkpoint?.metadata?.state ?? clone(initialState)\n }\n return state\n },\n async init(catchUp) {\n idle = false\n const relatedStreamEvents = generateRelatedStreamEvents({\n ...createEventHandlers(null),\n ...createAfterEffects(null),\n })\n\n checkpointApi = createCheckpointApi({\n ...params.checkpoint,\n name,\n relatedStreamEvents,\n type: 'processManager',\n loadEvents: params.loadEvents,\n apply: (event) => apply(event, false, true),\n applyAfter: (event) => apply(event, true, true),\n })\n\n if (resolveRefresh) {\n await refresh()\n return\n }\n if (!catchUp) {\n return\n }\n\n await checkpointApi.rehydrated({\n getMetadata() {\n return { state }\n },\n onMetadata(metadata) {\n state = metadata.state ?? state\n },\n })\n\n // Release state after hydration — it will be loaded\n // from the checkpoint on the next beginSession call\n state = null\n\n resolveHydrated()\n },\n $inferState: null as never,\n } as ProcessManagerApi & InternalProcessManager\n\n async function refresh() {\n await withRefreshing(async () => {\n await api.beginRefresh()\n await checkpointApi.rehydrated({\n getMetadata() {\n return { state }\n },\n onProgress(index, event) {\n params.onRefresh?.progress?.(name, index, event)\n },\n })\n })\n api.endRefresh()\n }\n\n return api\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "1BE5E249A230C5FD64756E2164756E21",
9
+ "names": []
10
+ }
@@ -5,29 +5,29 @@ import {
5
5
  } from "./chunk-z388cd25.js";
6
6
  import {
7
7
  getProjectionInfo
8
- } from "./chunk-ncpk70p4.js";
8
+ } from "./chunk-8ev7sb2v.js";
9
9
  import {
10
10
  getProcessManagerInfo
11
- } from "./chunk-m07vf8q9.js";
11
+ } from "./chunk-13wtyj2h.js";
12
12
  import {
13
13
  clone
14
14
  } from "./chunk-6q8mr1sg.js";
15
- import {
16
- isRefreshing
17
- } from "./chunk-9psg50cb.js";
18
- import {
19
- awaitAll,
20
- normalizeArray
21
- } from "./chunk-tfy01fah.js";
22
15
  import {
23
16
  createSnapshotGenerator
24
17
  } from "./chunk-pmfzjavb.js";
18
+ import {
19
+ isRefreshing
20
+ } from "./chunk-9psg50cb.js";
25
21
  import {
26
22
  CommandError,
27
23
  EventValidationError,
28
24
  InfiniteLoopError,
29
25
  ValidationError
30
26
  } from "./chunk-qdczt68t.js";
27
+ import {
28
+ awaitAll,
29
+ normalizeArray
30
+ } from "./chunk-tfy01fah.js";
31
31
 
32
32
  // src/createAggregateRoot.ts
33
33
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -386,4 +386,4 @@ function createAggregateRoot(type) {
386
386
 
387
387
  export { createAggregateRoot };
388
388
 
389
- //# debugId=7975EF0D4D2A5E9964756E2164756E21
389
+ //# debugId=0C7D081243723F6364756E2164756E21
@@ -5,6 +5,6 @@
5
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 }[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
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "7975EF0D4D2A5E9964756E2164756E21",
8
+ "debugId": "0C7D081243723F6364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,3 +1,6 @@
1
+ import {
2
+ createSnapshotGenerator
3
+ } from "./chunk-pmfzjavb.js";
1
4
  import {
2
5
  isReplaying,
3
6
  withReplaying
@@ -5,9 +8,6 @@ import {
5
8
  import {
6
9
  createCheckpointApi
7
10
  } from "./chunk-zf3x573k.js";
8
- import {
9
- createSnapshotGenerator
10
- } from "./chunk-pmfzjavb.js";
11
11
  import {
12
12
  ProjectionEventHandlerExecutionError,
13
13
  ProjectionReplayLoopError,
@@ -310,4 +310,4 @@ function buildProjectionCreator(params) {
310
310
 
311
311
  export { getProjectionInfo, isInsideProjection, buildProjectionCreator };
312
312
 
313
- //# debugId=B979DBD1EC4FBD5364756E2164756E21
313
+ //# debugId=B978A4271A037C0964756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport z from 'zod/v4'\n\nimport {\n type CheckpointApi,\n type CheckpointMethods,\n createCheckpointApi,\n} from './createCheckpointApi.ts'\nimport type { LoadEvents, OnProgress } from './createEventStore.ts'\nimport {\n ProjectionEventHandlerExecutionError,\n ProjectionReplayLoopError,\n ReplaySkipError,\n ValidationError,\n} from './errors.ts'\nimport { isReplaying, withReplaying } from './replay.ts'\nimport type {\n CompleteSnapshotGenerator,\n InternalSnapshotGenerator,\n SnapshotGenerator,\n} from './snapshotGenerator.ts'\nimport createSnapshotGenerator from './snapshotGenerator.ts'\nimport type {\n AllEvents,\n BaseOutputEvent,\n EventHandlers,\n EventTemplate,\n Keys,\n MaybePromise,\n Merge,\n OutputEvent,\n StreamEvents,\n} from './utilityTypes.d.ts'\n\nconst hydratingStore = new AsyncLocalStorage<boolean>()\n\nfunction isHydrating() {\n return hydratingStore.getStore() ?? false\n}\n\nasync function withHydrating(handler: () => Promise<void>) {\n await hydratingStore.run(true, handler)\n}\n\ntype ProjectionInfo = {\n name: string\n event: BaseOutputEvent\n}\nconst projectionInfoStore = new AsyncLocalStorage<ProjectionInfo>()\n\nfunction withProjectionInfo(\n info: ProjectionInfo,\n handler: () => Promise<void>,\n) {\n return projectionInfoStore.run(info, handler)\n}\n\nexport function getProjectionInfo() {\n return projectionInfoStore.getStore()\n}\n\nexport function isInsideProjection() {\n return Boolean(getProjectionInfo())\n}\n\ntype ReplayConfig = {\n deleteOne?: (id: string) => MaybePromise<void>\n deleteAll?: () => MaybePromise<void>\n}\n\ntype ProjectionEventHandlers<Events extends EventTemplate> = EventHandlers<\n Events,\n {\n replaying: boolean\n replayUntil: (\n position: number,\n filterEvents?: (event: OutputEvent<Events>) => boolean,\n ) => Promise<void>\n }\n>\n\ntype ReplayProjection<Events extends EventTemplate> = {\n replayOne: (streamId: string) => Promise<void>\n replayUntil: (\n streamId: string,\n position: number,\n filterEvents?: (event: OutputEvent<Events>) => boolean,\n ) => Promise<void>\n replay: () => Promise<void>\n}\n\nexport type InternalProjection = {\n apply: (event: BaseOutputEvent) => Promise<void>\n setRelatedStreamEvents: (\n generateRelatedStreamEvents: (\n eventHandlers: EventHandlers<EventTemplate>,\n ) => StreamEvents[],\n ) => void\n isReady(): Promise<void>\n canReplay(): boolean\n beginReplay(): Promise<void>\n progressReplay(index: number, event: BaseOutputEvent): Promise<void>\n endReplay(): void\n init(catchUp: boolean): Promise<void>\n}\n\nexport type ProjectionApi<\n Events extends EventTemplate = never,\n RConfig extends ReplayConfig = never,\n Flags extends {\n withEventHandlers: boolean\n withGlobalEventHandler: boolean\n concurrent: boolean\n withReplay: boolean\n withSnapshots: boolean\n } = {\n withEventHandlers: false\n withGlobalEventHandler: false\n concurrent: false\n withReplay: false\n withSnapshots: true\n },\n> = {\n withEventHandlers: (\n handlers: ProjectionEventHandlers<Events>,\n ) => Omit<\n ProjectionApi<Events, RConfig, Merge<Flags, { withEventHandlers: true }>>,\n Keys<Merge<Flags, { withEventHandlers: true }>>\n >\n withGlobalEventHandler: (\n handler: (\n event: AllEvents<Events>,\n methods: ReplayProjection<Events>,\n ) => MaybePromise<void>,\n ) => Omit<\n ProjectionApi<\n Events,\n RConfig,\n Merge<Flags, { withGlobalEventHandler: true }>\n >,\n Keys<Merge<Flags, { withGlobalEventHandler: true }>>\n >\n concurrent: () => Omit<\n ProjectionApi<Events, RConfig, Merge<Flags, { concurrent: true }>>,\n Keys<Merge<Flags, { concurrent: true }>>\n >\n withReplay: <Config extends ReplayConfig>(\n config: Config,\n ) => Omit<\n ProjectionApi<Events, Config, Merge<Flags, { withReplay: true }>>,\n Keys<Merge<Flags, { withReplay: true }>>\n >\n withSnapshots: (\n handler: (\n generator: SnapshotGenerator<Omit<Snapshot, 'schemaVersion' | 'state'>>,\n ) => CompleteSnapshotGenerator,\n ) => Omit<\n ProjectionApi<Events, RConfig, Merge<Flags, { withSnapshots: true }>>,\n Keys<Merge<Flags, { withSnapshots: true }>>\n >\n isReady(): Promise<void>\n} & ('deleteOne' extends keyof RConfig\n ? Pick<ReplayProjection<Events>, 'replayOne' | 'replayUntil'>\n : {}) &\n ('deleteAll' extends keyof RConfig\n ? Pick<ReplayProjection<Events>, 'replay'>\n : {})\n\nexport type ProjectionApiWithSnapshots<\n Events extends EventTemplate = never,\n RConfig extends ReplayConfig = never,\n Flags extends {\n withEventHandlers: boolean\n withGlobalEventHandler: boolean\n concurrent: boolean\n withReplay: boolean\n withSnapshots: boolean\n } = {\n withEventHandlers: false\n withGlobalEventHandler: false\n concurrent: false\n withReplay: false\n withSnapshots: false\n },\n> = ProjectionApi<Events, RConfig, Flags>\n\nconst snapshotSchema = z.object({\n projectionId: z.string(),\n projectionType: z.string(),\n lastEventPosition: z.int(),\n state: z.unknown(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n schemaVersion: z.int(),\n createdAt: z.date(),\n})\n\nexport type Snapshot = z.output<typeof snapshotSchema>\n\nexport type ProjectionSnapshotMethods = {\n get: (select: {\n projection: string\n id: string\n }) => MaybePromise<Snapshot | null | undefined>\n put: (snapshot: Snapshot) => MaybePromise<void>\n delete: (\n target: { id?: string; projection: string },\n fromPosition?: number,\n ) => MaybePromise<void>\n incrementAppliedCount: (target: {\n projection: string\n id: string\n }) => MaybePromise<number>\n}\n\nexport function buildProjectionCreator(params: {\n loadEvents: LoadEvents\n checkpoint: CheckpointMethods\n onReplay?: OnProgress\n snapshot?: ProjectionSnapshotMethods\n}): (name: string) => ProjectionApi {\n return (name) => {\n let idle = true\n let replaying = false\n let handlers: ProjectionEventHandlers<any> = {}\n let globalEventHandler:\n | ((event: BaseOutputEvent) => MaybePromise<void>)\n | null = null\n let generateRelatedStreamEvents: (\n eventHandlers: EventHandlers<any>,\n ) => StreamEvents[]\n let relatedStreamEvents: StreamEvents[] | null = null\n let exclusive = true\n let checkpointApi: CheckpointApi\n let lastEventPosition = -1\n\n let replayConfig: ReplayConfig | null = null\n\n let snapshotting:\n | (CompleteSnapshotGenerator & InternalSnapshotGenerator)\n | null = null\n\n const { promise: hydrated, resolve: resolveHydrated } =\n Promise.withResolvers<void>()\n\n const locks = new Map<string, Promise<void>>()\n const apply = async (event: BaseOutputEvent) => {\n const handler = handlers[`on${event.type}`]\n if (!handler && !globalEventHandler) {\n return Promise.resolve()\n }\n\n if (isHydrating()) {\n lastEventPosition = event.position\n } else {\n await hydrated\n // event was already applied through hydration\n if (event.position <= lastEventPosition) {\n return\n }\n }\n\n const unlocked = !exclusive\n ? Promise.resolve()\n : (locks.get(event.streamId)?.catch(() => {}) ?? Promise.resolve())\n\n const runner = (async () => {\n await unlocked\n await withProjectionInfo({ name, event }, async () => {\n try {\n await handler?.(event, {\n replaying,\n async replayUntil(position, filterEvents) {\n if (position >= event.position) {\n throw new ProjectionReplayLoopError(\n `Event handler on${event.type} of projection ${name} tried to replay to the future`,\n { name, eventHandler: `on${event.type}` },\n event,\n )\n }\n\n locks.delete(event.streamId)\n return api.replayUntil(event.streamId, position, filterEvents)\n },\n })\n } catch (error) {\n if (error instanceof ReplaySkipError) {\n if (isReplaying()) {\n return\n }\n\n throw new Error(\n 'ReplaySkipError should never be thrown outside replay',\n )\n }\n\n if (\n !(error instanceof Error) ||\n error instanceof ProjectionReplayLoopError\n ) {\n throw error\n }\n throw new ProjectionEventHandlerExecutionError(\n name,\n `on${event.type}`,\n event,\n error,\n )\n }\n try {\n await globalEventHandler?.(event)\n } catch (error) {\n if (!(error instanceof Error)) {\n throw error\n }\n\n throw new ProjectionEventHandlerExecutionError(\n name,\n 'GLOBAL',\n event,\n error,\n )\n }\n })\n\n if (params.snapshot && snapshotting) {\n const appliedEvents = await params.snapshot.incrementAppliedCount({\n projection: name,\n id: event.streamId,\n })\n const snapshot = await snapshotting.internalCapture(\n event,\n appliedEvents,\n )\n\n if (snapshot) {\n await params.snapshot.put({\n projectionType: name,\n projectionId: event.streamId,\n lastEventPosition: event.position,\n state: snapshot.state,\n schemaVersion: snapshot.version,\n createdAt: new Date(),\n })\n }\n }\n\n await checkpointApi.upsert(event)\n })()\n\n if (exclusive) {\n locks.set(event.streamId, runner)\n\n runner\n .finally(() => {\n if (locks.get(event.streamId) === runner) {\n locks.delete(event.streamId)\n }\n })\n .catch(() => {})\n return runner\n }\n\n return Promise.resolve()\n }\n\n let resolveReplay: null | (() => void) = null\n let resolveReplayOne: null | (() => void) = null\n let replayOneStreamId: null | string = null\n\n const api = {\n name: 'projection ' + name,\n async isReady() {\n await hydrated\n },\n withEventHandlers(h) {\n handlers = h\n return api\n },\n withGlobalEventHandler(handler) {\n globalEventHandler = handler as any\n return api\n },\n concurrent() {\n exclusive = false\n return api\n },\n setRelatedStreamEvents(generate) {\n generateRelatedStreamEvents = generate\n },\n withReplay(config) {\n replayConfig = config\n return api as any\n },\n\n withSnapshots(handler) {\n snapshotting = handler(createSnapshotGenerator() as any) as any\n return api\n },\n\n async apply(event) {\n await apply(event)\n },\n\n async replayOne(streamId: string) {\n if (!idle) {\n await replayOne(streamId)\n return\n }\n\n const { promise, resolve } = Promise.withResolvers<void>()\n resolveReplayOne = resolve\n replayOneStreamId = streamId\n return promise\n },\n\n async replay() {\n if (!idle) {\n await replay()\n return\n }\n const { promise, resolve } = Promise.withResolvers<void>()\n resolveReplay = resolve\n return promise\n },\n\n canReplay() {\n return Boolean(replayConfig)\n },\n\n async beginReplay() {\n if (!replayConfig?.deleteAll) {\n throw new Error(\n 'this projection does not support replay all. withReplay({ deleteAll }) not implemented.',\n )\n }\n\n lastEventPosition = -1\n params.onReplay?.begin?.(name)\n await params.snapshot?.delete({ projection: name })\n await replayConfig.deleteAll()\n },\n\n async progressReplay(index, event) {\n await withReplaying(() => withHydrating(() => apply(event)))\n if (\n !checkpointApi.relatedStreamEvents ||\n checkpointApi.relatedStreamEvents.some((streamEvent) =>\n streamEvent.events.includes(event.type),\n )\n ) {\n params.onReplay?.progress?.(name, index, event)\n }\n },\n\n endReplay() {\n params.onReplay?.end?.(name)\n resolveHydrated()\n },\n\n async replayUntil(id, position, filterEvents = () => true) {\n let startPosition = 0\n if (snapshotting) {\n await params.snapshot?.delete({ id, projection: name }, position)\n const snapshot = await params.snapshot?.get({ id, projection: name })\n if (snapshot) {\n const result = snapshotSchema.safeParse(snapshot)\n\n if (!result.success) {\n throw new ValidationError(\n 'loaded projection snapshot does not comply with schema',\n result.error,\n )\n }\n snapshotting.internalApply(result.data)\n startPosition = result.data.lastEventPosition + 1\n }\n }\n\n const events = params.loadEvents(\n relatedStreamEvents?.map((relatedStreamEvent) => ({\n ...relatedStreamEvent,\n id,\n })) ?? null,\n {\n from: startPosition,\n to: position,\n },\n )\n\n replaying = true\n await withReplaying(async () => {\n for await (const event of events) {\n if ((filterEvents as (event: BaseOutputEvent) => boolean)(event)) {\n await apply(event)\n }\n }\n })\n replaying = false\n },\n async init(catchUp) {\n idle = false\n relatedStreamEvents = globalEventHandler\n ? null\n : generateRelatedStreamEvents(handlers as EventHandlers<any>)\n checkpointApi = createCheckpointApi({\n ...params.checkpoint,\n name,\n relatedStreamEvents,\n type: 'projection',\n loadEvents: params.loadEvents,\n apply: (event) => withHydrating(() => apply(event)),\n })\n\n if (resolveReplay) {\n await replay()\n resolveReplay()\n return\n }\n\n if (resolveReplayOne && replayOneStreamId) {\n await replayOne(replayOneStreamId)\n }\n\n if (!catchUp) {\n return\n }\n\n await checkpointApi.rehydrated()\n resolveHydrated()\n resolveReplayOne?.()\n },\n } as ProjectionApi & InternalProjection & ReplayProjection<any>\n\n async function replayOne(id: string) {\n if (!replayConfig?.deleteOne) {\n throw new Error(\n 'this projection does not support replay one. withReplay({ deleteOne }) not implemented.',\n )\n }\n await params.snapshot?.delete({ id, projection: name })\n await replayConfig.deleteOne(id)\n const streamIds = relatedStreamEvents\n ? relatedStreamEvents.map((relatedStreamEvent) => ({\n ...relatedStreamEvent,\n id,\n }))\n : null\n const events = params.loadEvents(streamIds)\n\n replaying = true\n await withReplaying(async () => {\n for await (const event of events) {\n await withHydrating(() => apply(event))\n }\n })\n replaying = false\n }\n\n async function replay() {\n await api.beginReplay()\n const events = params.loadEvents(relatedStreamEvents)\n let index = 0\n replaying = true\n await withReplaying(async () => {\n for await (const event of events) {\n await api.progressReplay(index, event)\n index++\n }\n })\n replaying = false\n api.endReplay()\n }\n\n return api\n }\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "B979DBD1EC4FBD5364756E2164756E21",
8
+ "debugId": "B978A4271A037C0964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -13,10 +13,10 @@ import {
13
13
  } from "./chunk-z388cd25.js";
14
14
  import {
15
15
  buildProjectionCreator
16
- } from "./chunk-ncpk70p4.js";
16
+ } from "./chunk-8ev7sb2v.js";
17
17
  import {
18
18
  buildProcessManagerCreator
19
- } from "./chunk-m07vf8q9.js";
19
+ } from "./chunk-13wtyj2h.js";
20
20
  import {
21
21
  withRefreshing
22
22
  } from "./chunk-9psg50cb.js";
@@ -39,15 +39,22 @@ function createEventStore(params) {
39
39
  let exclusiveEmitEventsChain = Promise.resolve();
40
40
  const emitEvents = async (events) => {
41
41
  exclusiveEmitEventsChain = exclusiveEmitEventsChain.then(async () => {
42
- for (const event of events) {
43
- await Promise.all([
44
- ...processManagers.values(),
45
- ...projections.values(),
46
- ...eventListeners.values()
47
- ].map((listener) => listener.apply(event)));
48
- }
49
- for (const event of events) {
50
- await Promise.all([...processManagers.values(), ...eventListeners.values()].map((processManager) => processManager.applyAfter(event)));
42
+ await Promise.all(processManagers.values().map((pm) => pm.beginSession()));
43
+ try {
44
+ for (const event of events) {
45
+ await Promise.all([
46
+ ...processManagers.values(),
47
+ ...projections.values(),
48
+ ...eventListeners.values()
49
+ ].map((listener) => listener.apply(event)));
50
+ }
51
+ for (const event of events) {
52
+ await Promise.all([...processManagers.values(), ...eventListeners.values()].map((processManager) => processManager.applyAfter(event)));
53
+ }
54
+ } finally {
55
+ for (const pm of processManagers.values()) {
56
+ pm.endSession();
57
+ }
51
58
  }
52
59
  });
53
60
  return exclusiveEmitEventsChain;
@@ -230,4 +237,4 @@ function createEventStore(params) {
230
237
 
231
238
  export { createEventStore };
232
239
 
233
- //# debugId=7493A3991CE6299464756E2164756E21
240
+ //# debugId=E51438C1FD14F00B64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/createEventStore.ts"],
4
+ "sourcesContent": [
5
+ "import type {\n AggregateRootApi,\n AggregateRootSnapshotMethods,\n AnyAggregateRoot,\n InternalAggregateRootApi,\n} from './createAggregateRoot.ts'\nimport type { CheckpointMethods } from './createCheckpointApi.ts'\nimport {\n type EventListenerApi,\n type InternalEventListener,\n createEventListener,\n} from './createEventListener.ts'\nimport {\n type InternalProcessManager,\n type ProcessManagerApi,\n buildProcessManagerCreator,\n} from './createProcessManager.ts'\nimport {\n type InternalProjection,\n type ProjectionApi,\n type ProjectionApiWithSnapshots,\n type ProjectionSnapshotMethods,\n buildProjectionCreator,\n} from './createProjection.ts'\nimport lock, { type LockCreator } from './lock.ts'\nimport { withRefreshing } from './refresh.ts'\nimport createTransaction from './transaction.ts'\nimport type {\n BaseInputEvent,\n BaseOutputEvent,\n EventHandlers,\n EventTemplate,\n MaybePromise,\n Stream,\n StreamEvents,\n StreamId,\n StreamIdEvents,\n} from './utilityTypes.ts'\nimport {\n type WrappedEvent,\n unwrapEvent,\n wrappedEventBuilder,\n} from './wrappedEventBuilder.ts'\n\nexport type LoadEvents = (\n select:\n | Stream\n | StreamId\n | Stream[]\n | StreamId[]\n | StreamEvents\n | StreamEvents[]\n | StreamIdEvents\n | StreamIdEvents[]\n | null,\n range?: { from: number; to?: number },\n) => AsyncGenerator<BaseOutputEvent>\n\ntype AppendEvents = (\n streamId: StreamId,\n events: BaseInputEvent[],\n expectedVersion: number,\n) => MaybePromise<BaseOutputEvent[]>\n\nexport type InternalAppendEvents = (\n streamId: StreamId,\n events: BaseInputEvent[],\n expectedVersion: number,\n) => MaybePromise<BaseOutputEvent[]>\n\nexport type EmitEvents = (events: BaseOutputEvent[]) => Promise<void>\n\nexport type EventsFromRoot<Root> =\n Root extends Omit<AggregateRootApi<any, any, infer E>, any> ? E : never\n\nexport type OnProgress = {\n begin?: (projectionName: string) => void\n progress?: (\n projectionName: string,\n index: number,\n event: BaseOutputEvent,\n ) => void\n end?: (projectionName: string) => void\n}\n\ninterface BaseEventStoreParams<Root extends AnyAggregateRoot> {\n loadEvents: LoadEvents\n appendEvents: AppendEvents\n aggregateRoots: Root[]\n checkpoint: CheckpointMethods\n lock?: LockCreator\n projectionSnapshot?: ProjectionSnapshotMethods\n onProjectionReplay?: OnProgress\n onProcessManagerRefresh?: OnProgress\n autoInit?: boolean\n}\n\nexport interface EventStoreParamsWithAggregateRootSnapshots<\n Root extends AnyAggregateRoot,\n> extends BaseEventStoreParams<Root> {\n aggregateRootSnapshot: AggregateRootSnapshotMethods\n postProcessEvent?: (\n event: WrappedEvent<EventsFromRoot<Root>>,\n aggregateRoot: Root,\n ) => WrappedEvent\n}\n\nexport interface EventStoreParamsWithoutAggregateRootSnapshots<\n Root extends AnyAggregateRoot,\n> extends BaseEventStoreParams<Root> {\n aggregateRoots: Root[]\n aggregateRootSnapshot?: never\n postProcessEvent?: (\n event: WrappedEvent<EventsFromRoot<Root>>,\n aggregateRoot: Root,\n ) => WrappedEvent\n}\n\nexport type EventStore<\n Event extends EventTemplate,\n Root extends AnyAggregateRoot,\n SupportsProjectionSnapshots = boolean,\n> = {\n createProjection(\n name: string,\n ): SupportsProjectionSnapshots extends true\n ? ProjectionApiWithSnapshots<Event>\n : ProjectionApi<Event>\n createProcessManager(name: string): ProcessManagerApi<never, Event>\n createEventListener(name: string): EventListenerApi<Event>\n rebuild: () => Promise<void>\n isReady: () => Promise<void>\n init: () => Promise<EventStore<Event, Root, SupportsProjectionSnapshots>>\n getAggregateRoot<S extends Root['type']>(\n type: S,\n ): Root extends { type: S } ? Root : never\n transaction<T extends () => any>(handler: T): Promise<Awaited<ReturnType<T>>>\n}\n\nexport function createEventStore<const Root extends AnyAggregateRoot>(\n params: EventStoreParamsWithoutAggregateRootSnapshots<Root>,\n): EventStore<EventsFromRoot<Root>, Root, false>\nexport function createEventStore<const Root extends AnyAggregateRoot>(\n params: EventStoreParamsWithAggregateRootSnapshots<Root>,\n): EventStore<EventsFromRoot<Root>, Root, true>\nexport function createEventStore<const Root extends AnyAggregateRoot>(\n params:\n | EventStoreParamsWithoutAggregateRootSnapshots<Root>\n | EventStoreParamsWithAggregateRootSnapshots<Root>,\n) {\n const transaction = createTransaction()\n const { promise: initialized, resolve: resolveInitialized } =\n Promise.withResolvers<void>()\n const projections = new Map<string, InternalProjection>()\n const processManagers = new Map<string, InternalProcessManager>()\n const eventListeners = new Map<string, InternalEventListener>()\n const aggregatRootsByEvents = new Map<\n string,\n { aggregateRoot: InternalAggregateRootApi; eventType: string }\n >()\n\n let allReplaying = false\n let initializing = false\n\n const assertInitializing = () => {\n if (!initializing && params.autoInit === false) {\n throw new Error(\n 'Cannot emit events because the event store is not initialized. Set autoInit to true, or explicitly call .init() before emitting events.',\n )\n }\n }\n\n let exclusiveEmitEventsChain: Promise<any> = Promise.resolve()\n const emitEvents: EmitEvents = async (events) => {\n exclusiveEmitEventsChain = exclusiveEmitEventsChain.then(async () => {\n await Promise.all(processManagers.values().map((pm) => pm.beginSession()))\n\n try {\n for (const event of events) {\n await Promise.all(\n [\n ...processManagers.values(),\n ...projections.values(),\n ...eventListeners.values(),\n ].map((listener) => listener.apply(event)),\n )\n }\n\n for (const event of events) {\n await Promise.all(\n [...processManagers.values(), ...eventListeners.values()].map(\n (processManager) => processManager.applyAfter(event),\n ),\n )\n }\n } finally {\n for (const pm of processManagers.values()) {\n pm.endSession()\n }\n }\n })\n\n return exclusiveEmitEventsChain\n }\n\n const loadEvents: LoadEvents = (select, range) => {\n assertInitializing()\n return params.loadEvents(select, range)\n }\n\n let exclusiveAppendEventsChain: Promise<any> = initialized\n const appendEvents: InternalAppendEvents = async (\n streamId,\n events,\n expectedVersion,\n ) => {\n assertInitializing()\n exclusiveAppendEventsChain = exclusiveAppendEventsChain.then(async () => {\n if (events.length === 0) {\n return []\n }\n await new Promise((resolve) => setImmediate(resolve)) // edge case for sync setup, see 'can execute after effect' test\n\n const processedEvents = events.map((rawEvent) => {\n const event = structuredClone(rawEvent)\n if (params.postProcessEvent) {\n const wrappedEvent = wrappedEventBuilder(event) as WrappedEvent<any>\n const { aggregateRoot } = aggregatRootsByEvents.get(event.type)!\n const processedEvent = unwrapEvent(\n params.postProcessEvent(\n wrappedEvent,\n aggregateRoot as unknown as Root,\n ),\n )\n Object.assign(event, processedEvent)\n }\n\n return event\n })\n\n return params.appendEvents(streamId, processedEvents, expectedVersion)\n })\n\n return exclusiveAppendEventsChain\n }\n\n for (const aggregateRoot of params.aggregateRoots as unknown as InternalAggregateRootApi[]) {\n aggregateRoot.eventTypes.forEach((eventType) => {\n aggregatRootsByEvents.set(eventType, {\n aggregateRoot,\n eventType,\n })\n })\n\n aggregateRoot.linkEventStore(\n loadEvents,\n appendEvents,\n emitEvents,\n transaction,\n params.lock ?? lock(5000),\n params.aggregateRootSnapshot,\n )\n }\n\n const baseCreateProjection = buildProjectionCreator({\n loadEvents,\n checkpoint: params.checkpoint,\n snapshot: params.projectionSnapshot,\n onReplay: params.onProjectionReplay,\n })\n\n const baseCreateProcessManager = buildProcessManagerCreator({\n loadEvents,\n checkpoint: params.checkpoint,\n onRefresh: params.onProcessManagerRefresh,\n })\n\n const getRelatedStreamEvents = (\n handlers: EventHandlers<any>,\n ): StreamEvents[] => {\n const relatedStreamEvents = new Map<string, Set<string>>()\n for (const handlerName of Object.keys(handlers)) {\n const sanitizedHandlerName = handlerName.replace(/^(on|after)/, '')\n if (!aggregatRootsByEvents.has(sanitizedHandlerName)) {\n throw new Error(\n `event handler ${handlerName} has no corresponding event in any aggregate root`,\n )\n }\n const {\n aggregateRoot: { type: aggregateRootName },\n eventType,\n } = aggregatRootsByEvents.get(sanitizedHandlerName)!\n if (!relatedStreamEvents.has(aggregateRootName)) {\n relatedStreamEvents.set(aggregateRootName, new Set())\n }\n relatedStreamEvents.get(aggregateRootName)!.add(eventType)\n }\n\n return Array.from(relatedStreamEvents, ([stream, events]) => ({\n stream,\n events: Array.from(events),\n }))\n }\n\n const initialize = async () => {\n initializing = true\n await Promise.all(\n projections.values().map((projection) => projection.init(true)),\n )\n await Promise.all(\n processManagers\n .values()\n .map((processManager) => processManager.init(true)),\n )\n resolveInitialized()\n }\n setImmediate(() => {\n if (allReplaying || params.autoInit === false) {\n return\n }\n\n initialize()\n })\n\n const api = {\n createProjection(name) {\n if (projections.has(name)) {\n throw new Error(`Projection ${name} is already registered`)\n }\n const api = baseCreateProjection(name)\n const internalApi = api as unknown as InternalProjection\n internalApi.setRelatedStreamEvents((handlers) =>\n getRelatedStreamEvents(handlers),\n )\n projections.set(name, internalApi)\n if (initializing) {\n internalApi.init(true)\n }\n return api\n },\n createProcessManager(name) {\n if (processManagers.has(name)) {\n throw new Error(`Process Manager ${name} is already registered`)\n }\n const api = baseCreateProcessManager(name)\n\n const internalApi = api as unknown as InternalProcessManager\n internalApi.setRelatedStreamEvents((handlers) =>\n getRelatedStreamEvents(handlers),\n )\n processManagers.set(name, internalApi)\n if (initializing) {\n internalApi.init(true)\n }\n return api\n },\n createEventListener(name) {\n if (eventListeners.has(name)) {\n throw new Error(`Event Listener ${name} is already registered`)\n }\n\n const api = createEventListener(name)\n\n const internalApi = api as unknown as InternalEventListener\n eventListeners.set(name, internalApi)\n return api\n },\n async isReady() {\n await initialized\n await Promise.all([\n ...projections.values().map((projection) => projection.isReady()),\n ...processManagers.values().map((projection) => projection.isReady()),\n ])\n },\n async rebuild() {\n allReplaying = true\n initializing = true\n const replayProjections = Array.from(projections.values()).filter(\n (projection) => projection.canReplay(),\n )\n const replayProcessManagers = Array.from(processManagers.values()).filter(\n (processManager) => processManager.hasState(),\n )\n\n await Promise.all([\n ...replayProjections.map((projection) => projection.init(false)),\n ...replayProcessManagers.map((projection) => projection.init(false)),\n ...replayProjections.map((projection) => projection.beginReplay()),\n ...replayProcessManagers.map((processManager) =>\n processManager.beginRefresh(),\n ),\n ])\n\n await withRefreshing(async () => {\n let index = 0\n for await (const event of loadEvents(null)) {\n index++\n await Promise.all([\n ...replayProjections.map((projection) =>\n projection.progressReplay(index, event),\n ),\n ...replayProcessManagers.map((processManager) =>\n processManager.progressRefresh(index, event, false),\n ),\n ...Array.from(eventListeners.values(), (listener) =>\n listener.apply(event),\n ),\n ])\n await Promise.all([\n ...replayProcessManagers.map((processManager) =>\n processManager.progressRefresh(index, event, true),\n ),\n ...Array.from(eventListeners.values(), (listener) =>\n listener.applyAfter(event),\n ),\n ])\n }\n })\n\n await Promise.all([\n ...replayProjections.map((projection) => projection.endReplay()),\n ...replayProcessManagers.map((processManager) =>\n processManager.endRefresh(),\n ),\n ])\n\n await Promise.all(\n projections.values().map(async (projection) => {\n if (!projection.canReplay()) {\n await projection.init(true)\n }\n }),\n )\n resolveInitialized()\n },\n async init() {\n if (initializing) {\n return api\n }\n await initialize()\n return api\n },\n getAggregateRoot(type) {\n return params.aggregateRoots.find(\n (aggregateRoot) => aggregateRoot.type === type,\n ) as any\n },\n async transaction(handler) {\n return transaction.run(handler)\n },\n } as EventStore<any, Root>\n\n return api\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "E51438C1FD14F00B64756E2164756E21",
9
+ "names": []
10
+ }
@@ -2,7 +2,7 @@
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.d.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 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
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;",
8
8
  "debugId": "EF89CA439C05547264756E2164756E21",
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/createCheckpointApi.ts"],
4
4
  "sourcesContent": [
5
- "import z from 'zod/v4'\n\nimport type { LoadEvents } from './createEventStore.ts'\nimport { ValidationError } from './errors.ts'\nimport type {\n BaseOutputEvent,\n MaybePromise,\n StreamEvents,\n} from './utilityTypes.js'\n\nconst checkpointSchema = z.object({\n lastEventPosition: z.int(),\n type: z.enum(['projection', 'processManager']),\n name: z.string(),\n metadata: z.record(z.string(), z.any()),\n})\n\nexport type Checkpoint = z.output<typeof checkpointSchema>\n\nexport type CheckpointMethods = {\n get: (\n type: 'projection' | 'processManager',\n name: string,\n ) => MaybePromise<Checkpoint | null | undefined>\n delete: (\n type: 'projection' | 'processManager',\n name: string,\n ) => MaybePromise<void>\n upsert: (checkpoint: Checkpoint) => MaybePromise<void>\n}\n\nexport function createCheckpointApi(\n params: CheckpointMethods & {\n loadEvents: LoadEvents\n relatedStreamEvents: StreamEvents[] | null\n name: string\n type: 'processManager' | 'projection'\n apply: (event: BaseOutputEvent) => MaybePromise<void>\n applyAfter?: (event: BaseOutputEvent) => MaybePromise<void>\n },\n) {\n const api = {\n relatedStreamEvents: params.relatedStreamEvents,\n async clear() {\n await params.delete(params.type, params.name)\n },\n async upsert(event: BaseOutputEvent, metadata: Record<string, any> = {}) {\n await params.upsert({\n lastEventPosition: event.position,\n type: params.type,\n name: params.name,\n metadata,\n })\n },\n async rehydrated(\n options: {\n onMetadata?: (metadata: Record<string, any>) => unknown\n getMetadata?: () => Record<string, any>\n onProgress?: (index: number, event: BaseOutputEvent) => void\n } = {},\n ) {\n const checkpoint = await params.get(params.type, params.name)\n let startPosition = 0\n if (checkpoint) {\n const result = checkpointSchema.safeParse(checkpoint)\n if (!result.success) {\n throw new ValidationError(\n `loaded checkpoint for ${params.type} ${params.name} does not comply with schema`,\n result.error,\n )\n }\n startPosition = checkpoint.lastEventPosition + 1\n options.onMetadata?.(checkpoint.metadata)\n }\n\n const events = params.loadEvents(params.relatedStreamEvents, {\n from: startPosition,\n })\n\n let index = 0\n let lastEvent: BaseOutputEvent | null = null\n for await (const event of events) {\n lastEvent = event\n await params.apply(event)\n index++\n options.onProgress?.(index, event)\n }\n\n if (!lastEvent) {\n return // up to date\n }\n\n if (params.applyAfter) {\n for await (const event of events) {\n await params.applyAfter(event)\n }\n }\n\n await api.upsert(lastEvent, options.getMetadata?.())\n },\n }\n\n return api\n}\n\nexport type CheckpointApi = ReturnType<typeof createCheckpointApi>\n"
5
+ "import z from 'zod/v4'\n\nimport type { LoadEvents } from './createEventStore.ts'\nimport { ValidationError } from './errors.ts'\nimport type {\n BaseOutputEvent,\n MaybePromise,\n StreamEvents,\n} from './utilityTypes.ts'\n\nconst checkpointSchema = z.object({\n lastEventPosition: z.int(),\n type: z.enum(['projection', 'processManager']),\n name: z.string(),\n metadata: z.record(z.string(), z.any()),\n})\n\nexport type Checkpoint = z.output<typeof checkpointSchema>\n\nexport type CheckpointMethods = {\n get: (\n type: 'projection' | 'processManager',\n name: string,\n ) => MaybePromise<Checkpoint | null | undefined>\n delete: (\n type: 'projection' | 'processManager',\n name: string,\n ) => MaybePromise<void>\n upsert: (checkpoint: Checkpoint) => MaybePromise<void>\n}\n\nexport function createCheckpointApi(\n params: CheckpointMethods & {\n loadEvents: LoadEvents\n relatedStreamEvents: StreamEvents[] | null\n name: string\n type: 'processManager' | 'projection'\n apply: (event: BaseOutputEvent) => MaybePromise<void>\n applyAfter?: (event: BaseOutputEvent) => MaybePromise<void>\n },\n) {\n const api = {\n relatedStreamEvents: params.relatedStreamEvents,\n async clear() {\n await params.delete(params.type, params.name)\n },\n async upsert(event: BaseOutputEvent, metadata: Record<string, any> = {}) {\n await params.upsert({\n lastEventPosition: event.position,\n type: params.type,\n name: params.name,\n metadata,\n })\n },\n async rehydrated(\n options: {\n onMetadata?: (metadata: Record<string, any>) => unknown\n getMetadata?: () => Record<string, any>\n onProgress?: (index: number, event: BaseOutputEvent) => void\n } = {},\n ) {\n const checkpoint = await params.get(params.type, params.name)\n let startPosition = 0\n if (checkpoint) {\n const result = checkpointSchema.safeParse(checkpoint)\n if (!result.success) {\n throw new ValidationError(\n `loaded checkpoint for ${params.type} ${params.name} does not comply with schema`,\n result.error,\n )\n }\n startPosition = checkpoint.lastEventPosition + 1\n options.onMetadata?.(checkpoint.metadata)\n }\n\n const events = params.loadEvents(params.relatedStreamEvents, {\n from: startPosition,\n })\n\n let index = 0\n let lastEvent: BaseOutputEvent | null = null\n for await (const event of events) {\n lastEvent = event\n await params.apply(event)\n index++\n options.onProgress?.(index, event)\n }\n\n if (!lastEvent) {\n return // up to date\n }\n\n if (params.applyAfter) {\n for await (const event of events) {\n await params.applyAfter(event)\n }\n }\n\n await api.upsert(lastEvent, options.getMetadata?.())\n },\n }\n\n return api\n}\n\nexport type CheckpointApi = ReturnType<typeof createCheckpointApi>\n"
6
6
  ],
7
7
  "mappings": ";;;;;AAAA;AAUA,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,mBAAmB,EAAE,IAAI;AAAA,EACzB,MAAM,EAAE,KAAK,CAAC,cAAc,gBAAgB,CAAC;AAAA,EAC7C,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC;AACxC,CAAC;AAgBM,SAAS,mBAAmB,CACjC,QAQA;AAAA,EACA,MAAM,MAAM;AAAA,IACV,qBAAqB,OAAO;AAAA,SACtB,MAAK,GAAG;AAAA,MACZ,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA;AAAA,SAExC,OAAM,CAAC,OAAwB,WAAgC,CAAC,GAAG;AAAA,MACvE,MAAM,OAAO,OAAO;AAAA,QAClB,mBAAmB,MAAM;AAAA,QACzB,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb;AAAA,MACF,CAAC;AAAA;AAAA,SAEG,WAAU,CACd,UAII,CAAC,GACL;AAAA,MACA,MAAM,aAAa,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI;AAAA,MAC5D,IAAI,gBAAgB;AAAA,MACpB,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,iBAAiB,UAAU,UAAU;AAAA,QACpD,IAAI,CAAC,OAAO,SAAS;AAAA,UACnB,MAAM,IAAI,gBACR,yBAAyB,OAAO,QAAQ,OAAO,oCAC/C,OAAO,KACT;AAAA,QACF;AAAA,QACA,gBAAgB,WAAW,oBAAoB;AAAA,QAC/C,QAAQ,aAAa,WAAW,QAAQ;AAAA,MAC1C;AAAA,MAEA,MAAM,SAAS,OAAO,WAAW,OAAO,qBAAqB;AAAA,QAC3D,MAAM;AAAA,MACR,CAAC;AAAA,MAED,IAAI,QAAQ;AAAA,MACZ,IAAI,YAAoC;AAAA,MACxC,iBAAiB,SAAS,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,MAAM,OAAO,MAAM,KAAK;AAAA,QACxB;AAAA,QACA,QAAQ,aAAa,OAAO,KAAK;AAAA,MACnC;AAAA,MAEA,IAAI,CAAC,WAAW;AAAA,QACd;AAAA,MACF;AAAA,MAEA,IAAI,OAAO,YAAY;AAAA,QACrB,iBAAiB,SAAS,QAAQ;AAAA,UAChC,MAAM,OAAO,WAAW,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,MAAM,IAAI,OAAO,WAAW,QAAQ,cAAc,CAAC;AAAA;AAAA,EAEvD;AAAA,EAEA,OAAO;AAAA;",
8
8
  "debugId": "EDA59BA1E9DE8B8764756E2164756E21",
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createAggregateRoot
3
- } from "./chunk-tkvj6x8k.js";
3
+ } from "./chunk-6n3jfg84.js";
4
4
  import"./chunk-z388cd25.js";
5
- import"./chunk-ncpk70p4.js";
6
- import"./chunk-m07vf8q9.js";
5
+ import"./chunk-8ev7sb2v.js";
6
+ import"./chunk-13wtyj2h.js";
7
7
  import"./chunk-6q8mr1sg.js";
8
+ import"./chunk-pmfzjavb.js";
8
9
  import"./chunk-x90g388y.js";
9
10
  import"./chunk-zf3x573k.js";
10
11
  import"./chunk-9psg50cb.js";
11
- import"./chunk-tfy01fah.js";
12
- import"./chunk-pmfzjavb.js";
13
12
  import"./chunk-qdczt68t.js";
13
+ import"./chunk-tfy01fah.js";
14
14
  export {
15
15
  createAggregateRoot
16
16
  };
@@ -1,6 +1,6 @@
1
1
  import z from 'zod/v4';
2
2
  import type { LoadEvents } from './createEventStore.ts';
3
- import type { BaseOutputEvent, MaybePromise, StreamEvents } from './utilityTypes.js';
3
+ import type { BaseOutputEvent, MaybePromise, StreamEvents } from './utilityTypes.ts';
4
4
  declare const checkpointSchema: z.ZodObject<{
5
5
  lastEventPosition: z.ZodInt;
6
6
  type: z.ZodEnum<{
@@ -4,7 +4,7 @@ import { type EventListenerApi } from './createEventListener.ts';
4
4
  import { type ProcessManagerApi } from './createProcessManager.ts';
5
5
  import { type ProjectionApi, type ProjectionApiWithSnapshots, type ProjectionSnapshotMethods } from './createProjection.ts';
6
6
  import { type LockCreator } from './lock.ts';
7
- import type { BaseInputEvent, BaseOutputEvent, EventTemplate, MaybePromise, Stream, StreamEvents, StreamId, StreamIdEvents } from './utilityTypes.js';
7
+ import type { BaseInputEvent, BaseOutputEvent, EventTemplate, MaybePromise, Stream, StreamEvents, StreamId, StreamIdEvents } from './utilityTypes.ts';
8
8
  import { type WrappedEvent } from './wrappedEventBuilder.ts';
9
9
  export type LoadEvents = (select: Stream | StreamId | Stream[] | StreamId[] | StreamEvents | StreamEvents[] | StreamIdEvents | StreamIdEvents[] | null, range?: {
10
10
  from: number;
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  createEventStore
3
- } from "./chunk-wmz6a1jk.js";
3
+ } from "./chunk-8pchcyvm.js";
4
4
  import"./chunk-24xjphpk.js";
5
5
  import"./chunk-ty9bhdvx.js";
6
6
  import"./chunk-gq80tgvf.js";
7
7
  import"./chunk-z388cd25.js";
8
- import"./chunk-ncpk70p4.js";
9
- import"./chunk-m07vf8q9.js";
8
+ import"./chunk-8ev7sb2v.js";
9
+ import"./chunk-13wtyj2h.js";
10
10
  import"./chunk-6q8mr1sg.js";
11
+ import"./chunk-pmfzjavb.js";
11
12
  import"./chunk-x90g388y.js";
12
13
  import"./chunk-zf3x573k.js";
13
14
  import"./chunk-9psg50cb.js";
14
- import"./chunk-pmfzjavb.js";
15
15
  import"./chunk-qdczt68t.js";
16
16
  export {
17
17
  createEventStore