tinybase 4.0.3 → 4.0.4
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/lib/cjs/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -1
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -1
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/debug/persisters/persister-automerge.js +56 -18
- package/lib/debug/persisters/persister-browser.js +55 -22
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +106 -62
- package/lib/debug/persisters/persister-expo-sqlite.js +111 -62
- package/lib/debug/persisters/persister-file.js +51 -18
- package/lib/debug/persisters/persister-remote.js +51 -17
- package/lib/debug/persisters/persister-sqlite-wasm.js +106 -62
- package/lib/debug/persisters/persister-sqlite3.js +111 -62
- package/lib/debug/persisters/persister-yjs.js +63 -27
- package/lib/debug/persisters.js +49 -17
- package/lib/debug/tinybase.js +35 -17
- package/lib/es6/persisters/persister-automerge.js +1 -1
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -1
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -1
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -1
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -1
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -1
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/types/persisters/persister-automerge.d.ts +4 -0
- package/lib/types/persisters/persister-browser.d.ts +8 -0
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +10 -2
- package/lib/types/persisters/persister-expo-sqlite.d.ts +8 -0
- package/lib/types/persisters/persister-file.d.ts +8 -1
- package/lib/types/persisters/persister-remote.d.ts +4 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +8 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +8 -0
- package/lib/types/persisters/persister-yjs.d.ts +4 -0
- package/lib/types/persisters.d.ts +16 -3
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +5 -0
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +12 -2
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -1
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -0
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +5 -0
- package/lib/types/with-schemas/persisters.d.ts +17 -3
- package/lib/umd/persisters/persister-automerge.js +1 -1
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -1
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -1
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -1
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -1
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -1
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/package.json +5 -5
- package/readme.md +2 -2
|
@@ -32,32 +32,55 @@ const objEnsure = (obj, id, getDefaultValue) => {
|
|
|
32
32
|
return obj[id];
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
36
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
37
|
+
|
|
38
|
+
const mapNew = (entries) => new Map(entries);
|
|
39
|
+
const mapGet = (map, key) => map?.get(key);
|
|
40
|
+
const mapSet = (map, key, value) =>
|
|
41
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
42
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
43
|
+
if (!collHas(map, key)) {
|
|
44
|
+
mapSet(map, key, getDefaultValue());
|
|
45
|
+
}
|
|
46
|
+
return mapGet(map, key);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const scheduleRunning = mapNew();
|
|
50
|
+
const scheduleActions = mapNew();
|
|
35
51
|
const createCustomPersister = (
|
|
36
52
|
store,
|
|
37
53
|
getPersisted,
|
|
38
54
|
setPersisted,
|
|
39
55
|
addPersisterListener,
|
|
40
56
|
delPersisterListener,
|
|
57
|
+
onIgnoredError,
|
|
58
|
+
scheduleId = [],
|
|
41
59
|
) => {
|
|
42
60
|
let listenerId;
|
|
43
61
|
let loadSave = 0;
|
|
44
62
|
let loads = 0;
|
|
45
63
|
let saves = 0;
|
|
46
|
-
let running = 0;
|
|
47
64
|
let listening = 0;
|
|
48
65
|
let action;
|
|
49
66
|
let listeningHandle;
|
|
50
|
-
|
|
67
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
68
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
51
69
|
const run = async () => {
|
|
52
70
|
/* istanbul ignore else */
|
|
53
|
-
if (!
|
|
54
|
-
|
|
55
|
-
while (
|
|
71
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
72
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
73
|
+
while (
|
|
74
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
75
|
+
) {
|
|
56
76
|
try {
|
|
57
77
|
await action();
|
|
58
|
-
} catch {
|
|
78
|
+
} catch (error) {
|
|
79
|
+
/* istanbul ignore next */
|
|
80
|
+
onIgnoredError?.(error);
|
|
81
|
+
}
|
|
59
82
|
}
|
|
60
|
-
|
|
83
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
61
84
|
}
|
|
62
85
|
};
|
|
63
86
|
const loadLock = async (actions) => {
|
|
@@ -88,16 +111,22 @@ const createCustomPersister = (
|
|
|
88
111
|
await persister.load(initialTables, initialValues);
|
|
89
112
|
listening = 1;
|
|
90
113
|
listeningHandle = addPersisterListener(
|
|
91
|
-
async (getContent, getTransactionChanges) =>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
114
|
+
async (getContent, getTransactionChanges) => {
|
|
115
|
+
if (getTransactionChanges) {
|
|
116
|
+
const transactionChanges = getTransactionChanges();
|
|
117
|
+
await loadLock(async () =>
|
|
118
|
+
store.setTransactionChanges(transactionChanges),
|
|
119
|
+
);
|
|
120
|
+
} else {
|
|
121
|
+
await loadLock(async () => {
|
|
96
122
|
try {
|
|
97
123
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
98
|
-
} catch {
|
|
99
|
-
|
|
100
|
-
|
|
124
|
+
} catch (error) {
|
|
125
|
+
onIgnoredError?.(error);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
},
|
|
101
130
|
);
|
|
102
131
|
return persister;
|
|
103
132
|
},
|
|
@@ -119,7 +148,10 @@ const createCustomPersister = (
|
|
|
119
148
|
await persister.schedule(async () => {
|
|
120
149
|
try {
|
|
121
150
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
122
|
-
} catch {
|
|
151
|
+
} catch (error) {
|
|
152
|
+
/* istanbul ignore next */
|
|
153
|
+
onIgnoredError?.(error);
|
|
154
|
+
}
|
|
123
155
|
loadSave = 0;
|
|
124
156
|
});
|
|
125
157
|
}
|
|
@@ -142,7 +174,7 @@ const createCustomPersister = (
|
|
|
142
174
|
return persister;
|
|
143
175
|
},
|
|
144
176
|
schedule: async (...actions) => {
|
|
145
|
-
arrayPush(
|
|
177
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
146
178
|
await run();
|
|
147
179
|
return persister;
|
|
148
180
|
},
|
|
@@ -251,7 +283,12 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
|
|
|
251
283
|
}
|
|
252
284
|
return changed;
|
|
253
285
|
};
|
|
254
|
-
const createAutomergePersister = (
|
|
286
|
+
const createAutomergePersister = (
|
|
287
|
+
store,
|
|
288
|
+
docHandle,
|
|
289
|
+
docObjName = TINYBASE,
|
|
290
|
+
onIgnoredError,
|
|
291
|
+
) => {
|
|
255
292
|
docHandle.change((doc) => (doc[docObjName] = {}));
|
|
256
293
|
const getPersisted = async () =>
|
|
257
294
|
objSize(docHandle.doc[docObjName]) == 2
|
|
@@ -280,6 +317,7 @@ const createAutomergePersister = (store, docHandle, docObjName = TINYBASE) => {
|
|
|
280
317
|
setPersisted,
|
|
281
318
|
addPersisterListener,
|
|
282
319
|
delPersisterListener,
|
|
320
|
+
onIgnoredError,
|
|
283
321
|
);
|
|
284
322
|
};
|
|
285
323
|
|
|
@@ -21,32 +21,55 @@ const jsonString = (obj) =>
|
|
|
21
21
|
);
|
|
22
22
|
const jsonParse = JSON.parse;
|
|
23
23
|
|
|
24
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
25
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
26
|
+
|
|
27
|
+
const mapNew = (entries) => new Map(entries);
|
|
28
|
+
const mapGet = (map, key) => map?.get(key);
|
|
29
|
+
const mapSet = (map, key, value) =>
|
|
30
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
31
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
32
|
+
if (!collHas(map, key)) {
|
|
33
|
+
mapSet(map, key, getDefaultValue());
|
|
34
|
+
}
|
|
35
|
+
return mapGet(map, key);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const scheduleRunning = mapNew();
|
|
39
|
+
const scheduleActions = mapNew();
|
|
24
40
|
const createCustomPersister = (
|
|
25
41
|
store,
|
|
26
42
|
getPersisted,
|
|
27
43
|
setPersisted,
|
|
28
44
|
addPersisterListener,
|
|
29
45
|
delPersisterListener,
|
|
46
|
+
onIgnoredError,
|
|
47
|
+
scheduleId = [],
|
|
30
48
|
) => {
|
|
31
49
|
let listenerId;
|
|
32
50
|
let loadSave = 0;
|
|
33
51
|
let loads = 0;
|
|
34
52
|
let saves = 0;
|
|
35
|
-
let running = 0;
|
|
36
53
|
let listening = 0;
|
|
37
54
|
let action;
|
|
38
55
|
let listeningHandle;
|
|
39
|
-
|
|
56
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
57
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
40
58
|
const run = async () => {
|
|
41
59
|
/* istanbul ignore else */
|
|
42
|
-
if (!
|
|
43
|
-
|
|
44
|
-
while (
|
|
60
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
61
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
62
|
+
while (
|
|
63
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
64
|
+
) {
|
|
45
65
|
try {
|
|
46
66
|
await action();
|
|
47
|
-
} catch {
|
|
67
|
+
} catch (error) {
|
|
68
|
+
/* istanbul ignore next */
|
|
69
|
+
onIgnoredError?.(error);
|
|
70
|
+
}
|
|
48
71
|
}
|
|
49
|
-
|
|
72
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
50
73
|
}
|
|
51
74
|
};
|
|
52
75
|
const loadLock = async (actions) => {
|
|
@@ -77,16 +100,22 @@ const createCustomPersister = (
|
|
|
77
100
|
await persister.load(initialTables, initialValues);
|
|
78
101
|
listening = 1;
|
|
79
102
|
listeningHandle = addPersisterListener(
|
|
80
|
-
async (getContent, getTransactionChanges) =>
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
async (getContent, getTransactionChanges) => {
|
|
104
|
+
if (getTransactionChanges) {
|
|
105
|
+
const transactionChanges = getTransactionChanges();
|
|
106
|
+
await loadLock(async () =>
|
|
107
|
+
store.setTransactionChanges(transactionChanges),
|
|
108
|
+
);
|
|
109
|
+
} else {
|
|
110
|
+
await loadLock(async () => {
|
|
85
111
|
try {
|
|
86
112
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
87
|
-
} catch {
|
|
88
|
-
|
|
89
|
-
|
|
113
|
+
} catch (error) {
|
|
114
|
+
onIgnoredError?.(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
},
|
|
90
119
|
);
|
|
91
120
|
return persister;
|
|
92
121
|
},
|
|
@@ -108,7 +137,10 @@ const createCustomPersister = (
|
|
|
108
137
|
await persister.schedule(async () => {
|
|
109
138
|
try {
|
|
110
139
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
111
|
-
} catch {
|
|
140
|
+
} catch (error) {
|
|
141
|
+
/* istanbul ignore next */
|
|
142
|
+
onIgnoredError?.(error);
|
|
143
|
+
}
|
|
112
144
|
loadSave = 0;
|
|
113
145
|
});
|
|
114
146
|
}
|
|
@@ -131,7 +163,7 @@ const createCustomPersister = (
|
|
|
131
163
|
return persister;
|
|
132
164
|
},
|
|
133
165
|
schedule: async (...actions) => {
|
|
134
|
-
arrayPush(
|
|
166
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
135
167
|
await run();
|
|
136
168
|
return persister;
|
|
137
169
|
},
|
|
@@ -144,7 +176,7 @@ const createCustomPersister = (
|
|
|
144
176
|
|
|
145
177
|
const STORAGE = 'storage';
|
|
146
178
|
const WINDOW = globalThis.window;
|
|
147
|
-
const getStoragePersister = (store, storageName, storage) => {
|
|
179
|
+
const getStoragePersister = (store, storageName, storage, onIgnoredError) => {
|
|
148
180
|
const getPersisted = async () => jsonParse(storage.getItem(storageName));
|
|
149
181
|
const setPersisted = async (getContent) =>
|
|
150
182
|
storage.setItem(storageName, jsonString(getContent()));
|
|
@@ -165,11 +197,12 @@ const getStoragePersister = (store, storageName, storage) => {
|
|
|
165
197
|
setPersisted,
|
|
166
198
|
addPersisterListener,
|
|
167
199
|
delPersisterListener,
|
|
200
|
+
onIgnoredError,
|
|
168
201
|
);
|
|
169
202
|
};
|
|
170
|
-
const createLocalPersister = (store, storageName) =>
|
|
171
|
-
getStoragePersister(store, storageName, localStorage);
|
|
172
|
-
const createSessionPersister = (store, storageName) =>
|
|
173
|
-
getStoragePersister(store, storageName, sessionStorage);
|
|
203
|
+
const createLocalPersister = (store, storageName, onIgnoredError) =>
|
|
204
|
+
getStoragePersister(store, storageName, localStorage, onIgnoredError);
|
|
205
|
+
const createSessionPersister = (store, storageName, onIgnoredError) =>
|
|
206
|
+
getStoragePersister(store, storageName, sessionStorage, onIgnoredError);
|
|
174
207
|
|
|
175
208
|
export {createLocalPersister, createSessionPersister};
|
|
@@ -83,7 +83,7 @@ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
|
83
83
|
const SELECT_STAR_FROM = 'SELECT*FROM';
|
|
84
84
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
85
85
|
const WHERE = 'WHERE';
|
|
86
|
-
const getCommandFunctions = (cmd, managedTableNames) => {
|
|
86
|
+
const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
87
87
|
const schemaMap = mapNew();
|
|
88
88
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
89
89
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -281,7 +281,18 @@ const getCommandFunctions = (cmd, managedTableNames) => {
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
};
|
|
284
|
-
|
|
284
|
+
const transaction = async (actions) => {
|
|
285
|
+
let result;
|
|
286
|
+
await cmd('BEGIN');
|
|
287
|
+
try {
|
|
288
|
+
result = await actions();
|
|
289
|
+
} catch (error) {
|
|
290
|
+
onIgnoredError?.(error);
|
|
291
|
+
}
|
|
292
|
+
await cmd('END');
|
|
293
|
+
return result;
|
|
294
|
+
};
|
|
295
|
+
return [refreshSchema, loadTable, saveTable, transaction];
|
|
285
296
|
};
|
|
286
297
|
const upsert = async (
|
|
287
298
|
cmd,
|
|
@@ -331,32 +342,41 @@ const jsonString = (obj) =>
|
|
|
331
342
|
);
|
|
332
343
|
const jsonParse = JSON.parse;
|
|
333
344
|
|
|
345
|
+
const scheduleRunning = mapNew();
|
|
346
|
+
const scheduleActions = mapNew();
|
|
334
347
|
const createCustomPersister = (
|
|
335
348
|
store,
|
|
336
349
|
getPersisted,
|
|
337
350
|
setPersisted,
|
|
338
351
|
addPersisterListener,
|
|
339
352
|
delPersisterListener,
|
|
353
|
+
onIgnoredError,
|
|
354
|
+
scheduleId = [],
|
|
340
355
|
) => {
|
|
341
356
|
let listenerId;
|
|
342
357
|
let loadSave = 0;
|
|
343
358
|
let loads = 0;
|
|
344
359
|
let saves = 0;
|
|
345
|
-
let running = 0;
|
|
346
360
|
let listening = 0;
|
|
347
361
|
let action;
|
|
348
362
|
let listeningHandle;
|
|
349
|
-
|
|
363
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
364
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
350
365
|
const run = async () => {
|
|
351
366
|
/* istanbul ignore else */
|
|
352
|
-
if (!
|
|
353
|
-
|
|
354
|
-
while (
|
|
367
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
368
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
369
|
+
while (
|
|
370
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
371
|
+
) {
|
|
355
372
|
try {
|
|
356
373
|
await action();
|
|
357
|
-
} catch {
|
|
374
|
+
} catch (error) {
|
|
375
|
+
/* istanbul ignore next */
|
|
376
|
+
onIgnoredError?.(error);
|
|
377
|
+
}
|
|
358
378
|
}
|
|
359
|
-
|
|
379
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
360
380
|
}
|
|
361
381
|
};
|
|
362
382
|
const loadLock = async (actions) => {
|
|
@@ -387,16 +407,22 @@ const createCustomPersister = (
|
|
|
387
407
|
await persister.load(initialTables, initialValues);
|
|
388
408
|
listening = 1;
|
|
389
409
|
listeningHandle = addPersisterListener(
|
|
390
|
-
async (getContent, getTransactionChanges) =>
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
410
|
+
async (getContent, getTransactionChanges) => {
|
|
411
|
+
if (getTransactionChanges) {
|
|
412
|
+
const transactionChanges = getTransactionChanges();
|
|
413
|
+
await loadLock(async () =>
|
|
414
|
+
store.setTransactionChanges(transactionChanges),
|
|
415
|
+
);
|
|
416
|
+
} else {
|
|
417
|
+
await loadLock(async () => {
|
|
395
418
|
try {
|
|
396
419
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
397
|
-
} catch {
|
|
398
|
-
|
|
399
|
-
|
|
420
|
+
} catch (error) {
|
|
421
|
+
onIgnoredError?.(error);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
},
|
|
400
426
|
);
|
|
401
427
|
return persister;
|
|
402
428
|
},
|
|
@@ -418,7 +444,10 @@ const createCustomPersister = (
|
|
|
418
444
|
await persister.schedule(async () => {
|
|
419
445
|
try {
|
|
420
446
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
421
|
-
} catch {
|
|
447
|
+
} catch (error) {
|
|
448
|
+
/* istanbul ignore next */
|
|
449
|
+
onIgnoredError?.(error);
|
|
450
|
+
}
|
|
422
451
|
loadSave = 0;
|
|
423
452
|
});
|
|
424
453
|
}
|
|
@@ -441,7 +470,7 @@ const createCustomPersister = (
|
|
|
441
470
|
return persister;
|
|
442
471
|
},
|
|
443
472
|
schedule: async (...actions) => {
|
|
444
|
-
arrayPush(
|
|
473
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
445
474
|
await run();
|
|
446
475
|
return persister;
|
|
447
476
|
},
|
|
@@ -458,28 +487,30 @@ const createJsonSqlitePersister = (
|
|
|
458
487
|
cmd,
|
|
459
488
|
addPersisterListener,
|
|
460
489
|
delPersisterListener,
|
|
490
|
+
onIgnoredError,
|
|
461
491
|
[storeTableName],
|
|
462
492
|
managedTableNames,
|
|
493
|
+
scheduleId,
|
|
463
494
|
) => {
|
|
464
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
465
|
-
cmd,
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
);
|
|
475
|
-
};
|
|
495
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
496
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
497
|
+
const getPersisted = async () =>
|
|
498
|
+
await transaction(async () => {
|
|
499
|
+
await refreshSchema();
|
|
500
|
+
return jsonParse(
|
|
501
|
+
(await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
|
|
502
|
+
SINGLE_ROW_ID
|
|
503
|
+
]?.[STORE_COLUMN] ?? 'null',
|
|
504
|
+
);
|
|
505
|
+
});
|
|
476
506
|
const setPersisted = async (getContent) =>
|
|
477
|
-
|
|
507
|
+
await transaction(async () => {
|
|
508
|
+
await refreshSchema();
|
|
478
509
|
await saveTable(
|
|
479
510
|
storeTableName,
|
|
480
511
|
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
481
512
|
{
|
|
482
|
-
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent())},
|
|
513
|
+
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent() ?? null)},
|
|
483
514
|
},
|
|
484
515
|
true,
|
|
485
516
|
true,
|
|
@@ -491,6 +522,8 @@ const createJsonSqlitePersister = (
|
|
|
491
522
|
setPersisted,
|
|
492
523
|
addPersisterListener,
|
|
493
524
|
delPersisterListener,
|
|
525
|
+
onIgnoredError,
|
|
526
|
+
scheduleId,
|
|
494
527
|
);
|
|
495
528
|
return persister;
|
|
496
529
|
};
|
|
@@ -500,17 +533,17 @@ const createTabularSqlitePersister = (
|
|
|
500
533
|
cmd,
|
|
501
534
|
addPersisterListener,
|
|
502
535
|
delPersisterListener,
|
|
536
|
+
onIgnoredError,
|
|
503
537
|
[
|
|
504
538
|
tablesLoadConfig,
|
|
505
539
|
tablesSaveConfig,
|
|
506
540
|
[valuesLoad, valuesSave, valuesTableName],
|
|
507
541
|
],
|
|
508
542
|
managedTableNames,
|
|
543
|
+
scheduleId,
|
|
509
544
|
) => {
|
|
510
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
511
|
-
cmd,
|
|
512
|
-
managedTableNames,
|
|
513
|
-
);
|
|
545
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
546
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
514
547
|
const saveTables = async (tables, partial) =>
|
|
515
548
|
await promiseAll(
|
|
516
549
|
mapMap(
|
|
@@ -565,32 +598,36 @@ const createTabularSqlitePersister = (
|
|
|
565
598
|
SINGLE_ROW_ID
|
|
566
599
|
]
|
|
567
600
|
: {};
|
|
568
|
-
const getPersisted = async () =>
|
|
569
|
-
await
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
601
|
+
const getPersisted = async () =>
|
|
602
|
+
await transaction(async () => {
|
|
603
|
+
await refreshSchema();
|
|
604
|
+
const tables = await loadTables();
|
|
605
|
+
const values = await loadValues();
|
|
606
|
+
return !objIsEmpty(tables) || !isUndefined(values)
|
|
607
|
+
? [tables, values]
|
|
608
|
+
: void 0;
|
|
609
|
+
});
|
|
610
|
+
const setPersisted = async (getContent, getTransactionChanges) =>
|
|
611
|
+
await transaction(async () => {
|
|
612
|
+
await refreshSchema();
|
|
613
|
+
if (!isUndefined(getTransactionChanges)) {
|
|
614
|
+
const [tableChanges, valueChanges] = getTransactionChanges();
|
|
615
|
+
await saveTables(tableChanges, true);
|
|
616
|
+
await saveValues(valueChanges, true);
|
|
617
|
+
} else {
|
|
618
|
+
const [tables, values] = getContent();
|
|
619
|
+
await saveTables(tables);
|
|
620
|
+
await saveValues(values);
|
|
621
|
+
}
|
|
622
|
+
});
|
|
588
623
|
const persister = createCustomPersister(
|
|
589
624
|
store,
|
|
590
625
|
getPersisted,
|
|
591
626
|
setPersisted,
|
|
592
627
|
addPersisterListener,
|
|
593
628
|
delPersisterListener,
|
|
629
|
+
onIgnoredError,
|
|
630
|
+
scheduleId,
|
|
594
631
|
);
|
|
595
632
|
return persister;
|
|
596
633
|
};
|
|
@@ -697,7 +734,9 @@ const createSqlitePersister = (
|
|
|
697
734
|
cmd,
|
|
698
735
|
addUpdateListener,
|
|
699
736
|
delUpdateListener,
|
|
700
|
-
|
|
737
|
+
onSqlCommand,
|
|
738
|
+
onIgnoredError,
|
|
739
|
+
scheduleId,
|
|
701
740
|
) => {
|
|
702
741
|
let dataVersion;
|
|
703
742
|
let schemaVersion;
|
|
@@ -737,16 +776,18 @@ const createSqlitePersister = (
|
|
|
737
776
|
};
|
|
738
777
|
return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
|
|
739
778
|
store,
|
|
740
|
-
|
|
779
|
+
onSqlCommand
|
|
741
780
|
? async (sql, args) => {
|
|
742
|
-
|
|
781
|
+
onSqlCommand(sql, args);
|
|
743
782
|
return await cmd(sql, args);
|
|
744
783
|
}
|
|
745
784
|
: cmd,
|
|
746
785
|
addPersisterListener,
|
|
747
786
|
delPersisterListener,
|
|
787
|
+
onIgnoredError,
|
|
748
788
|
defaultedConfig,
|
|
749
789
|
collValues(managedTableNamesSet),
|
|
790
|
+
scheduleId,
|
|
750
791
|
);
|
|
751
792
|
};
|
|
752
793
|
|
|
@@ -754,7 +795,8 @@ const createCrSqliteWasmPersister = (
|
|
|
754
795
|
store,
|
|
755
796
|
db,
|
|
756
797
|
configOrStoreTableName,
|
|
757
|
-
|
|
798
|
+
onSqlCommand,
|
|
799
|
+
onIgnoredError,
|
|
758
800
|
) =>
|
|
759
801
|
createSqlitePersister(
|
|
760
802
|
store,
|
|
@@ -762,7 +804,9 @@ const createCrSqliteWasmPersister = (
|
|
|
762
804
|
async (sql, args = []) => await db.execO(sql, args),
|
|
763
805
|
(listener) => db.onUpdate((_, _2, tableName) => listener(tableName)),
|
|
764
806
|
(removeListener) => removeListener(),
|
|
765
|
-
|
|
807
|
+
onSqlCommand,
|
|
808
|
+
onIgnoredError,
|
|
809
|
+
db,
|
|
766
810
|
);
|
|
767
811
|
|
|
768
812
|
export {createCrSqliteWasmPersister};
|