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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,78 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to BoundlessDB will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.5.0] - 2026-02-27
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Multi-Key AND Queries**: Filter events that match ALL specified keys on the same event. Implements the DCB spec requirement for multi-tag QueryItems.
|
|
10
|
+
```typescript
|
|
11
|
+
// Fluent API
|
|
12
|
+
store.query()
|
|
13
|
+
.matchType('StudentSubscribed')
|
|
14
|
+
.withKey('course', 'cs101')
|
|
15
|
+
.withKey('student', 'alice') // AND: same event must have both keys
|
|
16
|
+
.read();
|
|
17
|
+
|
|
18
|
+
// Object API
|
|
19
|
+
store.read({
|
|
20
|
+
conditions: [{
|
|
21
|
+
type: 'StudentSubscribed',
|
|
22
|
+
keys: [
|
|
23
|
+
{ name: 'course', value: 'cs101' },
|
|
24
|
+
{ name: 'student', value: 'alice' }
|
|
25
|
+
]
|
|
26
|
+
}]
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
- **`.withKey(key, value)`** on QueryBuilder: adds an AND key to the last condition. Throws if called without a preceding `.matchType()` or `.matchTypeAndKey()`.
|
|
30
|
+
- **`MultiKeyConstrainedCondition` type**: `{ type, keys: [{ name, value }] }` for multi-key conditions.
|
|
31
|
+
- **`normalizeCondition()`**, **`hasKeys()`**, **`isMultiKeyCondition()`** exported as helpers.
|
|
32
|
+
- **AND vs OR** documentation in README.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- **sql.js storage rewritten** to CTE-based query approach (was naive JOIN + OR). Now mirrors the SQLite/better-sqlite3 strategy.
|
|
37
|
+
- **Backward compatible**: `{ type, key, value }` is still accepted and normalized internally to `{ type, keys: [{ name: key, value }] }`.
|
|
38
|
+
|
|
39
|
+
### SQL Strategy
|
|
40
|
+
|
|
41
|
+
Multi-key conditions use **INTERSECT** within a CTE. Each key gets its own sub-select on `idx_key_position`; INTERSECT returns only positions with ALL keys:
|
|
42
|
+
|
|
43
|
+
```sql
|
|
44
|
+
SELECT position FROM event_keys WHERE key_name = 'course' AND key_value = 'cs101'
|
|
45
|
+
INTERSECT
|
|
46
|
+
SELECT position FROM event_keys WHERE key_name = 'student' AND key_value = 'alice'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Single-key conditions (1 key) skip INTERSECT and use the existing efficient path.
|
|
50
|
+
|
|
51
|
+
### Tests
|
|
52
|
+
|
|
53
|
+
- 140 tests (was 118), +22 new tests covering multi-key AND, mixed AND+OR, 3+ keys, backward compat, AppendCondition conflict detection, error cases.
|
|
54
|
+
|
|
55
|
+
## [0.4.0] - 2026-02-24
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- **Atomic conflict detection**: `appendWithCondition()` performs conflict check and write in a single transaction. Enables safe multi-node deployments (e.g. Supabase Edge Functions).
|
|
60
|
+
- **PostgreSQL SERIALIZABLE isolation**: Concurrent appends with overlapping consistency keys are detected automatically. Auto-retry on serialization failure (max 3 attempts).
|
|
61
|
+
- **PostgreSQL 50M benchmark results** on landing page.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
|
|
65
|
+
- **Storage interface**: `append()` + `getEventsSince()` replaced by `appendWithCondition()`. Public API (`store.read()`, `store.append()`, `store.query()`) is unchanged.
|
|
66
|
+
- Conflict check logic moved from EventStore into Storage layer for atomicity.
|
|
67
|
+
|
|
68
|
+
### Performance
|
|
69
|
+
|
|
70
|
+
- **50M events (PostgreSQL 16, shuffled):**
|
|
71
|
+
- Constrained (167 results): 3.73ms
|
|
72
|
+
- Highly selective (10 results): 1.14ms
|
|
73
|
+
- Mixed 2 types (334 results): 3.83ms
|
|
74
|
+
- Full aggregate (2,004 results): 7.96ms
|
|
75
|
+
- Write throughput: 3,797 evt/s (LUKS encrypted)
|
|
76
|
+
|
|
5
77
|
## [0.3.1] - 2026-02-24
|
|
6
78
|
|
|
7
79
|
### Performance
|
package/README.md
CHANGED
|
@@ -157,6 +157,7 @@ Build queries with a chainable API:
|
|
|
157
157
|
const { events, appendCondition } = await store.query<CourseEvent>()
|
|
158
158
|
.matchType('CourseCreated') // all events of type
|
|
159
159
|
.matchTypeAndKey('StudentSubscribed', 'course', 'cs101') // type + key = value
|
|
160
|
+
.withKey('student', 'alice') // AND: also match student key
|
|
160
161
|
.fromPosition(100n) // start from position
|
|
161
162
|
.limit(50) // limit results
|
|
162
163
|
.read();
|
|
@@ -168,6 +169,7 @@ const { events, appendCondition } = await store.query<CourseEvent>()
|
|
|
168
169
|
|--------|-------------|
|
|
169
170
|
| `matchType(type)` | Match all events of type (unconstrained) |
|
|
170
171
|
| `matchTypeAndKey(type, key, value)` | Match events of type where key=value |
|
|
172
|
+
| `withKey(key, value)` | Add AND key to last condition (multi-key) |
|
|
171
173
|
| `fromPosition(bigint)` | Start reading from position |
|
|
172
174
|
| `limit(number)` | Limit number of results |
|
|
173
175
|
| `read()` | Execute query, returns `QueryResult` |
|
|
@@ -250,13 +252,48 @@ Traditional streams give you ONE boundary. DCB lets you query ANY combination:
|
|
|
250
252
|
|
|
251
253
|
```typescript
|
|
252
254
|
// "Has Alice already enrolled in CS101?"
|
|
255
|
+
// Multi-key AND: must match BOTH keys on the SAME event
|
|
256
|
+
const result = await store.query()
|
|
257
|
+
.matchType('StudentSubscribed')
|
|
258
|
+
.withKey('course', 'cs101')
|
|
259
|
+
.withKey('student', 'alice')
|
|
260
|
+
.read();
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### AND vs OR
|
|
264
|
+
|
|
265
|
+
- **`.withKey().withKey()`** = **AND** — the same event must have ALL specified keys
|
|
266
|
+
- **Two separate conditions** = **OR** — events matching EITHER condition
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// AND: Events where course='cs101' AND student='alice' (same event)
|
|
270
|
+
store.query()
|
|
271
|
+
.matchType('StudentSubscribed')
|
|
272
|
+
.withKey('course', 'cs101')
|
|
273
|
+
.withKey('student', 'alice')
|
|
274
|
+
.read();
|
|
275
|
+
|
|
276
|
+
// OR: Events where course='cs101' OR student='alice' (different events)
|
|
277
|
+
store.query()
|
|
278
|
+
.matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
279
|
+
.matchTypeAndKey('StudentSubscribed', 'student', 'alice')
|
|
280
|
+
.read();
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Multi-key conditions also work in the object syntax:
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
253
286
|
const result = await store.read({
|
|
254
287
|
conditions: [
|
|
255
|
-
{
|
|
256
|
-
|
|
288
|
+
{
|
|
289
|
+
type: 'StudentSubscribed',
|
|
290
|
+
keys: [
|
|
291
|
+
{ name: 'course', value: 'cs101' },
|
|
292
|
+
{ name: 'student', value: 'alice' }
|
|
293
|
+
]
|
|
294
|
+
}
|
|
257
295
|
]
|
|
258
296
|
});
|
|
259
|
-
// Checks BOTH course AND student boundaries in one query!
|
|
260
297
|
```
|
|
261
298
|
|
|
262
299
|
## Config-based Key Extraction
|
|
@@ -367,6 +404,30 @@ npm run build:browser
|
|
|
367
404
|
# → ui/public/boundless.browser.js (~100KB)
|
|
368
405
|
```
|
|
369
406
|
|
|
407
|
+
## Multi-Node Safety
|
|
408
|
+
|
|
409
|
+
BoundlessDB supports concurrent access from multiple processes (e.g. Supabase Edge Functions, multiple server instances) when using PostgreSQL.
|
|
410
|
+
|
|
411
|
+
The conflict check and write happen **atomically in a single SERIALIZABLE transaction**. PostgreSQL detects overlapping reads and aborts one transaction if two processes try to append with conflicting consistency keys. The library retries automatically.
|
|
412
|
+
|
|
413
|
+
```typescript
|
|
414
|
+
// Edge Function A and B run simultaneously:
|
|
415
|
+
// Both read, both decide, both try to append.
|
|
416
|
+
// PostgreSQL ensures only one succeeds — the other gets a conflict result.
|
|
417
|
+
|
|
418
|
+
const result = await store.append(newEvents, appendCondition);
|
|
419
|
+
if (result.conflict) {
|
|
420
|
+
// Retry with fresh state
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Key behavior:**
|
|
425
|
+
- Appends with **different keys** proceed in parallel (no conflict)
|
|
426
|
+
- Appends with **overlapping keys** are serialized (one wins, one retries)
|
|
427
|
+
- This maps directly to DCB's Dynamic Consistency Boundaries
|
|
428
|
+
|
|
429
|
+
**No configuration needed** — atomic conflict detection is built into all storage engines.
|
|
430
|
+
|
|
370
431
|
## Storage Backends
|
|
371
432
|
|
|
372
433
|
| Backend | Environment | Persistence |
|
|
@@ -497,17 +558,20 @@ const result = await store.read({
|
|
|
497
558
|
```
|
|
498
559
|
|
|
499
560
|
### Type Safety
|
|
500
|
-
With TypeScript, conditions are type-safe —
|
|
501
|
-
- **Only `type`** (unconstrained), or
|
|
502
|
-
- **`type` + `key` + `value`** (constrained)
|
|
561
|
+
With TypeScript, conditions are type-safe — three forms:
|
|
503
562
|
|
|
504
563
|
```typescript
|
|
505
|
-
// ✅
|
|
564
|
+
// ✅ Unconstrained (type only)
|
|
506
565
|
{ type: 'ProductItemAdded' }
|
|
566
|
+
|
|
567
|
+
// ✅ Single key
|
|
507
568
|
{ type: 'ProductItemAdded', key: 'cart', value: 'cart-123' }
|
|
508
569
|
|
|
509
|
-
//
|
|
510
|
-
{ type: '
|
|
570
|
+
// ✅ Multi-key AND
|
|
571
|
+
{ type: 'StudentSubscribed', keys: [
|
|
572
|
+
{ name: 'course', value: 'cs101' },
|
|
573
|
+
{ name: 'student', value: 'alice' }
|
|
574
|
+
]}
|
|
511
575
|
```
|
|
512
576
|
|
|
513
577
|
### Empty Conditions
|
|
@@ -529,11 +593,38 @@ const store = createEventStore({
|
|
|
529
593
|
});
|
|
530
594
|
```
|
|
531
595
|
|
|
596
|
+
### `store.query<E>()`
|
|
597
|
+
|
|
598
|
+
Fluent query builder:
|
|
599
|
+
|
|
600
|
+
```typescript
|
|
601
|
+
const result = await store.query<CourseEvent>()
|
|
602
|
+
.matchType('CourseCreated') // unconstrained (type only)
|
|
603
|
+
.matchTypeAndKey('StudentSubscribed', 'course', 'cs101') // type + single key
|
|
604
|
+
.withKey('student', 'alice') // AND: add key to last condition
|
|
605
|
+
.fromPosition(100n) // start from position
|
|
606
|
+
.limit(50) // limit results
|
|
607
|
+
.read(); // execute, returns QueryResult
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
| Method | Description |
|
|
611
|
+
|--------|-------------|
|
|
612
|
+
| `matchType(type)` | Match all events of type (unconstrained) |
|
|
613
|
+
| `matchTypeAndKey(type, key, value)` | Match events of type where key=value |
|
|
614
|
+
| `withKey(key, value)` | Add AND key to last condition (multi-key) |
|
|
615
|
+
| `fromPosition(bigint)` | Start reading from position |
|
|
616
|
+
| `limit(number)` | Limit number of results |
|
|
617
|
+
| `read()` | Execute query, returns `QueryResult` |
|
|
618
|
+
|
|
532
619
|
### `store.read<E>(query)`
|
|
533
620
|
|
|
534
621
|
```typescript
|
|
535
622
|
const result = await store.read<CartEvents>({
|
|
536
|
-
conditions: [
|
|
623
|
+
conditions: [
|
|
624
|
+
{ type: string } // unconstrained
|
|
625
|
+
| { type: string, key: string, value: string } // single key
|
|
626
|
+
| { type: string, keys: { name: string, value: string }[] } // multi-key AND
|
|
627
|
+
],
|
|
537
628
|
fromPosition?: bigint,
|
|
538
629
|
limit?: number,
|
|
539
630
|
});
|
package/dist/browser.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This file exports everything needed for browser usage with sql.js storage.
|
|
5
5
|
*/
|
|
6
|
-
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
7
|
-
export { QueryResult, isConflict, isConstrainedCondition } from './types.js';
|
|
6
|
+
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, MultiKeyConstrainedCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
7
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
8
8
|
export { EventStore, createEventStore, type EventStoreConfig } from './event-store.browser.js';
|
|
9
9
|
export type { EventStorage, EventToStore } from './storage/interface.js';
|
|
10
10
|
export { InMemoryStorage } from './storage/memory.js';
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAEV,KAAK,EACL,iBAAiB,EACjB,WAAW,EAEX,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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,0BAA0B,CAAC;AAG/F,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/browser.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This file exports everything needed for browser usage with sql.js storage.
|
|
5
5
|
*/
|
|
6
|
-
export { QueryResult, isConflict, isConstrainedCondition } from './types.js';
|
|
6
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
7
7
|
// Event Store (browser version)
|
|
8
8
|
export { EventStore, createEventStore } from './event-store.browser.js';
|
|
9
9
|
export { InMemoryStorage } from './storage/memory.js';
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/H,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAyB,MAAM,0BAA0B,CAAC;AAI/F,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAC;AAE5E,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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;AA6DpB,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;IA+DrC;;;;;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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { KeyExtractor } from './config/extractor.js';
|
|
5
5
|
import { validateConfig } from './config/validator.js';
|
|
6
6
|
import { SqlJsStorage } from './storage/sqljs.js';
|
|
7
|
-
import { QueryResult, isConstrainedCondition, } from './types.js';
|
|
7
|
+
import { QueryResult, isConstrainedCondition, normalizeCondition, hasKeys, } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Generate UUID with fallback for environments without crypto.randomUUID
|
|
10
10
|
*/
|
|
@@ -203,56 +203,7 @@ export class EventStore {
|
|
|
203
203
|
keysPerEvent.forEach((keys, i) => {
|
|
204
204
|
console.log(` Event ${i}: ${keys.map(k => `${k.name}="${k.value}"`).join(', ')}`);
|
|
205
205
|
});
|
|
206
|
-
//
|
|
207
|
-
if (condition !== null) {
|
|
208
|
-
const conditionsStr = condition.failIfEventsMatch.map((c) => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ');
|
|
209
|
-
// If 'after' is undefined, check ALL events (position 0n)
|
|
210
|
-
const checkFromPosition = condition.after ?? 0n;
|
|
211
|
-
console.log(`🔍 CONFLICT CHECK: Looking for events since position #${checkFromPosition}`);
|
|
212
|
-
console.log(` Checking conditions: ${conditionsStr || '(none)'}`);
|
|
213
|
-
const conflictingEvents = await this.storage.getEventsSince(condition.failIfEventsMatch, checkFromPosition);
|
|
214
|
-
console.log(` Result: ${conflictingEvents.length} matching event(s) found since #${checkFromPosition}`);
|
|
215
|
-
if (conflictingEvents.length > 0) {
|
|
216
|
-
// Conflict detected
|
|
217
|
-
console.log('');
|
|
218
|
-
console.log('❌ ═══════════════════════════════════════');
|
|
219
|
-
console.log(' CONFLICT DETECTED');
|
|
220
|
-
console.log('═══════════════════════════════════════════');
|
|
221
|
-
console.log('');
|
|
222
|
-
console.log('📍 Your position: #' + (condition.after ?? '0 (all events)'));
|
|
223
|
-
console.log('');
|
|
224
|
-
console.log('🔍 Query conditions you checked:');
|
|
225
|
-
condition.failIfEventsMatch.forEach((c) => {
|
|
226
|
-
if (isConstrainedCondition(c)) {
|
|
227
|
-
console.log(` • ${c.type} where ${c.key}="${c.value}"`);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
console.log(` • ${c.type} (all)`);
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
console.log('');
|
|
234
|
-
console.log('⚡ Events written SINCE your read (that match your query):');
|
|
235
|
-
conflictingEvents.forEach(e => {
|
|
236
|
-
console.log(` • Event #${e.position}: ${e.type}`);
|
|
237
|
-
console.log(` Data: ${JSON.stringify(e.data)}`);
|
|
238
|
-
});
|
|
239
|
-
console.log('');
|
|
240
|
-
console.log('💡 Why conflict?');
|
|
241
|
-
console.log(' These events match your query conditions!');
|
|
242
|
-
console.log(' Your decision was based on stale data.');
|
|
243
|
-
console.log('');
|
|
244
|
-
console.log('🔄 Solution: Use result.appendCondition to retry.');
|
|
245
|
-
console.log('═══════════════════════════════════════════');
|
|
246
|
-
console.log('');
|
|
247
|
-
const latestPosition = conflictingEvents[conflictingEvents.length - 1].position;
|
|
248
|
-
return {
|
|
249
|
-
conflict: true,
|
|
250
|
-
conflictingEvents: conflictingEvents,
|
|
251
|
-
appendCondition: { failIfEventsMatch: condition.failIfEventsMatch, after: latestPosition },
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// No conflict — prepare events for storage
|
|
206
|
+
// Prepare events for storage
|
|
256
207
|
const now = new Date();
|
|
257
208
|
const eventsToStore = events.map((event) => {
|
|
258
209
|
const id = generateUUID();
|
|
@@ -267,16 +218,69 @@ export class EventStore {
|
|
|
267
218
|
timestamp: now,
|
|
268
219
|
};
|
|
269
220
|
});
|
|
270
|
-
//
|
|
271
|
-
const
|
|
272
|
-
|
|
221
|
+
// Build storage condition (if provided)
|
|
222
|
+
const storageCondition = condition !== null
|
|
223
|
+
? { failIfEventsMatch: condition.failIfEventsMatch, after: condition.after ?? 0n }
|
|
224
|
+
: null;
|
|
225
|
+
if (condition !== null) {
|
|
226
|
+
const conditionsStr = condition.failIfEventsMatch.map((c) => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ');
|
|
227
|
+
const checkFromPosition = condition.after ?? 0n;
|
|
228
|
+
console.log(`🔍 CONFLICT CHECK: Looking for events since position #${checkFromPosition}`);
|
|
229
|
+
console.log(` Checking conditions: ${conditionsStr || '(none)'}`);
|
|
230
|
+
}
|
|
231
|
+
// Append with atomic conflict check
|
|
232
|
+
const result = await this.storage.appendWithCondition(eventsToStore, keysPerEvent, storageCondition);
|
|
233
|
+
// Check if conflict detected
|
|
234
|
+
if (result.conflicting) {
|
|
235
|
+
console.log(` Result: ${result.conflicting.length} matching event(s) found - CONFLICT!`);
|
|
236
|
+
console.log('');
|
|
237
|
+
console.log('❌ ═══════════════════════════════════════');
|
|
238
|
+
console.log(' CONFLICT DETECTED');
|
|
239
|
+
console.log('═══════════════════════════════════════════');
|
|
240
|
+
console.log('');
|
|
241
|
+
console.log('📍 Your position: #' + (condition?.after ?? '0 (all events)'));
|
|
242
|
+
console.log('');
|
|
243
|
+
console.log('🔍 Query conditions you checked:');
|
|
244
|
+
condition?.failIfEventsMatch.forEach((c) => {
|
|
245
|
+
if (isConstrainedCondition(c)) {
|
|
246
|
+
console.log(` • ${c.type} where ${c.key}="${c.value}"`);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
console.log(` • ${c.type} (all)`);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
console.log('');
|
|
253
|
+
console.log('⚡ Events written SINCE your read (that match your query):');
|
|
254
|
+
result.conflicting.forEach(e => {
|
|
255
|
+
console.log(` • Event #${e.position}: ${e.type}`);
|
|
256
|
+
console.log(` Data: ${JSON.stringify(e.data)}`);
|
|
257
|
+
});
|
|
258
|
+
console.log('');
|
|
259
|
+
console.log('💡 Why conflict?');
|
|
260
|
+
console.log(' These events match your query conditions!');
|
|
261
|
+
console.log(' Your decision was based on stale data.');
|
|
262
|
+
console.log('');
|
|
263
|
+
console.log('🔄 Solution: Use result.appendCondition to retry.');
|
|
264
|
+
console.log('═══════════════════════════════════════════');
|
|
265
|
+
console.log('');
|
|
266
|
+
const latestPosition = result.conflicting[result.conflicting.length - 1].position;
|
|
267
|
+
return {
|
|
268
|
+
conflict: true,
|
|
269
|
+
conflictingEvents: result.conflicting,
|
|
270
|
+
appendCondition: {
|
|
271
|
+
failIfEventsMatch: condition?.failIfEventsMatch ?? [],
|
|
272
|
+
after: latestPosition
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
console.log(`💾 STORED: Event(s) at position #${result.position}`);
|
|
273
277
|
// Build new appendCondition
|
|
274
278
|
const newConditions = this.buildConditionsFromEvents(events, condition);
|
|
275
|
-
console.log(`✅ SUCCESS: Append complete at position #${position}`);
|
|
279
|
+
console.log(`✅ SUCCESS: Append complete at position #${result.position}`);
|
|
276
280
|
return {
|
|
277
281
|
conflict: false,
|
|
278
|
-
position,
|
|
279
|
-
appendCondition: { failIfEventsMatch: newConditions, after: position },
|
|
282
|
+
position: result.position,
|
|
283
|
+
appendCondition: { failIfEventsMatch: newConditions, after: result.position },
|
|
280
284
|
};
|
|
281
285
|
}
|
|
282
286
|
/**
|
|
@@ -286,9 +290,11 @@ export class EventStore {
|
|
|
286
290
|
const conditions = new Map();
|
|
287
291
|
if (originalCondition !== null) {
|
|
288
292
|
for (const cond of originalCondition.failIfEventsMatch) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
293
|
+
const normalized = normalizeCondition(cond);
|
|
294
|
+
if (hasKeys(normalized)) {
|
|
295
|
+
const keysStr = normalized.keys.map(k => `${k.name}:${k.value}`).sort().join('|');
|
|
296
|
+
const dedupKey = `${normalized.type}:${keysStr}`;
|
|
297
|
+
conditions.set(dedupKey, normalized);
|
|
292
298
|
}
|
|
293
299
|
}
|
|
294
300
|
}
|
|
@@ -297,8 +303,8 @@ export class EventStore {
|
|
|
297
303
|
const extractedKeys = this.keyExtractor.extract(event);
|
|
298
304
|
for (const extracted of extractedKeys) {
|
|
299
305
|
const cond = { type: event.type, key: extracted.name, value: extracted.value };
|
|
300
|
-
const
|
|
301
|
-
conditions.set(
|
|
306
|
+
const dedupKey = `${cond.type}:${extracted.name}:${extracted.value}`;
|
|
307
|
+
conditions.set(dedupKey, cond);
|
|
302
308
|
}
|
|
303
309
|
}
|
|
304
310
|
return Array.from(conditions.values());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.browser.js","sourceRoot":"","sources":["../src/event-store.browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"event-store.browser.js","sourceRoot":"","sources":["../src/event-store.browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,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;AA2BtE,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,OAAO,EAAE,gBAAgB;IAYrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2C/B;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC;IAIjD;;;;;;;;;;;;;;;;;;OAkBG;IACG,IAAI,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAqB1E;;;;;;;;;;;;;;;;;;;OAmBG;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;IA2D5C;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAkCjC;;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"}
|
package/dist/event-store.js
CHANGED
|
@@ -5,7 +5,7 @@ import { randomUUID, createHash } from 'node:crypto';
|
|
|
5
5
|
import { KeyExtractor } from './config/extractor.js';
|
|
6
6
|
import { validateConfig } from './config/validator.js';
|
|
7
7
|
import { SqliteStorage } from './storage/sqlite.js';
|
|
8
|
-
import { QueryResult,
|
|
8
|
+
import { QueryResult, normalizeCondition, hasKeys, } from './types.js';
|
|
9
9
|
import { QueryBuilder } from './query-builder.js';
|
|
10
10
|
/**
|
|
11
11
|
* Recursively sort object keys for deterministic JSON
|
|
@@ -169,23 +169,7 @@ export class EventStore {
|
|
|
169
169
|
}
|
|
170
170
|
// Extract keys from all events
|
|
171
171
|
const keysPerEvent = events.map(event => this.keyExtractor.extract(event));
|
|
172
|
-
//
|
|
173
|
-
if (condition !== null) {
|
|
174
|
-
// If 'after' is undefined, check ALL events (position 0n)
|
|
175
|
-
// If 'after' is specified, check only events after that position
|
|
176
|
-
const checkFromPosition = condition.after ?? 0n;
|
|
177
|
-
const conflictingEvents = await this.storage.getEventsSince(condition.failIfEventsMatch, checkFromPosition);
|
|
178
|
-
if (conflictingEvents.length > 0) {
|
|
179
|
-
// Conflict detected — return delta
|
|
180
|
-
const latestPosition = conflictingEvents[conflictingEvents.length - 1].position;
|
|
181
|
-
return {
|
|
182
|
-
conflict: true,
|
|
183
|
-
conflictingEvents: conflictingEvents,
|
|
184
|
-
appendCondition: { failIfEventsMatch: condition.failIfEventsMatch, after: latestPosition },
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// No conflict — prepare events for storage
|
|
172
|
+
// Prepare events for storage
|
|
189
173
|
const now = new Date();
|
|
190
174
|
const eventsToStore = events.map(event => ({
|
|
191
175
|
id: randomUUID(),
|
|
@@ -194,14 +178,30 @@ export class EventStore {
|
|
|
194
178
|
metadata: event.metadata,
|
|
195
179
|
timestamp: now,
|
|
196
180
|
}));
|
|
197
|
-
//
|
|
198
|
-
const
|
|
199
|
-
|
|
181
|
+
// Build storage condition (if provided)
|
|
182
|
+
const storageCondition = condition !== null
|
|
183
|
+
? { failIfEventsMatch: condition.failIfEventsMatch, after: condition.after ?? 0n }
|
|
184
|
+
: null;
|
|
185
|
+
// Append with atomic conflict check
|
|
186
|
+
const result = await this.storage.appendWithCondition(eventsToStore, keysPerEvent, storageCondition);
|
|
187
|
+
// Check if conflict detected
|
|
188
|
+
if (result.conflicting) {
|
|
189
|
+
const latestPosition = result.conflicting[result.conflicting.length - 1].position;
|
|
190
|
+
return {
|
|
191
|
+
conflict: true,
|
|
192
|
+
conflictingEvents: result.conflicting,
|
|
193
|
+
appendCondition: {
|
|
194
|
+
failIfEventsMatch: condition?.failIfEventsMatch ?? [],
|
|
195
|
+
after: latestPosition
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Success - build new appendCondition
|
|
200
200
|
const newConditions = this.buildConditionsFromEvents(events, condition);
|
|
201
201
|
return {
|
|
202
202
|
conflict: false,
|
|
203
|
-
position,
|
|
204
|
-
appendCondition: { failIfEventsMatch: newConditions, after: position },
|
|
203
|
+
position: result.position,
|
|
204
|
+
appendCondition: { failIfEventsMatch: newConditions, after: result.position },
|
|
205
205
|
};
|
|
206
206
|
}
|
|
207
207
|
/**
|
|
@@ -210,22 +210,27 @@ export class EventStore {
|
|
|
210
210
|
*/
|
|
211
211
|
buildConditionsFromEvents(events, originalCondition) {
|
|
212
212
|
// Start with original conditions if provided
|
|
213
|
+
// Use a Map with a stable key to deduplicate
|
|
213
214
|
const conditions = new Map();
|
|
214
215
|
if (originalCondition !== null) {
|
|
215
216
|
for (const cond of originalCondition.failIfEventsMatch) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
const normalized = normalizeCondition(cond);
|
|
218
|
+
if (hasKeys(normalized)) {
|
|
219
|
+
// Build a dedup key from all keys
|
|
220
|
+
const keysStr = normalized.keys.map(k => `${k.name}:${k.value}`).sort().join('|');
|
|
221
|
+
const dedupKey = `${normalized.type}:${keysStr}`;
|
|
222
|
+
conditions.set(dedupKey, normalized);
|
|
219
223
|
}
|
|
220
224
|
}
|
|
221
225
|
}
|
|
222
226
|
// Add conditions from the newly appended events
|
|
227
|
+
// Each event generates one condition per extracted key (single-key conditions)
|
|
223
228
|
for (const event of events) {
|
|
224
229
|
const extractedKeys = this.keyExtractor.extract(event);
|
|
225
230
|
for (const extracted of extractedKeys) {
|
|
226
231
|
const cond = { type: event.type, key: extracted.name, value: extracted.value };
|
|
227
|
-
const
|
|
228
|
-
conditions.set(
|
|
232
|
+
const dedupKey = `${cond.type}:${extracted.name}:${extracted.value}`;
|
|
233
|
+
conditions.set(dedupKey, cond);
|
|
229
234
|
}
|
|
230
235
|
}
|
|
231
236
|
return Array.from(conditions.values());
|