@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.
@@ -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;AAE3F;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,YAqBD,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}:${String(id)}`;
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,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/C,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"}
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.4",
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.0",
51
- "@kronos-ts/messaging": "0.1.0",
52
- "@kronos-ts/modelling": "0.1.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.1.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}:${String(id)}`
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())