@quereus/plugin-indexeddb 0.6.0 → 1.0.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/README.md +14 -3
- package/dist/src/broadcast.d.ts +4 -1
- package/dist/src/broadcast.d.ts.map +1 -1
- package/dist/src/broadcast.js +14 -1
- package/dist/src/broadcast.js.map +1 -1
- package/dist/src/plugin.d.ts +6 -1
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +2 -0
- package/dist/src/plugin.js.map +1 -1
- package/dist/src/provider.d.ts +17 -0
- package/dist/src/provider.d.ts.map +1 -1
- package/dist/src/provider.js +32 -3
- package/dist/src/provider.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@ IndexedDB storage plugin for Quereus. Provides persistent storage for browser en
|
|
|
6
6
|
|
|
7
7
|
- **Browser-native**: Uses IndexedDB for reliable persistent storage
|
|
8
8
|
- **Transaction isolation**: Read-your-own-writes and snapshot isolation by default
|
|
9
|
-
- **
|
|
9
|
+
- **Read cache**: In-memory LRU cache reduces redundant IDB transactions (enabled by default)
|
|
10
|
+
- **Cross-tab sync**: BroadcastChannel-based synchronization across browser tabs, with automatic cache invalidation
|
|
10
11
|
- **Async iteration**: Efficient range queries with cursor-based iteration
|
|
11
12
|
|
|
12
13
|
## Installation
|
|
@@ -127,14 +128,24 @@ sync.close();
|
|
|
127
128
|
|
|
128
129
|
| Setting | Type | Default | Description |
|
|
129
130
|
|---------|------|---------|-------------|
|
|
130
|
-
| `
|
|
131
|
+
| `databaseName` | string | `'quereus'` | Name for the unified IndexedDB database |
|
|
131
132
|
| `moduleName` | string | `'store'` | Name to register the virtual table module under |
|
|
133
|
+
| `cache` | CacheOptions | `{ enabled: true, maxEntries: 1000 }` | Read cache configuration (see below) |
|
|
134
|
+
|
|
135
|
+
### Cache Options
|
|
136
|
+
|
|
137
|
+
| Option | Type | Default | Description |
|
|
138
|
+
|--------|------|---------|-------------|
|
|
139
|
+
| `maxEntries` | number | `1000` | Maximum cached entries per store |
|
|
140
|
+
| `maxBytes` | number | — | Maximum cached bytes per store (unlimited if omitted) |
|
|
141
|
+
| `enabled` | boolean | `true` | Set `false` to disable caching entirely |
|
|
132
142
|
|
|
133
143
|
### IndexedDBProvider Options
|
|
134
144
|
|
|
135
145
|
| Option | Type | Default | Description |
|
|
136
146
|
|--------|------|---------|-------------|
|
|
137
|
-
| `
|
|
147
|
+
| `databaseName` | string | `'quereus'` | Name for the unified IndexedDB database |
|
|
148
|
+
| `cache` | CacheOptions | — | Read cache configuration |
|
|
138
149
|
|
|
139
150
|
## Related Packages
|
|
140
151
|
|
package/dist/src/broadcast.d.ts
CHANGED
|
@@ -4,18 +4,21 @@
|
|
|
4
4
|
* Propagates DataChangeEvent across browser tabs sharing the same origin.
|
|
5
5
|
*/
|
|
6
6
|
import type { StoreEventEmitter } from '@quereus/store';
|
|
7
|
+
import type { IndexedDBProvider } from './provider.js';
|
|
7
8
|
/**
|
|
8
9
|
* Cross-tab synchronization for IndexedDB stores.
|
|
9
10
|
*
|
|
10
11
|
* Listens for local data changes and broadcasts them to other tabs.
|
|
11
12
|
* Receives broadcasts from other tabs and emits them locally.
|
|
13
|
+
* Invalidates read caches on remote data change events.
|
|
12
14
|
*/
|
|
13
15
|
export declare class CrossTabSync {
|
|
14
16
|
private channel;
|
|
15
17
|
private eventEmitter;
|
|
16
18
|
private databaseName;
|
|
17
19
|
private unsubscribe;
|
|
18
|
-
|
|
20
|
+
private provider;
|
|
21
|
+
constructor(databaseName: string, eventEmitter: StoreEventEmitter, provider?: IndexedDBProvider);
|
|
19
22
|
/**
|
|
20
23
|
* Start cross-tab synchronization.
|
|
21
24
|
* Safe to call in non-browser environments (no-op).
|
|
@@ -1 +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;
|
|
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;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAavD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,iBAAiB;IAM/F;;;OAGG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,aAAa;CAwBtB"}
|
package/dist/src/broadcast.js
CHANGED
|
@@ -10,15 +10,18 @@ const CHANNEL_PREFIX = 'quereus-store:';
|
|
|
10
10
|
*
|
|
11
11
|
* Listens for local data changes and broadcasts them to other tabs.
|
|
12
12
|
* Receives broadcasts from other tabs and emits them locally.
|
|
13
|
+
* Invalidates read caches on remote data change events.
|
|
13
14
|
*/
|
|
14
15
|
export class CrossTabSync {
|
|
15
16
|
channel = null;
|
|
16
17
|
eventEmitter;
|
|
17
18
|
databaseName;
|
|
18
19
|
unsubscribe = null;
|
|
19
|
-
|
|
20
|
+
provider = null;
|
|
21
|
+
constructor(databaseName, eventEmitter, provider) {
|
|
20
22
|
this.databaseName = databaseName;
|
|
21
23
|
this.eventEmitter = eventEmitter;
|
|
24
|
+
this.provider = provider ?? null;
|
|
22
25
|
}
|
|
23
26
|
/**
|
|
24
27
|
* Start cross-tab synchronization.
|
|
@@ -83,6 +86,16 @@ export class CrossTabSync {
|
|
|
83
86
|
if (message.type !== 'data-change') {
|
|
84
87
|
return;
|
|
85
88
|
}
|
|
89
|
+
// Invalidate read cache for the affected table
|
|
90
|
+
if (this.provider) {
|
|
91
|
+
const { schemaName, tableName } = message.event;
|
|
92
|
+
if (schemaName && tableName) {
|
|
93
|
+
this.provider.invalidateCache(schemaName, tableName);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.provider.invalidateAllCaches();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
86
99
|
// Mark as remote to prevent re-broadcast
|
|
87
100
|
const remoteEvent = {
|
|
88
101
|
...message.event,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/broadcast.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/broadcast.ts"],"names":[],"mappings":"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"}
|
package/dist/src/plugin.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Registers a StoreModule backed by IndexedDB for browser environments.
|
|
5
5
|
*/
|
|
6
6
|
import type { Database, SqlValue } from '@quereus/quereus';
|
|
7
|
-
import { StoreModule } from '@quereus/store';
|
|
7
|
+
import { StoreModule, type CacheOptions } from '@quereus/store';
|
|
8
8
|
/**
|
|
9
9
|
* Plugin configuration options.
|
|
10
10
|
*/
|
|
@@ -26,6 +26,11 @@ export interface IndexedDBPluginConfig {
|
|
|
26
26
|
* @default true
|
|
27
27
|
*/
|
|
28
28
|
isolation?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Read cache configuration for data and index stores.
|
|
31
|
+
* Wraps each store with an in-memory LRU cache to reduce IDB round-trips.
|
|
32
|
+
*/
|
|
33
|
+
cache?: CacheOptions;
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
36
|
* Register the IndexedDB plugin with a database.
|
package/dist/src/plugin.d.ts.map
CHANGED
|
@@ -1 +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,EAA6B,MAAM,gBAAgB,CAAC;
|
|
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,EAA6B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG3F;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC/B,GAAG,EAAE,QAAQ,EACb,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM;;;;;EAyBrC"}
|
package/dist/src/plugin.js
CHANGED
|
@@ -12,8 +12,10 @@ export default function register(_db, config = {}) {
|
|
|
12
12
|
const databaseName = config.databaseName ?? 'quereus';
|
|
13
13
|
const moduleName = config.moduleName ?? 'store';
|
|
14
14
|
const isolation = config.isolation ?? true;
|
|
15
|
+
const cache = config.cache;
|
|
15
16
|
const provider = new IndexedDBProvider({
|
|
16
17
|
databaseName,
|
|
18
|
+
cache,
|
|
17
19
|
});
|
|
18
20
|
const storeModule = isolation
|
|
19
21
|
? createIsolatedStoreModule({ provider })
|
package/dist/src/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAqB,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAiClD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC/B,GAAa,EACb,SAAmC,EAAE;IAErC,MAAM,YAAY,GAAI,MAAM,CAAC,YAAuB,IAAI,SAAS,CAAC;IAClE,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,OAAO,CAAC;IAC5D,MAAM,SAAS,GAAI,MAAM,CAAC,SAAqB,IAAI,IAAI,CAAC;IAExD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAuC,CAAC;IAE7D,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACtC,YAAY;QACZ,KAAK;KACL,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,SAAS;QAC5B,CAAC,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE7B,OAAO;QACN,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;aACnB;SACD;KACD,CAAC;AACH,CAAC"}
|
package/dist/src/provider.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* __catalog__ - Catalog store (DDL metadata)
|
|
13
13
|
*/
|
|
14
14
|
import type { KVStore, KVStoreProvider } from '@quereus/store';
|
|
15
|
+
import { type CacheOptions } from '@quereus/store';
|
|
15
16
|
import { IndexedDBManager } from './manager.js';
|
|
16
17
|
/**
|
|
17
18
|
* Options for creating an IndexedDB provider.
|
|
@@ -23,6 +24,11 @@ export interface IndexedDBProviderOptions {
|
|
|
23
24
|
* @default 'quereus'
|
|
24
25
|
*/
|
|
25
26
|
databaseName?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Read cache configuration.
|
|
29
|
+
* Wraps each data/index store with an in-memory LRU cache.
|
|
30
|
+
*/
|
|
31
|
+
cache?: CacheOptions;
|
|
26
32
|
}
|
|
27
33
|
/**
|
|
28
34
|
* IndexedDB implementation of KVStoreProvider.
|
|
@@ -36,6 +42,7 @@ export declare class IndexedDBProvider implements KVStoreProvider {
|
|
|
36
42
|
private catalogStore;
|
|
37
43
|
private statsStore;
|
|
38
44
|
private manager;
|
|
45
|
+
private cacheOptions;
|
|
39
46
|
constructor(options?: IndexedDBProviderOptions);
|
|
40
47
|
getStore(schemaName: string, tableName: string, _options?: Record<string, unknown>): Promise<KVStore>;
|
|
41
48
|
getIndexStore(schemaName: string, tableName: string, indexName: string): Promise<KVStore>;
|
|
@@ -50,6 +57,16 @@ export declare class IndexedDBProvider implements KVStoreProvider {
|
|
|
50
57
|
* Get the underlying IndexedDB manager for advanced operations.
|
|
51
58
|
*/
|
|
52
59
|
getManager(): IndexedDBManager;
|
|
60
|
+
/**
|
|
61
|
+
* Invalidate the read cache for a specific table's data and index stores.
|
|
62
|
+
* Called by cross-tab sync when remote data changes are detected.
|
|
63
|
+
*/
|
|
64
|
+
invalidateCache(schemaName: string, tableName: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Invalidate all read caches. Called on remote data change events
|
|
67
|
+
* when the affected store is unknown.
|
|
68
|
+
*/
|
|
69
|
+
invalidateAllCaches(): void;
|
|
53
70
|
private getOrCreateStore;
|
|
54
71
|
private closeStoreByName;
|
|
55
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAON,KAAK,YAAY,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACxD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,YAAY,CAA2B;gBAEnC,OAAO,GAAE,wBAA6B;IAM5C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzF,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxE,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzF,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7E;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAW5D;;;OAGG;IACH,mBAAmB,IAAI,IAAI;YAQb,gBAAgB;YAmBhB,gBAAgB;CAO9B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,iBAAiB,CAE7F"}
|
package/dist/src/provider.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* __stats__ - Unified stats store (row counts for all tables)
|
|
12
12
|
* __catalog__ - Catalog store (DDL metadata)
|
|
13
13
|
*/
|
|
14
|
-
import { buildDataStoreName, buildIndexStoreName, CATALOG_STORE_NAME, STATS_STORE_NAME, STORE_SUFFIX, } from '@quereus/store';
|
|
14
|
+
import { buildDataStoreName, buildIndexStoreName, CachedKVStore, CATALOG_STORE_NAME, STATS_STORE_NAME, STORE_SUFFIX, } from '@quereus/store';
|
|
15
15
|
import { IndexedDBStore } from './store.js';
|
|
16
16
|
import { IndexedDBManager } from './manager.js';
|
|
17
17
|
/**
|
|
@@ -26,9 +26,11 @@ export class IndexedDBProvider {
|
|
|
26
26
|
catalogStore = null;
|
|
27
27
|
statsStore = null;
|
|
28
28
|
manager;
|
|
29
|
+
cacheOptions;
|
|
29
30
|
constructor(options = {}) {
|
|
30
31
|
this.databaseName = options.databaseName ?? 'quereus';
|
|
31
32
|
this.manager = IndexedDBManager.getInstance(this.databaseName);
|
|
33
|
+
this.cacheOptions = options.cache;
|
|
32
34
|
}
|
|
33
35
|
async getStore(schemaName, tableName, _options) {
|
|
34
36
|
const storeName = buildDataStoreName(schemaName, tableName);
|
|
@@ -105,13 +107,40 @@ export class IndexedDBProvider {
|
|
|
105
107
|
getManager() {
|
|
106
108
|
return this.manager;
|
|
107
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Invalidate the read cache for a specific table's data and index stores.
|
|
112
|
+
* Called by cross-tab sync when remote data changes are detected.
|
|
113
|
+
*/
|
|
114
|
+
invalidateCache(schemaName, tableName) {
|
|
115
|
+
const dataStoreName = buildDataStoreName(schemaName, tableName);
|
|
116
|
+
const indexPrefix = `${dataStoreName}${STORE_SUFFIX.INDEX}`;
|
|
117
|
+
for (const [name, store] of this.stores) {
|
|
118
|
+
if ((name === dataStoreName || name.startsWith(indexPrefix)) && store instanceof CachedKVStore) {
|
|
119
|
+
store.invalidateAll();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Invalidate all read caches. Called on remote data change events
|
|
125
|
+
* when the affected store is unknown.
|
|
126
|
+
*/
|
|
127
|
+
invalidateAllCaches() {
|
|
128
|
+
for (const store of this.stores.values()) {
|
|
129
|
+
if (store instanceof CachedKVStore) {
|
|
130
|
+
store.invalidateAll();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
108
134
|
async getOrCreateStore(storeName) {
|
|
109
135
|
let store = this.stores.get(storeName);
|
|
110
136
|
if (!store) {
|
|
111
|
-
|
|
112
|
-
if (!
|
|
137
|
+
const raw = await IndexedDBStore.openForTable(this.databaseName, storeName);
|
|
138
|
+
if (!raw) {
|
|
113
139
|
throw new Error(`IndexedDBStore.openForTable returned null/undefined for ${storeName}`);
|
|
114
140
|
}
|
|
141
|
+
store = this.cacheOptions?.enabled === false
|
|
142
|
+
? raw
|
|
143
|
+
: new CachedKVStore(raw, this.cacheOptions);
|
|
115
144
|
this.stores.set(storeName, store);
|
|
116
145
|
}
|
|
117
146
|
return store;
|
package/dist/src/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GAEZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoBhD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACrB,YAAY,CAAS;IACrB,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IACpC,YAAY,GAA0B,IAAI,CAAC;IAC3C,UAAU,GAA0B,IAAI,CAAC;IACzC,OAAO,CAAmB;IAC1B,YAAY,CAA2B;IAE/C,YAAY,UAAoC,EAAE;QACjD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,SAAiB,EAAE,QAAkC;QACvF,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAiB;QAC3E,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,UAAkB;QAC1D,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,MAAM,cAAc,CAAC,YAAY,CAClD,IAAI,CAAC,YAAY,EACjB,gBAAgB,CAChB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,MAAM,cAAc,CAAC,YAAY,CACpD,IAAI,CAAC,YAAY,EACjB,kBAAkB,CAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,SAAiB;QACrD,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAiB;QAC7E,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,oCAAoC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAiB;QAC9E,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB,EAAE,SAAiB;QAC5D,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEhE,8BAA8B;QAC9B,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QAED,kFAAkF;QAClF,2EAA2E;QAE3E,kDAAkD;QAClD,MAAM,WAAW,GAAG,GAAG,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,UAAkB,EAAE,SAAiB;QACpD,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,GAAG,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;QAE5D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBAChG,KAAK,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,mBAAmB;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACpC,KAAK,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACF,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAE5E,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,2DAA2D,SAAS,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,KAAK,KAAK;gBAC3C,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACzE,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/plugin-indexeddb",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "IndexedDB storage plugin for Quereus - browser persistent storage",
|
|
6
6
|
"keywords": [
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@quereus/isolation": "^0.
|
|
42
|
-
"@quereus/quereus": "^0.
|
|
43
|
-
"@quereus/store": "^0.
|
|
41
|
+
"@quereus/isolation": "^1.0.0",
|
|
42
|
+
"@quereus/quereus": "^1.0.0",
|
|
43
|
+
"@quereus/store": "^1.0.0"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
|
46
46
|
"quereus": "^0.24.0"
|