boundlessdb 0.1.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 +89 -0
- package/LICENSE +21 -0
- package/README.md +545 -0
- package/dist/better-sqlite3-shim.d.ts +12 -0
- package/dist/better-sqlite3-shim.d.ts.map +1 -0
- package/dist/better-sqlite3-shim.js +18 -0
- package/dist/better-sqlite3-shim.js.map +1 -0
- package/dist/browser.d.ts +14 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +14 -0
- package/dist/browser.js.map +1 -0
- package/dist/config/extractor.d.ts +22 -0
- package/dist/config/extractor.d.ts.map +1 -0
- package/dist/config/extractor.js +132 -0
- package/dist/config/extractor.js.map +1 -0
- package/dist/config/validator.d.ts +14 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +94 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/event-store.browser.d.ts +61 -0
- package/dist/event-store.browser.d.ts.map +1 -0
- package/dist/event-store.browser.js +323 -0
- package/dist/event-store.browser.js.map +1 -0
- package/dist/event-store.d.ts +101 -0
- package/dist/event-store.d.ts.map +1 -0
- package/dist/event-store.js +249 -0
- package/dist/event-store.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/query-builder.d.ts +72 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +84 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/storage/interface.d.ts +48 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +5 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/memory.d.ts +27 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +94 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/postgres.d.ts +76 -0
- package/dist/storage/postgres.d.ts.map +1 -0
- package/dist/storage/postgres.js +346 -0
- package/dist/storage/postgres.js.map +1 -0
- package/dist/storage/sqlite.d.ts +47 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +249 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/sqljs.d.ts +60 -0
- package/dist/storage/sqljs.d.ts.map +1 -0
- package/dist/storage/sqljs.js +354 -0
- package/dist/storage/sqljs.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +52 -0
- package/dist/types.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,323 @@
|
|
|
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, } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate UUID with fallback for environments without crypto.randomUUID
|
|
10
|
+
*/
|
|
11
|
+
function generateUUID() {
|
|
12
|
+
try {
|
|
13
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
14
|
+
return crypto.randomUUID();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
// crypto.randomUUID might throw in insecure contexts
|
|
19
|
+
}
|
|
20
|
+
// Fallback using crypto.getRandomValues if available
|
|
21
|
+
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
22
|
+
const arr = new Uint8Array(16);
|
|
23
|
+
crypto.getRandomValues(arr);
|
|
24
|
+
arr[6] = (arr[6] & 0x0f) | 0x40; // Version 4
|
|
25
|
+
arr[8] = (arr[8] & 0x3f) | 0x80; // Variant
|
|
26
|
+
const hex = Array.from(arr, b => b.toString(16).padStart(2, '0')).join('');
|
|
27
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
28
|
+
}
|
|
29
|
+
// Last resort fallback
|
|
30
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
31
|
+
const r = (Math.random() * 16) | 0;
|
|
32
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
33
|
+
return v.toString(16);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Recursively sort object keys for deterministic JSON
|
|
38
|
+
*/
|
|
39
|
+
function sortObjectKeys(obj) {
|
|
40
|
+
if (obj === null || typeof obj !== 'object') {
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(obj)) {
|
|
44
|
+
return obj.map(sortObjectKeys);
|
|
45
|
+
}
|
|
46
|
+
const sorted = {};
|
|
47
|
+
for (const key of Object.keys(obj).sort()) {
|
|
48
|
+
sorted[key] = sortObjectKeys(obj[key]);
|
|
49
|
+
}
|
|
50
|
+
return sorted;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Compute SHA256 hash of ConsistencyConfig (async for browser)
|
|
54
|
+
*/
|
|
55
|
+
async function hashConfig(config) {
|
|
56
|
+
const normalized = JSON.stringify(sortObjectKeys(config));
|
|
57
|
+
const encoder = new TextEncoder();
|
|
58
|
+
const data = encoder.encode(normalized);
|
|
59
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
60
|
+
const hashArray = new Uint8Array(hashBuffer);
|
|
61
|
+
return Array.from(hashArray)
|
|
62
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
63
|
+
.join('');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Browser-compatible DCB-native Event Store
|
|
67
|
+
*/
|
|
68
|
+
export class EventStore {
|
|
69
|
+
storage;
|
|
70
|
+
keyExtractor;
|
|
71
|
+
config;
|
|
72
|
+
initPromise = null;
|
|
73
|
+
constructor(options) {
|
|
74
|
+
// Validate configuration
|
|
75
|
+
validateConfig(options.consistency);
|
|
76
|
+
this.storage = options.storage;
|
|
77
|
+
this.config = options.consistency;
|
|
78
|
+
this.keyExtractor = new KeyExtractor(this.config);
|
|
79
|
+
console.log('🚀 INIT: Creating EventStore...');
|
|
80
|
+
console.log('⚙️ CONFIG: Consistency configuration loaded');
|
|
81
|
+
const eventTypes = Object.keys(this.config.eventTypes);
|
|
82
|
+
console.log(` Event types: ${eventTypes.join(', ')}`);
|
|
83
|
+
eventTypes.forEach(type => {
|
|
84
|
+
const keys = this.config.eventTypes[type].keys;
|
|
85
|
+
console.log(` ${type}: ${keys.map(k => k.name + ' ← ' + k.path).join(', ')}`);
|
|
86
|
+
});
|
|
87
|
+
// Start async initialization
|
|
88
|
+
this.initPromise = this.checkAndReindexIfNeeded();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Ensure the store is initialized (for async operations)
|
|
92
|
+
*/
|
|
93
|
+
async ensureInitialized() {
|
|
94
|
+
if (this.initPromise) {
|
|
95
|
+
await this.initPromise;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if config has changed since last run, reindex if needed
|
|
100
|
+
*/
|
|
101
|
+
async checkAndReindexIfNeeded() {
|
|
102
|
+
// Only works with SqlJsStorage (has metadata methods)
|
|
103
|
+
if (!(this.storage instanceof SqlJsStorage)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
// Ensure storage is fully initialized before accessing metadata
|
|
108
|
+
await this.storage.getAllEvents(); // This awaits the init promise
|
|
109
|
+
console.log('🔐 HASH: Computing config hash...');
|
|
110
|
+
const currentHash = await hashConfig(this.config);
|
|
111
|
+
if (!currentHash) {
|
|
112
|
+
console.warn('[EventStore] Failed to compute config hash');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(` Current config hash: ${currentHash.substring(0, 16)}...`);
|
|
116
|
+
const storedHash = await this.storage.getConfigHash();
|
|
117
|
+
console.log(` Stored config hash: ${storedHash ? storedHash.substring(0, 16) + '...' : '(none - first run)'}`);
|
|
118
|
+
if (storedHash === null) {
|
|
119
|
+
// First run — just store the hash
|
|
120
|
+
console.log('📝 HASH: First run, storing config hash in database');
|
|
121
|
+
await this.storage.setConfigHash(currentHash);
|
|
122
|
+
}
|
|
123
|
+
else if (storedHash !== currentHash) {
|
|
124
|
+
// Config changed — reindex!
|
|
125
|
+
console.log('⚠️ HASH MISMATCH: Config changed since last run!');
|
|
126
|
+
console.log('🔄 REINDEX: Rebuilding key index from all events...');
|
|
127
|
+
const startTime = Date.now();
|
|
128
|
+
let eventCount = 0;
|
|
129
|
+
let keyCount = 0;
|
|
130
|
+
await this.storage.reindex((event) => {
|
|
131
|
+
eventCount++;
|
|
132
|
+
// Convert StoredEvent to Event format for KeyExtractor
|
|
133
|
+
const keys = this.keyExtractor.extract({
|
|
134
|
+
type: event.type,
|
|
135
|
+
data: event.data,
|
|
136
|
+
metadata: event.metadata
|
|
137
|
+
});
|
|
138
|
+
keyCount += keys.length;
|
|
139
|
+
return keys;
|
|
140
|
+
});
|
|
141
|
+
// Update stored hash
|
|
142
|
+
await this.storage.setConfigHash(currentHash);
|
|
143
|
+
const duration = Date.now() - startTime;
|
|
144
|
+
console.log(`✅ REINDEX: Complete! ${eventCount} events, ${keyCount} keys extracted (${duration}ms)`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log('✅ HASH: Config unchanged, index is up to date');
|
|
148
|
+
}
|
|
149
|
+
console.log('🟢 READY: EventStore initialized');
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.warn('⚠️ INIT: Config hash check failed (non-fatal):', error);
|
|
153
|
+
console.log('🟢 READY: EventStore initialized (without hash check)');
|
|
154
|
+
// Don't throw - config hash is nice-to-have, not required
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Read events matching a query
|
|
159
|
+
*
|
|
160
|
+
* @typeParam E - Event union type for typed results
|
|
161
|
+
* @returns QueryResult with typed events and appendCondition
|
|
162
|
+
*/
|
|
163
|
+
async read(query) {
|
|
164
|
+
await this.ensureInitialized();
|
|
165
|
+
console.log('📖 READ: Querying events...');
|
|
166
|
+
console.log(' Conditions:', query.conditions.map(c => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ') || '(none)');
|
|
167
|
+
const events = await this.storage.query(query.conditions, query.fromPosition, query.limit);
|
|
168
|
+
console.log(` Found: ${events.length} events`);
|
|
169
|
+
// Get the position for the append condition
|
|
170
|
+
const position = events.length > 0
|
|
171
|
+
? events[events.length - 1].position
|
|
172
|
+
: await this.storage.getLatestPosition();
|
|
173
|
+
console.log(`📍 POSITION: #${position}`);
|
|
174
|
+
console.log(` Scope: ${query.conditions.length} condition(s)`);
|
|
175
|
+
return new QueryResult(events, position, query.conditions);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Append events with optional consistency check
|
|
179
|
+
*
|
|
180
|
+
* @typeParam E - Event type for type checking
|
|
181
|
+
* @param events Events to append
|
|
182
|
+
* @param condition Consistency check - can be:
|
|
183
|
+
* - null: Skip consistency check (optimistic first write)
|
|
184
|
+
* - AppendCondition: { position, conditions } from a previous read
|
|
185
|
+
* @returns AppendResult on success, ConflictResult on conflict
|
|
186
|
+
*/
|
|
187
|
+
async append(events, condition) {
|
|
188
|
+
await this.ensureInitialized();
|
|
189
|
+
console.log(`✏️ APPEND: ${events.length} event(s)`);
|
|
190
|
+
events.forEach(e => console.log(` → ${e.type}: ${JSON.stringify(e.data).substring(0, 60)}...`));
|
|
191
|
+
console.log(` Condition: ${condition ? 'AppendCondition' : 'null (no conflict check)'}`);
|
|
192
|
+
if (events.length === 0) {
|
|
193
|
+
const position = await this.storage.getLatestPosition();
|
|
194
|
+
return {
|
|
195
|
+
conflict: false,
|
|
196
|
+
position,
|
|
197
|
+
appendCondition: { position, conditions: condition?.conditions ?? [] },
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Extract keys from all events
|
|
201
|
+
const keysPerEvent = events.map(event => this.keyExtractor.extract(event));
|
|
202
|
+
console.log(`🔑 KEYS: Extracted from payload via config`);
|
|
203
|
+
keysPerEvent.forEach((keys, i) => {
|
|
204
|
+
console.log(` Event ${i}: ${keys.map(k => `${k.name}="${k.value}"`).join(', ')}`);
|
|
205
|
+
});
|
|
206
|
+
// Check for conflicts if condition provided
|
|
207
|
+
if (condition !== null) {
|
|
208
|
+
const conditionsStr = condition.conditions.map(c => isConstrainedCondition(c) ? `${c.type}[${c.key}=${c.value}]` : `${c.type}[*]`).join(', ');
|
|
209
|
+
console.log(`🔍 CONFLICT CHECK: Looking for events since position #${condition.position}`);
|
|
210
|
+
console.log(` Checking conditions: ${conditionsStr || '(none)'}`);
|
|
211
|
+
const conflictingEvents = await this.storage.getEventsSince(condition.conditions, condition.position);
|
|
212
|
+
console.log(` Result: ${conflictingEvents.length} matching event(s) found since #${condition.position}`);
|
|
213
|
+
if (conflictingEvents.length > 0) {
|
|
214
|
+
// Conflict detected
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log('❌ ═══════════════════════════════════════');
|
|
217
|
+
console.log(' CONFLICT DETECTED');
|
|
218
|
+
console.log('═══════════════════════════════════════════');
|
|
219
|
+
console.log('');
|
|
220
|
+
console.log('📍 Your position: #' + condition.position);
|
|
221
|
+
console.log('');
|
|
222
|
+
console.log('🔍 Query conditions you checked:');
|
|
223
|
+
condition.conditions.forEach(c => {
|
|
224
|
+
if (isConstrainedCondition(c)) {
|
|
225
|
+
console.log(` • ${c.type} where ${c.key}="${c.value}"`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(` • ${c.type} (all)`);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
console.log('');
|
|
232
|
+
console.log('⚡ Events written SINCE your read (that match your query):');
|
|
233
|
+
conflictingEvents.forEach(e => {
|
|
234
|
+
console.log(` • Event #${e.position}: ${e.type}`);
|
|
235
|
+
console.log(` Data: ${JSON.stringify(e.data)}`);
|
|
236
|
+
});
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log('💡 Why conflict?');
|
|
239
|
+
console.log(' These events match your query conditions!');
|
|
240
|
+
console.log(' Your decision was based on stale data.');
|
|
241
|
+
console.log('');
|
|
242
|
+
console.log('🔄 Solution: Use result.appendCondition to retry.');
|
|
243
|
+
console.log('═══════════════════════════════════════════');
|
|
244
|
+
console.log('');
|
|
245
|
+
const latestPosition = conflictingEvents[conflictingEvents.length - 1].position;
|
|
246
|
+
return {
|
|
247
|
+
conflict: true,
|
|
248
|
+
conflictingEvents: conflictingEvents,
|
|
249
|
+
appendCondition: { position: latestPosition, conditions: condition.conditions },
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// No conflict — prepare events for storage
|
|
254
|
+
const now = new Date();
|
|
255
|
+
const eventsToStore = events.map((event) => {
|
|
256
|
+
const id = generateUUID();
|
|
257
|
+
if (!id) {
|
|
258
|
+
throw new Error('Failed to generate event ID');
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
id,
|
|
262
|
+
type: event.type,
|
|
263
|
+
data: event.data,
|
|
264
|
+
metadata: event.metadata,
|
|
265
|
+
timestamp: now,
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
// Append atomically
|
|
269
|
+
const position = await this.storage.append(eventsToStore, keysPerEvent);
|
|
270
|
+
console.log(`💾 STORED: Event(s) at position #${position}`);
|
|
271
|
+
// Build new appendCondition
|
|
272
|
+
const newConditions = this.buildConditionsFromEvents(events, condition);
|
|
273
|
+
console.log(`✅ SUCCESS: Append complete at position #${position}`);
|
|
274
|
+
return {
|
|
275
|
+
conflict: false,
|
|
276
|
+
position,
|
|
277
|
+
appendCondition: { position, conditions: newConditions },
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Build conditions that cover the appended events
|
|
282
|
+
*/
|
|
283
|
+
buildConditionsFromEvents(events, originalCondition) {
|
|
284
|
+
const conditions = new Map();
|
|
285
|
+
if (originalCondition !== null) {
|
|
286
|
+
for (const cond of originalCondition.conditions) {
|
|
287
|
+
if (isConstrainedCondition(cond)) {
|
|
288
|
+
const key = `${cond.type}:${cond.key}:${cond.value}`;
|
|
289
|
+
conditions.set(key, cond);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Add conditions from the newly appended events
|
|
294
|
+
for (const event of events) {
|
|
295
|
+
const extractedKeys = this.keyExtractor.extract(event);
|
|
296
|
+
for (const extracted of extractedKeys) {
|
|
297
|
+
const cond = { type: event.type, key: extracted.name, value: extracted.value };
|
|
298
|
+
const key = `${cond.type}:${cond.key}:${cond.value}`;
|
|
299
|
+
conditions.set(key, cond);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return Array.from(conditions.values());
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get the underlying storage (for advanced use cases)
|
|
306
|
+
*/
|
|
307
|
+
getStorage() {
|
|
308
|
+
return this.storage;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Close the event store
|
|
312
|
+
*/
|
|
313
|
+
async close() {
|
|
314
|
+
await this.storage.close();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Factory function to create an event store
|
|
319
|
+
*/
|
|
320
|
+
export function createEventStore(options) {
|
|
321
|
+
return new EventStore(options);
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=event-store.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store.browser.js","sourceRoot":"","sources":["../src/event-store.browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main EventStore class
|
|
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
|
+
* DCB-native Event Store
|
|
12
|
+
*
|
|
13
|
+
* Implements Dynamic Consistency Boundaries for event sourcing.
|
|
14
|
+
* No cryptographic signing - tokens are Base64 encoded for convenience.
|
|
15
|
+
*/
|
|
16
|
+
export declare class EventStore {
|
|
17
|
+
private readonly storage;
|
|
18
|
+
private readonly keyExtractor;
|
|
19
|
+
private readonly config;
|
|
20
|
+
constructor(options: EventStoreConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Check if config has changed since last run, reindex if needed
|
|
23
|
+
*/
|
|
24
|
+
private checkAndReindexIfNeeded;
|
|
25
|
+
/**
|
|
26
|
+
* Create a fluent query builder.
|
|
27
|
+
*
|
|
28
|
+
* @typeParam E - Event union type for typed results
|
|
29
|
+
* @returns QueryBuilder for chaining
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const result = await store.query<CourseEvent>()
|
|
34
|
+
* .matchType('CourseCreated')
|
|
35
|
+
* .matchKey('StudentSubscribed', 'course', 'cs101')
|
|
36
|
+
* .fromPosition(100n)
|
|
37
|
+
* .limit(50)
|
|
38
|
+
* .read();
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
query<E extends Event = Event>(): QueryBuilder<E>;
|
|
42
|
+
/**
|
|
43
|
+
* Read events matching a query
|
|
44
|
+
*
|
|
45
|
+
* @typeParam E - Event union type for typed results
|
|
46
|
+
* @returns QueryResult with typed events and consistency token
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Typed read
|
|
51
|
+
* const result = await store.read<CartEvents>({
|
|
52
|
+
* conditions: [{ type: 'ProductItemAdded', key: 'cart', value: 'cart-123' }]
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* // Untyped read (all events of type)
|
|
56
|
+
* const result = await store.read({
|
|
57
|
+
* conditions: [{ type: 'ProductItemAdded' }]
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
read<E extends Event = Event>(query: Query): Promise<QueryResult<E>>;
|
|
62
|
+
/**
|
|
63
|
+
* Append events with optional consistency check
|
|
64
|
+
*
|
|
65
|
+
* @typeParam E - Event type for type checking
|
|
66
|
+
* @param events Events to append
|
|
67
|
+
* @param condition Consistency check - can be:
|
|
68
|
+
* - null: Skip consistency check (optimistic first write)
|
|
69
|
+
* - AppendCondition: { position, conditions } from a previous read
|
|
70
|
+
* @returns AppendResult on success, ConflictResult on conflict
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* // With appendCondition from read
|
|
75
|
+
* const result = await store.read<CartEvents>({ conditions: [...] });
|
|
76
|
+
* await store.append<CartEvents>([newEvent], result.appendCondition);
|
|
77
|
+
*
|
|
78
|
+
* // Without consistency check (first write)
|
|
79
|
+
* await store.append<CartEvents>([newEvent], null);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
append<E extends Event = Event>(events: EventWithMetadata<E>[], condition: AppendCondition | null): Promise<AppendResult | ConflictResult<E>>;
|
|
83
|
+
/**
|
|
84
|
+
* Build conditions that cover the appended events
|
|
85
|
+
* Used to create the appendCondition returned after append
|
|
86
|
+
*/
|
|
87
|
+
private buildConditionsFromEvents;
|
|
88
|
+
/**
|
|
89
|
+
* Get the underlying storage (for advanced use cases)
|
|
90
|
+
*/
|
|
91
|
+
getStorage(): EventStorage;
|
|
92
|
+
/**
|
|
93
|
+
* Close the event store
|
|
94
|
+
*/
|
|
95
|
+
close(): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Factory function to create an event store
|
|
99
|
+
*/
|
|
100
|
+
export declare function createEventStore(options: EventStoreConfig): EventStore;
|
|
101
|
+
//# sourceMappingURL=event-store.d.ts.map
|
|
@@ -0,0 +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,EAEX,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EAGnB,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;IAwD5C;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA6BjC;;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"}
|