@defai.digital/memory-domain 13.4.8 → 13.4.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.
@@ -17,14 +17,11 @@ export declare class AggregateRepository<T> {
17
17
  /**
18
18
  * Saves an event to the aggregate
19
19
  * INV-MEM-004: Event ordering enforced via version
20
+ * INV-MEM-009: Optimistic concurrency is atomic via event store's version check
20
21
  *
21
- * CONCURRENCY NOTE (INV-MEM-008):
22
- * The optimistic concurrency check and append are NOT atomic. In truly concurrent
23
- * scenarios (e.g., distributed systems or multi-process), another operation could
24
- * modify the aggregate between getVersion() and append(). This is acceptable for
25
- * single-process Node.js where async operations interleave but don't truly run
26
- * in parallel. For distributed scenarios, implement compare-and-swap at the
27
- * storage layer or use a mutex/lock around the check-and-write operation.
22
+ * If expectedVersion is provided, the event's version is set to expectedVersion + 1.
23
+ * The event store's append() performs atomic version validation, ensuring no
24
+ * race condition between version check and write (TOCTOU prevention).
28
25
  */
29
26
  save(aggregateId: string, event: MemoryEvent, expectedVersion?: number): Promise<void>;
30
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,qBAAa,mBAAmB,CAAC,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,CAAC,EACrB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAGhD;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA6B3D;;;;;;;;;;;OAWG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAiC9B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,CAAC,EACrB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,GAC5B,mBAAmB,CAAC,CAAC,CAAC,CAExB"}
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,mBAAmB,CAAC,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,CAAC,EACrB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAGhD;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA6B3D;;;;;;;;OAQG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAiC9B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,CAAC,EACrB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,GAC5B,mBAAmB,CAAC,CAAC,CAAC,CAExB"}
package/dist/aggregate.js CHANGED
@@ -1,5 +1,3 @@
1
- import { MemoryErrorCodes } from './types.js';
2
- import { EventStoreError } from './event-store.js';
3
1
  /**
4
2
  * Aggregate repository for event-sourced aggregates
5
3
  * INV-MEM-002: Replaying events produces identical results
@@ -44,24 +42,22 @@ export class AggregateRepository {
44
42
  /**
45
43
  * Saves an event to the aggregate
46
44
  * INV-MEM-004: Event ordering enforced via version
45
+ * INV-MEM-009: Optimistic concurrency is atomic via event store's version check
47
46
  *
48
- * CONCURRENCY NOTE (INV-MEM-008):
49
- * The optimistic concurrency check and append are NOT atomic. In truly concurrent
50
- * scenarios (e.g., distributed systems or multi-process), another operation could
51
- * modify the aggregate between getVersion() and append(). This is acceptable for
52
- * single-process Node.js where async operations interleave but don't truly run
53
- * in parallel. For distributed scenarios, implement compare-and-swap at the
54
- * storage layer or use a mutex/lock around the check-and-write operation.
47
+ * If expectedVersion is provided, the event's version is set to expectedVersion + 1.
48
+ * The event store's append() performs atomic version validation, ensuring no
49
+ * race condition between version check and write (TOCTOU prevention).
55
50
  */
56
51
  async save(aggregateId, event, expectedVersion) {
57
- // Optimistic concurrency check (see INV-MEM-008 for concurrency limitations)
58
- if (expectedVersion !== undefined) {
59
- const currentVersion = await this.eventStore.getVersion(aggregateId);
60
- if (currentVersion !== expectedVersion) {
61
- throw new EventStoreError(MemoryErrorCodes.VERSION_CONFLICT, `Optimistic concurrency failure: expected version ${String(expectedVersion)}, current is ${String(currentVersion)}`, { expected: expectedVersion, current: currentVersion });
62
- }
63
- }
64
- await this.eventStore.append(event);
52
+ // INV-MEM-009: Set event version for atomic validation in event store
53
+ // This avoids TOCTOU by letting the event store do atomic compare-and-swap
54
+ // Ensure event has the correct aggregateId
55
+ const eventWithAggregate = {
56
+ ...event,
57
+ aggregateId: event.aggregateId ?? aggregateId,
58
+ ...(expectedVersion !== undefined ? { version: expectedVersion + 1 } : {}),
59
+ };
60
+ await this.eventStore.append(eventWithAggregate);
65
61
  }
66
62
  /**
67
63
  * Gets an aggregate at a specific version (point-in-time query)
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,13 @@ export declare class EventStoreError extends Error {
13
13
  * INV-MEM-001: Events are immutable - stored as frozen objects
14
14
  * INV-MEM-004: Events are ordered by version within aggregate
15
15
  * INV-MEM-006: Memory growth is bounded with LRU eviction
16
+ * INV-MEM-008: Eviction uses O(1) reverse index lookup
16
17
  */
17
18
  export declare class InMemoryEventStore implements EventStore {
18
19
  private readonly events;
19
20
  private readonly allEvents;
20
21
  private readonly correlationIndex;
22
+ private readonly eventToAggregate;
21
23
  private readonly maxEvents;
22
24
  constructor(maxEvents?: number);
23
25
  /**
@@ -48,6 +50,7 @@ export declare class InMemoryEventStore implements EventStore {
48
50
  /**
49
51
  * Evicts the oldest events to maintain memory bounds
50
52
  * INV-MEM-006: LRU eviction when over maxEvents
53
+ * INV-MEM-008: Uses reverse index for O(1) aggregate lookup
51
54
  */
52
55
  private evictOldest;
53
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAQD;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,GAAE,MAA2B;IAIlD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD/C;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAMtD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9D;;;OAGG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIrE;;;OAGG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBhD;;;OAGG;IACH,OAAO,CAAC,WAAW;IAmCnB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAE/E"}
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiB7C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;IAErE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,GAAE,MAA2B;IAIlD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmD/C;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAMtD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9D;;;OAGG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIrE;;;OAGG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBhD;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgDnB;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAE/E"}
@@ -1,4 +1,14 @@
1
1
  import { MemoryErrorCodes } from './types.js';
2
+ // ============================================================================
3
+ // Constants
4
+ // ============================================================================
5
+ /** Default aggregate ID for events without explicit aggregate */
6
+ const DEFAULT_AGGREGATE_ID = 'global';
7
+ /** Default maximum events to store before eviction (INV-MEM-006) */
8
+ const DEFAULT_MAX_EVENTS = 100_000;
9
+ // ============================================================================
10
+ // Error Class
11
+ // ============================================================================
2
12
  /**
3
13
  * Error thrown by event store operations
4
14
  */
@@ -12,21 +22,19 @@ export class EventStoreError extends Error {
12
22
  this.name = 'EventStoreError';
13
23
  }
14
24
  }
15
- /**
16
- * Default maximum events to store before eviction
17
- * INV-MEM-006: Memory growth is bounded
18
- */
19
- const DEFAULT_MAX_EVENTS = 100000;
20
25
  /**
21
26
  * In-memory event store implementation
22
27
  * INV-MEM-001: Events are immutable - stored as frozen objects
23
28
  * INV-MEM-004: Events are ordered by version within aggregate
24
29
  * INV-MEM-006: Memory growth is bounded with LRU eviction
30
+ * INV-MEM-008: Eviction uses O(1) reverse index lookup
25
31
  */
26
32
  export class InMemoryEventStore {
27
33
  events = new Map();
28
34
  allEvents = [];
29
35
  correlationIndex = new Map();
36
+ // Reverse index: eventId -> aggregateId for O(1) eviction lookup
37
+ eventToAggregate = new Map();
30
38
  maxEvents;
31
39
  constructor(maxEvents = DEFAULT_MAX_EVENTS) {
32
40
  this.maxEvents = maxEvents;
@@ -41,7 +49,7 @@ export class InMemoryEventStore {
41
49
  if (event.eventId === '') {
42
50
  throw new EventStoreError(MemoryErrorCodes.INVALID_EVENT, 'Event must have an eventId');
43
51
  }
44
- const aggregateId = event.aggregateId ?? 'global';
52
+ const aggregateId = event.aggregateId ?? DEFAULT_AGGREGATE_ID;
45
53
  // Check version ordering (INV-MEM-004)
46
54
  if (event.version !== undefined) {
47
55
  const currentVersion = await this.getVersion(aggregateId);
@@ -57,6 +65,8 @@ export class InMemoryEventStore {
57
65
  this.events.set(aggregateId, aggregateEvents);
58
66
  // Store in global list
59
67
  this.allEvents.push(frozenEvent);
68
+ // INV-MEM-008: Maintain reverse index for O(1) eviction
69
+ this.eventToAggregate.set(frozenEvent.eventId, aggregateId);
60
70
  // INV-MEM-006: Evict oldest events if over limit to prevent unbounded memory growth
61
71
  if (this.allEvents.length > this.maxEvents) {
62
72
  this.evictOldest(this.allEvents.length - this.maxEvents);
@@ -112,31 +122,46 @@ export class InMemoryEventStore {
112
122
  /**
113
123
  * Evicts the oldest events to maintain memory bounds
114
124
  * INV-MEM-006: LRU eviction when over maxEvents
125
+ * INV-MEM-008: Uses reverse index for O(1) aggregate lookup
115
126
  */
116
127
  evictOldest(count) {
117
- // Remove from global list
128
+ // Remove from global list (oldest events are at the front)
118
129
  const evicted = this.allEvents.splice(0, count);
119
- // Remove from aggregate buckets and correlation index
120
- // INV-MEM-007: Use eventId comparison instead of reference equality for robustness
121
130
  for (const event of evicted) {
122
- const aggregateId = event.aggregateId ?? 'global';
131
+ // INV-MEM-008: O(1) lookup using reverse index
132
+ const aggregateId = this.eventToAggregate.get(event.eventId) ?? event.aggregateId ?? DEFAULT_AGGREGATE_ID;
133
+ this.eventToAggregate.delete(event.eventId);
134
+ // Remove from aggregate bucket - events are ordered, so oldest is at index 0
123
135
  const aggregateEvents = this.events.get(aggregateId);
124
- if (aggregateEvents) {
125
- const index = aggregateEvents.findIndex((e) => e.eventId === event.eventId);
126
- if (index !== -1) {
127
- aggregateEvents.splice(index, 1);
136
+ if (aggregateEvents !== undefined && aggregateEvents.length > 0) {
137
+ // Since we evict in order, the event should be at the front of the aggregate array
138
+ if (aggregateEvents[0]?.eventId === event.eventId) {
139
+ aggregateEvents.shift(); // O(n) but only on the aggregate, not all events
140
+ }
141
+ else {
142
+ // Fallback: search for the event (should rarely happen)
143
+ const index = aggregateEvents.findIndex((e) => e.eventId === event.eventId);
144
+ if (index !== -1) {
145
+ aggregateEvents.splice(index, 1);
146
+ }
128
147
  }
129
148
  if (aggregateEvents.length === 0) {
130
149
  this.events.delete(aggregateId);
131
150
  }
132
151
  }
133
152
  // Remove from correlation index
134
- if (event.metadata?.correlationId) {
153
+ if (event.metadata?.correlationId !== undefined) {
135
154
  const correlatedEvents = this.correlationIndex.get(event.metadata.correlationId);
136
- if (correlatedEvents) {
137
- const index = correlatedEvents.findIndex((e) => e.eventId === event.eventId);
138
- if (index !== -1) {
139
- correlatedEvents.splice(index, 1);
155
+ if (correlatedEvents !== undefined && correlatedEvents.length > 0) {
156
+ // Same optimization: check front first
157
+ if (correlatedEvents[0]?.eventId === event.eventId) {
158
+ correlatedEvents.shift();
159
+ }
160
+ else {
161
+ const index = correlatedEvents.findIndex((e) => e.eventId === event.eventId);
162
+ if (index !== -1) {
163
+ correlatedEvents.splice(index, 1);
164
+ }
140
165
  }
141
166
  if (correlatedEvents.length === 0) {
142
167
  this.correlationIndex.delete(event.metadata.correlationId);
@@ -152,6 +177,7 @@ export class InMemoryEventStore {
152
177
  this.events.clear();
153
178
  this.allEvents.length = 0;
154
179
  this.correlationIndex.clear();
180
+ this.eventToAggregate.clear();
155
181
  }
156
182
  }
157
183
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defai.digital/memory-domain",
3
- "version": "13.4.8",
3
+ "version": "13.4.10",
4
4
  "type": "module",
5
5
  "description": "Memory domain - event sourcing following contract invariants",
6
6
  "license": "BUSL-1.1",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@defai.digital/contracts": "13.4.8"
35
+ "@defai.digital/contracts": "13.4.10"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsc --build",