@quereus/store 0.3.6 → 0.3.7

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.
Files changed (54) hide show
  1. package/README.md +2 -2
  2. package/dist/src/common/ddl-generator.d.ts +15 -0
  3. package/dist/src/common/ddl-generator.d.ts.map +1 -0
  4. package/dist/src/common/ddl-generator.js +131 -0
  5. package/dist/src/common/ddl-generator.js.map +1 -0
  6. package/dist/src/common/encoding.d.ts +65 -0
  7. package/dist/src/common/encoding.d.ts.map +1 -0
  8. package/dist/src/common/encoding.js +339 -0
  9. package/dist/src/common/encoding.js.map +1 -0
  10. package/dist/src/common/events.d.ts +119 -0
  11. package/dist/src/common/events.d.ts.map +1 -0
  12. package/dist/src/common/events.js +158 -0
  13. package/dist/src/common/events.js.map +1 -0
  14. package/dist/src/common/index.d.ts +15 -0
  15. package/dist/src/common/index.d.ts.map +1 -0
  16. package/dist/src/common/index.js +23 -0
  17. package/dist/src/common/index.js.map +1 -0
  18. package/dist/src/common/key-builder.d.ts +58 -0
  19. package/dist/src/common/key-builder.d.ts.map +1 -0
  20. package/dist/src/common/key-builder.js +130 -0
  21. package/dist/src/common/key-builder.js.map +1 -0
  22. package/dist/src/common/kv-store.d.ts +150 -0
  23. package/dist/src/common/kv-store.d.ts.map +1 -0
  24. package/dist/src/common/kv-store.js +6 -0
  25. package/dist/src/common/kv-store.js.map +1 -0
  26. package/dist/src/common/memory-store.d.ts +37 -0
  27. package/dist/src/common/memory-store.d.ts.map +1 -0
  28. package/dist/src/common/memory-store.js +146 -0
  29. package/dist/src/common/memory-store.js.map +1 -0
  30. package/dist/src/common/serialization.d.ts +41 -0
  31. package/dist/src/common/serialization.d.ts.map +1 -0
  32. package/dist/src/common/serialization.js +111 -0
  33. package/dist/src/common/serialization.js.map +1 -0
  34. package/dist/src/common/store-connection.d.ts +34 -0
  35. package/dist/src/common/store-connection.d.ts.map +1 -0
  36. package/dist/src/common/store-connection.js +55 -0
  37. package/dist/src/common/store-connection.js.map +1 -0
  38. package/dist/src/common/store-module.d.ts +111 -0
  39. package/dist/src/common/store-module.d.ts.map +1 -0
  40. package/dist/src/common/store-module.js +331 -0
  41. package/dist/src/common/store-module.js.map +1 -0
  42. package/dist/src/common/store-table.d.ts +115 -0
  43. package/dist/src/common/store-table.d.ts.map +1 -0
  44. package/dist/src/common/store-table.js +472 -0
  45. package/dist/src/common/store-table.js.map +1 -0
  46. package/dist/src/common/transaction.d.ts +57 -0
  47. package/dist/src/common/transaction.d.ts.map +1 -0
  48. package/dist/src/common/transaction.js +156 -0
  49. package/dist/src/common/transaction.js.map +1 -0
  50. package/dist/src/index.d.ts +17 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +18 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/package.json +1 -1
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Transaction coordinator for virtual table modules.
3
+ *
4
+ * Manages a shared WriteBatch across all tables in a transaction,
5
+ * providing multi-table atomicity.
6
+ */
7
+ import { QuereusError, StatusCode } from '@quereus/quereus';
8
+ /**
9
+ * Coordinates transactions across multiple tables.
10
+ *
11
+ * All mutations within a transaction are buffered in a shared WriteBatch.
12
+ * On commit, the batch is written atomically and events are fired.
13
+ * On rollback, the batch and events are discarded.
14
+ */
15
+ export class TransactionCoordinator {
16
+ store;
17
+ eventEmitter;
18
+ // Transaction state
19
+ inTransaction = false;
20
+ pendingOps = [];
21
+ pendingEvents = [];
22
+ savepoints = new Map();
23
+ callbacks = [];
24
+ constructor(store, eventEmitter) {
25
+ this.store = store;
26
+ this.eventEmitter = eventEmitter;
27
+ }
28
+ /** Register callbacks for transaction lifecycle events. */
29
+ registerCallbacks(callbacks) {
30
+ this.callbacks.push(callbacks);
31
+ }
32
+ /** Check if a transaction is active. */
33
+ isInTransaction() {
34
+ return this.inTransaction;
35
+ }
36
+ /** Begin a transaction. */
37
+ begin() {
38
+ if (this.inTransaction) {
39
+ // Already in transaction - no-op (matches SQLite semantics)
40
+ return;
41
+ }
42
+ this.inTransaction = true;
43
+ this.pendingOps = [];
44
+ this.pendingEvents = [];
45
+ this.savepoints.clear();
46
+ }
47
+ /** Queue a put operation. */
48
+ put(key, value) {
49
+ if (!this.inTransaction) {
50
+ throw new QuereusError('Cannot queue operation outside transaction', StatusCode.MISUSE);
51
+ }
52
+ this.pendingOps.push({ type: 'put', key, value });
53
+ }
54
+ /** Queue a delete operation. */
55
+ delete(key) {
56
+ if (!this.inTransaction) {
57
+ throw new QuereusError('Cannot queue operation outside transaction', StatusCode.MISUSE);
58
+ }
59
+ this.pendingOps.push({ type: 'delete', key });
60
+ }
61
+ /** Queue a data change event (fired on commit). */
62
+ queueEvent(event) {
63
+ if (!this.inTransaction) {
64
+ // If not in transaction, emit immediately
65
+ this.eventEmitter?.emitDataChange(event);
66
+ return;
67
+ }
68
+ this.pendingEvents.push(event);
69
+ }
70
+ /** Commit the transaction. */
71
+ async commit() {
72
+ if (!this.inTransaction) {
73
+ return;
74
+ }
75
+ try {
76
+ // Write all pending operations atomically
77
+ if (this.pendingOps.length > 0) {
78
+ const batch = this.store.batch();
79
+ for (const op of this.pendingOps) {
80
+ if (op.type === 'put') {
81
+ batch.put(op.key, op.value);
82
+ }
83
+ else {
84
+ batch.delete(op.key);
85
+ }
86
+ }
87
+ await batch.write();
88
+ }
89
+ // Fire all pending events
90
+ for (const event of this.pendingEvents) {
91
+ this.eventEmitter?.emitDataChange(event);
92
+ }
93
+ // Notify callbacks
94
+ for (const cb of this.callbacks) {
95
+ cb.onCommit();
96
+ }
97
+ }
98
+ finally {
99
+ this.clearTransaction();
100
+ }
101
+ }
102
+ /** Rollback the transaction. */
103
+ rollback() {
104
+ if (!this.inTransaction) {
105
+ return;
106
+ }
107
+ // Notify callbacks
108
+ for (const cb of this.callbacks) {
109
+ cb.onRollback();
110
+ }
111
+ this.clearTransaction();
112
+ }
113
+ /** Create a savepoint. */
114
+ createSavepoint(index) {
115
+ if (!this.inTransaction) {
116
+ // Start implicit transaction
117
+ this.begin();
118
+ }
119
+ this.savepoints.set(index, {
120
+ opIndex: this.pendingOps.length,
121
+ eventIndex: this.pendingEvents.length,
122
+ });
123
+ }
124
+ /** Release a savepoint (no-op, just removes from map). */
125
+ releaseSavepoint(index) {
126
+ this.savepoints.delete(index);
127
+ }
128
+ /** Rollback to a savepoint. */
129
+ rollbackToSavepoint(index) {
130
+ const savepoint = this.savepoints.get(index);
131
+ if (!savepoint) {
132
+ throw new QuereusError(`Savepoint ${index} not found`, StatusCode.NOTFOUND);
133
+ }
134
+ // Truncate operations and events back to savepoint
135
+ this.pendingOps = this.pendingOps.slice(0, savepoint.opIndex);
136
+ this.pendingEvents = this.pendingEvents.slice(0, savepoint.eventIndex);
137
+ // Remove this savepoint and any created after it
138
+ for (const [idx] of this.savepoints) {
139
+ if (idx >= index) {
140
+ this.savepoints.delete(idx);
141
+ }
142
+ }
143
+ }
144
+ /** Clear all transaction state. */
145
+ clearTransaction() {
146
+ this.inTransaction = false;
147
+ this.pendingOps = [];
148
+ this.pendingEvents = [];
149
+ this.savepoints.clear();
150
+ }
151
+ /** Get the underlying store for direct reads. */
152
+ getStore() {
153
+ return this.store;
154
+ }
155
+ }
156
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/common/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Abstract Store Module for Quereus
3
+ *
4
+ * Provides the generic StoreModule and KVStore abstractions for persistent storage.
5
+ * Concrete implementations (LevelDB, IndexedDB) are in separate plugin packages:
6
+ * - @quereus/plugin-leveldb (Node.js)
7
+ * - @quereus/plugin-indexeddb (Browser)
8
+ *
9
+ * Usage:
10
+ * import { StoreModule, type KVStoreProvider } from '@quereus/store';
11
+ *
12
+ * const provider: KVStoreProvider = createYourProvider();
13
+ * const module = new StoreModule(provider);
14
+ * db.registerVtabModule('store', module);
15
+ */
16
+ export * from './common/index.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Abstract Store Module for Quereus
3
+ *
4
+ * Provides the generic StoreModule and KVStore abstractions for persistent storage.
5
+ * Concrete implementations (LevelDB, IndexedDB) are in separate plugin packages:
6
+ * - @quereus/plugin-leveldb (Node.js)
7
+ * - @quereus/plugin-indexeddb (Browser)
8
+ *
9
+ * Usage:
10
+ * import { StoreModule, type KVStoreProvider } from '@quereus/store';
11
+ *
12
+ * const provider: KVStoreProvider = createYourProvider();
13
+ * const module = new StoreModule(provider);
14
+ * db.registerVtabModule('store', module);
15
+ */
16
+ // Export all common utilities and abstractions
17
+ export * from './common/index.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,+CAA+C;AAC/C,cAAc,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quereus/store",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "type": "module",
5
5
  "description": "Abstract key-value storage module for Quereus",
6
6
  "keywords": [