@requence/event-sourcing 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-24xjphpk.js → chunk-06anxtk6.js} +6 -6
- package/dist/{chunk-24xjphpk.js.map → chunk-06anxtk6.js.map} +2 -2
- package/dist/{chunk-263c07sn.js → chunk-1mr4cwpw.js} +8 -8
- package/dist/{chunk-263c07sn.js.map → chunk-1mr4cwpw.js.map} +2 -2
- package/dist/{chunk-zznvzvnv.js → chunk-2wqpktzp.js} +31 -31
- package/dist/{chunk-zznvzvnv.js.map → chunk-2wqpktzp.js.map} +2 -2
- package/dist/{chunk-dgzw1nj9.js → chunk-467qtkth.js} +8 -3
- package/dist/chunk-467qtkth.js.map +10 -0
- package/dist/chunk-6dn6wxg7.js +11 -0
- package/dist/{chunk-jd4q8fcf.js.map → chunk-6dn6wxg7.js.map} +2 -2
- package/dist/{chunk-pc1q4se9.js → chunk-9qtjz725.js} +2 -2
- package/dist/{chunk-pc1q4se9.js.map → chunk-9qtjz725.js.map} +2 -2
- package/dist/{chunk-tfy01fah.js → chunk-c7sytwpp.js} +4 -4
- package/dist/{chunk-tfy01fah.js.map → chunk-c7sytwpp.js.map} +2 -2
- package/dist/{chunk-kqh3q3fj.js → chunk-d6jqbrq2.js} +29 -29
- package/dist/{chunk-kqh3q3fj.js.map → chunk-d6jqbrq2.js.map} +2 -2
- package/dist/{chunk-7akf01zj.js → chunk-f95c3da4.js} +77 -64
- package/dist/chunk-f95c3da4.js.map +10 -0
- package/dist/chunk-fpjnk143.js +13 -0
- package/dist/{chunk-6q8mr1sg.js.map → chunk-fpjnk143.js.map} +2 -2
- package/dist/{chunk-8qn1nqnh.js → chunk-fxb9fbvz.js} +9 -9
- package/dist/{chunk-8qn1nqnh.js.map → chunk-fxb9fbvz.js.map} +2 -2
- package/dist/chunk-hmvwn02w.js +22 -0
- package/dist/{chunk-6yrb30rx.js.map → chunk-hmvwn02w.js.map} +2 -2
- package/dist/{chunk-ty9bhdvx.js → chunk-j4mwjx07.js} +5 -3
- package/dist/chunk-j4mwjx07.js.map +10 -0
- package/dist/{chunk-391m4mfp.js → chunk-jw9e0fr0.js} +13 -13
- package/dist/{chunk-391m4mfp.js.map → chunk-jw9e0fr0.js.map} +2 -2
- package/dist/chunk-mbxxvskx.js +67 -0
- package/dist/{chunk-ak901ckt.js.map → chunk-mbxxvskx.js.map} +2 -2
- package/dist/{chunk-3251p253.js → chunk-nrhw3kde.js} +8 -8
- package/dist/{chunk-3251p253.js.map → chunk-nrhw3kde.js.map} +2 -2
- package/dist/{chunk-8edc30gz.js → chunk-pcggjrxr.js} +32 -32
- package/dist/{chunk-8edc30gz.js.map → chunk-pcggjrxr.js.map} +2 -2
- package/dist/chunk-tkwe4r0y.js +22 -0
- package/dist/{chunk-2fe8jjdc.js.map → chunk-tkwe4r0y.js.map} +2 -2
- package/dist/{chunk-z388cd25.js → chunk-zkz6ew8c.js} +5 -5
- package/dist/{chunk-z388cd25.js.map → chunk-zkz6ew8c.js.map} +2 -2
- package/dist/createAggregateRoot.d.ts +1 -1
- package/dist/createAggregateRoot.d.ts.map +1 -1
- package/dist/createAggregateRoot.js +15 -14
- package/dist/createAggregateRoot.js.map +1 -1
- package/dist/createCheckpointApi.js +5 -5
- package/dist/createCheckpointApi.js.map +1 -1
- package/dist/createEventListener.js +8 -8
- package/dist/createEventListener.js.map +1 -1
- package/dist/createEventStore.js +16 -16
- package/dist/createEventStore.js.map +1 -1
- package/dist/createProcessManager.js +12 -12
- package/dist/createProcessManager.js.map +1 -1
- package/dist/createProjection.js +12 -12
- package/dist/createProjection.js.map +1 -1
- package/dist/drizzle/index.js +132 -132
- package/dist/drizzle/index.js.map +2 -2
- package/dist/drizzle/postgres.js +14 -14
- package/dist/drizzle/postgres.js.map +1 -1
- package/dist/errors.js +24 -24
- package/dist/errors.js.map +1 -1
- package/dist/index.js +63 -63
- package/dist/index.js.map +1 -1
- package/dist/lock.d.ts +11 -3
- package/dist/lock.d.ts.map +1 -1
- package/dist/lock.js +4 -2
- package/dist/lock.js.map +1 -1
- package/dist/memory/index.js +31 -31
- package/dist/memory/index.js.map +2 -2
- package/dist/redis/index.js +5 -4
- package/dist/redis/index.js.map +1 -1
- package/dist/redis/redisLock.d.ts +1 -1
- package/dist/redis/redisLock.d.ts.map +1 -1
- package/dist/redis/redisLock.js +5 -4
- package/dist/redis/redisLock.js.map +1 -1
- package/dist/refresh.js +9 -9
- package/dist/refresh.js.map +1 -1
- package/dist/replay.js +9 -9
- package/dist/replay.js.map +1 -1
- package/dist/snapshotGenerator.js +2 -2
- package/dist/superjson.js +8 -8
- package/dist/superjson.js.map +1 -1
- package/dist/surreal/index.js +73 -73
- package/dist/surreal/index.js.map +2 -2
- package/dist/surreal/schema.js +8 -8
- package/dist/surreal/schema.js.map +1 -1
- package/dist/transaction.js +1 -1
- package/dist/utils.js +6 -6
- package/dist/utils.js.map +1 -1
- package/dist/wrappedEventBuilder.js +8 -8
- package/dist/wrappedEventBuilder.js.map +1 -1
- package/package.json +1 -1
- package/src/createAggregateRoot.ts +22 -2
- package/src/lock.ts +17 -3
- package/src/redis/redisLock.ts +6 -2
- package/src/tests/aggregateRoot.spec.ts +42 -0
- package/dist/chunk-2fe8jjdc.js +0 -22
- package/dist/chunk-6q8mr1sg.js +0 -13
- package/dist/chunk-6yrb30rx.js +0 -22
- package/dist/chunk-7akf01zj.js.map +0 -10
- package/dist/chunk-ak901ckt.js +0 -67
- package/dist/chunk-dgzw1nj9.js.map +0 -10
- package/dist/chunk-jd4q8fcf.js +0 -11
- package/dist/chunk-ty9bhdvx.js.map +0 -10
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/superjson.ts
|
|
2
|
+
import SuperJSON from "superjson";
|
|
3
|
+
var superjson2 = new SuperJSON;
|
|
4
|
+
function extendTypes2(handler) {
|
|
5
|
+
handler(superjson2);
|
|
6
|
+
}
|
|
7
|
+
function clone2(obj) {
|
|
8
|
+
return superjson2.deserialize(superjson2.serialize(obj));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { superjson2, extendTypes2, clone2 };
|
|
12
|
+
|
|
13
|
+
//# debugId=3B62D845BB126E8B64756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import SuperJSON from 'superjson'\n\nexport const superjson = new SuperJSON()\n\nexport function extendTypes(handler: (superjson: SuperJSON) => void) {\n handler(superjson)\n}\n\nexport function clone<T>(obj: T): T {\n return superjson.deserialize(superjson.serialize(obj))\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AAAA;AAEO,IAAM,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAAA;AAEO,IAAM,aAAY,IAAI;AAEtB,SAAS,YAAW,CAAC,SAAyC;AAAA,EACnE,QAAQ,UAAS;AAAA;AAGZ,SAAS,MAAQ,CAAC,KAAW;AAAA,EAClC,OAAO,WAAU,YAAY,WAAU,UAAU,GAAG,CAAC;AAAA;",
|
|
8
|
+
"debugId": "3B62D845BB126E8B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
ValidationError2
|
|
3
|
+
} from "./chunk-jw9e0fr0.js";
|
|
4
4
|
|
|
5
5
|
// src/snapshotGenerator.ts
|
|
6
6
|
import { z } from "zod/v4";
|
|
@@ -9,7 +9,7 @@ function createSnapshotGenerator(schemas = [], config = null, applier = null, ca
|
|
|
9
9
|
async internalApply(snapshot) {
|
|
10
10
|
const result = z.union(schemas.map(({ schema }) => schema)).safeParse(snapshot.state);
|
|
11
11
|
if (!result.success) {
|
|
12
|
-
throw new
|
|
12
|
+
throw new ValidationError2(`loaded snapshot version ${snapshot.schemaVersion} does not comply with registered schema`, result.error);
|
|
13
13
|
}
|
|
14
14
|
await applier(snapshot);
|
|
15
15
|
},
|
|
@@ -20,7 +20,7 @@ function createSnapshotGenerator(schemas = [], config = null, applier = null, ca
|
|
|
20
20
|
const latestSchema = schemas.slice(1).reduce((latest, schema) => schema.schemaVersion > latest.schemaVersion ? schema : latest, schemas[0]);
|
|
21
21
|
const result = latestSchema.schema.safeParse(await capturer(event));
|
|
22
22
|
if (!result.success) {
|
|
23
|
-
throw new
|
|
23
|
+
throw new ValidationError2(`generated snapshot does not comply with schema for version ${latestSchema.schemaVersion}`, result.error);
|
|
24
24
|
}
|
|
25
25
|
return {
|
|
26
26
|
state: result.data,
|
|
@@ -34,11 +34,11 @@ function createSnapshotGenerator(schemas = [], config = null, applier = null, ca
|
|
|
34
34
|
schemas.push({ schemaVersion: schemaVersion ?? 0, schema });
|
|
35
35
|
return createSnapshotGenerator(schemas, config, null, null);
|
|
36
36
|
},
|
|
37
|
-
apply(
|
|
38
|
-
return createSnapshotGenerator(schemas, config,
|
|
37
|
+
apply(applier) {
|
|
38
|
+
return createSnapshotGenerator(schemas, config, applier, capturer);
|
|
39
39
|
},
|
|
40
|
-
capture(
|
|
41
|
-
return createSnapshotGenerator(schemas, config, applier,
|
|
40
|
+
capture(capturer) {
|
|
41
|
+
return createSnapshotGenerator(schemas, config, applier, capturer);
|
|
42
42
|
},
|
|
43
43
|
complete: true
|
|
44
44
|
};
|
|
@@ -46,4 +46,4 @@ function createSnapshotGenerator(schemas = [], config = null, applier = null, ca
|
|
|
46
46
|
|
|
47
47
|
export { createSnapshotGenerator };
|
|
48
48
|
|
|
49
|
-
//# debugId=
|
|
49
|
+
//# debugId=CB4E2325706333DE64756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { z } from 'zod/v4'\n\nimport { ValidationError } from './errors.ts'\nimport type {\n BaseOutputEvent,\n Keys,\n Max,\n MaybePromise,\n Merge,\n} from './utilityTypes.js'\n\ntype RegisteredSnapshotSchemas = { schemaVersion: number; schema: z.ZodType }\n\ntype LatestSnapshotSchemaInput<\n T extends RegisteredSnapshotSchemas,\n M = Max<T['schemaVersion']>,\n> = T extends { schemaVersion: M } ? z.input<T['schema']> : never\n\ntype OutputSnapshot<T extends RegisteredSnapshotSchemas> = T extends {\n schemaVersion: infer V\n schema: infer S\n}\n ? {\n schemaVersion: V\n state: z.output<S>\n createdAt: Date\n }\n : never\n\ntype SnapshotApplier<Base, T extends RegisteredSnapshotSchemas> = (\n snapshot: OutputSnapshot<T> & Base,\n) => MaybePromise<void>\ntype SnapshotCapturer<T extends RegisteredSnapshotSchemas> = (\n event: BaseOutputEvent,\n) => MaybePromise<LatestSnapshotSchemaInput<T> | undefined | null | void>\n\nexport type SnapshotGenerator<\n Base,\n Schemas extends RegisteredSnapshotSchemas = never,\n Flags extends {\n every: boolean\n apply: boolean\n capture: boolean\n schema: boolean\n } = {\n every: false\n apply: true\n capture: true\n schema: false\n },\n> = {\n every(\n count: number,\n ): Omit<\n SnapshotGenerator<Base, Schemas, Merge<Flags, { every: true }>>,\n Keys<Merge<Flags, { every: true }>>\n >\n schema<Schema extends z.ZodType, V extends number = 0>(\n schema: Schema,\n schemaVersion?: V,\n ): Omit<\n SnapshotGenerator<\n Base,\n Schemas | { schemaVersion: V; schema: Schema },\n Merge<Flags, { apply: false; capture: false }>\n >,\n Keys<Merge<Flags, { apply: false; capture: false }>>\n >\n apply(\n applier: SnapshotApplier<Base, Schemas>,\n ): Omit<\n SnapshotGenerator<\n Base,\n Schemas,\n Merge<Flags, { apply: true; schema: true }>\n >,\n Keys<Merge<Flags, { apply: true; schema: true }>>\n >\n capture(\n capturer: SnapshotCapturer<Schemas>,\n ): Omit<\n SnapshotGenerator<\n Base,\n Schemas,\n Merge<Flags, { capture: true; schema: true }>\n >,\n Keys<Merge<Flags, { capture: true; schema: true }>>\n >\n readonly complete: Flags['schema'] extends true\n ? Flags['capture'] extends true\n ? Flags['apply'] extends true\n ? true\n : false\n : false\n : false\n}\n\nexport type InternalSnapshotGenerator = {\n internalApply: (snapshot: OutputSnapshot<any>) => Promise<void>\n internalCapture: (\n event: BaseOutputEvent,\n applied: number,\n ) => Promise<null | { state: any; version: number }>\n}\n\nexport type CompleteSnapshotGenerator = Omit<\n SnapshotGenerator<\n any,\n RegisteredSnapshotSchemas,\n { every: true; apply: true; capture: true; schema: true }\n >,\n 'schema' | 'capture' | 'apply' | 'every'\n>\n\nexport default function createSnapshotGenerator<Base>(\n schemas: Array<RegisteredSnapshotSchemas> = [],\n config: { every: number } | null = null,\n applier:\n | ((snapshot: OutputSnapshot<any>) => MaybePromise<void>)\n | null = null,\n capturer: ((event: BaseOutputEvent) => any) | null = null,\n): CompleteSnapshotGenerator {\n return {\n async internalApply(snapshot) {\n const result = z\n .union(schemas.map(({ schema }) => schema))\n .safeParse(snapshot.state)\n\n if (!result.success) {\n throw new ValidationError(\n `loaded snapshot version ${snapshot.schemaVersion} does not comply with registered schema`,\n result.error,\n )\n }\n\n await applier!(snapshot)\n },\n async internalCapture(event, applied) {\n if (!config || applied % config.every !== 0) {\n return null\n }\n\n const latestSchema = schemas\n .slice(1)\n .reduce(\n (latest, schema) =>\n schema.schemaVersion > latest.schemaVersion ? schema : latest,\n schemas[0],\n )\n\n const result = latestSchema.schema.safeParse(await capturer!(event))\n\n if (!result.success) {\n throw new ValidationError(\n `generated snapshot does not comply with schema for version ${latestSchema.schemaVersion}`,\n result.error,\n )\n }\n\n return {\n state: result.data,\n version: latestSchema.schemaVersion,\n }\n },\n every(count) {\n return createSnapshotGenerator(\n schemas,\n { every: count },\n applier,\n capturer,\n )\n },\n schema(schema, schemaVersion) {\n schemas.push({ schemaVersion: schemaVersion ?? 0, schema })\n return createSnapshotGenerator(schemas, config, null, null) as any\n },\n apply(applier) {\n return createSnapshotGenerator(schemas, config, applier as any, capturer)\n },\n capture(capturer) {\n return createSnapshotGenerator(schemas, config, applier, capturer as any)\n },\n complete: true,\n } as SnapshotGenerator<\n Base,\n RegisteredSnapshotSchemas,\n { capture: true; apply: true; every: true; schema: true }\n > &\n InternalSnapshotGenerator\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;AAAA;AAkHA,SAAwB,uBAA6B,CACnD,UAA4C,CAAC,GAC7C,SAAmC,MACnC,UAEW,MACX,WAAqD,MAC1B;AAAA,EAC3B,OAAO;AAAA,SACC,cAAa,CAAC,UAAU;AAAA,MAC5B,MAAM,SAAS,EACZ,MAAM,QAAQ,IAAI,GAAG,aAAa,MAAM,CAAC,EACzC,UAAU,SAAS,KAAK;AAAA,MAE3B,IAAI,CAAC,OAAO,SAAS;AAAA,QACnB,MAAM,IAAI,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;AAAA;AAkHA,SAAwB,uBAA6B,CACnD,UAA4C,CAAC,GAC7C,SAAmC,MACnC,UAEW,MACX,WAAqD,MAC1B;AAAA,EAC3B,OAAO;AAAA,SACC,cAAa,CAAC,UAAU;AAAA,MAC5B,MAAM,SAAS,EACZ,MAAM,QAAQ,IAAI,GAAG,aAAa,MAAM,CAAC,EACzC,UAAU,SAAS,KAAK;AAAA,MAE3B,IAAI,CAAC,OAAO,SAAS;AAAA,QACnB,MAAM,IAAI,iBACR,2BAA2B,SAAS,wDACpC,OAAO,KACT;AAAA,MACF;AAAA,MAEA,MAAM,QAAS,QAAQ;AAAA;AAAA,SAEnB,gBAAe,CAAC,OAAO,SAAS;AAAA,MACpC,IAAI,CAAC,UAAU,UAAU,OAAO,UAAU,GAAG;AAAA,QAC3C,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,eAAe,QAClB,MAAM,CAAC,EACP,OACC,CAAC,QAAQ,WACP,OAAO,gBAAgB,OAAO,gBAAgB,SAAS,QACzD,QAAQ,EACV;AAAA,MAEF,MAAM,SAAS,aAAa,OAAO,UAAU,MAAM,SAAU,KAAK,CAAC;AAAA,MAEnE,IAAI,CAAC,OAAO,SAAS;AAAA,QACnB,MAAM,IAAI,iBACR,8DAA8D,aAAa,iBAC3E,OAAO,KACT;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,OAAO,OAAO;AAAA,QACd,SAAS,aAAa;AAAA,MACxB;AAAA;AAAA,IAEF,KAAK,CAAC,OAAO;AAAA,MACX,OAAO,wBACL,SACA,EAAE,OAAO,MAAM,GACf,SACA,QACF;AAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,eAAe;AAAA,MAC5B,QAAQ,KAAK,EAAE,eAAe,iBAAiB,GAAG,OAAO,CAAC;AAAA,MAC1D,OAAO,wBAAwB,SAAS,QAAQ,MAAM,IAAI;AAAA;AAAA,IAE5D,KAAK,CAAC,SAAS;AAAA,MACb,OAAO,wBAAwB,SAAS,QAAQ,SAAgB,QAAQ;AAAA;AAAA,IAE1E,OAAO,CAAC,UAAU;AAAA,MAChB,OAAO,wBAAwB,SAAS,QAAQ,SAAS,QAAe;AAAA;AAAA,IAE1E,UAAU;AAAA,EACZ;AAAA;",
|
|
8
|
+
"debugId": "CB4E2325706333DE64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RefreshingSkipError2
|
|
3
|
+
} from "./chunk-jw9e0fr0.js";
|
|
4
|
+
|
|
5
|
+
// src/refresh.ts
|
|
6
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
|
+
var refreshStore = new AsyncLocalStorage;
|
|
8
|
+
function isRefreshing2() {
|
|
9
|
+
return refreshStore.getStore() ?? false;
|
|
10
|
+
}
|
|
11
|
+
function withRefreshing2(handler) {
|
|
12
|
+
return refreshStore.run(true, handler);
|
|
13
|
+
}
|
|
14
|
+
function skipRefreshing2() {
|
|
15
|
+
if (isRefreshing2()) {
|
|
16
|
+
throw new RefreshingSkipError2;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { isRefreshing2, withRefreshing2, skipRefreshing2 };
|
|
21
|
+
|
|
22
|
+
//# debugId=67A7F9DE7EDBBD8C64756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { RefreshingSkipError } from './errors.ts'\n\nconst refreshStore = new AsyncLocalStorage<boolean>()\n\nexport function isRefreshing() {\n return refreshStore.getStore() ?? false\n}\n\nexport function withRefreshing<T extends () => any>(handler: T) {\n return refreshStore.run(true, handler)\n}\n\nexport function skipRefreshing() {\n if (isRefreshing()) {\n throw new RefreshingSkipError()\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;AAAA;AAIA,IAAM,eAAe,IAAI;AAElB,SAAS,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;AAAA;AAIA,IAAM,eAAe,IAAI;AAElB,SAAS,aAAY,GAAG;AAAA,EAC7B,OAAO,aAAa,SAAS,KAAK;AAAA;AAG7B,SAAS,eAAmC,CAAC,SAAY;AAAA,EAC9D,OAAO,aAAa,IAAI,MAAM,OAAO;AAAA;AAGhC,SAAS,eAAc,GAAG;AAAA,EAC/B,IAAI,cAAa,GAAG;AAAA,IAClB,MAAM,IAAI;AAAA,EACZ;AAAA;",
|
|
8
|
+
"debugId": "67A7F9DE7EDBBD8C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/lock.ts
|
|
2
2
|
import { Mutex } from "async-mutex";
|
|
3
|
-
|
|
3
|
+
var DEFAULT_LOCK_TTL2 = 5000;
|
|
4
|
+
function lock(defaultTtl = DEFAULT_LOCK_TTL2) {
|
|
4
5
|
const locks = new Map;
|
|
5
6
|
return async (key) => {
|
|
6
7
|
const k = Array.isArray(key) ? key.join(":") : key;
|
|
@@ -25,6 +26,7 @@ function lock(defaultTtl = 5000) {
|
|
|
25
26
|
};
|
|
26
27
|
startTimer(defaultTtl);
|
|
27
28
|
return {
|
|
29
|
+
ttl: defaultTtl,
|
|
28
30
|
async extend(ttl) {
|
|
29
31
|
if (isReleased) {
|
|
30
32
|
return false;
|
|
@@ -48,6 +50,6 @@ function lock(defaultTtl = 5000) {
|
|
|
48
50
|
};
|
|
49
51
|
}
|
|
50
52
|
|
|
51
|
-
export { lock };
|
|
53
|
+
export { DEFAULT_LOCK_TTL2, lock };
|
|
52
54
|
|
|
53
|
-
//# debugId=
|
|
55
|
+
//# debugId=769065B9E0FF5E8F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lock.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { Mutex } from 'async-mutex'\n\nexport const DEFAULT_LOCK_TTL = 5000\n\nexport type Lock = {\n /** Moves the expiry to `ttl` from now (default: half the lock's TTL). */\n extend(ttl?: number): Promise<boolean>\n release(): Promise<void>\n /**\n * The TTL the lock was taken with. The aggregate root keeps a replay's lock\n * alive at a quarter of it, and assumes {@link DEFAULT_LOCK_TTL} without it.\n */\n ttl?: number\n}\n\nexport type LockCreator = (key: string | string[]) => Promise<Lock>\n\nexport default function lock(defaultTtl = DEFAULT_LOCK_TTL): LockCreator {\n const locks = new Map<string, Mutex>()\n return async (key: string | string[]) => {\n const k = Array.isArray(key) ? key.join(':') : key\n if (!locks.has(k)) {\n locks.set(k, new Mutex())\n }\n\n const mutex = locks.get(k)!\n\n const releaseMutex = await mutex.acquire()\n let isReleased = false\n\n let timer: ReturnType<typeof setTimeout>\n const startTimer = (ttl: number) => {\n timer = setTimeout(() => {\n if (!isReleased) {\n console.warn('lock ttl expired for key', k)\n isReleased = true\n releaseMutex()\n if (!mutex.isLocked()) {\n locks.delete(k)\n }\n }\n }, ttl)\n }\n\n startTimer(defaultTtl)\n\n return {\n ttl: defaultTtl,\n async extend(ttl?: number) {\n if (isReleased) {\n return false\n }\n clearTimeout(timer)\n startTimer(ttl ?? defaultTtl / 2)\n return true\n },\n async release() {\n if (isReleased) {\n return\n }\n\n isReleased = true\n clearTimeout(timer)\n releaseMutex()\n\n if (!mutex.isLocked()) {\n locks.delete(k)\n }\n },\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAEO,IAAM,oBAAmB;AAehC,SAAwB,IAAI,CAAC,aAAa,mBAA+B;AAAA,EACvE,MAAM,QAAQ,IAAI;AAAA,EAClB,OAAO,OAAO,QAA2B;AAAA,IACvC,MAAM,IAAI,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAAA,IAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;AAAA,MACjB,MAAM,IAAI,GAAG,IAAI,KAAO;AAAA,IAC1B;AAAA,IAEA,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IAEzB,MAAM,eAAe,MAAM,MAAM,QAAQ;AAAA,IACzC,IAAI,aAAa;AAAA,IAEjB,IAAI;AAAA,IACJ,MAAM,aAAa,CAAC,QAAgB;AAAA,MAClC,QAAQ,WAAW,MAAM;AAAA,QACvB,IAAI,CAAC,YAAY;AAAA,UACf,QAAQ,KAAK,4BAA4B,CAAC;AAAA,UAC1C,aAAa;AAAA,UACb,aAAa;AAAA,UACb,IAAI,CAAC,MAAM,SAAS,GAAG;AAAA,YACrB,MAAM,OAAO,CAAC;AAAA,UAChB;AAAA,QACF;AAAA,SACC,GAAG;AAAA;AAAA,IAGR,WAAW,UAAU;AAAA,IAErB,OAAO;AAAA,MACL,KAAK;AAAA,WACC,OAAM,CAAC,KAAc;AAAA,QACzB,IAAI,YAAY;AAAA,UACd,OAAO;AAAA,QACT;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,WAAW,OAAO,aAAa,CAAC;AAAA,QAChC,OAAO;AAAA;AAAA,WAEH,QAAO,GAAG;AAAA,QACd,IAAI,YAAY;AAAA,UACd;AAAA,QACF;AAAA,QAEA,aAAa;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,aAAa;AAAA,QAEb,IAAI,CAAC,MAAM,SAAS,GAAG;AAAA,UACrB,MAAM,OAAO,CAAC;AAAA,QAChB;AAAA;AAAA,IAEJ;AAAA;AAAA;",
|
|
8
|
+
"debugId": "769065B9E0FF5E8F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// src/errors.ts
|
|
2
2
|
import z from "zod/v4";
|
|
3
3
|
|
|
4
|
-
class
|
|
4
|
+
class ConcurrencyError2 extends Error {
|
|
5
5
|
constructor(streamId, expectedVersion, actualVersion) {
|
|
6
6
|
super(`Concurrency error on ${streamId.stream}(${streamId.id}): expected v${expectedVersion}, actual v${actualVersion}`);
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class CheckpointConcurrencyError2 extends Error {
|
|
11
11
|
checkpointType;
|
|
12
12
|
name;
|
|
13
13
|
expectedVersion;
|
|
@@ -19,7 +19,7 @@ class CheckpointConcurrencyError extends Error {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
class
|
|
22
|
+
class ValidationError2 extends Error {
|
|
23
23
|
zodError;
|
|
24
24
|
constructor(message, zodError) {
|
|
25
25
|
super(`${message}: ${z.prettifyError(zodError)}`);
|
|
@@ -27,13 +27,13 @@ class ValidationError extends Error {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
class
|
|
30
|
+
class EventValidationError2 extends ValidationError2 {
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
class
|
|
33
|
+
class InfiniteLoopError2 extends Error {
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
class
|
|
36
|
+
class CommandError2 extends Error {
|
|
37
37
|
aggregateRootType;
|
|
38
38
|
commandName;
|
|
39
39
|
streamId;
|
|
@@ -47,7 +47,7 @@ class CommandError extends Error {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
class
|
|
50
|
+
class ProjectionReplayLoopError2 extends Error {
|
|
51
51
|
projection;
|
|
52
52
|
event;
|
|
53
53
|
constructor(message, projection, event) {
|
|
@@ -57,13 +57,13 @@ class ProjectionReplayLoopError extends Error {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
class
|
|
60
|
+
class RefreshingSkipError2 extends Error {
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
class
|
|
63
|
+
class ReplaySkipError2 extends Error {
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
class
|
|
66
|
+
class ProjectionEventHandlerExecutionError2 extends Error {
|
|
67
67
|
projection;
|
|
68
68
|
eventHandler;
|
|
69
69
|
event;
|
|
@@ -77,7 +77,7 @@ class ProjectionEventHandlerExecutionError extends Error {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
class
|
|
80
|
+
class ProcessManagerEventHandlerExecutionError2 extends Error {
|
|
81
81
|
processManager;
|
|
82
82
|
eventHandler;
|
|
83
83
|
event;
|
|
@@ -91,6 +91,6 @@ class ProcessManagerEventHandlerExecutionError extends Error {
|
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
export {
|
|
94
|
+
export { ConcurrencyError2, CheckpointConcurrencyError2, ValidationError2, EventValidationError2, InfiniteLoopError2, CommandError2, ProjectionReplayLoopError2, RefreshingSkipError2, ReplaySkipError2, ProjectionEventHandlerExecutionError2, ProcessManagerEventHandlerExecutionError2 };
|
|
95
95
|
|
|
96
|
-
//# debugId=
|
|
96
|
+
//# debugId=42304B5DFE82D88064756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
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
6
|
],
|
|
7
|
-
"mappings": ";AAAA;AAAA;AAIO,MAAM,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAAA;AAAA;AAIO,MAAM,0BAAyB,MAAM;AAAA,EAC1C,WAAW,CACT,UACA,iBACA,eACA;AAAA,IACA,MACE,wBAAwB,SAAS,UAAU,SAAS,kBAAkB,4BAA4B,eACpG;AAAA;AAEJ;AAAA;AAEO,MAAM,oCAAmC,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,yBAAwB,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,8BAA6B,iBAAgB;AAAC;AAAA;AAEpD,MAAM,2BAA0B,MAAM;AAAC;AAAA;AAEvC,MAAM,sBAAsC,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,mCAAkC,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,6BAA4B,MAAM;AAAC;AAAA;AAEzC,MAAM,yBAAwB,MAAM;AAAC;AAAA;AAErC,MAAM,8CAEH,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,kDAEH,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": "42304B5DFE82D88064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// src/surreal/schema.ts
|
|
2
|
+
var TABLES2 = {
|
|
3
|
+
events: "events",
|
|
4
|
+
counters: "event_sourcing_counters",
|
|
5
|
+
checkpoints: "checkpoints",
|
|
6
|
+
aggregateRootSnapshots: "aggregate_root_snapshots",
|
|
7
|
+
projectionSnapshots: "projection_snapshots",
|
|
8
|
+
projectionAppliedEvents: "projection_applied_events"
|
|
9
|
+
};
|
|
10
|
+
var SCHEMA_STATEMENTS2 = `
|
|
11
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.events} SCHEMAFULL;
|
|
12
|
+
DEFINE FIELD IF NOT EXISTS position ON ${TABLES2.events} TYPE int;
|
|
13
|
+
DEFINE FIELD IF NOT EXISTS streamId ON ${TABLES2.events} TYPE string;
|
|
14
|
+
DEFINE FIELD IF NOT EXISTS streamType ON ${TABLES2.events} TYPE string;
|
|
15
|
+
DEFINE FIELD IF NOT EXISTS streamVersion ON ${TABLES2.events} TYPE int;
|
|
16
|
+
DEFINE FIELD IF NOT EXISTS type ON ${TABLES2.events} TYPE string;
|
|
17
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES2.events} TYPE datetime DEFAULT time::now();
|
|
18
|
+
DEFINE FIELD IF NOT EXISTS payload ON ${TABLES2.events} TYPE string;
|
|
19
|
+
DEFINE FIELD IF NOT EXISTS metadata ON ${TABLES2.events} TYPE object FLEXIBLE;
|
|
20
|
+
DEFINE FIELD IF NOT EXISTS causationId ON ${TABLES2.events} TYPE option<string>;
|
|
21
|
+
DEFINE FIELD IF NOT EXISTS correlationId ON ${TABLES2.events} TYPE option<string>;
|
|
22
|
+
DEFINE FIELD IF NOT EXISTS actorId ON ${TABLES2.events} TYPE option<string>;
|
|
23
|
+
DEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES2.events} TYPE int;
|
|
24
|
+
DEFINE INDEX IF NOT EXISTS events_stream_unique ON ${TABLES2.events} FIELDS streamId, streamType, streamVersion UNIQUE;
|
|
25
|
+
DEFINE INDEX IF NOT EXISTS events_position ON ${TABLES2.events} FIELDS position UNIQUE;
|
|
26
|
+
|
|
27
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.counters} SCHEMAFULL;
|
|
28
|
+
DEFINE FIELD IF NOT EXISTS value ON ${TABLES2.counters} TYPE int;
|
|
29
|
+
|
|
30
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.checkpoints} SCHEMAFULL;
|
|
31
|
+
DEFINE FIELD IF NOT EXISTS type ON ${TABLES2.checkpoints} TYPE string;
|
|
32
|
+
DEFINE FIELD IF NOT EXISTS name ON ${TABLES2.checkpoints} TYPE string;
|
|
33
|
+
DEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES2.checkpoints} TYPE int;
|
|
34
|
+
DEFINE FIELD IF NOT EXISTS metadata ON ${TABLES2.checkpoints} TYPE string;
|
|
35
|
+
DEFINE FIELD IF NOT EXISTS version ON ${TABLES2.checkpoints} TYPE int DEFAULT 0;
|
|
36
|
+
|
|
37
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.aggregateRootSnapshots} SCHEMAFULL;
|
|
38
|
+
DEFINE FIELD IF NOT EXISTS streamId ON ${TABLES2.aggregateRootSnapshots} TYPE string;
|
|
39
|
+
DEFINE FIELD IF NOT EXISTS streamType ON ${TABLES2.aggregateRootSnapshots} TYPE string;
|
|
40
|
+
DEFINE FIELD IF NOT EXISTS streamVersion ON ${TABLES2.aggregateRootSnapshots} TYPE int;
|
|
41
|
+
DEFINE FIELD IF NOT EXISTS state ON ${TABLES2.aggregateRootSnapshots} TYPE string;
|
|
42
|
+
DEFINE FIELD IF NOT EXISTS metadata ON ${TABLES2.aggregateRootSnapshots} TYPE string;
|
|
43
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES2.aggregateRootSnapshots} TYPE datetime DEFAULT time::now();
|
|
44
|
+
DEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES2.aggregateRootSnapshots} TYPE int;
|
|
45
|
+
DEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES2.aggregateRootSnapshots} TYPE int;
|
|
46
|
+
DEFINE INDEX IF NOT EXISTS aggregate_root_snapshots_unique ON ${TABLES2.aggregateRootSnapshots} FIELDS streamType, streamId, streamVersion UNIQUE;
|
|
47
|
+
|
|
48
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.projectionSnapshots} SCHEMAFULL;
|
|
49
|
+
DEFINE FIELD IF NOT EXISTS projectionId ON ${TABLES2.projectionSnapshots} TYPE string;
|
|
50
|
+
DEFINE FIELD IF NOT EXISTS projectionType ON ${TABLES2.projectionSnapshots} TYPE string;
|
|
51
|
+
DEFINE FIELD IF NOT EXISTS state ON ${TABLES2.projectionSnapshots} TYPE string;
|
|
52
|
+
DEFINE FIELD IF NOT EXISTS metadata ON ${TABLES2.projectionSnapshots} TYPE string;
|
|
53
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES2.projectionSnapshots} TYPE datetime DEFAULT time::now();
|
|
54
|
+
DEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES2.projectionSnapshots} TYPE int;
|
|
55
|
+
DEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES2.projectionSnapshots} TYPE int;
|
|
56
|
+
DEFINE INDEX IF NOT EXISTS projection_snapshots_unique ON ${TABLES2.projectionSnapshots} FIELDS projectionId, projectionType, lastEventPosition UNIQUE;
|
|
57
|
+
|
|
58
|
+
DEFINE TABLE IF NOT EXISTS ${TABLES2.projectionAppliedEvents} SCHEMAFULL;
|
|
59
|
+
DEFINE FIELD IF NOT EXISTS appliedEvents ON ${TABLES2.projectionAppliedEvents} TYPE int;
|
|
60
|
+
`;
|
|
61
|
+
async function initSchema2(database) {
|
|
62
|
+
await database.query(SCHEMA_STATEMENTS2);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { TABLES2, SCHEMA_STATEMENTS2, initSchema2 };
|
|
66
|
+
|
|
67
|
+
//# debugId=D36A3ED0D642495B64756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { Surreal } from 'surrealdb'\n\nexport const TABLES = {\n events: 'events',\n counters: 'event_sourcing_counters',\n checkpoints: 'checkpoints',\n aggregateRootSnapshots: 'aggregate_root_snapshots',\n projectionSnapshots: 'projection_snapshots',\n projectionAppliedEvents: 'projection_applied_events',\n} as const\n\n// Idempotent DDL — safe to run on every boot. All tables are SCHEMAFULL, so\n// SurrealDB rejects writes carrying fields that are not defined here.\nexport const SCHEMA_STATEMENTS = `\nDEFINE TABLE IF NOT EXISTS ${TABLES.events} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS position ON ${TABLES.events} TYPE int;\nDEFINE FIELD IF NOT EXISTS streamId ON ${TABLES.events} TYPE string;\nDEFINE FIELD IF NOT EXISTS streamType ON ${TABLES.events} TYPE string;\nDEFINE FIELD IF NOT EXISTS streamVersion ON ${TABLES.events} TYPE int;\nDEFINE FIELD IF NOT EXISTS type ON ${TABLES.events} TYPE string;\nDEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES.events} TYPE datetime DEFAULT time::now();\nDEFINE FIELD IF NOT EXISTS payload ON ${TABLES.events} TYPE string;\nDEFINE FIELD IF NOT EXISTS metadata ON ${TABLES.events} TYPE object FLEXIBLE;\nDEFINE FIELD IF NOT EXISTS causationId ON ${TABLES.events} TYPE option<string>;\nDEFINE FIELD IF NOT EXISTS correlationId ON ${TABLES.events} TYPE option<string>;\nDEFINE FIELD IF NOT EXISTS actorId ON ${TABLES.events} TYPE option<string>;\nDEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES.events} TYPE int;\nDEFINE INDEX IF NOT EXISTS events_stream_unique ON ${TABLES.events} FIELDS streamId, streamType, streamVersion UNIQUE;\nDEFINE INDEX IF NOT EXISTS events_position ON ${TABLES.events} FIELDS position UNIQUE;\n\nDEFINE TABLE IF NOT EXISTS ${TABLES.counters} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS value ON ${TABLES.counters} TYPE int;\n\nDEFINE TABLE IF NOT EXISTS ${TABLES.checkpoints} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS type ON ${TABLES.checkpoints} TYPE string;\nDEFINE FIELD IF NOT EXISTS name ON ${TABLES.checkpoints} TYPE string;\nDEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES.checkpoints} TYPE int;\nDEFINE FIELD IF NOT EXISTS metadata ON ${TABLES.checkpoints} TYPE string;\nDEFINE FIELD IF NOT EXISTS version ON ${TABLES.checkpoints} TYPE int DEFAULT 0;\n\nDEFINE TABLE IF NOT EXISTS ${TABLES.aggregateRootSnapshots} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS streamId ON ${TABLES.aggregateRootSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS streamType ON ${TABLES.aggregateRootSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS streamVersion ON ${TABLES.aggregateRootSnapshots} TYPE int;\nDEFINE FIELD IF NOT EXISTS state ON ${TABLES.aggregateRootSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS metadata ON ${TABLES.aggregateRootSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES.aggregateRootSnapshots} TYPE datetime DEFAULT time::now();\nDEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES.aggregateRootSnapshots} TYPE int;\nDEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES.aggregateRootSnapshots} TYPE int;\nDEFINE INDEX IF NOT EXISTS aggregate_root_snapshots_unique ON ${TABLES.aggregateRootSnapshots} FIELDS streamType, streamId, streamVersion UNIQUE;\n\nDEFINE TABLE IF NOT EXISTS ${TABLES.projectionSnapshots} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS projectionId ON ${TABLES.projectionSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS projectionType ON ${TABLES.projectionSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS state ON ${TABLES.projectionSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS metadata ON ${TABLES.projectionSnapshots} TYPE string;\nDEFINE FIELD IF NOT EXISTS createdAt ON ${TABLES.projectionSnapshots} TYPE datetime DEFAULT time::now();\nDEFINE FIELD IF NOT EXISTS lastEventPosition ON ${TABLES.projectionSnapshots} TYPE int;\nDEFINE FIELD IF NOT EXISTS schemaVersion ON ${TABLES.projectionSnapshots} TYPE int;\nDEFINE INDEX IF NOT EXISTS projection_snapshots_unique ON ${TABLES.projectionSnapshots} FIELDS projectionId, projectionType, lastEventPosition UNIQUE;\n\nDEFINE TABLE IF NOT EXISTS ${TABLES.projectionAppliedEvents} SCHEMAFULL;\nDEFINE FIELD IF NOT EXISTS appliedEvents ON ${TABLES.projectionAppliedEvents} TYPE int;\n`\n\nexport async function initSchema(database: Surreal): Promise<void> {\n await database.query(SCHEMA_STATEMENTS)\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AAEO,IAAM,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAEO,IAAM,UAAS;AAAA,EACpB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,yBAAyB;AAC3B;AAIO,IAAM,qBAAoB;AAAA,6BACJ,QAAO;AAAA,yCACK,QAAO;AAAA,yCACP,QAAO;AAAA,2CACL,QAAO;AAAA,8CACJ,QAAO;AAAA,qCAChB,QAAO;AAAA,0CACF,QAAO;AAAA,wCACT,QAAO;AAAA,yCACN,QAAO;AAAA,4CACJ,QAAO;AAAA,8CACL,QAAO;AAAA,wCACb,QAAO;AAAA,8CACD,QAAO;AAAA,qDACA,QAAO;AAAA,gDACZ,QAAO;AAAA;AAAA,6BAE1B,QAAO;AAAA,sCACE,QAAO;AAAA;AAAA,6BAEhB,QAAO;AAAA,qCACC,QAAO;AAAA,qCACP,QAAO;AAAA,kDACM,QAAO;AAAA,yCAChB,QAAO;AAAA,wCACR,QAAO;AAAA;AAAA,6BAElB,QAAO;AAAA,yCACK,QAAO;AAAA,2CACL,QAAO;AAAA,8CACJ,QAAO;AAAA,sCACf,QAAO;AAAA,yCACJ,QAAO;AAAA,0CACN,QAAO;AAAA,kDACC,QAAO;AAAA,8CACX,QAAO;AAAA,gEACW,QAAO;AAAA;AAAA,6BAE1C,QAAO;AAAA,6CACS,QAAO;AAAA,+CACL,QAAO;AAAA,sCAChB,QAAO;AAAA,yCACJ,QAAO;AAAA,0CACN,QAAO;AAAA,kDACC,QAAO;AAAA,8CACX,QAAO;AAAA,4DACO,QAAO;AAAA;AAAA,6BAEtC,QAAO;AAAA,8CACU,QAAO;AAAA;AAGrD,eAAsB,WAAU,CAAC,UAAkC;AAAA,EACjE,MAAM,SAAS,MAAM,kBAAiB;AAAA;",
|
|
8
|
+
"debugId": "D36A3ED0D642495B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
2
|
+
CheckpointConcurrencyError2,
|
|
3
|
+
ValidationError2
|
|
4
|
+
} from "./chunk-jw9e0fr0.js";
|
|
5
5
|
|
|
6
6
|
// src/createCheckpointApi.ts
|
|
7
7
|
import z from "zod/v4";
|
|
@@ -12,7 +12,7 @@ var checkpointSchema = z.object({
|
|
|
12
12
|
metadata: z.record(z.string(), z.any()),
|
|
13
13
|
version: z.int()
|
|
14
14
|
});
|
|
15
|
-
function
|
|
15
|
+
function createCheckpointApi2(params) {
|
|
16
16
|
let version = null;
|
|
17
17
|
let position = null;
|
|
18
18
|
const api = {
|
|
@@ -91,7 +91,7 @@ function createCheckpointApi(params) {
|
|
|
91
91
|
}
|
|
92
92
|
const current = await api.load();
|
|
93
93
|
if (mode === "cas") {
|
|
94
|
-
throw new
|
|
94
|
+
throw new CheckpointConcurrencyError2(params.type, params.name, expectedVersion);
|
|
95
95
|
}
|
|
96
96
|
if (current && current.lastEventPosition >= event.position) {
|
|
97
97
|
return;
|
|
@@ -104,7 +104,7 @@ function createCheckpointApi(params) {
|
|
|
104
104
|
if (checkpoint) {
|
|
105
105
|
const result = checkpointSchema.safeParse(checkpoint);
|
|
106
106
|
if (!result.success) {
|
|
107
|
-
throw new
|
|
107
|
+
throw new ValidationError2(`loaded checkpoint for ${params.type} ${params.name} does not comply with schema`, result.error);
|
|
108
108
|
}
|
|
109
109
|
startPosition = checkpoint.lastEventPosition + 1;
|
|
110
110
|
options.onMetadata?.(checkpoint.metadata);
|
|
@@ -134,6 +134,6 @@ function createCheckpointApi(params) {
|
|
|
134
134
|
return api;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
export {
|
|
137
|
+
export { createCheckpointApi2 };
|
|
138
138
|
|
|
139
|
-
//# debugId=
|
|
139
|
+
//# debugId=48393861CC2E414464756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
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\n/**\n * The outcome of {@link CheckpointApi.claim}: either this instance owns the\n * event and must run its work, or another instance already has it.\n */\nexport type ClaimResult =\n | { claimed: false }\n | { claimed: true; release: () => Promise<void> }\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 // The position that goes with `version`. Only {@link CheckpointApi.claim}\n // needs it, to put the cursor back if the work it claimed then fails.\n let position: 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 position = 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 position = checkpoint?.lastEventPosition ?? null\n return checkpoint ?? null\n },\n /**\n * Takes ownership of `event` *before* its work runs, so that exactly one\n * instance does that work.\n *\n * Every instance runs its own copy of a projection against shared storage,\n * and each decides what it has already applied from a cursor only it can\n * see. Two instances catching up over the same backlog — or one catching up\n * while the other applies an event it just appended — therefore both reach\n * the same handler. Writing the cursor first, through the same\n * compare-and-swap the ordinary write uses, is what breaks the tie: the\n * loser is told so and skips the event instead of repeating its side\n * effects.\n *\n * Returns `{ claimed: false }` when another writer already covers this\n * position. On success the caller gets a `release` to call if the work then\n * fails, which puts the cursor back so the event is picked up again rather\n * than silently skipped — without it, claiming would turn every failed\n * handler into a lost event.\n */\n async claim(\n event: BaseOutputEvent,\n metadata: Record<string, any> = {},\n ): Promise<ClaimResult> {\n while (true) {\n const expectedVersion = version\n const previousPosition = position\n const nextVersion = (expectedVersion ?? -1) + 1\n\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 position = event.position\n\n return {\n claimed: true,\n async release() {\n // Only undo a claim that is still the newest write. Once anything\n // else has moved the cursor, rewinding it would drop that work.\n if (version !== nextVersion) {\n return\n }\n\n if (previousPosition === null) {\n await api.clear()\n return\n }\n\n const restored = await params.upsert(\n {\n lastEventPosition: previousPosition,\n type: params.type,\n name: params.name,\n metadata,\n version: nextVersion + 1,\n },\n nextVersion,\n )\n\n if (restored) {\n version = nextVersion + 1\n position = previousPosition\n }\n },\n }\n }\n\n // Another writer advanced this checkpoint. Refresh our view of it.\n const current = await api.load()\n\n if (current && current.lastEventPosition >= event.position) {\n return { claimed: false }\n }\n }\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 position = event.position\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
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;AAoCM,SAAS,
|
|
8
|
-
"debugId": "
|
|
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;AAoCM,SAAS,oBAAmB,CACjC,QAQA;AAAA,EAKA,IAAI,UAAyB;AAAA,EAG7B,IAAI,WAA0B;AAAA,EAE9B,MAAM,MAAM;AAAA,IACV,qBAAqB,OAAO;AAAA,SACtB,MAAK,GAAG;AAAA,MACZ,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,MAC5C,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,SAOP,KAAI,GAAG;AAAA,MACX,MAAM,aAAa,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI;AAAA,MAC5D,UAAU,YAAY,WAAW;AAAA,MACjC,WAAW,YAAY,qBAAqB;AAAA,MAC5C,OAAO,cAAc;AAAA;AAAA,SAqBjB,MAAK,CACT,OACA,WAAgC,CAAC,GACX;AAAA,MACtB,OAAO,MAAM;AAAA,QACX,MAAM,kBAAkB;AAAA,QACxB,MAAM,mBAAmB;AAAA,QACzB,MAAM,eAAe,mBAAmB,MAAM;AAAA,QAE9C,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,WAAW,MAAM;AAAA,UAEjB,OAAO;AAAA,YACL,SAAS;AAAA,iBACH,QAAO,GAAG;AAAA,cAGd,IAAI,YAAY,aAAa;AAAA,gBAC3B;AAAA,cACF;AAAA,cAEA,IAAI,qBAAqB,MAAM;AAAA,gBAC7B,MAAM,IAAI,MAAM;AAAA,gBAChB;AAAA,cACF;AAAA,cAEA,MAAM,WAAW,MAAM,OAAO,OAC5B;AAAA,gBACE,mBAAmB;AAAA,gBACnB,MAAM,OAAO;AAAA,gBACb,MAAM,OAAO;AAAA,gBACb;AAAA,gBACA,SAAS,cAAc;AAAA,cACzB,GACA,WACF;AAAA,cAEA,IAAI,UAAU;AAAA,gBACZ,UAAU,cAAc;AAAA,gBACxB,WAAW;AAAA,cACb;AAAA;AAAA,UAEJ;AAAA,QACF;AAAA,QAGA,MAAM,UAAU,MAAM,IAAI,KAAK;AAAA,QAE/B,IAAI,WAAW,QAAQ,qBAAqB,MAAM,UAAU;AAAA,UAC1D,OAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,SAeI,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,WAAW,MAAM;AAAA,UACjB;AAAA,QACF;AAAA,QAGA,MAAM,UAAU,MAAM,IAAI,KAAK;AAAA,QAE/B,IAAI,SAAS,OAAO;AAAA,UAClB,MAAM,IAAI,4BACR,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,iBACR,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": "48393861CC2E414464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
unwrapEvent,
|
|
6
|
-
wrappedEventBuilder
|
|
7
|
-
} from "./chunk-z388cd25.js";
|
|
2
|
+
createEventListener2
|
|
3
|
+
} from "./chunk-06anxtk6.js";
|
|
8
4
|
import {
|
|
9
|
-
|
|
10
|
-
} from "./chunk-
|
|
5
|
+
withRefreshing2
|
|
6
|
+
} from "./chunk-hmvwn02w.js";
|
|
11
7
|
import {
|
|
12
|
-
|
|
13
|
-
} from "./chunk-
|
|
8
|
+
buildProcessManagerCreator2
|
|
9
|
+
} from "./chunk-d6jqbrq2.js";
|
|
14
10
|
import {
|
|
15
|
-
|
|
16
|
-
} from "./chunk-
|
|
11
|
+
buildProjectionCreator2
|
|
12
|
+
} from "./chunk-2wqpktzp.js";
|
|
17
13
|
import {
|
|
18
|
-
|
|
19
|
-
} from "./chunk-
|
|
14
|
+
lock
|
|
15
|
+
} from "./chunk-j4mwjx07.js";
|
|
20
16
|
import {
|
|
21
17
|
createTransaction
|
|
22
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-9qtjz725.js";
|
|
19
|
+
import {
|
|
20
|
+
unwrapEvent2,
|
|
21
|
+
wrappedEventBuilder2
|
|
22
|
+
} from "./chunk-zkz6ew8c.js";
|
|
23
23
|
|
|
24
24
|
// src/createEventStore.ts
|
|
25
|
-
function
|
|
25
|
+
function createEventStore2(params) {
|
|
26
26
|
const transaction = createTransaction();
|
|
27
27
|
const { promise: initialized, resolve: resolveInitialized } = Promise.withResolvers();
|
|
28
28
|
const projections = new Map;
|
|
@@ -79,9 +79,9 @@ function createEventStore(params) {
|
|
|
79
79
|
const processedEvents = events.map((rawEvent) => {
|
|
80
80
|
const event = structuredClone(rawEvent);
|
|
81
81
|
if (params.postProcessEvent) {
|
|
82
|
-
const wrappedEvent =
|
|
82
|
+
const wrappedEvent = wrappedEventBuilder2(event);
|
|
83
83
|
const { aggregateRoot } = aggregatRootsByEvents.get(event.type);
|
|
84
|
-
const processedEvent =
|
|
84
|
+
const processedEvent = unwrapEvent2(params.postProcessEvent(wrappedEvent, aggregateRoot));
|
|
85
85
|
Object.assign(event, processedEvent);
|
|
86
86
|
}
|
|
87
87
|
return event;
|
|
@@ -104,13 +104,13 @@ function createEventStore(params) {
|
|
|
104
104
|
});
|
|
105
105
|
aggregateRoot.linkEventStore(loadEvents, appendEvents, emitEvents, transaction, params.lock ?? lock(5000), params.aggregateRootSnapshot);
|
|
106
106
|
}
|
|
107
|
-
const baseCreateProjection =
|
|
107
|
+
const baseCreateProjection = buildProjectionCreator2({
|
|
108
108
|
loadEvents,
|
|
109
109
|
checkpoint: params.checkpoint,
|
|
110
110
|
snapshot: params.projectionSnapshot,
|
|
111
111
|
onReplay: params.onProjectionReplay
|
|
112
112
|
});
|
|
113
|
-
const baseCreateProcessManager =
|
|
113
|
+
const baseCreateProcessManager = buildProcessManagerCreator2({
|
|
114
114
|
loadEvents,
|
|
115
115
|
checkpoint: params.checkpoint,
|
|
116
116
|
onRefresh: params.onProcessManagerRefresh
|
|
@@ -153,36 +153,36 @@ function createEventStore(params) {
|
|
|
153
153
|
if (projections.has(name)) {
|
|
154
154
|
throw new Error(`Projection ${name} is already registered`);
|
|
155
155
|
}
|
|
156
|
-
const
|
|
157
|
-
const internalApi =
|
|
156
|
+
const api = baseCreateProjection(name);
|
|
157
|
+
const internalApi = api;
|
|
158
158
|
internalApi.setRelatedStreamEvents((handlers) => getRelatedStreamEvents(handlers));
|
|
159
159
|
projections.set(name, internalApi);
|
|
160
160
|
if (initializing) {
|
|
161
161
|
internalApi.init(true);
|
|
162
162
|
}
|
|
163
|
-
return
|
|
163
|
+
return api;
|
|
164
164
|
},
|
|
165
165
|
createProcessManager(name, options) {
|
|
166
166
|
if (processManagers.has(name)) {
|
|
167
167
|
throw new Error(`Process Manager ${name} is already registered`);
|
|
168
168
|
}
|
|
169
|
-
const
|
|
170
|
-
const internalApi =
|
|
169
|
+
const api = baseCreateProcessManager(name, options);
|
|
170
|
+
const internalApi = api;
|
|
171
171
|
internalApi.setRelatedStreamEvents((handlers) => getRelatedStreamEvents(handlers));
|
|
172
172
|
processManagers.set(name, internalApi);
|
|
173
173
|
if (initializing) {
|
|
174
174
|
internalApi.init(true);
|
|
175
175
|
}
|
|
176
|
-
return
|
|
176
|
+
return api;
|
|
177
177
|
},
|
|
178
178
|
createEventListener(name) {
|
|
179
179
|
if (eventListeners.has(name)) {
|
|
180
180
|
throw new Error(`Event Listener ${name} is already registered`);
|
|
181
181
|
}
|
|
182
|
-
const
|
|
183
|
-
const internalApi =
|
|
182
|
+
const api = createEventListener2(name);
|
|
183
|
+
const internalApi = api;
|
|
184
184
|
eventListeners.set(name, internalApi);
|
|
185
|
-
return
|
|
185
|
+
return api;
|
|
186
186
|
},
|
|
187
187
|
async isReady() {
|
|
188
188
|
await initialized;
|
|
@@ -202,7 +202,7 @@ function createEventStore(params) {
|
|
|
202
202
|
...replayProjections.map((projection) => projection.beginReplay()),
|
|
203
203
|
...replayProcessManagers.map((processManager) => processManager.beginRefresh())
|
|
204
204
|
]);
|
|
205
|
-
await
|
|
205
|
+
await withRefreshing2(async () => {
|
|
206
206
|
let index = 0;
|
|
207
207
|
for await (const event of loadEvents(null)) {
|
|
208
208
|
index++;
|
|
@@ -245,6 +245,6 @@ function createEventStore(params) {
|
|
|
245
245
|
return api;
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
-
export {
|
|
248
|
+
export { createEventStore2 };
|
|
249
249
|
|
|
250
|
-
//# debugId=
|
|
250
|
+
//# debugId=45EED805BC72D1C864756E2164756E21
|