boundlessdb 0.3.1 → 0.5.0
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/CHANGELOG.md +72 -0
- package/README.md +101 -10
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/event-store.browser.d.ts.map +1 -1
- package/dist/event-store.browser.js +68 -62
- package/dist/event-store.browser.js.map +1 -1
- package/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +33 -28
- package/dist/event-store.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/query-builder.d.ts +35 -3
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/query-builder.js +63 -4
- package/dist/query-builder.js.map +1 -1
- package/dist/storage/interface.d.ts +27 -9
- package/dist/storage/interface.d.ts.map +1 -1
- package/dist/storage/memory.d.ts +2 -3
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +22 -11
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/postgres.d.ts +11 -3
- package/dist/storage/postgres.d.ts.map +1 -1
- package/dist/storage/postgres.js +137 -78
- package/dist/storage/postgres.js.map +1 -1
- package/dist/storage/sqlite.d.ts +6 -3
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +115 -24
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/sqljs.d.ts +2 -3
- package/dist/storage/sqljs.d.ts.map +1 -1
- package/dist/storage/sqljs.js +72 -51
- package/dist/storage/sqljs.js.map +1 -1
- package/dist/types.d.ts +40 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +25 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -5
package/dist/event-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DCB Event Store - Public API
|
|
3
3
|
*/
|
|
4
|
-
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
5
|
-
export { QueryResult, isConflict, isConstrainedCondition } from './types.js';
|
|
4
|
+
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, MultiKeyConstrainedCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
5
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
6
6
|
export { EventStore, createEventStore, type EventStoreConfig } from './event-store.js';
|
|
7
7
|
export type { EventStorage, EventToStore } from './storage/interface.js';
|
|
8
8
|
export { InMemoryStorage } from './storage/memory.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAEV,KAAK,EACL,iBAAiB,EACjB,WAAW,EAEX,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAEV,KAAK,EACL,iBAAiB,EACjB,WAAW,EAEX,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,EAE5B,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG/H,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGvF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DCB Event Store - Public API
|
|
3
3
|
*/
|
|
4
|
-
export { QueryResult, isConflict, isConstrainedCondition } from './types.js';
|
|
4
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
5
5
|
// Event Store
|
|
6
6
|
export { EventStore, createEventStore } from './event-store.js';
|
|
7
7
|
export { InMemoryStorage } from './storage/memory.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/H,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAyB,MAAM,kBAAkB,CAAC;AAIvF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/query-builder.d.ts
CHANGED
|
@@ -14,11 +14,24 @@ export interface QueryExecutor<E extends Event> {
|
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
|
+
* // Single-key query (backward compatible):
|
|
17
18
|
* const result = await store.query<CourseEvent>()
|
|
18
|
-
* .matchType('CourseCreated')
|
|
19
19
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
20
|
-
* .
|
|
21
|
-
*
|
|
20
|
+
* .read();
|
|
21
|
+
*
|
|
22
|
+
* // Multi-key AND query:
|
|
23
|
+
* const result = await store.query<CourseEvent>()
|
|
24
|
+
* .matchType('StudentSubscribed')
|
|
25
|
+
* .withKey('course', 'cs101')
|
|
26
|
+
* .withKey('student', 'alice')
|
|
27
|
+
* .read();
|
|
28
|
+
*
|
|
29
|
+
* // Mixed (AND + OR):
|
|
30
|
+
* const result = await store.query<CourseEvent>()
|
|
31
|
+
* .matchType('StudentSubscribed')
|
|
32
|
+
* .withKey('course', 'cs101')
|
|
33
|
+
* .withKey('student', 'alice') // AND on condition 0
|
|
34
|
+
* .matchTypeAndKey('CourseCancelled', 'course', 'cs101') // OR (condition 1)
|
|
22
35
|
* .read();
|
|
23
36
|
* ```
|
|
24
37
|
*/
|
|
@@ -30,22 +43,41 @@ export declare class QueryBuilder<E extends Event> {
|
|
|
30
43
|
constructor(executor: QueryExecutor<E>);
|
|
31
44
|
/**
|
|
32
45
|
* Add an unconstrained condition (match all events of type).
|
|
46
|
+
* Use `.withKey()` after to add key constraints (AND).
|
|
33
47
|
*
|
|
34
48
|
* @example
|
|
35
49
|
* ```typescript
|
|
36
50
|
* .matchType('CourseCreated') // matches ALL CourseCreated events
|
|
51
|
+
* .matchType('StudentSubscribed').withKey('course', 'cs101') // type + key
|
|
37
52
|
* ```
|
|
38
53
|
*/
|
|
39
54
|
matchType(type: string): this;
|
|
40
55
|
/**
|
|
41
56
|
* Add a constrained condition (match events of type where key equals value).
|
|
57
|
+
* Shorthand for `.matchType(type).withKey(key, value)`.
|
|
58
|
+
* Use `.withKey()` after to add more key constraints (AND).
|
|
42
59
|
*
|
|
43
60
|
* @example
|
|
44
61
|
* ```typescript
|
|
45
62
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
63
|
+
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').withKey('student', 'alice')
|
|
46
64
|
* ```
|
|
47
65
|
*/
|
|
48
66
|
matchTypeAndKey(type: string, key: string, value: string): this;
|
|
67
|
+
/**
|
|
68
|
+
* Add a key constraint to the last condition (AND).
|
|
69
|
+
* Must be called after `.matchType()` or `.matchTypeAndKey()`.
|
|
70
|
+
*
|
|
71
|
+
* @throws Error if no preceding condition exists
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* .matchType('StudentSubscribed')
|
|
76
|
+
* .withKey('course', 'cs101')
|
|
77
|
+
* .withKey('student', 'alice') // AND: both keys must match
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
withKey(key: string, value: string): this;
|
|
49
81
|
/**
|
|
50
82
|
* Start reading from a specific position.
|
|
51
83
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAgC,MAAM,YAAY,CAAC;AAEnG,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,KAAK;IAC5C,IAAI,CAAC,KAAK,EAAE;QACV,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,KAAK;IAK3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEK,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAEvD;;;;;;;;;OASG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7B;;;;;;;;;;OAUG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/D;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA8BzC;;;;;;;OAOG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAOtC"}
|
package/dist/query-builder.js
CHANGED
|
@@ -6,11 +6,24 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
9
|
+
* // Single-key query (backward compatible):
|
|
9
10
|
* const result = await store.query<CourseEvent>()
|
|
10
|
-
* .matchType('CourseCreated')
|
|
11
11
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
12
|
-
* .
|
|
13
|
-
*
|
|
12
|
+
* .read();
|
|
13
|
+
*
|
|
14
|
+
* // Multi-key AND query:
|
|
15
|
+
* const result = await store.query<CourseEvent>()
|
|
16
|
+
* .matchType('StudentSubscribed')
|
|
17
|
+
* .withKey('course', 'cs101')
|
|
18
|
+
* .withKey('student', 'alice')
|
|
19
|
+
* .read();
|
|
20
|
+
*
|
|
21
|
+
* // Mixed (AND + OR):
|
|
22
|
+
* const result = await store.query<CourseEvent>()
|
|
23
|
+
* .matchType('StudentSubscribed')
|
|
24
|
+
* .withKey('course', 'cs101')
|
|
25
|
+
* .withKey('student', 'alice') // AND on condition 0
|
|
26
|
+
* .matchTypeAndKey('CourseCancelled', 'course', 'cs101') // OR (condition 1)
|
|
14
27
|
* .read();
|
|
15
28
|
* ```
|
|
16
29
|
*/
|
|
@@ -24,10 +37,12 @@ export class QueryBuilder {
|
|
|
24
37
|
}
|
|
25
38
|
/**
|
|
26
39
|
* Add an unconstrained condition (match all events of type).
|
|
40
|
+
* Use `.withKey()` after to add key constraints (AND).
|
|
27
41
|
*
|
|
28
42
|
* @example
|
|
29
43
|
* ```typescript
|
|
30
44
|
* .matchType('CourseCreated') // matches ALL CourseCreated events
|
|
45
|
+
* .matchType('StudentSubscribed').withKey('course', 'cs101') // type + key
|
|
31
46
|
* ```
|
|
32
47
|
*/
|
|
33
48
|
matchType(type) {
|
|
@@ -36,14 +51,58 @@ export class QueryBuilder {
|
|
|
36
51
|
}
|
|
37
52
|
/**
|
|
38
53
|
* Add a constrained condition (match events of type where key equals value).
|
|
54
|
+
* Shorthand for `.matchType(type).withKey(key, value)`.
|
|
55
|
+
* Use `.withKey()` after to add more key constraints (AND).
|
|
39
56
|
*
|
|
40
57
|
* @example
|
|
41
58
|
* ```typescript
|
|
42
59
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
60
|
+
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').withKey('student', 'alice')
|
|
43
61
|
* ```
|
|
44
62
|
*/
|
|
45
63
|
matchTypeAndKey(type, key, value) {
|
|
46
|
-
this.conditions.push({ type, key, value });
|
|
64
|
+
this.conditions.push({ type, keys: [{ name: key, value }] });
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Add a key constraint to the last condition (AND).
|
|
69
|
+
* Must be called after `.matchType()` or `.matchTypeAndKey()`.
|
|
70
|
+
*
|
|
71
|
+
* @throws Error if no preceding condition exists
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* .matchType('StudentSubscribed')
|
|
76
|
+
* .withKey('course', 'cs101')
|
|
77
|
+
* .withKey('student', 'alice') // AND: both keys must match
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
withKey(key, value) {
|
|
81
|
+
if (this.conditions.length === 0) {
|
|
82
|
+
throw new Error('.withKey() requires a preceding .matchType() or .matchTypeAndKey()');
|
|
83
|
+
}
|
|
84
|
+
const lastIdx = this.conditions.length - 1;
|
|
85
|
+
const last = this.conditions[lastIdx];
|
|
86
|
+
// Convert the last condition to multi-key format if needed
|
|
87
|
+
if ('keys' in last && Array.isArray(last.keys)) {
|
|
88
|
+
// Already multi-key format — add to it
|
|
89
|
+
last.keys.push({ name: key, value });
|
|
90
|
+
}
|
|
91
|
+
else if ('key' in last && 'value' in last) {
|
|
92
|
+
// Legacy single-key format — convert to multi-key
|
|
93
|
+
const legacy = last;
|
|
94
|
+
this.conditions[lastIdx] = {
|
|
95
|
+
type: legacy.type,
|
|
96
|
+
keys: [{ name: legacy.key, value: legacy.value }, { name: key, value }],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Unconstrained (type only) — convert to multi-key
|
|
101
|
+
this.conditions[lastIdx] = {
|
|
102
|
+
type: last.type,
|
|
103
|
+
keys: [{ name: key, value }],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
47
106
|
return this;
|
|
48
107
|
}
|
|
49
108
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,YAAY;IAKM;IAJrB,UAAU,GAAqB,EAAE,CAAC;IAClC,aAAa,CAAU;IACvB,MAAM,CAAU;IAExB,YAA6B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE3D;;;;;;;;;OASG;IACH,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,eAAe,CAAC,IAAY,EAAE,GAAW,EAAE,KAAa;QACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAkC,CAAC,CAAC;QAC7F,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEtC,2DAA2D;QAC3D,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,IAAqC,CAAC,IAAI,CAAC,EAAE,CAAC;YACjF,uCAAuC;YACtC,IAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5C,kDAAkD;YAClD,MAAM,MAAM,GAAG,IAAoD,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;aACxC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;aACG,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,YAAY,CAAC,QAAgB;QAC3B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -12,16 +12,40 @@ export interface EventToStore {
|
|
|
12
12
|
metadata?: Record<string, unknown>;
|
|
13
13
|
timestamp: Date;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Result of appendWithCondition operation
|
|
17
|
+
*/
|
|
18
|
+
export interface AppendWithConditionResult {
|
|
19
|
+
/** Position of last appended event (only present if successful) */
|
|
20
|
+
position?: bigint;
|
|
21
|
+
/** Conflicting events found (only present if conflict detected) */
|
|
22
|
+
conflicting?: StoredEvent[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Condition for atomic append operation
|
|
26
|
+
*/
|
|
27
|
+
export interface StorageAppendCondition {
|
|
28
|
+
/** Query conditions that define what constitutes a conflict */
|
|
29
|
+
failIfEventsMatch: QueryCondition[];
|
|
30
|
+
/** Check for conflicts only after this position */
|
|
31
|
+
after: bigint;
|
|
32
|
+
}
|
|
15
33
|
/**
|
|
16
34
|
* Storage backend interface
|
|
17
35
|
*/
|
|
18
36
|
export interface EventStorage {
|
|
19
37
|
/**
|
|
20
|
-
*
|
|
38
|
+
* Atomically append events with optional conflict check
|
|
39
|
+
*
|
|
21
40
|
* Must be atomic: either all events are stored, or none
|
|
22
|
-
*
|
|
41
|
+
* If condition is provided, must check for conflicts before appending
|
|
42
|
+
*
|
|
43
|
+
* @param events Events to append
|
|
44
|
+
* @param keys Extracted keys for each event (same length as events)
|
|
45
|
+
* @param condition Optional conflict check condition
|
|
46
|
+
* @returns Result with position (success) or conflicting events (conflict)
|
|
23
47
|
*/
|
|
24
|
-
|
|
48
|
+
appendWithCondition(events: EventToStore[], keys: ExtractedKey[][], condition: StorageAppendCondition | null): Promise<AppendWithConditionResult>;
|
|
25
49
|
/**
|
|
26
50
|
* Query events by conditions
|
|
27
51
|
* @param conditions Query conditions (type + key + value)
|
|
@@ -29,12 +53,6 @@ export interface EventStorage {
|
|
|
29
53
|
* @param limit Maximum number of events to return
|
|
30
54
|
*/
|
|
31
55
|
query(conditions: QueryCondition[], fromPosition?: bigint, limit?: number): Promise<StoredEvent[]>;
|
|
32
|
-
/**
|
|
33
|
-
* Get events since a given position that match the conditions
|
|
34
|
-
* Used for consistency checks (conflict detection)
|
|
35
|
-
* @returns Events that match AND have position > sincePosition
|
|
36
|
-
*/
|
|
37
|
-
getEventsSince(conditions: QueryCondition[], sincePosition: bigint): Promise<StoredEvent[]>;
|
|
38
56
|
/**
|
|
39
57
|
* Get the current highest position in the store
|
|
40
58
|
* @returns 0n if store is empty
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACpC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;;OAUG;IACH,mBAAmB,CACjB,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,YAAY,EAAE,EAAE,EACtB,SAAS,EAAE,sBAAsB,GAAG,IAAI,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,KAAK,CACH,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1B;;;OAGG;IACH,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAErC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
package/dist/storage/memory.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* In-Memory Storage implementation (for testing)
|
|
3
3
|
*/
|
|
4
4
|
import { type ExtractedKey, type QueryCondition, type StoredEvent } from '../types.js';
|
|
5
|
-
import type { EventStorage, EventToStore } from './interface.js';
|
|
5
|
+
import type { EventStorage, EventToStore, StorageAppendCondition, AppendWithConditionResult } from './interface.js';
|
|
6
6
|
/**
|
|
7
7
|
* In-memory event storage for testing purposes
|
|
8
8
|
* NOT suitable for production use
|
|
@@ -10,9 +10,8 @@ import type { EventStorage, EventToStore } from './interface.js';
|
|
|
10
10
|
export declare class InMemoryStorage implements EventStorage {
|
|
11
11
|
private events;
|
|
12
12
|
private nextPosition;
|
|
13
|
-
|
|
13
|
+
appendWithCondition(eventsToStore: EventToStore[], keys: ExtractedKey[][], condition: StorageAppendCondition | null): Promise<AppendWithConditionResult>;
|
|
14
14
|
query(conditions: QueryCondition[], fromPosition?: bigint, limit?: number): Promise<StoredEvent[]>;
|
|
15
|
-
getEventsSince(conditions: QueryCondition[], sincePosition: bigint): Promise<StoredEvent[]>;
|
|
16
15
|
getLatestPosition(): Promise<bigint>;
|
|
17
16
|
close(): Promise<void>;
|
|
18
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAuD,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAqC,MAAM,aAAa,CAAC;AAC/K,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAMpH;;;GAGG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,YAAY,CAAc;IAE5B,mBAAmB,CACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,IAAI,EAAE,YAAY,EAAE,EAAE,EACtB,SAAS,EAAE,sBAAsB,GAAG,IAAI,GACvC,OAAO,CAAC,yBAAyB,CAAC;IA8C/B,KAAK,CACT,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC;IAkDnB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
package/dist/storage/memory.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-Memory Storage implementation (for testing)
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { normalizeCondition, hasKeys } from '../types.js';
|
|
5
5
|
/**
|
|
6
6
|
* In-memory event storage for testing purposes
|
|
7
7
|
* NOT suitable for production use
|
|
@@ -9,10 +9,22 @@ import { isConstrainedCondition } from '../types.js';
|
|
|
9
9
|
export class InMemoryStorage {
|
|
10
10
|
events = [];
|
|
11
11
|
nextPosition = 1n;
|
|
12
|
-
async
|
|
12
|
+
async appendWithCondition(eventsToStore, keys, condition) {
|
|
13
13
|
if (eventsToStore.length !== keys.length) {
|
|
14
14
|
throw new Error('Events and keys arrays must have the same length');
|
|
15
15
|
}
|
|
16
|
+
if (eventsToStore.length === 0) {
|
|
17
|
+
const position = await this.getLatestPosition();
|
|
18
|
+
return { position };
|
|
19
|
+
}
|
|
20
|
+
// 1. Conflict check (if condition provided)
|
|
21
|
+
if (condition !== null) {
|
|
22
|
+
const conflictingEvents = await this.query(condition.failIfEventsMatch, condition.after);
|
|
23
|
+
if (conflictingEvents.length > 0) {
|
|
24
|
+
return { conflicting: conflictingEvents };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// 2. Insert events
|
|
16
28
|
let lastPosition = 0n;
|
|
17
29
|
for (let i = 0; i < eventsToStore.length; i++) {
|
|
18
30
|
const event = eventsToStore[i];
|
|
@@ -29,7 +41,7 @@ export class InMemoryStorage {
|
|
|
29
41
|
});
|
|
30
42
|
lastPosition = position;
|
|
31
43
|
}
|
|
32
|
-
return lastPosition;
|
|
44
|
+
return { position: lastPosition };
|
|
33
45
|
}
|
|
34
46
|
async query(conditions, fromPosition, limit) {
|
|
35
47
|
const startPos = fromPosition ?? 0n;
|
|
@@ -42,20 +54,22 @@ export class InMemoryStorage {
|
|
|
42
54
|
const limited = limit !== undefined ? matching.slice(0, limit) : matching;
|
|
43
55
|
return limited.map(({ keys: _keys, ...event }) => event);
|
|
44
56
|
}
|
|
57
|
+
// Normalize conditions to internal format
|
|
58
|
+
const normalized = conditions.map(normalizeCondition);
|
|
45
59
|
// Filter by conditions
|
|
46
60
|
matching = matching.filter(event => {
|
|
47
|
-
// Must match at least one condition
|
|
48
|
-
return
|
|
61
|
+
// Must match at least one condition (OR across conditions)
|
|
62
|
+
return normalized.some(cond => {
|
|
49
63
|
// Type must match
|
|
50
64
|
if (event.type !== cond.type) {
|
|
51
65
|
return false;
|
|
52
66
|
}
|
|
53
67
|
// If unconstrained, type match is enough
|
|
54
|
-
if (!
|
|
68
|
+
if (!hasKeys(cond)) {
|
|
55
69
|
return true;
|
|
56
70
|
}
|
|
57
|
-
// Constrained:
|
|
58
|
-
return event.keys.some(
|
|
71
|
+
// Constrained: ALL keys must match (AND within a condition)
|
|
72
|
+
return cond.keys.every(requiredKey => event.keys.some(eventKey => eventKey.name === requiredKey.name && eventKey.value === requiredKey.value));
|
|
59
73
|
});
|
|
60
74
|
});
|
|
61
75
|
// Sort by position
|
|
@@ -65,9 +79,6 @@ export class InMemoryStorage {
|
|
|
65
79
|
// Strip internal keys
|
|
66
80
|
return limited.map(({ keys: _keys, ...event }) => event);
|
|
67
81
|
}
|
|
68
|
-
async getEventsSince(conditions, sincePosition) {
|
|
69
|
-
return this.query(conditions, sincePosition);
|
|
70
|
-
}
|
|
71
82
|
async getLatestPosition() {
|
|
72
83
|
if (this.events.length === 0) {
|
|
73
84
|
return 0n;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { type PoolConfig } from 'pg';
|
|
5
5
|
import { type ExtractedKey, type QueryCondition, type StoredEvent } from '../types.js';
|
|
6
|
-
import type { EventStorage, EventToStore } from './interface.js';
|
|
6
|
+
import type { EventStorage, EventToStore, StorageAppendCondition, AppendWithConditionResult } from './interface.js';
|
|
7
7
|
/**
|
|
8
8
|
* PostgreSQL-backed event storage
|
|
9
9
|
*
|
|
@@ -38,9 +38,17 @@ export declare class PostgresStorage implements EventStorage {
|
|
|
38
38
|
*/
|
|
39
39
|
init(): Promise<void>;
|
|
40
40
|
private ensureInitialized;
|
|
41
|
-
|
|
41
|
+
appendWithCondition(eventsToStore: EventToStore[], keys: ExtractedKey[][], condition: StorageAppendCondition | null): Promise<AppendWithConditionResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Build PostgreSQL query from normalized conditions.
|
|
44
|
+
* Shared between queryWithClient and query methods.
|
|
45
|
+
*/
|
|
46
|
+
private buildPostgresQuery;
|
|
47
|
+
/**
|
|
48
|
+
* Query with specific client (for use within transactions)
|
|
49
|
+
*/
|
|
50
|
+
private queryWithClient;
|
|
42
51
|
query(conditions: QueryCondition[], fromPosition?: bigint, limit?: number): Promise<StoredEvent[]>;
|
|
43
|
-
getEventsSince(conditions: QueryCondition[], sincePosition: bigint): Promise<StoredEvent[]>;
|
|
44
52
|
getLatestPosition(): Promise<bigint>;
|
|
45
53
|
close(): Promise<void>;
|
|
46
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/storage/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/storage/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,EAA4E,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAkE,MAAM,aAAa,CAAC;AACjO,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AA2CpH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,WAAW,CAAS;gBAEhB,wBAAwB,EAAE,MAAM,GAAG,UAAU;IAQzD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,OAAO,CAAC,iBAAiB;IAMnB,mBAAmB,CACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,IAAI,EAAE,YAAY,EAAE,EAAE,EACtB,SAAS,EAAE,sBAAsB,GAAG,IAAI,GACvC,OAAO,CAAC,yBAAyB,CAAC;IAwGrC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAmK1B;;OAEG;YACW,eAAe;IAWvB,KAAK,CACT,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC;IAQnB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IASpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAY5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAgB7F;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS7C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD;;OAEG;IACG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjF,OAAO,CAAC,UAAU;CAUnB"}
|