@spine-event-engine/storage 2.0.0-snapshot.10

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 (137) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +190 -0
  3. package/REFERENCE.md +122 -0
  4. package/dist/entity/entity-history-record-spec.d.ts +26 -0
  5. package/dist/entity/entity-history-record-spec.d.ts.map +1 -0
  6. package/dist/entity/entity-history-record-spec.js +77 -0
  7. package/dist/entity/entity-history-record-spec.js.map +1 -0
  8. package/dist/entity/entity-history-storage.d.ts +111 -0
  9. package/dist/entity/entity-history-storage.d.ts.map +1 -0
  10. package/dist/entity/entity-history-storage.js +40 -0
  11. package/dist/entity/entity-history-storage.js.map +1 -0
  12. package/dist/entity/entity-record.d.ts +31 -0
  13. package/dist/entity/entity-record.d.ts.map +1 -0
  14. package/dist/entity/entity-record.js +15 -0
  15. package/dist/entity/entity-record.js.map +1 -0
  16. package/dist/entity/history-conformance.d.ts +55 -0
  17. package/dist/entity/history-conformance.d.ts.map +1 -0
  18. package/dist/entity/history-conformance.js +165 -0
  19. package/dist/entity/history-conformance.js.map +1 -0
  20. package/dist/event/event-store.d.ts +141 -0
  21. package/dist/event/event-store.d.ts.map +1 -0
  22. package/dist/event/event-store.js +407 -0
  23. package/dist/event/event-store.js.map +1 -0
  24. package/dist/index.d.ts +22 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +29 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/internal/delivery-cleanup.d.ts +99 -0
  29. package/dist/internal/delivery-cleanup.d.ts.map +1 -0
  30. package/dist/internal/delivery-cleanup.js +38 -0
  31. package/dist/internal/delivery-cleanup.js.map +1 -0
  32. package/dist/internal/entity-commit.d.ts +108 -0
  33. package/dist/internal/entity-commit.d.ts.map +1 -0
  34. package/dist/internal/entity-commit.js +32 -0
  35. package/dist/internal/entity-commit.js.map +1 -0
  36. package/dist/internal/entity-history.d.ts +12 -0
  37. package/dist/internal/entity-history.d.ts.map +1 -0
  38. package/dist/internal/entity-history.js +17 -0
  39. package/dist/internal/entity-history.js.map +1 -0
  40. package/dist/internal/event-store.d.ts +8 -0
  41. package/dist/internal/event-store.d.ts.map +1 -0
  42. package/dist/internal/event-store.js +21 -0
  43. package/dist/internal/event-store.js.map +1 -0
  44. package/dist/internal/query-values.d.ts +5 -0
  45. package/dist/internal/query-values.d.ts.map +1 -0
  46. package/dist/internal/query-values.js +18 -0
  47. package/dist/internal/query-values.js.map +1 -0
  48. package/dist/internal/tenancy.d.ts +89 -0
  49. package/dist/internal/tenancy.d.ts.map +1 -0
  50. package/dist/internal/tenancy.js +97 -0
  51. package/dist/internal/tenancy.js.map +1 -0
  52. package/dist/memory/canonical-utf8.d.ts +21 -0
  53. package/dist/memory/canonical-utf8.d.ts.map +1 -0
  54. package/dist/memory/canonical-utf8.js +65 -0
  55. package/dist/memory/canonical-utf8.js.map +1 -0
  56. package/dist/memory/in-memory-entity-commit.d.ts +35 -0
  57. package/dist/memory/in-memory-entity-commit.d.ts.map +1 -0
  58. package/dist/memory/in-memory-entity-commit.js +183 -0
  59. package/dist/memory/in-memory-entity-commit.js.map +1 -0
  60. package/dist/memory/in-memory-entity-history.d.ts +379 -0
  61. package/dist/memory/in-memory-entity-history.d.ts.map +1 -0
  62. package/dist/memory/in-memory-entity-history.js +756 -0
  63. package/dist/memory/in-memory-entity-history.js.map +1 -0
  64. package/dist/memory/in-memory-record-storage.d.ts +78 -0
  65. package/dist/memory/in-memory-record-storage.d.ts.map +1 -0
  66. package/dist/memory/in-memory-record-storage.js +127 -0
  67. package/dist/memory/in-memory-record-storage.js.map +1 -0
  68. package/dist/memory/in-memory-storage-backend.d.ts +38 -0
  69. package/dist/memory/in-memory-storage-backend.d.ts.map +1 -0
  70. package/dist/memory/in-memory-storage-backend.js +108 -0
  71. package/dist/memory/in-memory-storage-backend.js.map +1 -0
  72. package/dist/memory/in-memory-storage-factory.d.ts +58 -0
  73. package/dist/memory/in-memory-storage-factory.d.ts.map +1 -0
  74. package/dist/memory/in-memory-storage-factory.js +148 -0
  75. package/dist/memory/in-memory-storage-factory.js.map +1 -0
  76. package/dist/memory/memory-delivery-cleanup.d.ts +32 -0
  77. package/dist/memory/memory-delivery-cleanup.d.ts.map +1 -0
  78. package/dist/memory/memory-delivery-cleanup.js +61 -0
  79. package/dist/memory/memory-delivery-cleanup.js.map +1 -0
  80. package/dist/memory/tenant-records.d.ts +66 -0
  81. package/dist/memory/tenant-records.d.ts.map +1 -0
  82. package/dist/memory/tenant-records.js +573 -0
  83. package/dist/memory/tenant-records.js.map +1 -0
  84. package/dist/provider.d.ts +18 -0
  85. package/dist/provider.d.ts.map +1 -0
  86. package/dist/provider.js +23 -0
  87. package/dist/provider.js.map +1 -0
  88. package/dist/query/query-execution.d.ts +50 -0
  89. package/dist/query/query-execution.d.ts.map +1 -0
  90. package/dist/query/query-execution.js +222 -0
  91. package/dist/query/query-execution.js.map +1 -0
  92. package/dist/query/query-policy.d.ts +115 -0
  93. package/dist/query/query-policy.d.ts.map +1 -0
  94. package/dist/query/query-policy.js +294 -0
  95. package/dist/query/query-policy.js.map +1 -0
  96. package/dist/record/column-mapping.d.ts +41 -0
  97. package/dist/record/column-mapping.d.ts.map +1 -0
  98. package/dist/record/column-mapping.js +36 -0
  99. package/dist/record/column-mapping.js.map +1 -0
  100. package/dist/record/column-type.d.ts +75 -0
  101. package/dist/record/column-type.d.ts.map +1 -0
  102. package/dist/record/column-type.js +69 -0
  103. package/dist/record/column-type.js.map +1 -0
  104. package/dist/record/record-column.d.ts +23 -0
  105. package/dist/record/record-column.d.ts.map +1 -0
  106. package/dist/record/record-column.js +41 -0
  107. package/dist/record/record-column.js.map +1 -0
  108. package/dist/record/record-mask.d.ts +11 -0
  109. package/dist/record/record-mask.d.ts.map +1 -0
  110. package/dist/record/record-mask.js +82 -0
  111. package/dist/record/record-mask.js.map +1 -0
  112. package/dist/record/record-query.d.ts +102 -0
  113. package/dist/record/record-query.d.ts.map +1 -0
  114. package/dist/record/record-query.js +44 -0
  115. package/dist/record/record-query.js.map +1 -0
  116. package/dist/record/record-spec.d.ts +101 -0
  117. package/dist/record/record-spec.d.ts.map +1 -0
  118. package/dist/record/record-spec.js +159 -0
  119. package/dist/record/record-spec.js.map +1 -0
  120. package/dist/record/record-storage.d.ts +202 -0
  121. package/dist/record/record-storage.d.ts.map +1 -0
  122. package/dist/record/record-storage.js +234 -0
  123. package/dist/record/record-storage.js.map +1 -0
  124. package/dist/record/storage-group.d.ts +17 -0
  125. package/dist/record/storage-group.d.ts.map +1 -0
  126. package/dist/record/storage-group.js +37 -0
  127. package/dist/record/storage-group.js.map +1 -0
  128. package/dist/storage/storage-factory.d.ts +44 -0
  129. package/dist/storage/storage-factory.d.ts.map +1 -0
  130. package/dist/storage/storage-factory.js +54 -0
  131. package/dist/storage/storage-factory.js.map +1 -0
  132. package/dist/storage/storage.d.ts +62 -0
  133. package/dist/storage/storage.d.ts.map +1 -0
  134. package/dist/storage/storage.js +15 -0
  135. package/dist/storage/storage.js.map +1 -0
  136. package/dist/tsconfig.tsbuildinfo +1 -0
  137. package/package.json +35 -0
@@ -0,0 +1,111 @@
1
+ import type { Message } from "@bufbuild/protobuf";
2
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
3
+ import type { Event } from "@spine-event-engine/proto";
4
+ import type { EntityRecord } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
5
+ /**
6
+ * Represents application-managed maintenance for retained entity state history.
7
+ */
8
+ declare const entityStateHistoryState: unique symbol;
9
+ declare const entityEventHistoryEntity: unique symbol;
10
+ /**
11
+ * Defines retention maintenance for one entity state history.
12
+ */
13
+ export interface EntityStateHistoryStorage<I, S extends Message> {
14
+ /**
15
+ * Brands the storage with its retained state type.
16
+ */
17
+ readonly [entityStateHistoryState]?: S;
18
+ /**
19
+ * Updates retained versioned states for one entity.
20
+ * @param entityId The entity whose history is trimmed.
21
+ * @param keepMostRecent The number of newest states to keep.
22
+ * @returns Completes when maintenance finishes.
23
+ */
24
+ trim(entityId: I, keepMostRecent: number): Promise<void>;
25
+ /**
26
+ * Removes states created strictly before the supplied time.
27
+ * @param olderThan The exclusive retention cutoff.
28
+ * @returns Completes when maintenance finishes.
29
+ */
30
+ truncate(olderThan: Timestamp): Promise<void>;
31
+ }
32
+ /**
33
+ * Application-managed maintenance for retained diagnostic entity events.
34
+ */
35
+ export interface EntityEventStorage<I> {
36
+ /**
37
+ * Brands the storage with its retained entity identifier type.
38
+ */
39
+ readonly [entityEventHistoryEntity]?: I;
40
+ /**
41
+ * Removes events created strictly before the supplied time.
42
+ * @param olderThan The exclusive retention cutoff.
43
+ * @returns Completes when maintenance finishes.
44
+ */
45
+ truncate(olderThan: Timestamp): Promise<void>;
46
+ }
47
+ /**
48
+ * Internal state-history read and append seam used by repository implementations.
49
+ */
50
+ export interface EntityStateHistoryPort<I, S extends Message> extends EntityStateHistoryStorage<I, S> {
51
+ /**
52
+ * Stores one versioned state-history record.
53
+ * @param record The state-history record to append.
54
+ * @returns Completes when the record is stored.
55
+ */
56
+ append(record: EntityRecord): Promise<void>;
57
+ /**
58
+ * Reads versioned states backward from an optional version.
59
+ * @param entityId The entity whose history is read.
60
+ * @param depth The maximum number of records to return.
61
+ * @param startingFromVersion The inclusive version at which to start.
62
+ * @returns The matching history records in reverse version order.
63
+ */
64
+ backward(entityId: I, depth: number, startingFromVersion?: bigint): Promise<readonly EntityRecord[]>;
65
+ /**
66
+ * Reads the state current at a specific time.
67
+ * @param entityId The entity whose state is read.
68
+ * @param time The point in time to inspect.
69
+ * @returns The state at that time, if retained.
70
+ */
71
+ stateAt(entityId: I, time: Timestamp): Promise<S | undefined>;
72
+ /**
73
+ * Closes the state-history storage.
74
+ */
75
+ close(): void;
76
+ }
77
+ /**
78
+ * Internal diagnostic event-history read and append seam used by repositories.
79
+ */
80
+ export interface EntityEventHistoryPort<I> extends EntityEventStorage<I> {
81
+ /**
82
+ * Stores one diagnostic event-history record.
83
+ * @param record The event-history record to append.
84
+ * @returns Completes when the record is stored.
85
+ */
86
+ append(record: Event): Promise<void>;
87
+ /**
88
+ * Reads diagnostic events backward from an optional version.
89
+ * @param entityId The entity whose events are read.
90
+ * @param depth The maximum number of events to return.
91
+ * @param startingFromVersion The inclusive version at which to start.
92
+ * @returns The matching events in reverse version order.
93
+ */
94
+ backward(entityId: I, depth: number, startingFromVersion?: bigint): Promise<readonly Event[]>;
95
+ /**
96
+ * Closes the event-history storage.
97
+ */
98
+ close(): void;
99
+ }
100
+ /**
101
+ * Creates a history port that deliberately allocates no backing storage.
102
+ * @returns The disabled state-history port.
103
+ */
104
+ export declare function disabledStateHistoryPort<I, S extends Message>(): EntityStateHistoryPort<I, S>;
105
+ /**
106
+ * Creates a diagnostic event-history port that deliberately allocates no backing storage.
107
+ * @returns The disabled event-history port.
108
+ */
109
+ export declare function disabledEventHistoryPort<I>(): EntityEventHistoryPort<I>;
110
+ export {};
111
+ //# sourceMappingURL=entity-history-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-history-storage.d.ts","sourceRoot":"","sources":["../../src/entity/entity-history-storage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sEAAsE,CAAC;AAEzG;;GAEG;AACH,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,MAAM,CAAC;AACrD,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO;IAG7D;;OAEG;IACH,QAAQ,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IAGnC;;OAEG;IACH,QAAQ,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,CAAE,SAAQ,yBAAyB,CAC7F,CAAC,EACD,CAAC,CACF;IAGC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C;;;;;;OAMG;IACH,QAAQ,CACN,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAE9D;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAGtE;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;IAE9F;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,KAAK,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAS7F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,KAAK,sBAAsB,CAAC,CAAC,CAAC,CAOvE"}
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ /**
15
+ * Creates a history port that deliberately allocates no backing storage.
16
+ * @returns The disabled state-history port.
17
+ */
18
+ export function disabledStateHistoryPort() {
19
+ return {
20
+ append: () => Promise.reject(new Error("Entity state history is disabled.")),
21
+ backward: () => Promise.resolve(Object.freeze([])),
22
+ stateAt: () => Promise.resolve(undefined),
23
+ trim: () => Promise.resolve(),
24
+ truncate: () => Promise.resolve(),
25
+ close: () => undefined,
26
+ };
27
+ }
28
+ /**
29
+ * Creates a diagnostic event-history port that deliberately allocates no backing storage.
30
+ * @returns The disabled event-history port.
31
+ */
32
+ export function disabledEventHistoryPort() {
33
+ return {
34
+ append: () => Promise.reject(new Error("Entity event history is disabled.")),
35
+ backward: () => Promise.resolve(Object.freeze([])),
36
+ truncate: () => Promise.resolve(),
37
+ close: () => undefined,
38
+ };
39
+ }
40
+ //# sourceMappingURL=entity-history-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-history-storage.js","sourceRoot":"","sources":["../../src/entity/entity-history-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkIH;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC5E,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC5E,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { EntityRecord } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
2
+ export type { EntityRecord } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
3
+ import type { NormalizedQueryEntry } from "../query/query-execution.js";
4
+ import type { NormalizedQueryPlan } from "../query/query-policy.js";
5
+ /**
6
+ * Internal latest-state persistence port for one Entity identifier type.
7
+ */
8
+ export interface EntityRecordStorage<I> {
9
+ /**
10
+ * Reads the latest JVM EntityRecord for an entity ID.
11
+ *
12
+ * @param id The entity ID to read.
13
+ * @returns The current EntityRecord, when present.
14
+ */
15
+ read(id: I): Promise<EntityRecord | undefined>;
16
+ /**
17
+ * Writes one JVM EntityRecord envelope.
18
+ *
19
+ * @param record The EntityRecord to persist.
20
+ * @returns A promise that resolves once the record is persisted.
21
+ */
22
+ write(record: EntityRecord): Promise<void>;
23
+ /**
24
+ * Reads normalized current records with provider materialized columns.
25
+ *
26
+ * @param plan The normalized current-record query plan.
27
+ * @returns Matching records and materialized columns.
28
+ */
29
+ query(plan: NormalizedQueryPlan<I>): Promise<readonly NormalizedQueryEntry<I, EntityRecord>[]>;
30
+ }
31
+ //# sourceMappingURL=entity-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-record.d.ts","sourceRoot":"","sources":["../../src/entity/entity-record.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sEAAsE,CAAC;AACzG,YAAY,EAAE,YAAY,EAAE,MAAM,sEAAsE,CAAC;AACzG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IAGpC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IAE/C;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,oBAAoB,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;CAChG"}
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=entity-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-record.js","sourceRoot":"","sources":["../../src/entity/entity-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,55 @@
1
+ import { type Message } from "@bufbuild/protobuf";
2
+ import { type StringValue } from "@bufbuild/protobuf/wkt";
3
+ import type { EntityEventHistoryPort, EntityStateHistoryPort } from "./entity-history-storage.js";
4
+ import type { EntityRecordStorage } from "./entity-record.js";
5
+ import type { EntityStorageInput } from "../memory/in-memory-entity-history.js";
6
+ /**
7
+ * Provides the current-record and state-history handles used by adapter conformance checks.
8
+ */
9
+ export interface EntityStorageConformance<I, S extends Message> {
10
+ /**
11
+ * Stores current Entity records.
12
+ */
13
+ readonly current: EntityRecordStorage<I>;
14
+ /**
15
+ * Stores retained generated Entity records for state history.
16
+ */
17
+ readonly states: EntityStateHistoryPort<I, S>;
18
+ /**
19
+ * Stores retained generated diagnostic events.
20
+ */
21
+ readonly events: EntityEventHistoryPort<I>;
22
+ /**
23
+ * Closes provider-owned resources when needed.
24
+ */
25
+ close?(): void;
26
+ }
27
+ /**
28
+ * Creates a provider handle for the reusable current-record and state-history checks.
29
+ */
30
+ export interface EntityHistoryConformanceAdapter {
31
+ /**
32
+ * Creates storage for the supplied Entity shape.
33
+ *
34
+ * @param input Defines the Entity storage scope and schemas.
35
+ * @returns The provider handle.
36
+ */
37
+ readonly create: (input: EntityStorageInput<string, StringValue>) => EntityStorageConformance<string, StringValue>;
38
+ /**
39
+ * Creates a reopened handle for the same Entity shape.
40
+ *
41
+ * @param input Defines the Entity storage scope and schemas.
42
+ * @returns The reopened provider handle.
43
+ */
44
+ readonly reopen: (input: EntityStorageInput<string, StringValue>) => EntityStorageConformance<string, StringValue>;
45
+ }
46
+ interface EntityHistoryConformanceChecks {
47
+ readonly checkCurrentQueries: (adapter: EntityHistoryConformanceAdapter) => Promise<void>;
48
+ readonly check: (adapter: EntityHistoryConformanceAdapter) => Promise<void>;
49
+ }
50
+ /**
51
+ * Runs provider-neutral current-record and generated state-history checks.
52
+ */
53
+ export declare const EntityHistoryConformance: EntityHistoryConformanceChecks;
54
+ export {};
55
+ //# sourceMappingURL=history-conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-conformance.d.ts","sourceRoot":"","sources":["../../src/entity/history-conformance.ts"],"names":[],"mappings":"AAcA,OAAO,EAA4C,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAKhF;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO;IAG5D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAE3C;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAG9C;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,KAC3C,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,KAC3C,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpD;AAED,UAAU,8BAA8B;IACtC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,8BAuFrC,CAAC"}
@@ -0,0 +1,165 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { create, fromBinary, ScalarType, toBinary } from "@bufbuild/protobuf";
15
+ import { AnySchema, StringValueSchema, TimestampSchema, } from "@bufbuild/protobuf/wkt";
16
+ import { EntityRecordSchema, } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
17
+ import { EventIdSchema, EventSchema, VersionSchema } from "@spine-event-engine/proto";
18
+ import { RecordColumn } from "../record/record-column.js";
19
+ import { ColumnTypes } from "../record/column-type.js";
20
+ import { RecordSpec } from "../record/record-spec.js";
21
+ /**
22
+ * Runs provider-neutral current-record and generated state-history checks.
23
+ */
24
+ export const EntityHistoryConformance = Object.freeze({
25
+ // prettier-ignore
26
+ /**
27
+ * Checks the shared current-record behavior.
28
+ *
29
+ * @param adapter Supplies the provider under test.
30
+ * @returns Completes when the behavior is verified.
31
+ */
32
+ async checkCurrentQueries(adapter) {
33
+ const storage = adapter.create(EntityHistoryFixture.input());
34
+ try {
35
+ await storage.current.write(EntityHistoryFixture.record("task", "task", 3));
36
+ await storage.current.write(EntityHistoryFixture.record("later", "later", 4));
37
+ const queried = await storage.current.query({
38
+ predicate: { kind: "comparison", column: "value", operator: "equal", value: "later" },
39
+ order: [{ column: "value", direction: "asc" }],
40
+ limit: 1,
41
+ candidateLimit: 2,
42
+ });
43
+ const current = await storage.current.read("task");
44
+ EntityHistoryFixture.assert(current !== undefined, "current state must round-trip");
45
+ EntityHistoryFixture.assert(EntityHistoryFixture.state(current).value === "task", "current state must round-trip");
46
+ EntityHistoryFixture.assert(queried.length === 1 && queried[0]?.id === "later", "current queries must filter, order, and limit generated records");
47
+ }
48
+ finally {
49
+ storage.close?.();
50
+ }
51
+ const reopened = adapter.reopen(EntityHistoryFixture.input());
52
+ try {
53
+ EntityHistoryFixture.assert((await reopened.current.read("task")) !== undefined, "current record must survive reopen");
54
+ }
55
+ finally {
56
+ reopened.close?.();
57
+ }
58
+ },
59
+ /**
60
+ * Checks the generated state-history behavior.
61
+ *
62
+ * @param adapter Supplies the provider under test.
63
+ * @returns Completes when the behavior is verified.
64
+ */
65
+ async check(adapter) {
66
+ await EntityHistoryConformance.checkCurrentQueries(adapter);
67
+ const input = EntityHistoryFixture.input();
68
+ const storage = adapter.create(input);
69
+ try {
70
+ await storage.states.append(EntityHistoryFixture.record("task", "first", 1));
71
+ await storage.states.append(EntityHistoryFixture.record("task", "second", 2));
72
+ const backward = await storage.states.backward("task", 2);
73
+ const newest = backward[0];
74
+ const older = backward[1];
75
+ EntityHistoryFixture.assert(newest !== undefined &&
76
+ older !== undefined &&
77
+ EntityHistoryFixture.state(newest).value === "second" &&
78
+ EntityHistoryFixture.state(older).value === "first", "state history must return newest records first");
79
+ EntityHistoryFixture.assert((await storage.states.stateAt("task", create(TimestampSchema, { seconds: 1n })))?.value ===
80
+ "first", "state history must return the state at an inclusive timestamp");
81
+ const event = EntityHistoryFixture.event("event", "task", 2);
82
+ await storage.events.append(event);
83
+ EntityHistoryFixture.assert((await storage.events.backward("task", 1))[0]?.id?.value === "event", "event history must retain generated events");
84
+ await storage.events.truncate(create(TimestampSchema, { seconds: 3n }));
85
+ EntityHistoryFixture.assert((await storage.events.backward("task", 1)).length === 0, "event history truncation must remove older generated events");
86
+ }
87
+ finally {
88
+ storage.close?.();
89
+ }
90
+ },
91
+ });
92
+ const EntityHistoryFixture = Object.freeze({
93
+ input() {
94
+ const unpack = (id) => id.typeUrl.endsWith(`/${StringValueSchema.typeName}`)
95
+ ? fromBinary(StringValueSchema, id.value).value
96
+ : undefined;
97
+ const columns = [
98
+ new RecordColumn("value", ColumnTypes.scalar(ScalarType.STRING), (record) => EntityHistoryFixture.state(record).value),
99
+ ];
100
+ return {
101
+ context: { name: "EntityHistoryConformance", multitenant: false },
102
+ id: {
103
+ clone: (id) => id,
104
+ key: (id) => id,
105
+ pack: (id) => EntityHistoryFixture.pack(create(StringValueSchema, { value: id })),
106
+ unpack,
107
+ },
108
+ columns,
109
+ recordSpec: new RecordSpec({
110
+ sourceType: StringValueSchema,
111
+ recordType: EntityRecordSchema,
112
+ idKind: "string",
113
+ extractId: (record) => {
114
+ if (record.entityId === undefined)
115
+ throw new Error("EntityRecord requires entityId.");
116
+ const id = unpack(record.entityId);
117
+ if (id === undefined)
118
+ throw new Error("EntityRecord has an incompatible ID.");
119
+ return id;
120
+ },
121
+ columns,
122
+ }),
123
+ sourceType: StringValueSchema,
124
+ stateSchema: StringValueSchema,
125
+ stateHistory: true,
126
+ eventHistory: true,
127
+ };
128
+ },
129
+ record(id, state, version) {
130
+ return create(EntityRecordSchema, {
131
+ entityId: EntityHistoryFixture.pack(create(StringValueSchema, { value: id })),
132
+ state: EntityHistoryFixture.pack(create(StringValueSchema, { value: state })),
133
+ version: {
134
+ number: version,
135
+ timestamp: create(TimestampSchema, { seconds: BigInt(version) }),
136
+ },
137
+ });
138
+ },
139
+ pack(value) {
140
+ return create(AnySchema, {
141
+ typeUrl: `type.spine.io/${StringValueSchema.typeName}`,
142
+ value: toBinary(StringValueSchema, value),
143
+ });
144
+ },
145
+ state(record) {
146
+ if (record.state === undefined)
147
+ throw new Error("Entity record has no state.");
148
+ return fromBinary(StringValueSchema, record.state.value);
149
+ },
150
+ event(id, producer, version) {
151
+ return create(EventSchema, {
152
+ id: create(EventIdSchema, { value: id }),
153
+ context: {
154
+ producerId: EntityHistoryFixture.pack(create(StringValueSchema, { value: producer })),
155
+ timestamp: create(TimestampSchema, { seconds: BigInt(version) }),
156
+ version: create(VersionSchema, { number: version }),
157
+ },
158
+ });
159
+ },
160
+ assert(condition, message) {
161
+ if (!condition)
162
+ throw new Error(`Entity storage conformance failed: ${message}`);
163
+ },
164
+ });
165
+ //# sourceMappingURL=history-conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-conformance.js","sourceRoot":"","sources":["../../src/entity/history-conformance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import type { Event, EventId, TenantId } from "@spine-event-engine/proto";
2
+ import type { RecordQuery } from "../record/record-query.js";
3
+ import { RecordSpec } from "../record/record-spec.js";
4
+ import type { StorageContext } from "../storage/storage.js";
5
+ import type { StorageFactory } from "../storage/storage-factory.js";
6
+ /**
7
+ * Framework event store backed by record storage.
8
+ *
9
+ * Snapshots input events before queued work, rejects missing, blank, and
10
+ * duplicate IDs in one batch, and rejects IDs already stored for the same
11
+ * captured storage context.
12
+ */
13
+ export declare class EventStore {
14
+ #private;
15
+ /**
16
+ * Creates an event store for one storage context.
17
+ *
18
+ * @param context Specifies the storage context.
19
+ * @param factory Creates the backing record storage.
20
+ */
21
+ constructor(context: EventStoreContext, factory: StorageFactory);
22
+ /**
23
+ * Returns whether this Event Store still accepts operations.
24
+ *
25
+ * @returns Returns true until this Event Store is closed.
26
+ */
27
+ isOpen(): boolean;
28
+ /**
29
+ * Closes this Event Store. Operation-selected storage handles close after use.
30
+ */
31
+ close(): void;
32
+ /**
33
+ * Validates that one generated Spine event can be appended without storing it.
34
+ *
35
+ * @param event Supplies the event to validate.
36
+ * @returns Completes when the event is accepted.
37
+ */
38
+ accept(event: Event): Promise<void>;
39
+ /**
40
+ * Accepts one event, runs caller acceptance, and appends using one captured
41
+ * storage context.
42
+ *
43
+ * @param event Supplies the event to accept.
44
+ * @param onAccepted Runs after uniqueness validation and before append.
45
+ * @returns Resolves to the appended event snapshot.
46
+ */
47
+ acceptThenAppend(event: Event, onAccepted: OnEventAccepted): Promise<Event>;
48
+ /**
49
+ * Writes one generated Spine event, rejecting missing, blank, or duplicate IDs.
50
+ *
51
+ * @param event Supplies the event to append.
52
+ * @returns Completes when the event is appended.
53
+ */
54
+ append(event: Event): Promise<void>;
55
+ /**
56
+ * Writes generated Spine events in order, rejecting missing, blank, or duplicate IDs.
57
+ *
58
+ * @param events Supplies the events to append.
59
+ * @returns Completes when the events are appended.
60
+ */
61
+ appendAll(events: Iterable<Event>): Promise<void>;
62
+ /**
63
+ * Writes generated Spine events and returns a one-shot rollback token.
64
+ *
65
+ * @param events Supplies the events to append.
66
+ * @returns Resolves to the rollback token for this append.
67
+ */
68
+ appendAllWithRollback(events: Iterable<Event>): Promise<EventRollback>;
69
+ /**
70
+ * Reads persisted events through the underlying record-storage query seam.
71
+ *
72
+ * @param query Specifies the record query.
73
+ * @returns Resolves to matching events.
74
+ */
75
+ read(query?: RecordQuery<EventId>): Promise<readonly Event[]>;
76
+ private appendUnique;
77
+ private deleteIds;
78
+ private checkUnique;
79
+ private requireOpen;
80
+ }
81
+ /**
82
+ * Selects Event Store tenancy before an event envelope supplies a tenant.
83
+ *
84
+ * Multitenant append operations may omit `tenantId` only because the complete
85
+ * tenant is then required in every stored event envelope. Reads require an
86
+ * explicitly selected tenant.
87
+ */
88
+ export type EventStoreContext = {
89
+ /**
90
+ * Diagnostic Bounded Context name.
91
+ */
92
+ readonly name: string;
93
+ /**
94
+ * Selects the one unpartitioned storage boundary.
95
+ */
96
+ readonly multitenant: false;
97
+ } | {
98
+ /**
99
+ * Diagnostic Bounded Context name.
100
+ */
101
+ readonly name: string;
102
+ /**
103
+ * Requires tenant selection for every storage operation.
104
+ */
105
+ readonly multitenant: true;
106
+ /**
107
+ * Selects a default complete tenant when an event does not carry one.
108
+ */
109
+ readonly tenantId?: TenantId;
110
+ };
111
+ /**
112
+ * Accepts an event after `EventStore` prechecks it and before append.
113
+ *
114
+ * @param event Supplies the validated event snapshot.
115
+ * @returns Completes after caller acceptance finishes.
116
+ */
117
+ export type OnEventAccepted = (event: Event) => Promise<void> | void;
118
+ /**
119
+ * One-shot rollback token scoped to one successful event-store append.
120
+ */
121
+ export interface EventRollback {
122
+ /**
123
+ * Deletes the events appended by the operation that created this token.
124
+ * @returns Completes when the events are deleted.
125
+ */
126
+ rollback(): Promise<void>;
127
+ }
128
+ /**
129
+ * Provider-only coordination access for the Event Store context lock.
130
+ * @internal
131
+ */
132
+ export declare const eventStoreAccess: {
133
+ readonly withLock: <T>(factory: StorageFactory, context: StorageContext, work: () => Promise<T>) => Promise<T>;
134
+ };
135
+ /**
136
+ * Provides the canonical event-store record layout to provider-only internals.
137
+ *
138
+ * @internal
139
+ */
140
+ export declare const eventStoreRecordSpec: RecordSpec<EventId, Event>;
141
+ //# sourceMappingURL=event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../src/event/event-store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpE;;;;;;GAMG;AACH,qBAAa,UAAU;;IAKrB;;;;;OAKG;gBACS,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc;IAK/D;;;;OAIG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC;;;;;;;OAOG;IACG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;IAUjF;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD;;;;;OAKG;IACG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAoB5E;;;;;OAKG;IACG,IAAI,CAAC,KAAK,GAAE,WAAW,CAAC,OAAO,CAAM,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;YAazD,YAAY;YAeZ,SAAS;YAeT,WAAW;IAczB,OAAO,CAAC,WAAW;CAGpB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAGE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;CAC7B,GACD;IAGE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B,CAAC;AAEN;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAG5B;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAuCD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,EACnB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KACnB,OAAO,CAAC,CAAC,CAAC,CAAC;CAmBhB,CAAC;AA0KH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAgB1D,CAAC"}