boundlessdb 0.8.0 → 0.9.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 +114 -0
- package/README.md +97 -135
- package/dist/browser.d.ts +3 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/event-store.d.ts +3 -1
- package/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +52 -14
- 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 +28 -15
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/query-builder.js +48 -17
- package/dist/query-builder.js.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +14 -1
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/postgres.d.ts +6 -0
- package/dist/storage/postgres.d.ts.map +1 -1
- package/dist/storage/postgres.js +151 -11
- package/dist/storage/postgres.js.map +1 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +153 -3
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/sqljs.d.ts.map +1 -1
- package/dist/storage/sqljs.js +87 -3
- package/dist/storage/sqljs.js.map +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +16 -4
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/event-store.browser.d.ts +0 -82
- package/dist/event-store.browser.d.ts.map +0 -1
- package/dist/event-store.browser.js +0 -336
- package/dist/event-store.browser.js.map +0 -1
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,KAAK,CACf,SAAS,SAAS,MAAM,GAAG,MAAM,EACjC,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACpE,QAAQ,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;CACpB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAMH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzC;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -14,11 +14,23 @@ export function isMultiKeyCondition(c) {
|
|
|
14
14
|
return 'type' in c && 'keys' in c && Array.isArray(c.keys);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
* - `{ type, key, value }` → `{ type, keys: [{ name: key, value }] }`
|
|
19
|
-
* - `{ type, keys: [...] }` → pass through
|
|
20
|
-
* - `{ type }` → pass through (unconstrained)
|
|
17
|
+
* Type guard: check if condition is multi-type (types[] without keys)
|
|
21
18
|
*/
|
|
19
|
+
export function isMultiTypeCondition(c) {
|
|
20
|
+
return 'types' in c && !('keys' in c);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Type guard: check if condition is multi-type constrained (types[] + keys[])
|
|
24
|
+
*/
|
|
25
|
+
export function isMultiTypeConstrainedCondition(c) {
|
|
26
|
+
return 'types' in c && 'keys' in c;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Type guard: check if condition is key-only (no type/types field)
|
|
30
|
+
*/
|
|
31
|
+
export function isKeyOnlyCondition(c) {
|
|
32
|
+
return !('type' in c) && !('types' in c) && 'keys' in c && Array.isArray(c.keys);
|
|
33
|
+
}
|
|
22
34
|
export function normalizeCondition(c) {
|
|
23
35
|
if (isConstrainedCondition(c)) {
|
|
24
36
|
return { type: c.type, keys: [{ name: c.key, value: c.value }] };
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+HH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAAiB;IACtD,OAAO,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAiB;IACnD,OAAO,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAE,CAAkC,CAAC,IAAI,CAAC,CAAC;AAC/F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAiB;IACpD,OAAO,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,CAAiB;IAC/D,OAAO,OAAO,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAiB;IAClD,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAE,CAAsB,CAAC,IAAI,CAAC,CAAC;AACzG,CAAC;AAWD,MAAM,UAAU,kBAAkB,CAAC,CAAiB;IAClD,IAAI,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,CAAwB,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,CAAsB;IAC5C,OAAO,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAE,CAAkC,CAAC,IAAI,CAAC,IAAK,CAAkC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACvI,CAAC;AAWD,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D;;GAEG;AACH,MAAM,OAAO,WAAW;IACb,MAAM,CAAmB;IACzB,QAAQ,CAAS;IACjB,UAAU,CAAmB;IAEtC,YACE,MAAwB,EACxB,QAAgB,EAChB,UAA4B;QAE5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,qCAAqC;IACrC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,iDAAiD;IACjD,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,gDAAgD;IAChD,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,2DAA2D;IAC3D,IAAI,eAAe;QACjB,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC;CACF;AAsED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAAwC;IAExC,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser-compatible EventStore
|
|
3
|
-
*/
|
|
4
|
-
import type { EventStorage } from './storage/interface.js';
|
|
5
|
-
import { QueryResult, type AppendCondition, type AppendResult, type ConflictResult, type Event, type EventStoreOptions, type EventWithMetadata, type Query } from './types.js';
|
|
6
|
-
import { QueryBuilder } from './query-builder.js';
|
|
7
|
-
export interface EventStoreConfig extends EventStoreOptions {
|
|
8
|
-
storage: EventStorage;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Browser-compatible DCB-native Event Store
|
|
12
|
-
*/
|
|
13
|
-
export declare class EventStore {
|
|
14
|
-
private readonly storage;
|
|
15
|
-
private readonly keyExtractor;
|
|
16
|
-
private readonly config;
|
|
17
|
-
private initPromise;
|
|
18
|
-
constructor(options: EventStoreConfig);
|
|
19
|
-
/**
|
|
20
|
-
* Ensure the store is initialized (for async operations)
|
|
21
|
-
*/
|
|
22
|
-
private ensureInitialized;
|
|
23
|
-
/**
|
|
24
|
-
* Check if config has changed since last run, reindex if needed
|
|
25
|
-
*/
|
|
26
|
-
private checkAndReindexIfNeeded;
|
|
27
|
-
/**
|
|
28
|
-
* Create a fluent query builder.
|
|
29
|
-
*
|
|
30
|
-
* @typeParam E - Event union type for typed results
|
|
31
|
-
* @returns QueryBuilder for chaining
|
|
32
|
-
*/
|
|
33
|
-
query<E extends Event = Event>(): QueryBuilder<E>;
|
|
34
|
-
/**
|
|
35
|
-
* Create a fluent query builder that reads all events (no type filter required).
|
|
36
|
-
*
|
|
37
|
-
* @typeParam E - Event union type for typed results
|
|
38
|
-
* @returns QueryBuilder for chaining
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```typescript
|
|
42
|
-
* const result = await store.all().fromPosition(0n).limit(1000).read();
|
|
43
|
-
* const result = await store.all().read();
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
all<E extends Event = Event>(): QueryBuilder<E>;
|
|
47
|
-
/**
|
|
48
|
-
* Read events matching a query
|
|
49
|
-
*
|
|
50
|
-
* @typeParam E - Event union type for typed results
|
|
51
|
-
* @returns QueryResult with typed events and appendCondition
|
|
52
|
-
*/
|
|
53
|
-
read<E extends Event = Event>(query: Query): Promise<QueryResult<E>>;
|
|
54
|
-
/**
|
|
55
|
-
* Append events with optional consistency check
|
|
56
|
-
*
|
|
57
|
-
* @typeParam E - Event type for type checking
|
|
58
|
-
* @param events Events to append
|
|
59
|
-
* @param condition Consistency check - can be:
|
|
60
|
-
* - null: Skip consistency check (optimistic first write)
|
|
61
|
-
* - AppendCondition: { position, conditions } from a previous read
|
|
62
|
-
* @returns AppendResult on success, ConflictResult on conflict
|
|
63
|
-
*/
|
|
64
|
-
append<E extends Event = Event>(events: EventWithMetadata<E>[], condition: AppendCondition | null): Promise<AppendResult | ConflictResult<E>>;
|
|
65
|
-
/**
|
|
66
|
-
* Build conditions that cover the appended events
|
|
67
|
-
*/
|
|
68
|
-
private buildConditionsFromEvents;
|
|
69
|
-
/**
|
|
70
|
-
* Get the underlying storage (for advanced use cases)
|
|
71
|
-
*/
|
|
72
|
-
getStorage(): EventStorage;
|
|
73
|
-
/**
|
|
74
|
-
* Close the event store
|
|
75
|
-
*/
|
|
76
|
-
close(): Promise<void>;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Factory function to create an event store
|
|
80
|
-
*/
|
|
81
|
-
export declare function createEventStore(options: EventStoreConfig): EventStore;
|
|
82
|
-
//# sourceMappingURL=event-store.browser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.browser.d.ts","sourceRoot":"","sources":["../src/event-store.browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACL,WAAW,EAKX,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EAInB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,KAAK,EAGX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AA6DtE,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,EAAE,gBAAgB;IAqBrC;;OAEG;YACW,iBAAiB;IAM/B;;OAEG;YACW,uBAAuB;IAyCrC;;;;;OAKG;IACH,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC;IAIjD;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC;IAI/C;;;;;OAKG;IACG,IAAI,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA+B1E;;;;;;;;;OASG;IACG,MAAM,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAClC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC9B,SAAS,EAAE,eAAe,GAAG,IAAI,GAChC,OAAO,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAsH5C;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA8BjC;;OAEG;IACH,UAAU,IAAI,YAAY;IAI1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAEtE"}
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser-compatible EventStore
|
|
3
|
-
*/
|
|
4
|
-
import { KeyExtractor } from './config/extractor.js';
|
|
5
|
-
import { validateConfig } from './config/validator.js';
|
|
6
|
-
import { SqlJsStorage } from './storage/sqljs.js';
|
|
7
|
-
import { QueryResult, isConstrainedCondition, normalizeCondition, hasKeys, } from './types.js';
|
|
8
|
-
import { QueryBuilder } from './query-builder.js';
|
|
9
|
-
/**
|
|
10
|
-
* Generate UUID with fallback for environments without crypto.randomUUID
|
|
11
|
-
*/
|
|
12
|
-
function generateUUID() {
|
|
13
|
-
try {
|
|
14
|
-
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
15
|
-
return crypto.randomUUID();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
catch (e) {
|
|
19
|
-
// crypto.randomUUID might throw in insecure contexts
|
|
20
|
-
}
|
|
21
|
-
// Fallback using crypto.getRandomValues if available
|
|
22
|
-
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
23
|
-
const arr = new Uint8Array(16);
|
|
24
|
-
crypto.getRandomValues(arr);
|
|
25
|
-
arr[6] = (arr[6] & 0x0f) | 0x40; // Version 4
|
|
26
|
-
arr[8] = (arr[8] & 0x3f) | 0x80; // Variant
|
|
27
|
-
const hex = Array.from(arr, b => b.toString(16).padStart(2, '0')).join('');
|
|
28
|
-
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
29
|
-
}
|
|
30
|
-
// Last resort fallback
|
|
31
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
32
|
-
const r = (Math.random() * 16) | 0;
|
|
33
|
-
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
34
|
-
return v.toString(16);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Recursively sort object keys for deterministic JSON
|
|
39
|
-
*/
|
|
40
|
-
function sortObjectKeys(obj) {
|
|
41
|
-
if (obj === null || typeof obj !== 'object') {
|
|
42
|
-
return obj;
|
|
43
|
-
}
|
|
44
|
-
if (Array.isArray(obj)) {
|
|
45
|
-
return obj.map(sortObjectKeys);
|
|
46
|
-
}
|
|
47
|
-
const sorted = {};
|
|
48
|
-
for (const key of Object.keys(obj).sort()) {
|
|
49
|
-
sorted[key] = sortObjectKeys(obj[key]);
|
|
50
|
-
}
|
|
51
|
-
return sorted;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Compute SHA256 hash of ConsistencyConfig (async for browser)
|
|
55
|
-
*/
|
|
56
|
-
async function hashConfig(config) {
|
|
57
|
-
const normalized = JSON.stringify(sortObjectKeys(config));
|
|
58
|
-
const encoder = new TextEncoder();
|
|
59
|
-
const data = encoder.encode(normalized);
|
|
60
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
61
|
-
const hashArray = new Uint8Array(hashBuffer);
|
|
62
|
-
return Array.from(hashArray)
|
|
63
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
64
|
-
.join('');
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Browser-compatible DCB-native Event Store
|
|
68
|
-
*/
|
|
69
|
-
export class EventStore {
|
|
70
|
-
storage;
|
|
71
|
-
keyExtractor;
|
|
72
|
-
config;
|
|
73
|
-
initPromise = null;
|
|
74
|
-
constructor(options) {
|
|
75
|
-
// Validate configuration
|
|
76
|
-
validateConfig(options.consistency);
|
|
77
|
-
this.storage = options.storage;
|
|
78
|
-
this.config = options.consistency;
|
|
79
|
-
this.keyExtractor = new KeyExtractor(this.config);
|
|
80
|
-
console.log('🚀 INIT: Creating EventStore...');
|
|
81
|
-
console.log('⚙️ CONFIG: Consistency configuration loaded');
|
|
82
|
-
const eventTypes = Object.keys(this.config.eventTypes);
|
|
83
|
-
console.log(` Event types: ${eventTypes.join(', ')}`);
|
|
84
|
-
eventTypes.forEach(type => {
|
|
85
|
-
const keys = this.config.eventTypes[type].keys;
|
|
86
|
-
console.log(` ${type}: ${keys.map(k => k.name + ' ← ' + k.path).join(', ')}`);
|
|
87
|
-
});
|
|
88
|
-
// Start async initialization
|
|
89
|
-
this.initPromise = this.checkAndReindexIfNeeded();
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Ensure the store is initialized (for async operations)
|
|
93
|
-
*/
|
|
94
|
-
async ensureInitialized() {
|
|
95
|
-
if (this.initPromise) {
|
|
96
|
-
await this.initPromise;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Check if config has changed since last run, reindex if needed
|
|
101
|
-
*/
|
|
102
|
-
async checkAndReindexIfNeeded() {
|
|
103
|
-
// Only works with SqlJsStorage (has metadata methods)
|
|
104
|
-
if (!(this.storage instanceof SqlJsStorage)) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
try {
|
|
108
|
-
// Ensure storage is fully initialized before accessing metadata
|
|
109
|
-
await this.storage.getLatestPosition(); // This awaits the init promise
|
|
110
|
-
console.log('🔐 HASH: Computing config hash...');
|
|
111
|
-
const currentHash = await hashConfig(this.config);
|
|
112
|
-
if (!currentHash) {
|
|
113
|
-
console.warn('[EventStore] Failed to compute config hash');
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
console.log(` Current config hash: ${currentHash.substring(0, 16)}...`);
|
|
117
|
-
const storedHash = await this.storage.getConfigHash();
|
|
118
|
-
console.log(` Stored config hash: ${storedHash ? storedHash.substring(0, 16) + '...' : '(none - first run)'}`);
|
|
119
|
-
if (storedHash === null) {
|
|
120
|
-
// First run — just store the hash
|
|
121
|
-
await this.storage.setConfigHash(currentHash);
|
|
122
|
-
}
|
|
123
|
-
else if (storedHash !== currentHash) {
|
|
124
|
-
// Config changed — throw error, require explicit reindex via script
|
|
125
|
-
throw new Error(`Config hash mismatch (stored: ${storedHash}, current: ${currentHash}). ` +
|
|
126
|
-
`Run the reindex script before starting the application.`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
// Re-throw config hash mismatch errors — these are intentional
|
|
131
|
-
if (error instanceof Error && error.message.includes('Config hash mismatch')) {
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
console.warn('⚠️ INIT: Config hash check failed (non-fatal):', error);
|
|
135
|
-
// Don't throw for other errors - config hash is nice-to-have, not required
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Create a fluent query builder.
|
|
140
|
-
*
|
|
141
|
-
* @typeParam E - Event union type for typed results
|
|
142
|
-
* @returns QueryBuilder for chaining
|
|
143
|
-
*/
|
|
144
|
-
query() {
|
|
145
|
-
return new QueryBuilder(this);
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Create a fluent query builder that reads all events (no type filter required).
|
|
149
|
-
*
|
|
150
|
-
* @typeParam E - Event union type for typed results
|
|
151
|
-
* @returns QueryBuilder for chaining
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* const result = await store.all().fromPosition(0n).limit(1000).read();
|
|
156
|
-
* const result = await store.all().read();
|
|
157
|
-
* ```
|
|
158
|
-
*/
|
|
159
|
-
all() {
|
|
160
|
-
return new QueryBuilder(this);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Read events matching a query
|
|
164
|
-
*
|
|
165
|
-
* @typeParam E - Event union type for typed results
|
|
166
|
-
* @returns QueryResult with typed events and appendCondition
|
|
167
|
-
*/
|
|
168
|
-
async read(query) {
|
|
169
|
-
await this.ensureInitialized();
|
|
170
|
-
console.log('📖 READ: Querying events...');
|
|
171
|
-
console.log(' Conditions:', query.conditions.map(c => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ') || '(none)');
|
|
172
|
-
const events = await this.storage.query(query.conditions, query.fromPosition, query.limit);
|
|
173
|
-
console.log(` Found: ${events.length} events`);
|
|
174
|
-
// Get the position for the append condition
|
|
175
|
-
const position = events.length > 0
|
|
176
|
-
? events[events.length - 1].position
|
|
177
|
-
: await this.storage.getLatestPosition();
|
|
178
|
-
console.log(`📍 POSITION: #${position}`);
|
|
179
|
-
console.log(` Scope: ${query.conditions.length} condition(s)`);
|
|
180
|
-
return new QueryResult(events, position, query.conditions);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Append events with optional consistency check
|
|
184
|
-
*
|
|
185
|
-
* @typeParam E - Event type for type checking
|
|
186
|
-
* @param events Events to append
|
|
187
|
-
* @param condition Consistency check - can be:
|
|
188
|
-
* - null: Skip consistency check (optimistic first write)
|
|
189
|
-
* - AppendCondition: { position, conditions } from a previous read
|
|
190
|
-
* @returns AppendResult on success, ConflictResult on conflict
|
|
191
|
-
*/
|
|
192
|
-
async append(events, condition) {
|
|
193
|
-
await this.ensureInitialized();
|
|
194
|
-
console.log(`✏️ APPEND: ${events.length} event(s)`);
|
|
195
|
-
events.forEach(e => console.log(` → ${e.type}: ${JSON.stringify(e.data).substring(0, 60)}...`));
|
|
196
|
-
console.log(` Condition: ${condition ? 'AppendCondition' : 'null (no conflict check)'}`);
|
|
197
|
-
if (events.length === 0) {
|
|
198
|
-
const position = await this.storage.getLatestPosition();
|
|
199
|
-
return {
|
|
200
|
-
conflict: false,
|
|
201
|
-
position,
|
|
202
|
-
appendCondition: { failIfEventsMatch: condition?.failIfEventsMatch ?? [], after: position },
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
// Extract keys from all events
|
|
206
|
-
const keysPerEvent = events.map(event => this.keyExtractor.extract(event));
|
|
207
|
-
console.log(`🔑 KEYS: Extracted from payload via config`);
|
|
208
|
-
keysPerEvent.forEach((keys, i) => {
|
|
209
|
-
console.log(` Event ${i}: ${keys.map(k => `${k.name}="${k.value}"`).join(', ')}`);
|
|
210
|
-
});
|
|
211
|
-
// Prepare events for storage
|
|
212
|
-
const now = new Date();
|
|
213
|
-
const eventsToStore = events.map((event) => {
|
|
214
|
-
const id = generateUUID();
|
|
215
|
-
if (!id) {
|
|
216
|
-
throw new Error('Failed to generate event ID');
|
|
217
|
-
}
|
|
218
|
-
return {
|
|
219
|
-
id,
|
|
220
|
-
type: event.type,
|
|
221
|
-
data: event.data,
|
|
222
|
-
metadata: event.metadata,
|
|
223
|
-
timestamp: now,
|
|
224
|
-
};
|
|
225
|
-
});
|
|
226
|
-
// Build storage condition (if provided)
|
|
227
|
-
const storageCondition = condition !== null
|
|
228
|
-
? { failIfEventsMatch: condition.failIfEventsMatch, after: condition.after ?? 0n }
|
|
229
|
-
: null;
|
|
230
|
-
if (condition !== null) {
|
|
231
|
-
const conditionsStr = condition.failIfEventsMatch.map((c) => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ');
|
|
232
|
-
const checkFromPosition = condition.after ?? 0n;
|
|
233
|
-
console.log(`🔍 CONFLICT CHECK: Looking for events since position #${checkFromPosition}`);
|
|
234
|
-
console.log(` Checking conditions: ${conditionsStr || '(none)'}`);
|
|
235
|
-
}
|
|
236
|
-
// Append with atomic conflict check
|
|
237
|
-
const result = await this.storage.appendWithCondition(eventsToStore, keysPerEvent, storageCondition);
|
|
238
|
-
// Check if conflict detected
|
|
239
|
-
if (result.conflicting) {
|
|
240
|
-
console.log(` Result: ${result.conflicting.length} matching event(s) found - CONFLICT!`);
|
|
241
|
-
console.log('');
|
|
242
|
-
console.log('❌ ═══════════════════════════════════════');
|
|
243
|
-
console.log(' CONFLICT DETECTED');
|
|
244
|
-
console.log('═══════════════════════════════════════════');
|
|
245
|
-
console.log('');
|
|
246
|
-
console.log('📍 Your position: #' + (condition?.after ?? '0 (all events)'));
|
|
247
|
-
console.log('');
|
|
248
|
-
console.log('🔍 Query conditions you checked:');
|
|
249
|
-
condition?.failIfEventsMatch.forEach((c) => {
|
|
250
|
-
if (isConstrainedCondition(c)) {
|
|
251
|
-
console.log(` • ${c.type} where ${c.key}="${c.value}"`);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
console.log(` • ${c.type} (all)`);
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
console.log('');
|
|
258
|
-
console.log('⚡ Events written SINCE your read (that match your query):');
|
|
259
|
-
result.conflicting.forEach(e => {
|
|
260
|
-
console.log(` • Event #${e.position}: ${e.type}`);
|
|
261
|
-
console.log(` Data: ${JSON.stringify(e.data)}`);
|
|
262
|
-
});
|
|
263
|
-
console.log('');
|
|
264
|
-
console.log('💡 Why conflict?');
|
|
265
|
-
console.log(' These events match your query conditions!');
|
|
266
|
-
console.log(' Your decision was based on stale data.');
|
|
267
|
-
console.log('');
|
|
268
|
-
console.log('🔄 Solution: Use result.appendCondition to retry.');
|
|
269
|
-
console.log('═══════════════════════════════════════════');
|
|
270
|
-
console.log('');
|
|
271
|
-
const latestPosition = result.conflicting[result.conflicting.length - 1].position;
|
|
272
|
-
return {
|
|
273
|
-
conflict: true,
|
|
274
|
-
conflictingEvents: result.conflicting,
|
|
275
|
-
appendCondition: {
|
|
276
|
-
failIfEventsMatch: condition?.failIfEventsMatch ?? [],
|
|
277
|
-
after: latestPosition
|
|
278
|
-
},
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
console.log(`💾 STORED: Event(s) at position #${result.position}`);
|
|
282
|
-
// Build new appendCondition
|
|
283
|
-
const newConditions = this.buildConditionsFromEvents(events, condition);
|
|
284
|
-
console.log(`✅ SUCCESS: Append complete at position #${result.position}`);
|
|
285
|
-
return {
|
|
286
|
-
conflict: false,
|
|
287
|
-
position: result.position,
|
|
288
|
-
appendCondition: { failIfEventsMatch: newConditions, after: result.position },
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Build conditions that cover the appended events
|
|
293
|
-
*/
|
|
294
|
-
buildConditionsFromEvents(events, originalCondition) {
|
|
295
|
-
const conditions = new Map();
|
|
296
|
-
if (originalCondition !== null) {
|
|
297
|
-
for (const cond of originalCondition.failIfEventsMatch) {
|
|
298
|
-
const normalized = normalizeCondition(cond);
|
|
299
|
-
if (hasKeys(normalized)) {
|
|
300
|
-
const keysStr = normalized.keys.map(k => `${k.name}:${k.value}`).sort().join('|');
|
|
301
|
-
const dedupKey = `${normalized.type}:${keysStr}`;
|
|
302
|
-
conditions.set(dedupKey, normalized);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
// Add conditions from the newly appended events
|
|
307
|
-
for (const event of events) {
|
|
308
|
-
const extractedKeys = this.keyExtractor.extract(event);
|
|
309
|
-
for (const extracted of extractedKeys) {
|
|
310
|
-
const cond = { type: event.type, key: extracted.name, value: extracted.value };
|
|
311
|
-
const dedupKey = `${cond.type}:${extracted.name}:${extracted.value}`;
|
|
312
|
-
conditions.set(dedupKey, cond);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
return Array.from(conditions.values());
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Get the underlying storage (for advanced use cases)
|
|
319
|
-
*/
|
|
320
|
-
getStorage() {
|
|
321
|
-
return this.storage;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Close the event store
|
|
325
|
-
*/
|
|
326
|
-
async close() {
|
|
327
|
-
await this.storage.close();
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Factory function to create an event store
|
|
332
|
-
*/
|
|
333
|
-
export function createEventStore(options) {
|
|
334
|
-
return new EventStore(options);
|
|
335
|
-
}
|
|
336
|
-
//# sourceMappingURL=event-store.browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.browser.js","sourceRoot":"","sources":["../src/event-store.browser.ts"],"names":[],"mappings":"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"}
|