@kronos-ts/eventsourcing 0.1.4 → 0.1.5
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/load.d.ts.map +1 -1
- package/dist/load.js +23 -1
- package/dist/load.js.map +1 -1
- package/package.json +5 -5
- package/src/load.ts +22 -1
package/dist/load.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;KAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAClG,CAAC,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACvD;AAMD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,CACJ,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,GAAG,KACJ,OAAO,CAAC;QACX,KAAK,EAAE,GAAG,CAAA;QACV,YAAY,EAAE;YAAE,QAAQ,EAAE,aAAa,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAClE,CAAC,CAAA;CACH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,gBAAgB,CAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;KAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAClG,CAAC,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACvD;AAMD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,CACJ,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,GAAG,KACJ,OAAO,CAAC;QACX,KAAK,EAAE,GAAG,CAAA;QACV,YAAY,EAAE;YAAE,QAAQ,EAAE,aAAa,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAClE,CAAC,CAAA;CACH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,gBAAgB,CAA+B,CAAA;AAuB3F;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,YAqBD,CAAA"}
|
package/dist/load.js
CHANGED
|
@@ -6,6 +6,28 @@ import { STATE_CACHE_KEY, STATE_MODULES_KEY, SOURCING_INFOS_KEY } from "./append
|
|
|
6
6
|
* Written by handling modules + processors at handler-invocation entry (D-44).
|
|
7
7
|
*/
|
|
8
8
|
export const STATE_MANAGER_KEY = resourceKey("stateManager");
|
|
9
|
+
/**
|
|
10
|
+
* Stable cache key for a state id. State ids are typically objects
|
|
11
|
+
* (e.g. `{ ticketId }`), and `String({...})` collapses every object to
|
|
12
|
+
* `"[object Object]"` — which would make two different ids of the same module
|
|
13
|
+
* share a cache entry within a UoW and return each other's state. Serialize
|
|
14
|
+
* structurally instead, with sorted keys (so id construction order is
|
|
15
|
+
* irrelevant) and bigint support. Primitive ids serialize to a unique string
|
|
16
|
+
* too, so this is strictly safer than `String(id)`.
|
|
17
|
+
*/
|
|
18
|
+
function stableIdKey(id) {
|
|
19
|
+
return JSON.stringify(id, (_key, value) => {
|
|
20
|
+
if (typeof value === "bigint")
|
|
21
|
+
return `${value}n`;
|
|
22
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
23
|
+
const sorted = {};
|
|
24
|
+
for (const k of Object.keys(value).sort())
|
|
25
|
+
sorted[k] = value[k];
|
|
26
|
+
return sorted;
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
9
31
|
/**
|
|
10
32
|
* Plan 04-01 (HDL-02 / D-42): module-level load.
|
|
11
33
|
*
|
|
@@ -21,7 +43,7 @@ export const load = (async (module, id) => {
|
|
|
21
43
|
if (!stateManager)
|
|
22
44
|
throw new Error("No state manager configured");
|
|
23
45
|
const cache = computeIfAbsent(STATE_CACHE_KEY, () => new Map());
|
|
24
|
-
const cacheKey = `${module.name}:${
|
|
46
|
+
const cacheKey = `${module.name}:${stableIdKey(id)}`;
|
|
25
47
|
if (!cache.has(cacheKey)) {
|
|
26
48
|
cache.set(cacheKey, stateManager.load(module, id));
|
|
27
49
|
const modules = computeIfAbsent(STATE_MODULES_KEY, () => new Map());
|
package/dist/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AA4BpF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAkC,WAAW,CAAC,cAAc,CAAC,CAAA;AAE3F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAiB,CAAC,KAAK,EAAK,MAAwB,EAAE,EAAW,EAAc,EAAE;IAChG,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAA;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,kBAAkB,EAAE,CAAA;IACvD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAiC,CAAA;IAClG,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEjE,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AA4BpF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAkC,WAAW,CAAC,cAAc,CAAC,CAAA;AAE3F;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,EAAW;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,KAAK,GAAG,CAAA;QACjD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,MAAM,GAA4B,EAAE,CAAA;YAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAI,KAAiC,CAAC,CAAC,CAAC,CAAA;YAC5F,OAAO,MAAM,CAAA;QACf,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAiB,CAAC,KAAK,EAAK,MAAwB,EAAE,EAAW,EAAc,EAAE;IAChG,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAA;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,kBAAkB,EAAE,CAAA;IACvD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAiC,CAAA;IAClG,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEjE,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAA;IACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,eAAe,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAA;IACzC,MAAM,UAAU,GAAG,MAGlB,CAAA;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IACnC,OAAO,UAAU,CAAC,KAAU,CAAA;AAC9B,CAAC,CAAiB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kronos-ts/eventsourcing",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Event sourcing for Kronos — dynamic-consistency-boundary event store with load/append.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -47,12 +47,12 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@kronos-ts/common": "0.1.
|
|
51
|
-
"@kronos-ts/messaging": "0.
|
|
52
|
-
"@kronos-ts/modelling": "0.
|
|
50
|
+
"@kronos-ts/common": "0.1.1",
|
|
51
|
+
"@kronos-ts/messaging": "0.4.0",
|
|
52
|
+
"@kronos-ts/modelling": "0.2.2",
|
|
53
53
|
"zod": "^4.3.6"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@kronos-ts/app": "0.
|
|
56
|
+
"@kronos-ts/app": "0.3.2"
|
|
57
57
|
}
|
|
58
58
|
}
|
package/src/load.ts
CHANGED
|
@@ -39,6 +39,27 @@ type StateManagerLike = {
|
|
|
39
39
|
*/
|
|
40
40
|
export const STATE_MANAGER_KEY: ResourceKey<StateManagerLike> = resourceKey("stateManager")
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Stable cache key for a state id. State ids are typically objects
|
|
44
|
+
* (e.g. `{ ticketId }`), and `String({...})` collapses every object to
|
|
45
|
+
* `"[object Object]"` — which would make two different ids of the same module
|
|
46
|
+
* share a cache entry within a UoW and return each other's state. Serialize
|
|
47
|
+
* structurally instead, with sorted keys (so id construction order is
|
|
48
|
+
* irrelevant) and bigint support. Primitive ids serialize to a unique string
|
|
49
|
+
* too, so this is strictly safer than `String(id)`.
|
|
50
|
+
*/
|
|
51
|
+
function stableIdKey(id: unknown): string {
|
|
52
|
+
return JSON.stringify(id, (_key, value) => {
|
|
53
|
+
if (typeof value === "bigint") return `${value}n`
|
|
54
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
55
|
+
const sorted: Record<string, unknown> = {}
|
|
56
|
+
for (const k of Object.keys(value).sort()) sorted[k] = (value as Record<string, unknown>)[k]
|
|
57
|
+
return sorted
|
|
58
|
+
}
|
|
59
|
+
return value
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
42
63
|
/**
|
|
43
64
|
* Plan 04-01 (HDL-02 / D-42): module-level load.
|
|
44
65
|
*
|
|
@@ -53,7 +74,7 @@ export const load: LoadFunction = (async <S>(module: { name: string }, id: unkno
|
|
|
53
74
|
if (!stateManager) throw new Error("No state manager configured")
|
|
54
75
|
|
|
55
76
|
const cache = computeIfAbsent(STATE_CACHE_KEY, () => new Map())
|
|
56
|
-
const cacheKey = `${module.name}:${
|
|
77
|
+
const cacheKey = `${module.name}:${stableIdKey(id)}`
|
|
57
78
|
if (!cache.has(cacheKey)) {
|
|
58
79
|
cache.set(cacheKey, stateManager.load(module, id))
|
|
59
80
|
const modules = computeIfAbsent(STATE_MODULES_KEY, () => new Map())
|