@requence/event-sourcing 1.0.4 → 1.1.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.
Files changed (61) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-2qy4eb4h.js → chunk-04wqxaqs.js} +3 -3
  3. package/dist/{chunk-3t1vzbab.js → chunk-263c07sn.js} +3 -2
  4. package/dist/{chunk-3t1vzbab.js.map → chunk-263c07sn.js.map} +3 -3
  5. package/dist/{chunk-x90g388y.js → chunk-2fe8jjdc.js} +1 -1
  6. package/dist/{chunk-qdczt68t.js → chunk-391m4mfp.js} +14 -2
  7. package/dist/chunk-391m4mfp.js.map +10 -0
  8. package/dist/{chunk-9psg50cb.js → chunk-6yrb30rx.js} +1 -1
  9. package/dist/{chunk-pmfzjavb.js → chunk-8qn1nqnh.js} +1 -1
  10. package/dist/{chunk-crc0araj.js → chunk-r601d5jm.js} +5 -5
  11. package/dist/{chunk-8x4bedr4.js → chunk-smy8mxvr.js} +35 -21
  12. package/dist/chunk-smy8mxvr.js.map +10 -0
  13. package/dist/{chunk-kj36dz26.js → chunk-th14wxh8.js} +4 -4
  14. package/dist/{chunk-zf3x573k.js → chunk-yn2sjcg3.js} +36 -11
  15. package/dist/chunk-yn2sjcg3.js.map +10 -0
  16. package/dist/createAggregateRoot.js +8 -8
  17. package/dist/createCheckpointApi.d.ts +37 -2
  18. package/dist/createCheckpointApi.d.ts.map +1 -1
  19. package/dist/createCheckpointApi.js +2 -2
  20. package/dist/createEventStore.js +8 -8
  21. package/dist/createProcessManager.d.ts.map +1 -1
  22. package/dist/createProcessManager.js +4 -4
  23. package/dist/createProjection.js +5 -5
  24. package/dist/drizzle/index.d.ts.map +1 -1
  25. package/dist/drizzle/index.js +24 -18
  26. package/dist/drizzle/index.js.map +3 -3
  27. package/dist/drizzle/postgres.d.ts +17 -0
  28. package/dist/drizzle/postgres.d.ts.map +1 -1
  29. package/dist/drizzle/postgres.js +1 -1
  30. package/dist/errors.d.ts +6 -0
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js +5 -3
  33. package/dist/errors.js.map +1 -1
  34. package/dist/index.js +13 -11
  35. package/dist/index.js.map +1 -1
  36. package/dist/memory/index.d.ts.map +1 -1
  37. package/dist/memory/index.js +17 -12
  38. package/dist/memory/index.js.map +3 -3
  39. package/dist/refresh.js +2 -2
  40. package/dist/replay.js +2 -2
  41. package/dist/snapshotGenerator.js +2 -2
  42. package/dist/tests/setup.d.ts +1 -0
  43. package/dist/tests/setup.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/createCheckpointApi.ts +86 -10
  46. package/src/createProcessManager.ts +71 -32
  47. package/src/drizzle/index.ts +19 -4
  48. package/src/drizzle/postgres.ts +3 -0
  49. package/src/errors.ts +12 -0
  50. package/src/memory/index.ts +10 -2
  51. package/src/tests/processManagerMultiInstance.spec.ts +86 -3
  52. package/src/tests/setup.ts +12 -2
  53. package/dist/chunk-8x4bedr4.js.map +0 -10
  54. package/dist/chunk-qdczt68t.js.map +0 -10
  55. package/dist/chunk-zf3x573k.js.map +0 -10
  56. /package/dist/{chunk-2qy4eb4h.js.map → chunk-04wqxaqs.js.map} +0 -0
  57. /package/dist/{chunk-x90g388y.js.map → chunk-2fe8jjdc.js.map} +0 -0
  58. /package/dist/{chunk-9psg50cb.js.map → chunk-6yrb30rx.js.map} +0 -0
  59. /package/dist/{chunk-pmfzjavb.js.map → chunk-8qn1nqnh.js.map} +0 -0
  60. /package/dist/{chunk-crc0araj.js.map → chunk-r601d5jm.js.map} +0 -0
  61. /package/dist/{chunk-kj36dz26.js.map → chunk-th14wxh8.js.map} +0 -0
package/README.md CHANGED
@@ -8,7 +8,7 @@ Build resilient, auditable systems by storing every state change as an immutable
8
8
 
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
- - **Distributed Locking** — use `redisLock` for multi-instance deployments to coordinate locks across processes via Redis.
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
12
  - **Projections** — build query-optimized read models from events, with full replay support.
13
13
  - **Process Managers** — coordinate workflows across multiple aggregates.
14
14
  - **Event Listeners** — react to events with lightweight, stateless side effects.
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-gq80tgvf.js";
4
4
  import {
5
5
  buildProcessManagerCreator
6
- } from "./chunk-8x4bedr4.js";
6
+ } from "./chunk-smy8mxvr.js";
7
7
  import {
8
8
  withRefreshing
9
- } from "./chunk-9psg50cb.js";
9
+ } from "./chunk-6yrb30rx.js";
10
10
  import {
11
11
  buildProjectionCreator
12
- } from "./chunk-kj36dz26.js";
12
+ } from "./chunk-th14wxh8.js";
13
13
  import {
14
14
  lock
15
15
  } from "./chunk-ty9bhdvx.js";
@@ -69,7 +69,8 @@ var checkpoints = eventSourcing.table("checkpoints", {
69
69
  type: text({ enum: ["projection", "processManager"] }).notNull(),
70
70
  name: text().notNull(),
71
71
  lastEventPosition: bigint({ mode: "number" }).notNull(),
72
- metadata: text().notNull()
72
+ metadata: text().notNull(),
73
+ version: bigint({ mode: "number" }).notNull().default(0)
73
74
  }, (table) => [
74
75
  unique().on(table.type, table.name),
75
76
  index().on(table.type, table.name)
@@ -85,4 +86,4 @@ var projectionAppliedEvents = eventSourcing.table("projection_applied_events", {
85
86
 
86
87
  export { eventSourcing, events, aggregateRootSnapshots, projectionSnapshots, checkpoints, projectionAppliedEvents };
87
88
 
88
- //# debugId=336C30BF93DC04EF64756E2164756E21
89
+ //# debugId=AEF78418F25350BD64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/drizzle/postgres.ts"],
4
4
  "sourcesContent": [
5
- "import { sql } from 'drizzle-orm'\nimport {\n bigint,\n index,\n integer,\n jsonb,\n pgPolicy,\n pgSchema,\n text,\n timestamp,\n unique,\n uuid,\n} from 'drizzle-orm/pg-core'\nimport type { SuperJSONResult } from 'superjson'\n\nexport const eventSourcing = pgSchema('event_sourcing')\n\nexport const events = eventSourcing.table(\n 'events',\n {\n position: bigint({ mode: 'number' })\n .generatedByDefaultAsIdentity()\n .primaryKey(),\n id: uuid().unique().notNull().defaultRandom(),\n streamId: text().notNull(),\n streamType: text().notNull(),\n streamVersion: bigint({ mode: 'number' }).notNull(),\n type: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n payload: text().notNull(),\n metadata: jsonb().$type<SuperJSONResult>().notNull(),\n causationId: uuid(),\n correlationId: uuid(),\n actorId: text(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(table.streamId, table.streamVersion, table.streamType),\n index().on(table.streamId, table.streamVersion.desc()),\n index('metadata').using('gin', sql`${table.metadata} jsonb_path_ops`),\n pgPolicy('insert only', {\n for: 'insert',\n to: 'public',\n withCheck: sql`true`,\n }),\n ],\n)\n\nexport const aggregateRootSnapshots = eventSourcing.table(\n 'aggregate_root_snapshots',\n {\n id: uuid().primaryKey().defaultRandom(),\n streamId: text().notNull(),\n streamType: text().notNull(),\n streamVersion: bigint({ mode: 'number' }).notNull(),\n state: text().notNull(),\n metadata: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(table.streamType, table.streamId, table.streamVersion),\n index().on(table.streamType, table.streamId, table.streamVersion.desc()),\n ],\n)\n\nexport const projectionSnapshots = eventSourcing.table(\n 'projection_snapshots',\n {\n id: uuid().primaryKey().defaultRandom(),\n projectionId: text().notNull(),\n projectionType: text().notNull(),\n state: text().notNull(),\n metadata: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(\n table.projectionId,\n table.projectionType,\n table.lastEventPosition,\n ),\n index().on(\n table.projectionId,\n table.projectionType,\n table.lastEventPosition.desc(),\n ),\n ],\n)\n\nexport const checkpoints = eventSourcing.table(\n 'checkpoints',\n {\n id: uuid().defaultRandom().primaryKey(),\n type: text({ enum: ['projection', 'processManager'] }).notNull(),\n name: text().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n metadata: text().notNull(),\n },\n (table) => [\n unique().on(table.type, table.name),\n index().on(table.type, table.name),\n ],\n)\n\nexport const projectionAppliedEvents = eventSourcing.table(\n 'projection_applied_events',\n {\n projectionId: uuid().notNull(),\n projectionType: text().notNull(),\n appliedEvents: integer().notNull(),\n },\n (table) => [\n unique().on(table.projectionId, table.projectionType),\n index().on(table.projectionId, table.projectionType),\n ],\n)\n"
5
+ "import { sql } from 'drizzle-orm'\nimport {\n bigint,\n index,\n integer,\n jsonb,\n pgPolicy,\n pgSchema,\n text,\n timestamp,\n unique,\n uuid,\n} from 'drizzle-orm/pg-core'\nimport type { SuperJSONResult } from 'superjson'\n\nexport const eventSourcing = pgSchema('event_sourcing')\n\nexport const events = eventSourcing.table(\n 'events',\n {\n position: bigint({ mode: 'number' })\n .generatedByDefaultAsIdentity()\n .primaryKey(),\n id: uuid().unique().notNull().defaultRandom(),\n streamId: text().notNull(),\n streamType: text().notNull(),\n streamVersion: bigint({ mode: 'number' }).notNull(),\n type: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n payload: text().notNull(),\n metadata: jsonb().$type<SuperJSONResult>().notNull(),\n causationId: uuid(),\n correlationId: uuid(),\n actorId: text(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(table.streamId, table.streamVersion, table.streamType),\n index().on(table.streamId, table.streamVersion.desc()),\n index('metadata').using('gin', sql`${table.metadata} jsonb_path_ops`),\n pgPolicy('insert only', {\n for: 'insert',\n to: 'public',\n withCheck: sql`true`,\n }),\n ],\n)\n\nexport const aggregateRootSnapshots = eventSourcing.table(\n 'aggregate_root_snapshots',\n {\n id: uuid().primaryKey().defaultRandom(),\n streamId: text().notNull(),\n streamType: text().notNull(),\n streamVersion: bigint({ mode: 'number' }).notNull(),\n state: text().notNull(),\n metadata: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(table.streamType, table.streamId, table.streamVersion),\n index().on(table.streamType, table.streamId, table.streamVersion.desc()),\n ],\n)\n\nexport const projectionSnapshots = eventSourcing.table(\n 'projection_snapshots',\n {\n id: uuid().primaryKey().defaultRandom(),\n projectionId: text().notNull(),\n projectionType: text().notNull(),\n state: text().notNull(),\n metadata: text().notNull(),\n createdAt: timestamp().defaultNow().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n schemaVersion: integer().notNull(),\n },\n (table) => [\n unique().on(\n table.projectionId,\n table.projectionType,\n table.lastEventPosition,\n ),\n index().on(\n table.projectionId,\n table.projectionType,\n table.lastEventPosition.desc(),\n ),\n ],\n)\n\nexport const checkpoints = eventSourcing.table(\n 'checkpoints',\n {\n id: uuid().defaultRandom().primaryKey(),\n type: text({ enum: ['projection', 'processManager'] }).notNull(),\n name: text().notNull(),\n lastEventPosition: bigint({ mode: 'number' }).notNull(),\n metadata: text().notNull(),\n // Optimistic-concurrency guard: bumped on every write so concurrent\n // instances can detect when they raced on the same checkpoint.\n version: bigint({ mode: 'number' }).notNull().default(0),\n },\n (table) => [\n unique().on(table.type, table.name),\n index().on(table.type, table.name),\n ],\n)\n\nexport const projectionAppliedEvents = eventSourcing.table(\n 'projection_applied_events',\n {\n projectionId: uuid().notNull(),\n projectionType: text().notNull(),\n appliedEvents: integer().notNull(),\n },\n (table) => [\n unique().on(table.projectionId, table.projectionType),\n index().on(table.projectionId, table.projectionType),\n ],\n)\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "336C30BF93DC04EF64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "AEF78418F25350BD64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ReplaySkipError
3
- } from "./chunk-qdczt68t.js";
3
+ } from "./chunk-391m4mfp.js";
4
4
 
5
5
  // src/replay.ts
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -7,6 +7,18 @@ class ConcurrencyError extends Error {
7
7
  }
8
8
  }
9
9
 
10
+ class CheckpointConcurrencyError extends Error {
11
+ checkpointType;
12
+ name;
13
+ expectedVersion;
14
+ constructor(checkpointType, name, expectedVersion) {
15
+ super(`Concurrency error on ${checkpointType} checkpoint "${name}": expected version ${expectedVersion}, but it was modified by another writer`);
16
+ this.checkpointType = checkpointType;
17
+ this.name = name;
18
+ this.expectedVersion = expectedVersion;
19
+ }
20
+ }
21
+
10
22
  class ValidationError extends Error {
11
23
  zodError;
12
24
  constructor(message, zodError) {
@@ -79,6 +91,6 @@ class ProcessManagerEventHandlerExecutionError extends Error {
79
91
  }
80
92
  }
81
93
 
82
- export { ConcurrencyError, ValidationError, EventValidationError, InfiniteLoopError, CommandError, ProjectionReplayLoopError, RefreshingSkipError, ReplaySkipError, ProjectionEventHandlerExecutionError, ProcessManagerEventHandlerExecutionError };
94
+ export { ConcurrencyError, CheckpointConcurrencyError, ValidationError, EventValidationError, InfiniteLoopError, CommandError, ProjectionReplayLoopError, RefreshingSkipError, ReplaySkipError, ProjectionEventHandlerExecutionError, ProcessManagerEventHandlerExecutionError };
83
95
 
84
- //# debugId=7F0D85CC4F4ACE1E64756E2164756E21
96
+ //# debugId=CD7EE46B2474D0E864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/errors.ts"],
4
+ "sourcesContent": [
5
+ "import z from 'zod/v4'\n\nimport type { BaseOutputEvent, OutputEvent } from './utilityTypes.js'\n\nexport class ConcurrencyError extends Error {\n constructor(\n streamId: { stream: string; id: string },\n expectedVersion: number,\n actualVersion: number,\n ) {\n super(\n `Concurrency error on ${streamId.stream}(${streamId.id}): expected v${expectedVersion}, actual v${actualVersion}`,\n )\n }\n}\n\nexport class CheckpointConcurrencyError extends Error {\n constructor(\n public readonly checkpointType: 'projection' | 'processManager',\n public readonly name: string,\n public readonly expectedVersion: number | null,\n ) {\n super(\n `Concurrency error on ${checkpointType} checkpoint \"${name}\": expected version ${expectedVersion}, but it was modified by another writer`,\n )\n }\n}\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n public readonly zodError: z.ZodError,\n ) {\n super(`${message}: ${z.prettifyError(zodError)}`)\n }\n}\n\nexport class EventValidationError extends ValidationError {}\n\nexport class InfiniteLoopError extends Error {}\n\nexport class CommandError<T extends Error> extends Error {\n constructor(\n public readonly aggregateRootType: string,\n public readonly commandName: string,\n public readonly streamId: string,\n public readonly originalError: T,\n ) {\n super(\n `Error executing command \"${commandName}\" on aggregate root \"${aggregateRootType}\" for stream id \"${streamId}\": ${originalError.message}`,\n )\n }\n}\n\nexport class ProjectionReplayLoopError extends Error {\n constructor(\n message: string,\n public readonly projection: { name: string; eventHandler: string },\n public readonly event: OutputEvent<any>,\n ) {\n super(message)\n }\n}\n\nexport class RefreshingSkipError extends Error {}\n\nexport class ReplaySkipError extends Error {}\n\nexport class ProjectionEventHandlerExecutionError<\n T extends Error,\n> extends Error {\n constructor(\n public readonly projection: string,\n public readonly eventHandler: string,\n public readonly event: BaseOutputEvent,\n public readonly originalError: T,\n ) {\n super(\n `Error execution event handler \"${eventHandler}\" in projection \"${projection}\": ${originalError.message}`,\n )\n }\n}\n\nexport class ProcessManagerEventHandlerExecutionError<\n T extends Error,\n> extends Error {\n constructor(\n public readonly processManager: string,\n public readonly eventHandler: string,\n public readonly event: BaseOutputEvent,\n public readonly originalError: T,\n ) {\n super(\n `Error execution event handler \"${eventHandler}\" in process manager \"${processManager}\": ${originalError.message}`,\n )\n }\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AAAA;AAIO,MAAM,yBAAyB,MAAM;AAAA,EAC1C,WAAW,CACT,UACA,iBACA,eACA;AAAA,IACA,MACE,wBAAwB,SAAS,UAAU,SAAS,kBAAkB,4BAA4B,eACpG;AAAA;AAEJ;AAAA;AAEO,MAAM,mCAAmC,MAAM;AAAA,EAElC;AAAA,EACA;AAAA,EACA;AAAA,EAHlB,WAAW,CACO,gBACA,MACA,iBAChB;AAAA,IACA,MACE,wBAAwB,8BAA8B,2BAA2B,wDACnF;AAAA,IANgB;AAAA,IACA;AAAA,IACA;AAAA;AAMpB;AAAA;AAEO,MAAM,wBAAwB,MAAM;AAAA,EAGvB;AAAA,EAFlB,WAAW,CACT,SACgB,UAChB;AAAA,IACA,MAAM,GAAG,YAAY,EAAE,cAAc,QAAQ,GAAG;AAAA,IAFhC;AAAA;AAIpB;AAAA;AAEO,MAAM,6BAA6B,gBAAgB;AAAC;AAAA;AAEpD,MAAM,0BAA0B,MAAM;AAAC;AAAA;AAEvC,MAAM,qBAAsC,MAAM;AAAA,EAErC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAJlB,WAAW,CACO,mBACA,aACA,UACA,eAChB;AAAA,IACA,MACE,4BAA4B,mCAAmC,qCAAqC,cAAc,cAAc,SAClI;AAAA,IAPgB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAMpB;AAAA;AAEO,MAAM,kCAAkC,MAAM;AAAA,EAGjC;AAAA,EACA;AAAA,EAHlB,WAAW,CACT,SACgB,YACA,OAChB;AAAA,IACA,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA;AAIpB;AAAA;AAEO,MAAM,4BAA4B,MAAM;AAAC;AAAA;AAEzC,MAAM,wBAAwB,MAAM;AAAC;AAAA;AAErC,MAAM,6CAEH,MAAM;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAJlB,WAAW,CACO,YACA,cACA,OACA,eAChB;AAAA,IACA,MACE,kCAAkC,gCAAgC,gBAAgB,cAAc,SAClG;AAAA,IAPgB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAMpB;AAAA;AAEO,MAAM,iDAEH,MAAM;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAJlB,WAAW,CACO,gBACA,cACA,OACA,eAChB;AAAA,IACA,MACE,kCAAkC,qCAAqC,oBAAoB,cAAc,SAC3G;AAAA,IAPgB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAMpB;",
8
+ "debugId": "CD7EE46B2474D0E864756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RefreshingSkipError
3
- } from "./chunk-qdczt68t.js";
3
+ } from "./chunk-391m4mfp.js";
4
4
 
5
5
  // src/refresh.ts
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ValidationError
3
- } from "./chunk-qdczt68t.js";
3
+ } from "./chunk-391m4mfp.js";
4
4
 
5
5
  // src/snapshotGenerator.ts
6
6
  import { z } from "zod/v4";
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  getProcessManagerInfo
3
- } from "./chunk-8x4bedr4.js";
3
+ } from "./chunk-smy8mxvr.js";
4
4
  import {
5
5
  clone
6
6
  } from "./chunk-6q8mr1sg.js";
7
7
  import {
8
8
  isRefreshing
9
- } from "./chunk-9psg50cb.js";
9
+ } from "./chunk-6yrb30rx.js";
10
10
  import {
11
11
  awaitAll,
12
12
  normalizeArray
13
13
  } from "./chunk-tfy01fah.js";
14
14
  import {
15
15
  getProjectionInfo
16
- } from "./chunk-kj36dz26.js";
16
+ } from "./chunk-th14wxh8.js";
17
17
  import {
18
18
  createSnapshotGenerator
19
- } from "./chunk-pmfzjavb.js";
19
+ } from "./chunk-8qn1nqnh.js";
20
20
  import {
21
21
  handleEventError,
22
22
  unwrapEvent,
@@ -27,7 +27,7 @@ import {
27
27
  EventValidationError,
28
28
  InfiniteLoopError,
29
29
  ValidationError
30
- } from "./chunk-qdczt68t.js";
30
+ } from "./chunk-391m4mfp.js";
31
31
 
32
32
  // src/createAggregateRoot.ts
33
33
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -4,14 +4,15 @@ import {
4
4
  import {
5
5
  isRefreshing,
6
6
  withRefreshing
7
- } from "./chunk-9psg50cb.js";
7
+ } from "./chunk-6yrb30rx.js";
8
8
  import {
9
9
  createCheckpointApi
10
- } from "./chunk-zf3x573k.js";
10
+ } from "./chunk-yn2sjcg3.js";
11
11
  import {
12
+ CheckpointConcurrencyError,
12
13
  ProcessManagerEventHandlerExecutionError,
13
14
  RefreshingSkipError
14
- } from "./chunk-qdczt68t.js";
15
+ } from "./chunk-391m4mfp.js";
15
16
 
16
17
  // src/createProcessManager.ts
17
18
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -57,26 +58,39 @@ function buildProcessManagerCreator(params) {
57
58
  const runner = (async () => {
58
59
  await unlocked;
59
60
  const refreshing = isRefreshing();
60
- await withProcessManagerInfo({
61
- name,
62
- event
63
- }, async () => {
64
- try {
65
- await handler(event, { refreshing });
66
- } catch (error) {
67
- if (error instanceof RefreshingSkipError) {
68
- if (refreshing) {
69
- return;
61
+ const useCas = hasState && !after && !hydrating && !refreshing;
62
+ while (true) {
63
+ const currentHandler = after ? createAfterEffects(state)[`after${event.type}`] : createEventHandlers(state)[`on${event.type}`];
64
+ await withProcessManagerInfo({
65
+ name,
66
+ event
67
+ }, async () => {
68
+ try {
69
+ await currentHandler(event, { refreshing });
70
+ } catch (error) {
71
+ if (error instanceof RefreshingSkipError) {
72
+ if (refreshing) {
73
+ return;
74
+ }
75
+ throw new Error("RefreshingSkipError should never be thrown outside refresh");
76
+ }
77
+ if (!(error instanceof Error)) {
78
+ throw error;
70
79
  }
71
- throw new Error("RefreshingSkipError should never be thrown outside refresh");
80
+ throw new ProcessManagerEventHandlerExecutionError(name, after ? `after${event.type}` : `on${event.type}`, event, error);
72
81
  }
73
- if (!(error instanceof Error)) {
82
+ });
83
+ try {
84
+ await checkpointApi.upsert(event, { state }, useCas ? "cas" : "monotonic");
85
+ break;
86
+ } catch (error) {
87
+ if (!(error instanceof CheckpointConcurrencyError)) {
74
88
  throw error;
75
89
  }
76
- throw new ProcessManagerEventHandlerExecutionError(name, after ? `after${event.type}` : `on${event.type}`, event, error);
90
+ const checkpoint = await checkpointApi.load();
91
+ state = checkpoint?.metadata?.state != null ? clone(checkpoint.metadata.state) : clone(initialState);
77
92
  }
78
- });
79
- await checkpointApi.upsert(event, { state });
93
+ }
80
94
  })();
81
95
  if (exclusive) {
82
96
  locks.set(event.streamId, runner);
@@ -101,9 +115,9 @@ function buildProcessManagerCreator(params) {
101
115
  async beginSession() {
102
116
  if (!hasState)
103
117
  return;
104
- const checkpoint = await params.checkpoint.get("processManager", name);
118
+ const checkpoint = await checkpointApi.load();
105
119
  if (checkpoint) {
106
- state = checkpoint.metadata?.state ?? clone(initialState);
120
+ state = checkpoint.metadata?.state != null ? clone(checkpoint.metadata.state) : clone(initialState);
107
121
  lastEventPosition = checkpoint.lastEventPosition;
108
122
  } else {
109
123
  state = clone(initialState);
@@ -232,4 +246,4 @@ function buildProcessManagerCreator(params) {
232
246
 
233
247
  export { getProcessManagerInfo, isInsideProcessManager, buildProcessManagerCreator };
234
248
 
235
- //# debugId=973C14BE668A8E0964756E2164756E21
249
+ //# debugId=BB37D0A63A7EEC5164756E2164756E21
@@ -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 CheckpointConcurrencyError,\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 // Fold state into the process-manager checkpoint with optimistic\n // concurrency control. Only the stateful `on<Event>` fold needs\n // compare-and-swap — after-effects and stateless managers persist a\n // plain cursor, which is safe to write monotonically. When a concurrent\n // instance advances the checkpoint between our read and write, reload\n // the latest state and re-apply this event on top of it.\n const useCas = hasState && !after && !hydrating && !refreshing\n while (true) {\n const currentHandler = after\n ? createAfterEffects(state)[`after${event.type}`]\n : createEventHandlers(state)[`on${event.type}`]\n await withProcessManagerInfo(\n {\n name,\n event,\n },\n async () => {\n try {\n await currentHandler!(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\n try {\n await checkpointApi.upsert(\n event,\n { state },\n useCas ? 'cas' : 'monotonic',\n )\n break\n } catch (error) {\n if (!(error instanceof CheckpointConcurrencyError)) {\n throw error\n }\n\n // A concurrent writer advanced the checkpoint. Reload the latest\n // folded state (and version) and re-apply this event on top of it.\n // This event is emitted only by this instance, so it is never\n // already part of the reloaded state — we must always re-fold it\n // (do not skip on position: events are processed out of global\n // order across instances).\n const checkpoint = await checkpointApi.load()\n state =\n checkpoint?.metadata?.state != null\n ? clone(checkpoint.metadata.state)\n : clone(initialState)\n }\n }\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 // Load through the checkpoint API so the local version is synced with\n // the store; the subsequent fold relies on it for compare-and-swap.\n const checkpoint = await checkpointApi.load()\n if (checkpoint) {\n state =\n checkpoint.metadata?.state != null\n ? clone(checkpoint.metadata.state)\n : 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": "BB37D0A63A7EEC5164756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  createCheckpointApi
3
- } from "./chunk-zf3x573k.js";
3
+ } from "./chunk-yn2sjcg3.js";
4
4
  import {
5
5
  createSnapshotGenerator
6
- } from "./chunk-pmfzjavb.js";
6
+ } from "./chunk-8qn1nqnh.js";
7
7
  import {
8
8
  isReplaying,
9
9
  withReplaying
10
- } from "./chunk-x90g388y.js";
10
+ } from "./chunk-2fe8jjdc.js";
11
11
  import {
12
12
  ProjectionEventHandlerExecutionError,
13
13
  ProjectionReplayLoopError,
14
14
  ReplaySkipError,
15
15
  ValidationError
16
- } from "./chunk-qdczt68t.js";
16
+ } from "./chunk-391m4mfp.js";
17
17
 
18
18
  // src/createProjection.ts
19
19
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -1,6 +1,7 @@
1
1
  import {
2
+ CheckpointConcurrencyError,
2
3
  ValidationError
3
- } from "./chunk-qdczt68t.js";
4
+ } from "./chunk-391m4mfp.js";
4
5
 
5
6
  // src/createCheckpointApi.ts
6
7
  import z from "zod/v4";
@@ -8,24 +9,48 @@ var checkpointSchema = z.object({
8
9
  lastEventPosition: z.int(),
9
10
  type: z.enum(["projection", "processManager"]),
10
11
  name: z.string(),
11
- metadata: z.record(z.string(), z.any())
12
+ metadata: z.record(z.string(), z.any()),
13
+ version: z.int()
12
14
  });
13
15
  function createCheckpointApi(params) {
16
+ let version = null;
14
17
  const api = {
15
18
  relatedStreamEvents: params.relatedStreamEvents,
16
19
  async clear() {
17
20
  await params.delete(params.type, params.name);
21
+ version = null;
18
22
  },
19
- async upsert(event, metadata = {}) {
20
- await params.upsert({
21
- lastEventPosition: event.position,
22
- type: params.type,
23
- name: params.name,
24
- metadata
25
- });
23
+ async load() {
24
+ const checkpoint = await params.get(params.type, params.name);
25
+ version = checkpoint?.version ?? null;
26
+ return checkpoint ?? null;
27
+ },
28
+ async upsert(event, metadata = {}, mode = "monotonic") {
29
+ while (true) {
30
+ const expectedVersion = version;
31
+ const nextVersion = (expectedVersion ?? -1) + 1;
32
+ const committed = await params.upsert({
33
+ lastEventPosition: event.position,
34
+ type: params.type,
35
+ name: params.name,
36
+ metadata,
37
+ version: nextVersion
38
+ }, expectedVersion);
39
+ if (committed) {
40
+ version = nextVersion;
41
+ return;
42
+ }
43
+ const current = await api.load();
44
+ if (mode === "cas") {
45
+ throw new CheckpointConcurrencyError(params.type, params.name, expectedVersion);
46
+ }
47
+ if (current && current.lastEventPosition >= event.position) {
48
+ return;
49
+ }
50
+ }
26
51
  },
27
52
  async rehydrated(options = {}) {
28
- const checkpoint = await params.get(params.type, params.name);
53
+ const checkpoint = await api.load();
29
54
  let startPosition = 0;
30
55
  if (checkpoint) {
31
56
  const result = checkpointSchema.safeParse(checkpoint);
@@ -62,4 +87,4 @@ function createCheckpointApi(params) {
62
87
 
63
88
  export { createCheckpointApi };
64
89
 
65
- //# debugId=EDA59BA1E9DE8B8764756E2164756E21
90
+ //# debugId=E7ED2588EB8CF7CA64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/createCheckpointApi.ts"],
4
+ "sourcesContent": [
5
+ "import z from 'zod/v4'\n\nimport type { LoadEvents } from './createEventStore.ts'\nimport { CheckpointConcurrencyError, 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 version: z.int(),\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 /**\n * Persist a checkpoint using optimistic concurrency control.\n *\n * The write must only succeed if the currently stored version equals\n * `expectedVersion` (or, when `expectedVersion` is `null`, if no checkpoint\n * exists yet). `checkpoint.version` holds the version to store on success.\n * Return `true` when the write was applied and `false` when it was rejected\n * because another writer had advanced the checkpoint in the meantime.\n */\n upsert: (\n checkpoint: Checkpoint,\n expectedVersion: number | null,\n ) => MaybePromise<boolean>\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 // In-memory view of the persisted checkpoint version. `null` means \"no\n // checkpoint has been written yet\". It is kept in sync with the store on\n // every load/upsert so optimistic-concurrency writes can detect when another\n // instance has advanced the same checkpoint.\n let version: number | null = null\n\n const api = {\n relatedStreamEvents: params.relatedStreamEvents,\n async clear() {\n await params.delete(params.type, params.name)\n version = null\n },\n /**\n * Load the persisted checkpoint and sync the local version. Returns the\n * raw checkpoint (or `null`), so callers can rehydrate their own state\n * (e.g. a process manager reloading its folded state) from it.\n */\n async load() {\n const checkpoint = await params.get(params.type, params.name)\n version = checkpoint?.version ?? null\n return checkpoint ?? null\n },\n /**\n * Persist the checkpoint position (and optional metadata) for the given\n * event.\n *\n * - `'cas'` (compare-and-swap): the write must land on top of the exact\n * version we last observed. If another writer advanced the checkpoint,\n * the local version is refreshed and a {@link CheckpointConcurrencyError}\n * is thrown so the caller can re-fold its state and retry. Used for\n * process managers that fold state into the checkpoint.\n * - `'monotonic'` (default): retries on conflict, skipping the write once\n * the stored position already covers this event. Safe for cursors with\n * no derived state (projections, stateless/after-effect writes).\n */\n async upsert(\n event: BaseOutputEvent,\n metadata: Record<string, any> = {},\n mode: 'cas' | 'monotonic' = 'monotonic',\n ) {\n while (true) {\n const expectedVersion = version\n const nextVersion = (expectedVersion ?? -1) + 1\n const committed = await params.upsert(\n {\n lastEventPosition: event.position,\n type: params.type,\n name: params.name,\n metadata,\n version: nextVersion,\n },\n expectedVersion,\n )\n\n if (committed) {\n version = nextVersion\n return\n }\n\n // Another writer advanced this checkpoint. Refresh our view of it.\n const current = await api.load()\n\n if (mode === 'cas') {\n throw new CheckpointConcurrencyError(\n params.type,\n params.name,\n expectedVersion,\n )\n }\n\n // monotonic: the stored cursor already covers this event, nothing to do.\n if (current && current.lastEventPosition >= event.position) {\n return\n }\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 api.load()\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
+ ],
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;AAAA,EACtC,SAAS,EAAE,IAAI;AACjB,CAAC;AA4BM,SAAS,mBAAmB,CACjC,QAQA;AAAA,EAKA,IAAI,UAAyB;AAAA,EAE7B,MAAM,MAAM;AAAA,IACV,qBAAqB,OAAO;AAAA,SACtB,MAAK,GAAG;AAAA,MACZ,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,MAC5C,UAAU;AAAA;AAAA,SAON,KAAI,GAAG;AAAA,MACX,MAAM,aAAa,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI;AAAA,MAC5D,UAAU,YAAY,WAAW;AAAA,MACjC,OAAO,cAAc;AAAA;AAAA,SAejB,OAAM,CACV,OACA,WAAgC,CAAC,GACjC,OAA4B,aAC5B;AAAA,MACA,OAAO,MAAM;AAAA,QACX,MAAM,kBAAkB;AAAA,QACxB,MAAM,eAAe,mBAAmB,MAAM;AAAA,QAC9C,MAAM,YAAY,MAAM,OAAO,OAC7B;AAAA,UACE,mBAAmB,MAAM;AAAA,UACzB,MAAM,OAAO;AAAA,UACb,MAAM,OAAO;AAAA,UACb;AAAA,UACA,SAAS;AAAA,QACX,GACA,eACF;AAAA,QAEA,IAAI,WAAW;AAAA,UACb,UAAU;AAAA,UACV;AAAA,QACF;AAAA,QAGA,MAAM,UAAU,MAAM,IAAI,KAAK;AAAA,QAE/B,IAAI,SAAS,OAAO;AAAA,UAClB,MAAM,IAAI,2BACR,OAAO,MACP,OAAO,MACP,eACF;AAAA,QACF;AAAA,QAGA,IAAI,WAAW,QAAQ,qBAAqB,MAAM,UAAU;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA;AAAA,SAEI,WAAU,CACd,UAII,CAAC,GACL;AAAA,MACA,MAAM,aAAa,MAAM,IAAI,KAAK;AAAA,MAClC,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
+ "debugId": "E7ED2588EB8CF7CA64756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createAggregateRoot
3
- } from "./chunk-crc0araj.js";
4
- import"./chunk-8x4bedr4.js";
3
+ } from "./chunk-r601d5jm.js";
4
+ import"./chunk-smy8mxvr.js";
5
5
  import"./chunk-6q8mr1sg.js";
6
- import"./chunk-9psg50cb.js";
6
+ import"./chunk-6yrb30rx.js";
7
7
  import"./chunk-tfy01fah.js";
8
- import"./chunk-kj36dz26.js";
9
- import"./chunk-zf3x573k.js";
10
- import"./chunk-pmfzjavb.js";
8
+ import"./chunk-th14wxh8.js";
9
+ import"./chunk-yn2sjcg3.js";
10
+ import"./chunk-8qn1nqnh.js";
11
11
  import"./chunk-z388cd25.js";
12
- import"./chunk-x90g388y.js";
13
- import"./chunk-qdczt68t.js";
12
+ import"./chunk-2fe8jjdc.js";
13
+ import"./chunk-391m4mfp.js";
14
14
  export {
15
15
  createAggregateRoot
16
16
  };
@@ -9,12 +9,22 @@ declare const checkpointSchema: z.ZodObject<{
9
9
  }>;
10
10
  name: z.ZodString;
11
11
  metadata: z.ZodRecord<z.ZodString, z.ZodAny>;
12
+ version: z.ZodInt;
12
13
  }, z.core.$strip>;
13
14
  export type Checkpoint = z.output<typeof checkpointSchema>;
14
15
  export type CheckpointMethods = {
15
16
  get: (type: 'projection' | 'processManager', name: string) => MaybePromise<Checkpoint | null | undefined>;
16
17
  delete: (type: 'projection' | 'processManager', name: string) => MaybePromise<void>;
17
- upsert: (checkpoint: Checkpoint) => MaybePromise<void>;
18
+ /**
19
+ * Persist a checkpoint using optimistic concurrency control.
20
+ *
21
+ * The write must only succeed if the currently stored version equals
22
+ * `expectedVersion` (or, when `expectedVersion` is `null`, if no checkpoint
23
+ * exists yet). `checkpoint.version` holds the version to store on success.
24
+ * Return `true` when the write was applied and `false` when it was rejected
25
+ * because another writer had advanced the checkpoint in the meantime.
26
+ */
27
+ upsert: (checkpoint: Checkpoint, expectedVersion: number | null) => MaybePromise<boolean>;
18
28
  };
19
29
  export declare function createCheckpointApi(params: CheckpointMethods & {
20
30
  loadEvents: LoadEvents;
@@ -26,7 +36,32 @@ export declare function createCheckpointApi(params: CheckpointMethods & {
26
36
  }): {
27
37
  relatedStreamEvents: StreamEvents[] | null;
28
38
  clear(): Promise<void>;
29
- upsert(event: BaseOutputEvent, metadata?: Record<string, any>): Promise<void>;
39
+ /**
40
+ * Load the persisted checkpoint and sync the local version. Returns the
41
+ * raw checkpoint (or `null`), so callers can rehydrate their own state
42
+ * (e.g. a process manager reloading its folded state) from it.
43
+ */
44
+ load(): Promise<{
45
+ lastEventPosition: number;
46
+ type: "projection" | "processManager";
47
+ name: string;
48
+ metadata: Record<string, any>;
49
+ version: number;
50
+ } | null>;
51
+ /**
52
+ * Persist the checkpoint position (and optional metadata) for the given
53
+ * event.
54
+ *
55
+ * - `'cas'` (compare-and-swap): the write must land on top of the exact
56
+ * version we last observed. If another writer advanced the checkpoint,
57
+ * the local version is refreshed and a {@link CheckpointConcurrencyError}
58
+ * is thrown so the caller can re-fold its state and retry. Used for
59
+ * process managers that fold state into the checkpoint.
60
+ * - `'monotonic'` (default): retries on conflict, skipping the write once
61
+ * the stored position already covers this event. Safe for cursors with
62
+ * no derived state (projections, stateless/after-effect writes).
63
+ */
64
+ upsert(event: BaseOutputEvent, metadata?: Record<string, any>, mode?: "cas" | "monotonic"): Promise<void>;
30
65
  rehydrated(options?: {
31
66
  onMetadata?: (metadata: Record<string, any>) => unknown;
32
67
  getMetadata?: () => Record<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"createCheckpointApi.d.ts","sourceRoot":"","sources":["../src/createCheckpointApi.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAA;AAE1B,QAAA,MAAM,gBAAgB;;;;;;;;iBAKpB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,CACH,IAAI,EAAE,YAAY,GAAG,gBAAgB,EACrC,IAAI,EAAE,MAAM,KACT,YAAY,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;IAChD,MAAM,EAAE,CACN,IAAI,EAAE,YAAY,GAAG,gBAAgB,EACrC,IAAI,EAAE,MAAM,KACT,YAAY,CAAC,IAAI,CAAC,CAAA;IACvB,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;CACvD,CAAA;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GAAG;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,mBAAmB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAA;IACrC,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;CAC5D;;;kBAOqB,eAAe,aAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;yBASvD;QACP,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAA;QACvD,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACvC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;KAC7D;EA4CN;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
1
+ {"version":3,"file":"createCheckpointApi.d.ts","sourceRoot":"","sources":["../src/createCheckpointApi.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAA;AAE1B,QAAA,MAAM,gBAAgB;;;;;;;;;iBAMpB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,CACH,IAAI,EAAE,YAAY,GAAG,gBAAgB,EACrC,IAAI,EAAE,MAAM,KACT,YAAY,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;IAChD,MAAM,EAAE,CACN,IAAI,EAAE,YAAY,GAAG,gBAAgB,EACrC,IAAI,EAAE,MAAM,KACT,YAAY,CAAC,IAAI,CAAC,CAAA;IACvB;;;;;;;;OAQG;IACH,MAAM,EAAE,CACN,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,GAAG,IAAI,KAC3B,YAAY,CAAC,OAAO,CAAC,CAAA;CAC3B,CAAA;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GAAG;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,mBAAmB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAA;IACrC,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;CAC5D;;;IAcC;;;;OAIG;;;;;;;;IAMH;;;;;;;;;;;;OAYG;kBAEM,eAAe,aACZ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SACvB,KAAK,GAAG,WAAW;yBAuChB;QACP,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAA;QACvD,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACvC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;KAC7D;EA4CN;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createCheckpointApi
3
- } from "./chunk-zf3x573k.js";
4
- import"./chunk-qdczt68t.js";
3
+ } from "./chunk-yn2sjcg3.js";
4
+ import"./chunk-391m4mfp.js";
5
5
  export {
6
6
  createCheckpointApi
7
7
  };
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  createEventStore
3
- } from "./chunk-2qy4eb4h.js";
3
+ } from "./chunk-04wqxaqs.js";
4
4
  import"./chunk-gq80tgvf.js";
5
- import"./chunk-8x4bedr4.js";
5
+ import"./chunk-smy8mxvr.js";
6
6
  import"./chunk-6q8mr1sg.js";
7
- import"./chunk-9psg50cb.js";
8
- import"./chunk-kj36dz26.js";
9
- import"./chunk-zf3x573k.js";
10
- import"./chunk-pmfzjavb.js";
7
+ import"./chunk-6yrb30rx.js";
8
+ import"./chunk-th14wxh8.js";
9
+ import"./chunk-yn2sjcg3.js";
10
+ import"./chunk-8qn1nqnh.js";
11
11
  import"./chunk-ty9bhdvx.js";
12
12
  import"./chunk-z388cd25.js";
13
13
  import"./chunk-24xjphpk.js";
14
- import"./chunk-x90g388y.js";
15
- import"./chunk-qdczt68t.js";
14
+ import"./chunk-2fe8jjdc.js";
15
+ import"./chunk-391m4mfp.js";
16
16
  export {
17
17
  createEventStore
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createProcessManager.d.ts","sourceRoot":"","sources":["../src/createProcessManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAOnE,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,aAAa,EACb,IAAI,EACJ,KAAK,EACL,YAAY,EACb,MAAM,mBAAmB,CAAA;AAE1B,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,eAAe,CAAA;CACvB,CAAA;AAUD,wBAAgB,qBAAqB,mCAEpC;AAED,wBAAgB,sBAAsB,YAErC;AAED,KAAK,2BAA2B,CAAC,MAAM,SAAS,aAAa,IAAI,aAAa,CAC5E,MAAM,EACN;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CACxB,CAAA;AAED,KAAK,iCAAiC,CAAC,MAAM,SAAS,aAAa,IACjE,mBAAmB,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAEtD,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,UAAU,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,sBAAsB,EAAE,CACtB,2BAA2B,EAAE,CAC3B,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,KACxC,YAAY,EAAE,KAChB,IAAI,CAAA;IACT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,eAAe,CACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,UAAU,IAAI,IAAI,CAAA;IAClB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,QAAQ,IAAI,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAC3B,KAAK,GAAG,KAAK,EACb,MAAM,SAAS,aAAa,GAAG,KAAK,EACpC,KAAK,SAAS;IACZ,SAAS,EAAE,OAAO,CAAA;IAClB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;CAC1B,GAAG;IACF,SAAS,EAAE,KAAK,CAAA;IAChB,iBAAiB,EAAE,KAAK,CAAA;IACxB,UAAU,EAAE,KAAK,CAAA;IACjB,gBAAgB,EAAE,KAAK,CAAA;CACxB,IACC;IACF,SAAS,EAAE,CAAC,SAAS,EACnB,KAAK,EAAE,SAAS,KACb,IAAI,CACP,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,EACvE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CACxC,CAAA;IACD,iBAAiB,EAAE,CACjB,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAC7B,2BAA2B,CAAC,MAAM,CAAC,GACnC,CAAC,KAAK,EAAE,KAAK,KAAK,2BAA2B,CAAC,MAAM,CAAC,KACtD,IAAI,CACP,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE;QAAE,iBAAiB,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,EAC3E,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,iBAAiB,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAChD,CAAA;IACD,gBAAgB,EAAE,CAChB,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAC7B,iCAAiC,CAAC,MAAM,CAAC,GACzC,CAAC,KAAK,EAAE,KAAK,KAAK,iCAAiC,CAAC,MAAM,CAAC,KAC5D,IAAI,CACP,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE;QAAE,gBAAgB,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,EAC1E,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,gBAAgB,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAC/C,CAAA;IACD,UAAU,EAAE,MAAM,IAAI,CACpB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,EACpE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CACzC,CAAA;IACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,WAAW,EAAE,KAAK,CAAA;CACnB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,IAAI,GAChC;IACE,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;CAC5B,GACD,EAAE,CAAC,CAAA;AAEP,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,SAAS,CAAC,EAAE,UAAU,CAAA;CACvB,IACS,MAAM,MAAM,KAAG,iBAAiB,CA0QzC"}
1
+ {"version":3,"file":"createProcessManager.d.ts","sourceRoot":"","sources":["../src/createProcessManager.ts"],"names":[],"mappings":"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"}