@quereus/plugin-indexeddb 0.2.2 → 0.2.3

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.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Cross-tab synchronization using BroadcastChannel API.
3
+ *
4
+ * Propagates DataChangeEvent across browser tabs sharing the same origin.
5
+ */
6
+ import type { StoreEventEmitter } from '@quereus/store';
7
+ /**
8
+ * Cross-tab synchronization for IndexedDB stores.
9
+ *
10
+ * Listens for local data changes and broadcasts them to other tabs.
11
+ * Receives broadcasts from other tabs and emits them locally.
12
+ */
13
+ export declare class CrossTabSync {
14
+ private channel;
15
+ private eventEmitter;
16
+ private databaseName;
17
+ private unsubscribe;
18
+ constructor(databaseName: string, eventEmitter: StoreEventEmitter);
19
+ /**
20
+ * Start cross-tab synchronization.
21
+ * Safe to call in non-browser environments (no-op).
22
+ */
23
+ start(): void;
24
+ /**
25
+ * Stop cross-tab synchronization and clean up resources.
26
+ */
27
+ stop(): void;
28
+ /**
29
+ * Broadcast a data change event to other tabs.
30
+ */
31
+ private broadcast;
32
+ /**
33
+ * Handle a message received from another tab.
34
+ */
35
+ private handleMessage;
36
+ }
37
+ //# sourceMappingURL=broadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/broadcast.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAazE;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAA6B;gBAEpC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB;IAKjE;;;OAGG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,aAAa;CActB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Cross-tab synchronization using BroadcastChannel API.
3
+ *
4
+ * Propagates DataChangeEvent across browser tabs sharing the same origin.
5
+ */
6
+ /** Channel name prefix for Quereus store broadcasts. */
7
+ const CHANNEL_PREFIX = 'quereus-store:';
8
+ /**
9
+ * Cross-tab synchronization for IndexedDB stores.
10
+ *
11
+ * Listens for local data changes and broadcasts them to other tabs.
12
+ * Receives broadcasts from other tabs and emits them locally.
13
+ */
14
+ export class CrossTabSync {
15
+ channel = null;
16
+ eventEmitter;
17
+ databaseName;
18
+ unsubscribe = null;
19
+ constructor(databaseName, eventEmitter) {
20
+ this.databaseName = databaseName;
21
+ this.eventEmitter = eventEmitter;
22
+ }
23
+ /**
24
+ * Start cross-tab synchronization.
25
+ * Safe to call in non-browser environments (no-op).
26
+ */
27
+ start() {
28
+ // Check if BroadcastChannel is available (browser environment)
29
+ if (typeof BroadcastChannel === 'undefined') {
30
+ return;
31
+ }
32
+ const channelName = `${CHANNEL_PREFIX}${this.databaseName}`;
33
+ this.channel = new BroadcastChannel(channelName);
34
+ // Listen for messages from other tabs
35
+ this.channel.onmessage = (event) => {
36
+ this.handleMessage(event.data);
37
+ };
38
+ // Subscribe to local data changes to broadcast them
39
+ this.unsubscribe = this.eventEmitter.onDataChange((event) => {
40
+ // Don't re-broadcast events that came from other tabs
41
+ if (event.remote) {
42
+ return;
43
+ }
44
+ this.broadcast(event);
45
+ });
46
+ }
47
+ /**
48
+ * Stop cross-tab synchronization and clean up resources.
49
+ */
50
+ stop() {
51
+ if (this.unsubscribe) {
52
+ this.unsubscribe();
53
+ this.unsubscribe = null;
54
+ }
55
+ if (this.channel) {
56
+ this.channel.close();
57
+ this.channel = null;
58
+ }
59
+ }
60
+ /**
61
+ * Broadcast a data change event to other tabs.
62
+ */
63
+ broadcast(event) {
64
+ if (!this.channel) {
65
+ return;
66
+ }
67
+ const message = {
68
+ type: 'data-change',
69
+ event: { ...event },
70
+ };
71
+ try {
72
+ this.channel.postMessage(message);
73
+ }
74
+ catch (e) {
75
+ // Serialization errors (e.g., if Row contains non-cloneable data)
76
+ console.warn('Failed to broadcast data change:', e);
77
+ }
78
+ }
79
+ /**
80
+ * Handle a message received from another tab.
81
+ */
82
+ handleMessage(message) {
83
+ if (message.type !== 'data-change') {
84
+ return;
85
+ }
86
+ // Mark as remote to prevent re-broadcast
87
+ const remoteEvent = {
88
+ ...message.event,
89
+ remote: true,
90
+ };
91
+ // Emit locally so listeners are notified
92
+ this.eventEmitter.emitDataChange(remoteEvent);
93
+ }
94
+ }
95
+ //# sourceMappingURL=broadcast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/broadcast.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wDAAwD;AACxD,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAUxC;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACf,OAAO,GAA4B,IAAI,CAAC;IACxC,YAAY,CAAoB;IAChC,YAAY,CAAS;IACrB,WAAW,GAAwB,IAAI,CAAC;IAEhD,YAAY,YAAoB,EAAE,YAA+B;QAC/D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,+DAA+D;QAC/D,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAEjD,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,KAAqC,EAAE,EAAE;YACjE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,oDAAoD;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1D,sDAAsD;YACtD,IAAK,KAAgD,CAAC,MAAM,EAAE,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAsB;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;SACpB,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,kEAAkE;YAClE,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAyB;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,MAAM,WAAW,GAA0C;YACzD,GAAG,OAAO,CAAC,KAAK;YAChB,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,yCAAyC;QACzC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * IndexedDB storage plugin for Quereus.
3
+ *
4
+ * Provides IndexedDB-based persistent storage for browser environments.
5
+ *
6
+ * @example Using as a plugin (recommended)
7
+ * ```typescript
8
+ * import { Database, registerPlugin } from '@quereus/quereus';
9
+ * import indexeddbPlugin from '@quereus/plugin-indexeddb/plugin';
10
+ *
11
+ * const db = new Database();
12
+ * await registerPlugin(db, indexeddbPlugin, { prefix: 'myapp' });
13
+ *
14
+ * await db.exec(`
15
+ * create table users (id integer primary key, name text)
16
+ * using store
17
+ * `);
18
+ * ```
19
+ *
20
+ * @example Using the provider directly
21
+ * ```typescript
22
+ * import { createIndexedDBProvider } from '@quereus/plugin-indexeddb';
23
+ * import { StoreModule } from '@quereus/store';
24
+ *
25
+ * const provider = createIndexedDBProvider({ prefix: 'myapp' });
26
+ * const storeModule = new StoreModule(provider);
27
+ * db.registerVtabModule('store', storeModule);
28
+ * ```
29
+ */
30
+ export { IndexedDBStore, MultiStoreWriteBatch, type IndexedDBStoreOptions } from './store.js';
31
+ export { IndexedDBManager } from './manager.js';
32
+ export { IndexedDBProvider, createIndexedDBProvider, type IndexedDBProviderOptions } from './provider.js';
33
+ export { CrossTabSync } from './broadcast.js';
34
+ export { default as plugin, type IndexedDBPluginConfig } from './plugin.js';
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * IndexedDB storage plugin for Quereus.
3
+ *
4
+ * Provides IndexedDB-based persistent storage for browser environments.
5
+ *
6
+ * @example Using as a plugin (recommended)
7
+ * ```typescript
8
+ * import { Database, registerPlugin } from '@quereus/quereus';
9
+ * import indexeddbPlugin from '@quereus/plugin-indexeddb/plugin';
10
+ *
11
+ * const db = new Database();
12
+ * await registerPlugin(db, indexeddbPlugin, { prefix: 'myapp' });
13
+ *
14
+ * await db.exec(`
15
+ * create table users (id integer primary key, name text)
16
+ * using store
17
+ * `);
18
+ * ```
19
+ *
20
+ * @example Using the provider directly
21
+ * ```typescript
22
+ * import { createIndexedDBProvider } from '@quereus/plugin-indexeddb';
23
+ * import { StoreModule } from '@quereus/store';
24
+ *
25
+ * const provider = createIndexedDBProvider({ prefix: 'myapp' });
26
+ * const storeModule = new StoreModule(provider);
27
+ * db.registerVtabModule('store', storeModule);
28
+ * ```
29
+ */
30
+ export { IndexedDBStore, MultiStoreWriteBatch } from './store.js';
31
+ export { IndexedDBManager } from './manager.js';
32
+ export { IndexedDBProvider, createIndexedDBProvider } from './provider.js';
33
+ export { CrossTabSync } from './broadcast.js';
34
+ export { default as plugin } from './plugin.js';
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAA8B,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAiC,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAA8B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Unified IndexedDB Database Manager.
3
+ *
4
+ * Manages a single IndexedDB database with multiple object stores (one per table).
5
+ * This enables cross-table atomic transactions using native IDB transaction support.
6
+ *
7
+ * Architecture:
8
+ * - Single IDB database per prefix (e.g., 'quereus')
9
+ * - One object store per table (e.g., 'main.users', 'main.orders')
10
+ * - One '__catalog__' object store for DDL metadata
11
+ * - Native cross-table transactions for atomicity
12
+ */
13
+ /**
14
+ * Singleton manager for a unified IndexedDB database.
15
+ * All tables share this database with separate object stores.
16
+ */
17
+ export declare class IndexedDBManager {
18
+ private static instances;
19
+ private dbName;
20
+ private db;
21
+ private dbVersion;
22
+ private objectStores;
23
+ private openPromise;
24
+ private closed;
25
+ private constructor();
26
+ /**
27
+ * Get or create the singleton manager instance for a database name.
28
+ */
29
+ static getInstance(dbName: string): IndexedDBManager;
30
+ /**
31
+ * Reset a singleton instance (for testing purposes).
32
+ */
33
+ static resetInstance(dbName: string): void;
34
+ /**
35
+ * Get the list of object store names in the database.
36
+ */
37
+ getObjectStoreNames(): string[];
38
+ /**
39
+ * Ensure the database is open and has the required object stores.
40
+ */
41
+ ensureOpen(): Promise<IDBDatabase>;
42
+ private doOpen;
43
+ private getExistingDatabaseInfo;
44
+ private openDatabase;
45
+ /**
46
+ * Ensure an object store exists for a table.
47
+ * Creates the store via database version upgrade if needed.
48
+ */
49
+ ensureObjectStore(storeName: string): Promise<void>;
50
+ /**
51
+ * Delete an object store (table).
52
+ */
53
+ deleteObjectStore(storeName: string): Promise<void>;
54
+ /**
55
+ * Check if an object store exists.
56
+ */
57
+ hasObjectStore(storeName: string): boolean;
58
+ /**
59
+ * Get the underlying IDBDatabase for direct transaction creation.
60
+ */
61
+ getDatabase(): IDBDatabase | null;
62
+ /**
63
+ * Get the catalog store name.
64
+ */
65
+ getCatalogStoreName(): string;
66
+ /**
67
+ * Create a read-write transaction spanning multiple object stores.
68
+ * This enables atomic cross-table operations.
69
+ */
70
+ createTransaction(storeNames: string[], mode?: IDBTransactionMode): IDBTransaction;
71
+ /**
72
+ * Close the database and clean up.
73
+ */
74
+ close(): Promise<void>;
75
+ /**
76
+ * Delete the entire database (for testing or reset).
77
+ */
78
+ static deleteDatabase(dbName: string): Promise<void>;
79
+ }
80
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAA4C;IAEpE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB;IASpD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;YAqB1B,MAAM;YAaN,uBAAuB;YAoBvB,YAAY;IAwC1B;;;OAGG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDzD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CzD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACH,WAAW,IAAI,WAAW,GAAG,IAAI;IAIjC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,kBAAgC,GAAG,cAAc;IAO/F;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;WACU,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAY3D"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Unified IndexedDB Database Manager.
3
+ *
4
+ * Manages a single IndexedDB database with multiple object stores (one per table).
5
+ * This enables cross-table atomic transactions using native IDB transaction support.
6
+ *
7
+ * Architecture:
8
+ * - Single IDB database per prefix (e.g., 'quereus')
9
+ * - One object store per table (e.g., 'main.users', 'main.orders')
10
+ * - One '__catalog__' object store for DDL metadata
11
+ * - Native cross-table transactions for atomicity
12
+ */
13
+ /** Reserved object store for catalog/DDL metadata. */
14
+ const CATALOG_STORE_NAME = '__catalog__';
15
+ /**
16
+ * Singleton manager for a unified IndexedDB database.
17
+ * All tables share this database with separate object stores.
18
+ */
19
+ export class IndexedDBManager {
20
+ static instances = new Map();
21
+ dbName;
22
+ db = null;
23
+ dbVersion = 1;
24
+ objectStores = new Set();
25
+ openPromise = null;
26
+ closed = false;
27
+ constructor(dbName) {
28
+ this.dbName = dbName;
29
+ }
30
+ /**
31
+ * Get or create the singleton manager instance for a database name.
32
+ */
33
+ static getInstance(dbName) {
34
+ let instance = this.instances.get(dbName);
35
+ if (!instance) {
36
+ instance = new IndexedDBManager(dbName);
37
+ this.instances.set(dbName, instance);
38
+ }
39
+ return instance;
40
+ }
41
+ /**
42
+ * Reset a singleton instance (for testing purposes).
43
+ */
44
+ static resetInstance(dbName) {
45
+ this.instances.delete(dbName);
46
+ }
47
+ /**
48
+ * Get the list of object store names in the database.
49
+ */
50
+ getObjectStoreNames() {
51
+ return Array.from(this.objectStores);
52
+ }
53
+ /**
54
+ * Ensure the database is open and has the required object stores.
55
+ */
56
+ async ensureOpen() {
57
+ if (this.closed) {
58
+ throw new Error('IndexedDBManager is closed');
59
+ }
60
+ if (this.db) {
61
+ return this.db;
62
+ }
63
+ // Serialize opening to prevent race conditions
64
+ if (this.openPromise) {
65
+ await this.openPromise;
66
+ return this.db;
67
+ }
68
+ this.openPromise = this.doOpen();
69
+ await this.openPromise;
70
+ this.openPromise = null;
71
+ return this.db;
72
+ }
73
+ async doOpen() {
74
+ // First, try to open the existing database to get its version
75
+ const existingInfo = await this.getExistingDatabaseInfo();
76
+ if (existingInfo) {
77
+ this.dbVersion = existingInfo.version;
78
+ this.objectStores = existingInfo.objectStores;
79
+ }
80
+ // Open with the current version
81
+ this.db = await this.openDatabase(this.dbVersion);
82
+ }
83
+ async getExistingDatabaseInfo() {
84
+ return new Promise((resolve) => {
85
+ // Try to open without specifying version to get current state
86
+ const request = indexedDB.open(this.dbName);
87
+ request.onerror = () => resolve(null);
88
+ request.onsuccess = () => {
89
+ const db = request.result;
90
+ const stores = new Set();
91
+ for (let i = 0; i < db.objectStoreNames.length; i++) {
92
+ stores.add(db.objectStoreNames[i]);
93
+ }
94
+ const version = db.version;
95
+ db.close();
96
+ resolve({ version, objectStores: stores });
97
+ };
98
+ });
99
+ }
100
+ async openDatabase(version) {
101
+ return new Promise((resolve, reject) => {
102
+ const timeout = setTimeout(() => {
103
+ reject(new Error('IndexedDB open timed out after 10 seconds'));
104
+ }, 10000);
105
+ const request = indexedDB.open(this.dbName, version);
106
+ request.onerror = () => {
107
+ clearTimeout(timeout);
108
+ reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`));
109
+ };
110
+ request.onblocked = () => {
111
+ clearTimeout(timeout);
112
+ reject(new Error('IndexedDB is blocked by another connection'));
113
+ };
114
+ request.onupgradeneeded = (event) => {
115
+ const db = event.target.result;
116
+ // Ensure catalog store exists
117
+ if (!db.objectStoreNames.contains(CATALOG_STORE_NAME)) {
118
+ db.createObjectStore(CATALOG_STORE_NAME);
119
+ this.objectStores.add(CATALOG_STORE_NAME);
120
+ }
121
+ };
122
+ request.onsuccess = () => {
123
+ clearTimeout(timeout);
124
+ const db = request.result;
125
+ // Update objectStores from actual database
126
+ this.objectStores.clear();
127
+ for (let i = 0; i < db.objectStoreNames.length; i++) {
128
+ this.objectStores.add(db.objectStoreNames[i]);
129
+ }
130
+ resolve(db);
131
+ };
132
+ });
133
+ }
134
+ /**
135
+ * Ensure an object store exists for a table.
136
+ * Creates the store via database version upgrade if needed.
137
+ */
138
+ async ensureObjectStore(storeName) {
139
+ await this.ensureOpen();
140
+ if (this.objectStores.has(storeName)) {
141
+ return; // Already exists
142
+ }
143
+ // Close current connection and reopen with new version
144
+ this.db?.close();
145
+ this.db = null;
146
+ this.dbVersion++;
147
+ this.db = await new Promise((resolve, reject) => {
148
+ const timeout = setTimeout(() => {
149
+ reject(new Error('IndexedDB upgrade timed out'));
150
+ }, 10000);
151
+ const request = indexedDB.open(this.dbName, this.dbVersion);
152
+ request.onerror = () => {
153
+ clearTimeout(timeout);
154
+ reject(new Error(`Failed to upgrade IndexedDB: ${request.error?.message}`));
155
+ };
156
+ request.onblocked = () => {
157
+ clearTimeout(timeout);
158
+ reject(new Error('IndexedDB upgrade blocked'));
159
+ };
160
+ request.onupgradeneeded = (event) => {
161
+ const db = event.target.result;
162
+ if (!db.objectStoreNames.contains(storeName)) {
163
+ db.createObjectStore(storeName);
164
+ }
165
+ };
166
+ request.onsuccess = () => {
167
+ clearTimeout(timeout);
168
+ const db = request.result;
169
+ this.objectStores.clear();
170
+ for (let i = 0; i < db.objectStoreNames.length; i++) {
171
+ this.objectStores.add(db.objectStoreNames[i]);
172
+ }
173
+ resolve(db);
174
+ };
175
+ });
176
+ }
177
+ /**
178
+ * Delete an object store (table).
179
+ */
180
+ async deleteObjectStore(storeName) {
181
+ await this.ensureOpen();
182
+ if (!this.objectStores.has(storeName)) {
183
+ return; // Doesn't exist
184
+ }
185
+ // Close current connection and reopen with new version
186
+ this.db?.close();
187
+ this.db = null;
188
+ this.dbVersion++;
189
+ this.db = await new Promise((resolve, reject) => {
190
+ const timeout = setTimeout(() => {
191
+ reject(new Error('IndexedDB upgrade timed out'));
192
+ }, 10000);
193
+ const request = indexedDB.open(this.dbName, this.dbVersion);
194
+ request.onerror = () => {
195
+ clearTimeout(timeout);
196
+ reject(new Error(`Failed to upgrade IndexedDB: ${request.error?.message}`));
197
+ };
198
+ request.onupgradeneeded = (event) => {
199
+ const db = event.target.result;
200
+ if (db.objectStoreNames.contains(storeName)) {
201
+ db.deleteObjectStore(storeName);
202
+ }
203
+ };
204
+ request.onsuccess = () => {
205
+ clearTimeout(timeout);
206
+ const db = request.result;
207
+ this.objectStores.clear();
208
+ for (let i = 0; i < db.objectStoreNames.length; i++) {
209
+ this.objectStores.add(db.objectStoreNames[i]);
210
+ }
211
+ resolve(db);
212
+ };
213
+ });
214
+ }
215
+ /**
216
+ * Check if an object store exists.
217
+ */
218
+ hasObjectStore(storeName) {
219
+ return this.objectStores.has(storeName);
220
+ }
221
+ /**
222
+ * Get the underlying IDBDatabase for direct transaction creation.
223
+ */
224
+ getDatabase() {
225
+ return this.db;
226
+ }
227
+ /**
228
+ * Get the catalog store name.
229
+ */
230
+ getCatalogStoreName() {
231
+ return CATALOG_STORE_NAME;
232
+ }
233
+ /**
234
+ * Create a read-write transaction spanning multiple object stores.
235
+ * This enables atomic cross-table operations.
236
+ */
237
+ createTransaction(storeNames, mode = 'readwrite') {
238
+ if (!this.db) {
239
+ throw new Error('Database not open');
240
+ }
241
+ return this.db.transaction(storeNames, mode);
242
+ }
243
+ /**
244
+ * Close the database and clean up.
245
+ */
246
+ async close() {
247
+ if (this.db) {
248
+ this.db.close();
249
+ this.db = null;
250
+ }
251
+ this.closed = true;
252
+ IndexedDBManager.instances.delete(this.dbName);
253
+ }
254
+ /**
255
+ * Delete the entire database (for testing or reset).
256
+ */
257
+ static async deleteDatabase(dbName) {
258
+ const instance = this.instances.get(dbName);
259
+ if (instance) {
260
+ await instance.close();
261
+ }
262
+ return new Promise((resolve, reject) => {
263
+ const request = indexedDB.deleteDatabase(dbName);
264
+ request.onerror = () => reject(new Error('Failed to delete database'));
265
+ request.onsuccess = () => resolve();
266
+ });
267
+ }
268
+ }
269
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * IndexedDB plugin for Quereus.
3
+ *
4
+ * Registers a StoreModule backed by IndexedDB for browser environments.
5
+ */
6
+ import type { Database, SqlValue } from '@quereus/quereus';
7
+ import { StoreModule } from '@quereus/store';
8
+ /**
9
+ * Plugin configuration options.
10
+ */
11
+ export interface IndexedDBPluginConfig {
12
+ /**
13
+ * Name for the unified IndexedDB database.
14
+ * All tables share this single database with separate object stores.
15
+ * @default 'quereus'
16
+ */
17
+ databaseName?: string;
18
+ /**
19
+ * Module name to register. Tables are created with `USING <moduleName>`.
20
+ * @default 'store'
21
+ */
22
+ moduleName?: string;
23
+ }
24
+ /**
25
+ * Register the IndexedDB plugin with a database.
26
+ */
27
+ export default function register(_db: Database, config?: Record<string, SqlValue>): {
28
+ vtables: {
29
+ name: string;
30
+ module: StoreModule;
31
+ }[];
32
+ };
33
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,GAAG,EAAE,QAAQ,EACb,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM;;;;;EAmBtC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * IndexedDB plugin for Quereus.
3
+ *
4
+ * Registers a StoreModule backed by IndexedDB for browser environments.
5
+ */
6
+ import { StoreModule } from '@quereus/store';
7
+ import { IndexedDBProvider } from './provider.js';
8
+ /**
9
+ * Register the IndexedDB plugin with a database.
10
+ */
11
+ export default function register(_db, config = {}) {
12
+ const databaseName = config.databaseName ?? 'quereus';
13
+ const moduleName = config.moduleName ?? 'store';
14
+ const provider = new IndexedDBProvider({
15
+ databaseName,
16
+ });
17
+ const storeModule = new StoreModule(provider);
18
+ return {
19
+ vtables: [
20
+ {
21
+ name: moduleName,
22
+ module: storeModule,
23
+ },
24
+ ],
25
+ };
26
+ }
27
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAoBlD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,GAAa,EACb,SAAmC,EAAE;IAErC,MAAM,YAAY,GAAI,MAAM,CAAC,YAAuB,IAAI,SAAS,CAAC;IAClE,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,OAAO,CAAC;IAE5D,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;aACpB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * IndexedDB KVStore provider implementation.
3
+ *
4
+ * Uses a unified single-database architecture where all tables share one
5
+ * IndexedDB database with multiple object stores (one per table).
6
+ * This enables cross-table atomic transactions using native IDB transaction support.
7
+ */
8
+ import type { KVStore, KVStoreProvider } from '@quereus/store';
9
+ import { IndexedDBManager } from './manager.js';
10
+ /**
11
+ * Options for creating an IndexedDB provider.
12
+ */
13
+ export interface IndexedDBProviderOptions {
14
+ /**
15
+ * Name for the unified IndexedDB database.
16
+ * All tables share this single database with separate object stores.
17
+ * @default 'quereus'
18
+ */
19
+ databaseName?: string;
20
+ }
21
+ /**
22
+ * IndexedDB implementation of KVStoreProvider.
23
+ *
24
+ * Uses a unified single-database architecture where all tables share one
25
+ * IndexedDB database with multiple object stores (one per table).
26
+ */
27
+ export declare class IndexedDBProvider implements KVStoreProvider {
28
+ private databaseName;
29
+ private stores;
30
+ private catalogStore;
31
+ private manager;
32
+ constructor(options?: IndexedDBProviderOptions);
33
+ /**
34
+ * Get the object store name for a table.
35
+ */
36
+ private getStoreKey;
37
+ getStore(schemaName: string, tableName: string, _options?: Record<string, unknown>): Promise<KVStore>;
38
+ getCatalogStore(): Promise<KVStore>;
39
+ closeStore(schemaName: string, tableName: string): Promise<void>;
40
+ closeAll(): Promise<void>;
41
+ /**
42
+ * Get the underlying IndexedDB manager for advanced operations.
43
+ */
44
+ getManager(): IndexedDBManager;
45
+ }
46
+ /**
47
+ * Create an IndexedDB provider with the given options.
48
+ */
49
+ export declare function createIndexedDBProvider(options?: IndexedDBProviderOptions): IndexedDBProvider;
50
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,GAAE,wBAA6B;IAKlD;;OAEG;IACH,OAAO,CAAC,WAAW;IAIb,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAe/B;;OAEG;IACH,UAAU,IAAI,gBAAgB;CAG/B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,iBAAiB,CAE7F"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * IndexedDB KVStore provider implementation.
3
+ *
4
+ * Uses a unified single-database architecture where all tables share one
5
+ * IndexedDB database with multiple object stores (one per table).
6
+ * This enables cross-table atomic transactions using native IDB transaction support.
7
+ */
8
+ import { IndexedDBStore } from './store.js';
9
+ import { IndexedDBManager } from './manager.js';
10
+ /**
11
+ * IndexedDB implementation of KVStoreProvider.
12
+ *
13
+ * Uses a unified single-database architecture where all tables share one
14
+ * IndexedDB database with multiple object stores (one per table).
15
+ */
16
+ export class IndexedDBProvider {
17
+ databaseName;
18
+ stores = new Map();
19
+ catalogStore = null;
20
+ manager;
21
+ constructor(options = {}) {
22
+ this.databaseName = options.databaseName ?? 'quereus';
23
+ this.manager = IndexedDBManager.getInstance(this.databaseName);
24
+ }
25
+ /**
26
+ * Get the object store name for a table.
27
+ */
28
+ getStoreKey(schemaName, tableName) {
29
+ return `${schemaName}.${tableName}`.toLowerCase();
30
+ }
31
+ async getStore(schemaName, tableName, _options) {
32
+ const key = this.getStoreKey(schemaName, tableName);
33
+ let store = this.stores.get(key);
34
+ if (!store) {
35
+ store = await IndexedDBStore.openForTable(this.databaseName, key);
36
+ this.stores.set(key, store);
37
+ }
38
+ return store;
39
+ }
40
+ async getCatalogStore() {
41
+ if (!this.catalogStore) {
42
+ this.catalogStore = await IndexedDBStore.openForTable(this.databaseName, this.manager.getCatalogStoreName());
43
+ }
44
+ return this.catalogStore;
45
+ }
46
+ async closeStore(schemaName, tableName) {
47
+ const key = this.getStoreKey(schemaName, tableName);
48
+ const store = this.stores.get(key);
49
+ if (store) {
50
+ await store.close();
51
+ this.stores.delete(key);
52
+ }
53
+ }
54
+ async closeAll() {
55
+ for (const store of this.stores.values()) {
56
+ await store.close();
57
+ }
58
+ this.stores.clear();
59
+ if (this.catalogStore) {
60
+ await this.catalogStore.close();
61
+ this.catalogStore = null;
62
+ }
63
+ // Close the shared database manager
64
+ await this.manager.close();
65
+ }
66
+ /**
67
+ * Get the underlying IndexedDB manager for advanced operations.
68
+ */
69
+ getManager() {
70
+ return this.manager;
71
+ }
72
+ }
73
+ /**
74
+ * Create an IndexedDB provider with the given options.
75
+ */
76
+ export function createIndexedDBProvider(options) {
77
+ return new IndexedDBProvider(options);
78
+ }
79
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAchD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACpB,YAAY,CAAS;IACrB,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,YAAY,GAA0B,IAAI,CAAC;IAC3C,OAAO,CAAmB;IAElC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,UAAkB,EAAE,SAAiB;QACvD,OAAO,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,SAAiB,EAAE,QAAkC;QACtF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,MAAM,cAAc,CAAC,YAAY,CACnD,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CACnC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,SAAiB;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,oCAAoC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * IndexedDB-based KVStore implementation for browsers.
3
+ *
4
+ * Uses a unified single-database architecture where all tables share one
5
+ * IndexedDB database with multiple object stores (one per table).
6
+ * This enables cross-table atomic transactions using native IDB transaction support.
7
+ */
8
+ import type { KVStore, KVEntry, WriteBatch, IterateOptions, KVStoreOptions } from '@quereus/store';
9
+ import { IndexedDBManager } from './manager.js';
10
+ /**
11
+ * Extended options for IndexedDB store.
12
+ */
13
+ export interface IndexedDBStoreOptions extends KVStoreOptions {
14
+ /** Object store name within the database. */
15
+ storeName?: string;
16
+ }
17
+ /**
18
+ * KVStore implementation that uses an object store within a unified IndexedDB database.
19
+ * All tables share this database with separate object stores.
20
+ */
21
+ export declare class IndexedDBStore implements KVStore {
22
+ private manager;
23
+ private storeName;
24
+ private closed;
25
+ private constructor();
26
+ /**
27
+ * Open or create a store within the unified database.
28
+ */
29
+ static open(options: KVStoreOptions): Promise<IndexedDBStore>;
30
+ /**
31
+ * Create a store for a specific table within the unified database.
32
+ */
33
+ static openForTable(dbName: string, tableKey: string): Promise<IndexedDBStore>;
34
+ /**
35
+ * Get the underlying manager for cross-table transactions.
36
+ */
37
+ getManager(): IndexedDBManager;
38
+ /**
39
+ * Get the object store name.
40
+ */
41
+ getStoreName(): string;
42
+ get(key: Uint8Array): Promise<Uint8Array | undefined>;
43
+ put(key: Uint8Array, value: Uint8Array): Promise<void>;
44
+ delete(key: Uint8Array): Promise<void>;
45
+ has(key: Uint8Array): Promise<boolean>;
46
+ iterate(options?: IterateOptions): AsyncIterable<KVEntry>;
47
+ private collectEntries;
48
+ private buildKeyRange;
49
+ batch(): WriteBatch;
50
+ approximateCount(options?: IterateOptions): Promise<number>;
51
+ close(): Promise<void>;
52
+ private checkOpen;
53
+ }
54
+ /**
55
+ * Multi-store write batch for cross-table atomic transactions.
56
+ * Collects operations across multiple object stores and commits them atomically.
57
+ */
58
+ export declare class MultiStoreWriteBatch implements WriteBatch {
59
+ private manager;
60
+ private ops;
61
+ private storeNames;
62
+ constructor(manager: IndexedDBManager);
63
+ /**
64
+ * Queue a put operation for a specific store.
65
+ */
66
+ putToStore(storeName: string, key: Uint8Array, value: Uint8Array): void;
67
+ /**
68
+ * Queue a delete operation for a specific store.
69
+ */
70
+ deleteFromStore(storeName: string, key: Uint8Array): void;
71
+ put(_key: Uint8Array, _value: Uint8Array): void;
72
+ delete(_key: Uint8Array): void;
73
+ /**
74
+ * Write all operations atomically across all affected stores.
75
+ */
76
+ write(): Promise<void>;
77
+ clear(): void;
78
+ /**
79
+ * Get the store names involved in this batch.
80
+ */
81
+ getStoreNames(): string[];
82
+ }
83
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAWhD;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,OAAO;IAC5C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAKP;;OAEG;WACU,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAYnE;;OAEG;WACU,YAAY,CACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC;IAM1B;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,YAAY,IAAI,MAAM;IAIhB,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAerD,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC;YAQlD,cAAc;IA2B5B,OAAO,CAAC,aAAa;IAqBrB,KAAK,IAAI,UAAU;IAKb,gBAAgB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAa3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,OAAO,CAAC,SAAS;CAKlB;AAiDD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,UAAU;IACrD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,GAAG,CAA8F;IACzG,OAAO,CAAC,UAAU,CAA0B;gBAEhC,OAAO,EAAE,gBAAgB;IAIrC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAKvE;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IAMzD,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;CAG1B"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * IndexedDB-based KVStore implementation for browsers.
3
+ *
4
+ * Uses a unified single-database architecture where all tables share one
5
+ * IndexedDB database with multiple object stores (one per table).
6
+ * This enables cross-table atomic transactions using native IDB transaction support.
7
+ */
8
+ import { IndexedDBManager } from './manager.js';
9
+ /**
10
+ * Convert Uint8Array to ArrayBuffer for use as IDBValidKey.
11
+ */
12
+ function toKey(key) {
13
+ const copy = new ArrayBuffer(key.byteLength);
14
+ new Uint8Array(copy).set(key);
15
+ return copy;
16
+ }
17
+ /**
18
+ * KVStore implementation that uses an object store within a unified IndexedDB database.
19
+ * All tables share this database with separate object stores.
20
+ */
21
+ export class IndexedDBStore {
22
+ manager;
23
+ storeName;
24
+ closed = false;
25
+ constructor(manager, storeName) {
26
+ this.manager = manager;
27
+ this.storeName = storeName;
28
+ }
29
+ /**
30
+ * Open or create a store within the unified database.
31
+ */
32
+ static async open(options) {
33
+ const manager = IndexedDBManager.getInstance(options.path);
34
+ await manager.ensureOpen();
35
+ // storeName should come from the table key (e.g., 'main.users')
36
+ // For backwards compatibility, default to 'kv' for the catalog
37
+ const storeName = options.storeName || 'kv';
38
+ await manager.ensureObjectStore(storeName);
39
+ return new IndexedDBStore(manager, storeName);
40
+ }
41
+ /**
42
+ * Create a store for a specific table within the unified database.
43
+ */
44
+ static async openForTable(dbName, tableKey) {
45
+ const manager = IndexedDBManager.getInstance(dbName);
46
+ await manager.ensureObjectStore(tableKey);
47
+ return new IndexedDBStore(manager, tableKey);
48
+ }
49
+ /**
50
+ * Get the underlying manager for cross-table transactions.
51
+ */
52
+ getManager() {
53
+ return this.manager;
54
+ }
55
+ /**
56
+ * Get the object store name.
57
+ */
58
+ getStoreName() {
59
+ return this.storeName;
60
+ }
61
+ async get(key) {
62
+ this.checkOpen();
63
+ const db = await this.manager.ensureOpen();
64
+ return new Promise((resolve, reject) => {
65
+ const tx = db.transaction(this.storeName, 'readonly');
66
+ const store = tx.objectStore(this.storeName);
67
+ const request = store.get(toKey(key));
68
+ request.onerror = () => reject(request.error);
69
+ request.onsuccess = () => {
70
+ const result = request.result;
71
+ resolve(result === undefined ? undefined : new Uint8Array(result));
72
+ };
73
+ });
74
+ }
75
+ async put(key, value) {
76
+ this.checkOpen();
77
+ const db = await this.manager.ensureOpen();
78
+ return new Promise((resolve, reject) => {
79
+ const tx = db.transaction(this.storeName, 'readwrite');
80
+ const store = tx.objectStore(this.storeName);
81
+ store.put(value, toKey(key));
82
+ tx.onerror = () => reject(tx.error);
83
+ tx.oncomplete = () => resolve();
84
+ });
85
+ }
86
+ async delete(key) {
87
+ this.checkOpen();
88
+ const db = await this.manager.ensureOpen();
89
+ return new Promise((resolve, reject) => {
90
+ const tx = db.transaction(this.storeName, 'readwrite');
91
+ const store = tx.objectStore(this.storeName);
92
+ store.delete(toKey(key));
93
+ tx.onerror = () => reject(tx.error);
94
+ tx.oncomplete = () => resolve();
95
+ });
96
+ }
97
+ async has(key) {
98
+ this.checkOpen();
99
+ const db = await this.manager.ensureOpen();
100
+ return new Promise((resolve, reject) => {
101
+ const tx = db.transaction(this.storeName, 'readonly');
102
+ const store = tx.objectStore(this.storeName);
103
+ const request = store.count(toKey(key));
104
+ request.onerror = () => reject(request.error);
105
+ request.onsuccess = () => resolve(request.result > 0);
106
+ });
107
+ }
108
+ async *iterate(options) {
109
+ this.checkOpen();
110
+ const entries = await this.collectEntries(options);
111
+ for (const entry of entries) {
112
+ yield entry;
113
+ }
114
+ }
115
+ async collectEntries(options) {
116
+ const db = await this.manager.ensureOpen();
117
+ return new Promise((resolve, reject) => {
118
+ const tx = db.transaction(this.storeName, 'readonly');
119
+ const store = tx.objectStore(this.storeName);
120
+ const range = this.buildKeyRange(options);
121
+ const direction = options?.reverse ? 'prev' : 'next';
122
+ const request = store.openCursor(range, direction);
123
+ const entries = [];
124
+ const limit = options?.limit;
125
+ request.onerror = () => reject(request.error);
126
+ request.onsuccess = () => {
127
+ const cursor = request.result;
128
+ if (cursor && (limit === undefined || entries.length < limit)) {
129
+ entries.push({
130
+ key: new Uint8Array(cursor.key),
131
+ value: new Uint8Array(cursor.value),
132
+ });
133
+ cursor.continue();
134
+ }
135
+ else {
136
+ resolve(entries);
137
+ }
138
+ };
139
+ });
140
+ }
141
+ buildKeyRange(options) {
142
+ if (options?.gte && options?.lt) {
143
+ return IDBKeyRange.bound(toKey(options.gte), toKey(options.lt), false, true);
144
+ }
145
+ else if (options?.gte && options?.lte) {
146
+ return IDBKeyRange.bound(toKey(options.gte), toKey(options.lte), false, false);
147
+ }
148
+ else if (options?.gt && options?.lt) {
149
+ return IDBKeyRange.bound(toKey(options.gt), toKey(options.lt), true, true);
150
+ }
151
+ else if (options?.gt && options?.lte) {
152
+ return IDBKeyRange.bound(toKey(options.gt), toKey(options.lte), true, false);
153
+ }
154
+ else if (options?.gte) {
155
+ return IDBKeyRange.lowerBound(toKey(options.gte), false);
156
+ }
157
+ else if (options?.gt) {
158
+ return IDBKeyRange.lowerBound(toKey(options.gt), true);
159
+ }
160
+ else if (options?.lte) {
161
+ return IDBKeyRange.upperBound(toKey(options.lte), false);
162
+ }
163
+ else if (options?.lt) {
164
+ return IDBKeyRange.upperBound(toKey(options.lt), true);
165
+ }
166
+ return undefined;
167
+ }
168
+ batch() {
169
+ this.checkOpen();
170
+ return new IndexedDBWriteBatch(this.manager, this.storeName);
171
+ }
172
+ async approximateCount(options) {
173
+ this.checkOpen();
174
+ const db = await this.manager.ensureOpen();
175
+ return new Promise((resolve, reject) => {
176
+ const tx = db.transaction(this.storeName, 'readonly');
177
+ const store = tx.objectStore(this.storeName);
178
+ const range = this.buildKeyRange(options);
179
+ const request = store.count(range);
180
+ request.onerror = () => reject(request.error);
181
+ request.onsuccess = () => resolve(request.result);
182
+ });
183
+ }
184
+ async close() {
185
+ // Individual stores don't close the shared database
186
+ this.closed = true;
187
+ }
188
+ checkOpen() {
189
+ if (this.closed) {
190
+ throw new Error('Store is closed');
191
+ }
192
+ }
193
+ }
194
+ /**
195
+ * Write batch for unified database - can span multiple object stores.
196
+ */
197
+ class IndexedDBWriteBatch {
198
+ manager;
199
+ storeName;
200
+ ops = [];
201
+ constructor(manager, storeName) {
202
+ this.manager = manager;
203
+ this.storeName = storeName;
204
+ }
205
+ put(key, value) {
206
+ this.ops.push({ type: 'put', key, value });
207
+ }
208
+ delete(key) {
209
+ this.ops.push({ type: 'del', key });
210
+ }
211
+ async write() {
212
+ const db = this.manager.getDatabase();
213
+ if (!db) {
214
+ throw new Error('Database not open');
215
+ }
216
+ return new Promise((resolve, reject) => {
217
+ const tx = db.transaction(this.storeName, 'readwrite');
218
+ const store = tx.objectStore(this.storeName);
219
+ for (const op of this.ops) {
220
+ if (op.type === 'put' && op.value) {
221
+ store.put(op.value, toKey(op.key));
222
+ }
223
+ else if (op.type === 'del') {
224
+ store.delete(toKey(op.key));
225
+ }
226
+ }
227
+ tx.onerror = () => reject(tx.error);
228
+ tx.oncomplete = () => resolve();
229
+ });
230
+ }
231
+ clear() {
232
+ this.ops = [];
233
+ }
234
+ }
235
+ /**
236
+ * Multi-store write batch for cross-table atomic transactions.
237
+ * Collects operations across multiple object stores and commits them atomically.
238
+ */
239
+ export class MultiStoreWriteBatch {
240
+ manager;
241
+ ops = [];
242
+ storeNames = new Set();
243
+ constructor(manager) {
244
+ this.manager = manager;
245
+ }
246
+ /**
247
+ * Queue a put operation for a specific store.
248
+ */
249
+ putToStore(storeName, key, value) {
250
+ this.ops.push({ storeName, type: 'put', key, value });
251
+ this.storeNames.add(storeName);
252
+ }
253
+ /**
254
+ * Queue a delete operation for a specific store.
255
+ */
256
+ deleteFromStore(storeName, key) {
257
+ this.ops.push({ storeName, type: 'del', key });
258
+ this.storeNames.add(storeName);
259
+ }
260
+ // Standard WriteBatch interface - not useful for multi-store but required
261
+ put(_key, _value) {
262
+ throw new Error('Use putToStore() for MultiStoreWriteBatch');
263
+ }
264
+ delete(_key) {
265
+ throw new Error('Use deleteFromStore() for MultiStoreWriteBatch');
266
+ }
267
+ /**
268
+ * Write all operations atomically across all affected stores.
269
+ */
270
+ async write() {
271
+ const db = this.manager.getDatabase();
272
+ if (!db) {
273
+ throw new Error('Database not open');
274
+ }
275
+ if (this.ops.length === 0) {
276
+ return;
277
+ }
278
+ const storeNames = Array.from(this.storeNames);
279
+ return new Promise((resolve, reject) => {
280
+ const tx = db.transaction(storeNames, 'readwrite');
281
+ for (const op of this.ops) {
282
+ const store = tx.objectStore(op.storeName);
283
+ if (op.type === 'put' && op.value) {
284
+ store.put(op.value, toKey(op.key));
285
+ }
286
+ else if (op.type === 'del') {
287
+ store.delete(toKey(op.key));
288
+ }
289
+ }
290
+ tx.onerror = () => reject(tx.error);
291
+ tx.oncomplete = () => resolve();
292
+ });
293
+ }
294
+ clear() {
295
+ this.ops = [];
296
+ this.storeNames.clear();
297
+ }
298
+ /**
299
+ * Get the store names involved in this batch.
300
+ */
301
+ getStoreNames() {
302
+ return Array.from(this.storeNames);
303
+ }
304
+ }
305
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,SAAS,KAAK,CAAC,GAAe;IAC5B,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAUD;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,CAAmB;IAC1B,SAAS,CAAS;IAClB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAoB,OAAyB,EAAE,SAAiB;QAC9D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAuB;QACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAE3B,gEAAgE;QAChE,+DAA+D;QAC/D,MAAM,SAAS,GAAI,OAAiC,CAAC,SAAS,IAAI,IAAI,CAAC;QACvE,MAAM,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE3C,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,MAAc,EACd,QAAgB;QAEhB,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAe;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAe,EAAE,KAAiB;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAe;QAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAe;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CAAC,OAAwB;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAAwB;QACnD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACrD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,OAAO,GAAc,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;YAE7B,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,IAAI,MAAM,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;oBAC9D,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,GAAkB,CAAC;wBAC9C,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,KAAoB,CAAC;qBACnD,CAAC,CAAC;oBACH,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,OAAwB;QAC5C,IAAI,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAChC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACxC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;aAAM,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YACtC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAwB;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,oDAAoD;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,mBAAmB;IACf,OAAO,CAAmB;IAC1B,SAAS,CAAS;IAClB,GAAG,GAAwE,EAAE,CAAC;IAEtF,YAAY,OAAyB,EAAE,SAAiB;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAe,EAAE,KAAiB;QACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAe;QACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;oBAClC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,OAAO,CAAmB;IAC1B,GAAG,GAA2F,EAAE,CAAC;IACjG,UAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE5C,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB,EAAE,GAAe,EAAE,KAAiB;QAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB,EAAE,GAAe;QAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,GAAG,CAAC,IAAgB,EAAE,MAAkB;QACtC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAEnD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;oBAClC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quereus/plugin-indexeddb",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "description": "IndexedDB storage plugin for Quereus - browser persistent storage",
6
6
  "keywords": [