reflectdb 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/LICENSE +21 -0
- package/README.md +1260 -0
- package/dist/cjs/client/index.cjs +1252 -0
- package/dist/cjs/client/index.d.cts +629 -0
- package/dist/cjs/client/storage/indexeddb.cjs +253 -0
- package/dist/cjs/client/storage/indexeddb.d.cts +85 -0
- package/dist/cjs/core/index.cjs +202 -0
- package/dist/cjs/core/index.d.cts +473 -0
- package/dist/cjs/react/index.cjs +1512 -0
- package/dist/cjs/react/index.d.cts +748 -0
- package/dist/cjs/server/drizzle.cjs +413 -0
- package/dist/cjs/server/drizzle.d.cts +233 -0
- package/dist/cjs/server/index.cjs +4486 -0
- package/dist/cjs/server/index.d.cts +1988 -0
- package/dist/cjs/svelte/index.cjs +1414 -0
- package/dist/cjs/svelte/index.d.cts +645 -0
- package/dist/cjs/transport/bun-ws.cjs +244 -0
- package/dist/cjs/transport/bun-ws.d.cts +215 -0
- package/dist/cjs/transport/polling.cjs +285 -0
- package/dist/cjs/transport/polling.d.cts +210 -0
- package/dist/cjs/transport/sse.cjs +312 -0
- package/dist/cjs/transport/sse.d.cts +205 -0
- package/dist/cjs/transport/ws.cjs +330 -0
- package/dist/cjs/transport/ws.d.cts +236 -0
- package/dist/cjs/vanilla/index.cjs +1430 -0
- package/dist/cjs/vanilla/index.d.cts +657 -0
- package/dist/client/index.d.ts +629 -0
- package/dist/client/index.js +106 -0
- package/dist/client/storage/indexeddb.d.ts +85 -0
- package/dist/client/storage/indexeddb.js +213 -0
- package/dist/core/index.d.ts +473 -0
- package/dist/core/index.js +56 -0
- package/dist/react/index.d.ts +748 -0
- package/dist/react/index.js +366 -0
- package/dist/server/drizzle.d.ts +233 -0
- package/dist/server/drizzle.js +9 -0
- package/dist/server/index.d.ts +1988 -0
- package/dist/server/index.js +3959 -0
- package/dist/shared/esm-3tkwvysa.js +54 -0
- package/dist/shared/esm-b7xs9cde.js +4 -0
- package/dist/shared/esm-rw7jjtrv.js +58 -0
- package/dist/shared/esm-wkwx6bd9.js +25 -0
- package/dist/shared/esm-ytrd3hbq.js +1007 -0
- package/dist/shared/esm-z1xse19c.js +369 -0
- package/dist/svelte/index.d.ts +645 -0
- package/dist/svelte/index.js +262 -0
- package/dist/transport/bun-ws.d.ts +215 -0
- package/dist/transport/bun-ws.js +140 -0
- package/dist/transport/polling.d.ts +210 -0
- package/dist/transport/polling.js +181 -0
- package/dist/transport/sse.d.ts +205 -0
- package/dist/transport/sse.js +208 -0
- package/dist/transport/ws.d.ts +236 -0
- package/dist/transport/ws.js +226 -0
- package/dist/vanilla/index.d.ts +657 -0
- package/dist/vanilla/index.js +278 -0
- package/package.json +253 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClientStore,
|
|
3
|
+
SyncClient,
|
|
4
|
+
createOpCreator,
|
|
5
|
+
pushSafely
|
|
6
|
+
} from "../shared/esm-ytrd3hbq.js";
|
|
7
|
+
import"../shared/esm-rw7jjtrv.js";
|
|
8
|
+
import"../shared/esm-3tkwvysa.js";
|
|
9
|
+
import"../shared/esm-b7xs9cde.js";
|
|
10
|
+
// src/client/storage/memory.ts
|
|
11
|
+
function createMemoryStorage() {
|
|
12
|
+
const rows = new Map;
|
|
13
|
+
let pendingOps = [];
|
|
14
|
+
const meta = new Map;
|
|
15
|
+
return {
|
|
16
|
+
async getRows(table) {
|
|
17
|
+
return Array.from(rows.get(table)?.values() ?? []);
|
|
18
|
+
},
|
|
19
|
+
async getAllRows() {
|
|
20
|
+
const all = [];
|
|
21
|
+
for (const tableRows of rows.values()) {
|
|
22
|
+
for (const row of tableRows.values()) {
|
|
23
|
+
all.push(row);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return all;
|
|
27
|
+
},
|
|
28
|
+
async putRow(table, rowId, row) {
|
|
29
|
+
let tableRows = rows.get(table);
|
|
30
|
+
if (!tableRows) {
|
|
31
|
+
tableRows = new Map;
|
|
32
|
+
rows.set(table, tableRows);
|
|
33
|
+
}
|
|
34
|
+
tableRows.set(rowId, row);
|
|
35
|
+
},
|
|
36
|
+
async deleteRow(table, rowId) {
|
|
37
|
+
rows.get(table)?.delete(rowId);
|
|
38
|
+
},
|
|
39
|
+
async clearTable(table) {
|
|
40
|
+
rows.delete(table);
|
|
41
|
+
},
|
|
42
|
+
async getPendingOps() {
|
|
43
|
+
return [...pendingOps];
|
|
44
|
+
},
|
|
45
|
+
async putPendingOps(ops) {
|
|
46
|
+
pendingOps = [...ops];
|
|
47
|
+
},
|
|
48
|
+
async appendPendingOps(ops) {
|
|
49
|
+
pendingOps.push(...ops);
|
|
50
|
+
},
|
|
51
|
+
async updatePendingOps(ops) {
|
|
52
|
+
const updateMap = new Map;
|
|
53
|
+
for (const op of ops) {
|
|
54
|
+
updateMap.set(op.op.id, op);
|
|
55
|
+
}
|
|
56
|
+
for (let i = 0;i < pendingOps.length; i++) {
|
|
57
|
+
const updated = updateMap.get(pendingOps[i].op.id);
|
|
58
|
+
if (updated) {
|
|
59
|
+
pendingOps[i] = updated;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async removePendingOps(opIds) {
|
|
64
|
+
const idSet = new Set(opIds);
|
|
65
|
+
pendingOps = pendingOps.filter((p) => !idSet.has(p.op.id));
|
|
66
|
+
},
|
|
67
|
+
async clearPendingOps() {
|
|
68
|
+
pendingOps = [];
|
|
69
|
+
},
|
|
70
|
+
async getMeta(key) {
|
|
71
|
+
return meta.get(key) ?? null;
|
|
72
|
+
},
|
|
73
|
+
async setMeta(key, value) {
|
|
74
|
+
meta.set(key, value);
|
|
75
|
+
},
|
|
76
|
+
async deleteMeta(key) {
|
|
77
|
+
meta.delete(key);
|
|
78
|
+
},
|
|
79
|
+
async clear() {
|
|
80
|
+
rows.clear();
|
|
81
|
+
pendingOps = [];
|
|
82
|
+
meta.clear();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// src/client/typed-client.ts
|
|
87
|
+
function createSyncClient(config) {
|
|
88
|
+
const { queries, autoSync, ...clientConfig } = config;
|
|
89
|
+
const client = new SyncClient(clientConfig);
|
|
90
|
+
if (autoSync) {
|
|
91
|
+
const origConnect = client.connect.bind(client);
|
|
92
|
+
client.connect = async () => {
|
|
93
|
+
await origConnect();
|
|
94
|
+
await Promise.all(Object.keys(queries).filter((name) => !("params" in queries[name])).map((name) => client.sync(name)));
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return client;
|
|
98
|
+
}
|
|
99
|
+
export {
|
|
100
|
+
pushSafely,
|
|
101
|
+
createSyncClient,
|
|
102
|
+
createOpCreator,
|
|
103
|
+
createMemoryStorage,
|
|
104
|
+
SyncClient,
|
|
105
|
+
ClientStore
|
|
106
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
type OpType = "insert" | "update" | "delete";
|
|
2
|
+
type OpStatus = "pending" | "synced" | "rejected";
|
|
3
|
+
type ErrorReason = "outside_shape" | "readonly_query" | "rate_limited" | "buffer_full" | "server_conflict" | "custom_conflict" | "merge_stale" | "clock_drift" | "replay" | "batch_too_large" | "schema_outdated" | "auth_revoked" | "compacted" | "mutation_rejected" | "server_error" | "unknown_query";
|
|
4
|
+
interface ClientOp {
|
|
5
|
+
id: string;
|
|
6
|
+
table: string;
|
|
7
|
+
op: OpType;
|
|
8
|
+
rowId: string;
|
|
9
|
+
payload: Record<string, unknown> | null;
|
|
10
|
+
hlc: string;
|
|
11
|
+
batchId?: string;
|
|
12
|
+
batchSize?: number;
|
|
13
|
+
batchSeq?: number;
|
|
14
|
+
}
|
|
15
|
+
interface PendingOp {
|
|
16
|
+
op: ClientOp;
|
|
17
|
+
status: OpStatus;
|
|
18
|
+
rejectedReason: ErrorReason | null;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
/**
|
|
21
|
+
* Row state captured just before the optimistic apply. Restored on reject
|
|
22
|
+
* so a rejected optimistic insert collapses back to no-row (instead of
|
|
23
|
+
* leaving a tombstone), and a rejected update reverts to the merged row
|
|
24
|
+
* the client had before touching it.
|
|
25
|
+
*/
|
|
26
|
+
preState?: {
|
|
27
|
+
data: Record<string, unknown> | null;
|
|
28
|
+
colClocks: Record<string, string>;
|
|
29
|
+
serverHlc: string | null;
|
|
30
|
+
} | null;
|
|
31
|
+
}
|
|
32
|
+
interface LocalRow {
|
|
33
|
+
table: string;
|
|
34
|
+
rowId: string;
|
|
35
|
+
data: Record<string, unknown> | null;
|
|
36
|
+
colClocks: Record<string, string>;
|
|
37
|
+
serverHlc: string | null;
|
|
38
|
+
}
|
|
39
|
+
interface ClientStorageAdapter {
|
|
40
|
+
getRows(table: string): Promise<LocalRow[]>;
|
|
41
|
+
getAllRows(): Promise<LocalRow[]>;
|
|
42
|
+
putRow(table: string, rowId: string, row: LocalRow): Promise<void>;
|
|
43
|
+
deleteRow(table: string, rowId: string): Promise<void>;
|
|
44
|
+
clearTable(table: string): Promise<void>;
|
|
45
|
+
getPendingOps(): Promise<PendingOp[]>;
|
|
46
|
+
putPendingOps(ops: PendingOp[]): Promise<void>;
|
|
47
|
+
appendPendingOps(ops: PendingOp[]): Promise<void>;
|
|
48
|
+
updatePendingOps(ops: PendingOp[]): Promise<void>;
|
|
49
|
+
removePendingOps(opIds: string[]): Promise<void>;
|
|
50
|
+
clearPendingOps(): Promise<void>;
|
|
51
|
+
getMeta(key: string): Promise<string | null>;
|
|
52
|
+
setMeta(key: string, value: string): Promise<void>;
|
|
53
|
+
deleteMeta(key: string): Promise<void>;
|
|
54
|
+
clear(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
interface IndexedDBMigrationContext {
|
|
57
|
+
db: IDBDatabase;
|
|
58
|
+
transaction: IDBTransaction;
|
|
59
|
+
oldVersion: number;
|
|
60
|
+
newVersion: number;
|
|
61
|
+
}
|
|
62
|
+
declare function createIndexedDBStorage(config: {
|
|
63
|
+
dbName: string;
|
|
64
|
+
version?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Called during onupgradeneeded after the built-in stores are ensured.
|
|
67
|
+
* Bump `version` and handle old→new schema changes here. Without this,
|
|
68
|
+
* raising `version` in app code with no migration wipes user data.
|
|
69
|
+
*/
|
|
70
|
+
migrate?: (ctx: IndexedDBMigrationContext) => void;
|
|
71
|
+
/**
|
|
72
|
+
* Application-level schema version (separate from IDB `version`).
|
|
73
|
+
* Persisted to meta on first open. On subsequent opens, mismatch fires
|
|
74
|
+
* `onSchemaChange` so the app can clear or migrate row data whose shape
|
|
75
|
+
* changed without an IDB version bump (e.g. new required field added to
|
|
76
|
+
* a Drizzle table).
|
|
77
|
+
*/
|
|
78
|
+
appSchemaVersion?: number;
|
|
79
|
+
/** Invoked when stored appSchemaVersion differs from config. Default: warn. */
|
|
80
|
+
onSchemaChange?: (ctx: {
|
|
81
|
+
storedVersion: number;
|
|
82
|
+
configVersion: number;
|
|
83
|
+
}, storage: ClientStorageAdapter) => void | Promise<void>;
|
|
84
|
+
}): ClientStorageAdapter;
|
|
85
|
+
export { createIndexedDBStorage, IndexedDBMigrationContext };
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import"../../shared/esm-b7xs9cde.js";
|
|
2
|
+
|
|
3
|
+
// src/client/storage/indexeddb.ts
|
|
4
|
+
function createIndexedDBStorage(config) {
|
|
5
|
+
let dbPromise = null;
|
|
6
|
+
let schemaChecked = false;
|
|
7
|
+
function openDB() {
|
|
8
|
+
if (dbPromise)
|
|
9
|
+
return dbPromise;
|
|
10
|
+
dbPromise = new Promise((resolve, reject) => {
|
|
11
|
+
const request = indexedDB.open(config.dbName, config.version ?? 1);
|
|
12
|
+
request.onupgradeneeded = (event) => {
|
|
13
|
+
const db = request.result;
|
|
14
|
+
const transaction = request.transaction;
|
|
15
|
+
if (!db.objectStoreNames.contains("rows")) {
|
|
16
|
+
const rowStore = db.createObjectStore("rows", { keyPath: ["table", "rowId"] });
|
|
17
|
+
rowStore.createIndex("table", "table", { unique: false });
|
|
18
|
+
}
|
|
19
|
+
if (!db.objectStoreNames.contains("pendingOps")) {
|
|
20
|
+
db.createObjectStore("pendingOps", { keyPath: "op.id" });
|
|
21
|
+
}
|
|
22
|
+
if (!db.objectStoreNames.contains("meta")) {
|
|
23
|
+
db.createObjectStore("meta", { keyPath: "key" });
|
|
24
|
+
}
|
|
25
|
+
if (config.migrate && transaction) {
|
|
26
|
+
config.migrate({
|
|
27
|
+
db,
|
|
28
|
+
transaction,
|
|
29
|
+
oldVersion: event.oldVersion,
|
|
30
|
+
newVersion: event.newVersion ?? (config.version ?? 1)
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
request.onsuccess = () => resolve(request.result);
|
|
35
|
+
request.onerror = () => reject(request.error);
|
|
36
|
+
});
|
|
37
|
+
return dbPromise;
|
|
38
|
+
}
|
|
39
|
+
function tx(storeNames, mode) {
|
|
40
|
+
return openDB().then((db) => {
|
|
41
|
+
const names = Array.isArray(storeNames) ? storeNames : [storeNames];
|
|
42
|
+
const transaction = db.transaction(names, mode);
|
|
43
|
+
const stores = {};
|
|
44
|
+
for (const name of names) {
|
|
45
|
+
stores[name] = transaction.objectStore(name);
|
|
46
|
+
}
|
|
47
|
+
return { tx: transaction, stores };
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function reqToPromise(request) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
request.onsuccess = () => resolve(request.result);
|
|
53
|
+
request.onerror = () => reject(request.error);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function txComplete(transaction) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
transaction.oncomplete = () => resolve();
|
|
59
|
+
transaction.onerror = () => reject(transaction.error);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async function readMetaRaw(key) {
|
|
63
|
+
const { stores } = await tx("meta", "readonly");
|
|
64
|
+
const result = await reqToPromise(stores.meta.get(key));
|
|
65
|
+
return result?.value ?? null;
|
|
66
|
+
}
|
|
67
|
+
async function writeMetaRaw(key, value) {
|
|
68
|
+
const { tx: transaction, stores } = await tx("meta", "readwrite");
|
|
69
|
+
stores.meta.put({ key, value });
|
|
70
|
+
await txComplete(transaction);
|
|
71
|
+
}
|
|
72
|
+
let schemaCheckPromise = null;
|
|
73
|
+
async function ensureSchemaChecked() {
|
|
74
|
+
if (schemaChecked)
|
|
75
|
+
return;
|
|
76
|
+
if (schemaCheckPromise)
|
|
77
|
+
return schemaCheckPromise;
|
|
78
|
+
schemaCheckPromise = (async () => {
|
|
79
|
+
if (config.appSchemaVersion === undefined) {
|
|
80
|
+
schemaChecked = true;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const storedRaw = await readMetaRaw("__reflectdb_appSchemaVersion");
|
|
84
|
+
const stored = storedRaw == null ? null : Number.parseInt(storedRaw, 10);
|
|
85
|
+
if (stored === null) {
|
|
86
|
+
await writeMetaRaw("__reflectdb_appSchemaVersion", String(config.appSchemaVersion));
|
|
87
|
+
schemaChecked = true;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (stored !== config.appSchemaVersion) {
|
|
91
|
+
if (config.onSchemaChange) {
|
|
92
|
+
await config.onSchemaChange({ storedVersion: stored, configVersion: config.appSchemaVersion }, adapter);
|
|
93
|
+
} else {
|
|
94
|
+
console.warn(`[reflectdb] IndexedDB appSchemaVersion mismatch: stored=${stored} config=${config.appSchemaVersion}. ` + `Pass onSchemaChange to handle (e.g. await storage.clear()).`);
|
|
95
|
+
}
|
|
96
|
+
await writeMetaRaw("__reflectdb_appSchemaVersion", String(config.appSchemaVersion));
|
|
97
|
+
}
|
|
98
|
+
schemaChecked = true;
|
|
99
|
+
})().catch((err) => {
|
|
100
|
+
schemaCheckPromise = null;
|
|
101
|
+
throw err;
|
|
102
|
+
});
|
|
103
|
+
return schemaCheckPromise;
|
|
104
|
+
}
|
|
105
|
+
const adapter = {
|
|
106
|
+
async getRows(table) {
|
|
107
|
+
await ensureSchemaChecked();
|
|
108
|
+
const { stores } = await tx("rows", "readonly");
|
|
109
|
+
const index = stores.rows.index("table");
|
|
110
|
+
const results = await reqToPromise(index.getAll(table));
|
|
111
|
+
return results;
|
|
112
|
+
},
|
|
113
|
+
async getAllRows() {
|
|
114
|
+
const { stores } = await tx("rows", "readonly");
|
|
115
|
+
const results = await reqToPromise(stores.rows.getAll());
|
|
116
|
+
return results;
|
|
117
|
+
},
|
|
118
|
+
async putRow(table, rowId, row) {
|
|
119
|
+
const { tx: transaction, stores } = await tx("rows", "readwrite");
|
|
120
|
+
stores.rows.put(row);
|
|
121
|
+
await txComplete(transaction);
|
|
122
|
+
},
|
|
123
|
+
async deleteRow(table, rowId) {
|
|
124
|
+
const { tx: transaction, stores } = await tx("rows", "readwrite");
|
|
125
|
+
stores.rows.delete([table, rowId]);
|
|
126
|
+
await txComplete(transaction);
|
|
127
|
+
},
|
|
128
|
+
async clearTable(table) {
|
|
129
|
+
const { tx: transaction, stores } = await tx("rows", "readwrite");
|
|
130
|
+
const index = stores.rows.index("table");
|
|
131
|
+
const keys = await reqToPromise(index.getAllKeys(table));
|
|
132
|
+
const deletes = keys.map((key) => reqToPromise(stores.rows.delete(key)));
|
|
133
|
+
await Promise.all(deletes);
|
|
134
|
+
await txComplete(transaction);
|
|
135
|
+
},
|
|
136
|
+
async getPendingOps() {
|
|
137
|
+
const { stores } = await tx("pendingOps", "readonly");
|
|
138
|
+
const results = await reqToPromise(stores.pendingOps.getAll());
|
|
139
|
+
return results;
|
|
140
|
+
},
|
|
141
|
+
async putPendingOps(ops) {
|
|
142
|
+
const { tx: transaction, stores } = await tx("pendingOps", "readwrite");
|
|
143
|
+
stores.pendingOps.clear();
|
|
144
|
+
for (const op of ops) {
|
|
145
|
+
stores.pendingOps.put(op);
|
|
146
|
+
}
|
|
147
|
+
await txComplete(transaction);
|
|
148
|
+
},
|
|
149
|
+
async appendPendingOps(ops) {
|
|
150
|
+
const { tx: transaction, stores } = await tx("pendingOps", "readwrite");
|
|
151
|
+
for (const op of ops) {
|
|
152
|
+
stores.pendingOps.put(op);
|
|
153
|
+
}
|
|
154
|
+
await txComplete(transaction);
|
|
155
|
+
},
|
|
156
|
+
async updatePendingOps(ops) {
|
|
157
|
+
const { tx: transaction, stores } = await tx("pendingOps", "readwrite");
|
|
158
|
+
for (const op of ops) {
|
|
159
|
+
stores.pendingOps.put(op);
|
|
160
|
+
}
|
|
161
|
+
await txComplete(transaction);
|
|
162
|
+
},
|
|
163
|
+
async removePendingOps(opIds) {
|
|
164
|
+
const { tx: transaction, stores } = await tx("pendingOps", "readwrite");
|
|
165
|
+
for (const id of opIds) {
|
|
166
|
+
stores.pendingOps.delete(id);
|
|
167
|
+
}
|
|
168
|
+
await txComplete(transaction);
|
|
169
|
+
},
|
|
170
|
+
async clearPendingOps() {
|
|
171
|
+
const { tx: transaction, stores } = await tx("pendingOps", "readwrite");
|
|
172
|
+
stores.pendingOps.clear();
|
|
173
|
+
await txComplete(transaction);
|
|
174
|
+
},
|
|
175
|
+
async getMeta(key) {
|
|
176
|
+
const { stores } = await tx("meta", "readonly");
|
|
177
|
+
const result = await reqToPromise(stores.meta.get(key));
|
|
178
|
+
return result?.value ?? null;
|
|
179
|
+
},
|
|
180
|
+
async setMeta(key, value) {
|
|
181
|
+
const { tx: transaction, stores } = await tx("meta", "readwrite");
|
|
182
|
+
stores.meta.put({ key, value });
|
|
183
|
+
await txComplete(transaction);
|
|
184
|
+
},
|
|
185
|
+
async deleteMeta(key) {
|
|
186
|
+
const { tx: transaction, stores } = await tx("meta", "readwrite");
|
|
187
|
+
stores.meta.delete(key);
|
|
188
|
+
await txComplete(transaction);
|
|
189
|
+
},
|
|
190
|
+
async clear() {
|
|
191
|
+
const { tx: transaction, stores } = await tx(["rows", "pendingOps", "meta"], "readwrite");
|
|
192
|
+
stores.rows.clear();
|
|
193
|
+
stores.pendingOps.clear();
|
|
194
|
+
stores.meta.clear();
|
|
195
|
+
await txComplete(transaction);
|
|
196
|
+
dbPromise = null;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const _getAllRows = adapter.getAllRows;
|
|
200
|
+
adapter.getAllRows = async () => {
|
|
201
|
+
await ensureSchemaChecked();
|
|
202
|
+
return _getAllRows();
|
|
203
|
+
};
|
|
204
|
+
const _getPendingOps = adapter.getPendingOps;
|
|
205
|
+
adapter.getPendingOps = async () => {
|
|
206
|
+
await ensureSchemaChecked();
|
|
207
|
+
return _getPendingOps();
|
|
208
|
+
};
|
|
209
|
+
return adapter;
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
createIndexedDBStorage
|
|
213
|
+
};
|