tinybase 4.0.0-beta.4 → 4.0.0-beta.5.1
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 -0
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -0
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -0
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -0
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -0
- 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/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
- 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/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/{persister-automerge.js → persisters/persister-automerge.js} +58 -31
- package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +49 -20
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
- package/lib/debug/{persister-file.js → persisters/persister-file.js} +51 -25
- package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +48 -19
- package/lib/debug/persisters/persister-sqlite-wasm.js +673 -0
- package/lib/debug/persisters/persister-sqlite3.js +676 -0
- package/lib/debug/{persister-yjs.js → persisters/persister-yjs.js} +49 -20
- package/lib/debug/persisters.js +47 -18
- package/lib/debug/store.js +79 -29
- package/lib/debug/tinybase.js +123 -46
- package/lib/debug/tools.js +121 -27
- package/lib/debug/ui-react.js +24 -0
- package/lib/es6/persisters/persister-automerge.js +1 -0
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -0
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -0
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -0
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -0
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -0
- 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/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -0
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -0
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -0
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -0
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -0
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -0
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/checkpoints.d.ts +0 -27
- package/lib/types/common.d.ts +0 -9
- package/lib/types/indexes.d.ts +0 -26
- package/lib/types/metrics.d.ts +0 -23
- package/lib/types/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
- package/lib/types/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +95 -0
- package/lib/types/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
- package/lib/types/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +102 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +109 -0
- package/lib/types/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
- package/lib/types/persisters.d.ts +517 -27
- package/lib/types/queries.d.ts +52 -127
- package/lib/types/relationships.d.ts +0 -26
- package/lib/types/store.d.ts +347 -196
- package/lib/types/tinybase.d.ts +0 -1
- package/lib/types/tools.d.ts +15 -28
- package/lib/types/ui-react.d.ts +196 -181
- package/lib/types/with-schemas/checkpoints.d.ts +5 -32
- package/lib/types/with-schemas/common.d.ts +0 -9
- package/lib/types/with-schemas/indexes.d.ts +9 -35
- package/lib/types/with-schemas/metrics.d.ts +9 -32
- package/lib/types/with-schemas/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
- package/lib/types/with-schemas/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +105 -0
- package/lib/types/with-schemas/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
- package/lib/types/with-schemas/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +113 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +119 -0
- package/lib/types/with-schemas/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
- package/lib/types/with-schemas/persisters.d.ts +534 -29
- package/lib/types/with-schemas/queries.d.ts +61 -224
- package/lib/types/with-schemas/relationships.d.ts +9 -35
- package/lib/types/with-schemas/store.d.ts +488 -239
- package/lib/types/with-schemas/tinybase.d.ts +0 -1
- package/lib/types/with-schemas/tools.d.ts +19 -32
- package/lib/types/with-schemas/ui-react.d.ts +221 -186
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -0
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -0
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -0
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -0
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -0
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -0
- 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/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -0
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -0
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -0
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -0
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -0
- 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/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +39 -22
- package/readme.md +3 -3
- package/lib/cjs/persister-automerge.cjs +0 -1
- package/lib/cjs/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persister-browser.cjs +0 -1
- package/lib/cjs/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persister-file.cjs +0 -1
- package/lib/cjs/persister-file.cjs.gz +0 -0
- package/lib/cjs/persister-remote.cjs +0 -1
- package/lib/cjs/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persister-yjs.cjs +0 -1
- package/lib/cjs/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persister-automerge.cjs +0 -1
- package/lib/cjs-es6/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persister-browser.cjs +0 -1
- package/lib/cjs-es6/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persister-file.cjs +0 -1
- package/lib/cjs-es6/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persister-remote.cjs +0 -1
- package/lib/cjs-es6/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persister-yjs.cjs +0 -1
- package/lib/cjs-es6/persister-yjs.cjs.gz +0 -0
- package/lib/es6/persister-automerge.js +0 -1
- package/lib/es6/persister-automerge.js.gz +0 -0
- package/lib/es6/persister-browser.js +0 -1
- package/lib/es6/persister-browser.js.gz +0 -0
- package/lib/es6/persister-file.js +0 -1
- package/lib/es6/persister-file.js.gz +0 -0
- package/lib/es6/persister-remote.js +0 -1
- package/lib/es6/persister-remote.js.gz +0 -0
- package/lib/es6/persister-yjs.js +0 -1
- package/lib/es6/persister-yjs.js.gz +0 -0
- package/lib/persister-automerge.js +0 -1
- package/lib/persister-automerge.js.gz +0 -0
- package/lib/persister-browser.js +0 -1
- package/lib/persister-browser.js.gz +0 -0
- package/lib/persister-file.js +0 -1
- package/lib/persister-file.js.gz +0 -0
- package/lib/persister-remote.js +0 -1
- package/lib/persister-remote.js.gz +0 -0
- package/lib/persister-yjs.js +0 -1
- package/lib/persister-yjs.js.gz +0 -0
- package/lib/umd/persister-automerge.js +0 -1
- package/lib/umd/persister-automerge.js.gz +0 -0
- package/lib/umd/persister-browser.js +0 -1
- package/lib/umd/persister-browser.js.gz +0 -0
- package/lib/umd/persister-file.js +0 -1
- package/lib/umd/persister-file.js.gz +0 -0
- package/lib/umd/persister-remote.js +0 -1
- package/lib/umd/persister-remote.js.gz +0 -0
- package/lib/umd/persister-yjs.js +0 -1
- package/lib/umd/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persister-automerge.js +0 -1
- package/lib/umd-es6/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persister-browser.js +0 -1
- package/lib/umd-es6/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persister-file.js +0 -1
- package/lib/umd-es6/persister-file.js.gz +0 -0
- package/lib/umd-es6/persister-remote.js +0 -1
- package/lib/umd-es6/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persister-yjs.js +0 -1
- package/lib/umd-es6/persister-yjs.js.gz +0 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
const TINYBASE = 'tinybase';
|
|
2
|
+
|
|
1
3
|
const arrayMap = (array, cb) => array.map(cb);
|
|
2
4
|
const arrayLength = (array) => array.length;
|
|
3
|
-
const
|
|
5
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
6
|
+
const arrayShift = (array) => array.shift();
|
|
4
7
|
|
|
5
8
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
6
9
|
const isUndefined = (thing) => thing == void 0;
|
|
@@ -14,10 +17,14 @@ const isObject = (obj) =>
|
|
|
14
17
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
15
18
|
const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
|
|
16
19
|
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
17
|
-
const objDel = (obj, id) =>
|
|
20
|
+
const objDel = (obj, id) => {
|
|
21
|
+
delete obj[id];
|
|
22
|
+
return obj;
|
|
23
|
+
};
|
|
18
24
|
const objMap = (obj, cb) =>
|
|
19
25
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
20
|
-
const
|
|
26
|
+
const objSize = (obj) => arrayLength(objIds(obj));
|
|
27
|
+
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
21
28
|
const objEnsure = (obj, id, getDefaultValue) => {
|
|
22
29
|
if (!objHas(obj, id)) {
|
|
23
30
|
obj[id] = getDefaultValue();
|
|
@@ -36,8 +43,23 @@ const createCustomPersister = (
|
|
|
36
43
|
let loadSave = 0;
|
|
37
44
|
let loads = 0;
|
|
38
45
|
let saves = 0;
|
|
39
|
-
let
|
|
46
|
+
let running = 0;
|
|
47
|
+
let listening = 0;
|
|
48
|
+
let action;
|
|
40
49
|
let listeningHandle;
|
|
50
|
+
const scheduledActions = [];
|
|
51
|
+
const run = async () => {
|
|
52
|
+
/* istanbul ignore else */
|
|
53
|
+
if (!running) {
|
|
54
|
+
running = 1;
|
|
55
|
+
while (!isUndefined((action = arrayShift(scheduledActions)))) {
|
|
56
|
+
try {
|
|
57
|
+
await action();
|
|
58
|
+
} catch {}
|
|
59
|
+
}
|
|
60
|
+
running = 0;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
41
63
|
const loadLock = async (actions) => {
|
|
42
64
|
/* istanbul ignore else */
|
|
43
65
|
if (loadSave != 2) {
|
|
@@ -50,20 +72,20 @@ const createCustomPersister = (
|
|
|
50
72
|
}
|
|
51
73
|
};
|
|
52
74
|
const persister = {
|
|
53
|
-
load: async (initialTables
|
|
75
|
+
load: async (initialTables, initialValues) => {
|
|
54
76
|
await loadLock(async () => {
|
|
55
|
-
let content;
|
|
56
77
|
try {
|
|
57
|
-
|
|
58
|
-
} catch {
|
|
59
|
-
|
|
78
|
+
store.setContent(await getPersisted());
|
|
79
|
+
} catch {
|
|
80
|
+
store.setContent([initialTables, initialValues]);
|
|
81
|
+
}
|
|
60
82
|
});
|
|
61
83
|
return persister;
|
|
62
84
|
},
|
|
63
85
|
startAutoLoad: async (initialTables = {}, initialValues = {}) => {
|
|
64
86
|
persister.stopAutoLoad();
|
|
65
87
|
await persister.load(initialTables, initialValues);
|
|
66
|
-
listening =
|
|
88
|
+
listening = 1;
|
|
67
89
|
listeningHandle = addPersisterListener(
|
|
68
90
|
async (getContent, getTransactionChanges) => {
|
|
69
91
|
await loadLock(async () => {
|
|
@@ -83,27 +105,33 @@ const createCustomPersister = (
|
|
|
83
105
|
if (listening) {
|
|
84
106
|
delPersisterListener(listeningHandle);
|
|
85
107
|
listeningHandle = void 0;
|
|
86
|
-
listening =
|
|
108
|
+
listening = 0;
|
|
87
109
|
}
|
|
88
110
|
return persister;
|
|
89
111
|
},
|
|
90
112
|
save: async (getTransactionChanges) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
loadSave
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
await persister.schedule(async () => {
|
|
114
|
+
/* istanbul ignore else */
|
|
115
|
+
if (loadSave != 1) {
|
|
116
|
+
loadSave = 2;
|
|
117
|
+
{
|
|
118
|
+
saves++;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await setPersisted(store.getContent, getTransactionChanges);
|
|
122
|
+
} catch {}
|
|
123
|
+
loadSave = 0;
|
|
96
124
|
}
|
|
97
|
-
|
|
98
|
-
loadSave = 0;
|
|
99
|
-
}
|
|
125
|
+
});
|
|
100
126
|
return persister;
|
|
101
127
|
},
|
|
102
128
|
startAutoSave: async () => {
|
|
103
129
|
await persister.stopAutoSave().save();
|
|
104
130
|
listenerId = store.addDidFinishTransactionListener(
|
|
105
|
-
(_store, getTransactionChanges) =>
|
|
106
|
-
|
|
131
|
+
(_store, getTransactionChanges) => {
|
|
132
|
+
const transactionChanges = getTransactionChanges();
|
|
133
|
+
persister.save(() => transactionChanges);
|
|
134
|
+
},
|
|
107
135
|
);
|
|
108
136
|
return persister;
|
|
109
137
|
},
|
|
@@ -111,6 +139,11 @@ const createCustomPersister = (
|
|
|
111
139
|
ifNotUndefined(listenerId, store.delListener);
|
|
112
140
|
return persister;
|
|
113
141
|
},
|
|
142
|
+
schedule: async (...actions) => {
|
|
143
|
+
arrayPush(scheduledActions, ...actions);
|
|
144
|
+
await run();
|
|
145
|
+
return persister;
|
|
146
|
+
},
|
|
114
147
|
getStore: () => store,
|
|
115
148
|
destroy: () => persister.stopAutoLoad().stopAutoSave(),
|
|
116
149
|
getStats: () => ({loads, saves}),
|
|
@@ -216,18 +249,13 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
|
|
|
216
249
|
}
|
|
217
250
|
return changed;
|
|
218
251
|
};
|
|
219
|
-
const createAutomergePersister = (
|
|
220
|
-
store,
|
|
221
|
-
docHandle,
|
|
222
|
-
docObjName = 'tinybase',
|
|
223
|
-
) => {
|
|
252
|
+
const createAutomergePersister = (store, docHandle, docObjName = TINYBASE) => {
|
|
224
253
|
docHandle.change((doc) => (doc[docObjName] = {}));
|
|
225
|
-
const getPersisted = async () =>
|
|
226
|
-
|
|
254
|
+
const getPersisted = async () =>
|
|
255
|
+
objSize(docHandle.doc[docObjName]) == 2
|
|
227
256
|
? getDocContent(docHandle.doc, docObjName)
|
|
228
257
|
: void 0;
|
|
229
|
-
|
|
230
|
-
const setPersisted = async (getContent, getTransactionChanges) => {
|
|
258
|
+
const setPersisted = async (getContent, getTransactionChanges) =>
|
|
231
259
|
docHandle.change((doc) =>
|
|
232
260
|
setTransactionChangesToDoc(
|
|
233
261
|
doc,
|
|
@@ -236,7 +264,6 @@ const createAutomergePersister = (
|
|
|
236
264
|
getTransactionChanges,
|
|
237
265
|
),
|
|
238
266
|
);
|
|
239
|
-
};
|
|
240
267
|
const addPersisterListener = (listener) => {
|
|
241
268
|
const observer = ({doc}) => listener(() => getDocContent(doc, docObjName));
|
|
242
269
|
docHandle.on('change', observer);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
2
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
3
|
+
const arrayShift = (array) => array.shift();
|
|
2
4
|
|
|
3
5
|
const jsonString = (obj) =>
|
|
4
6
|
JSON.stringify(obj, (_key, value) =>
|
|
@@ -13,6 +15,7 @@ const jsonString = (obj) =>
|
|
|
13
15
|
)
|
|
14
16
|
: value,
|
|
15
17
|
);
|
|
18
|
+
const jsonParse = JSON.parse;
|
|
16
19
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
17
20
|
const isUndefined = (thing) => thing == void 0;
|
|
18
21
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
@@ -32,8 +35,23 @@ const createCustomPersister = (
|
|
|
32
35
|
let loadSave = 0;
|
|
33
36
|
let loads = 0;
|
|
34
37
|
let saves = 0;
|
|
35
|
-
let
|
|
38
|
+
let running = 0;
|
|
39
|
+
let listening = 0;
|
|
40
|
+
let action;
|
|
36
41
|
let listeningHandle;
|
|
42
|
+
const scheduledActions = [];
|
|
43
|
+
const run = async () => {
|
|
44
|
+
/* istanbul ignore else */
|
|
45
|
+
if (!running) {
|
|
46
|
+
running = 1;
|
|
47
|
+
while (!isUndefined((action = arrayShift(scheduledActions)))) {
|
|
48
|
+
try {
|
|
49
|
+
await action();
|
|
50
|
+
} catch {}
|
|
51
|
+
}
|
|
52
|
+
running = 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
37
55
|
const loadLock = async (actions) => {
|
|
38
56
|
/* istanbul ignore else */
|
|
39
57
|
if (loadSave != 2) {
|
|
@@ -46,20 +64,20 @@ const createCustomPersister = (
|
|
|
46
64
|
}
|
|
47
65
|
};
|
|
48
66
|
const persister = {
|
|
49
|
-
load: async (initialTables
|
|
67
|
+
load: async (initialTables, initialValues) => {
|
|
50
68
|
await loadLock(async () => {
|
|
51
|
-
let content;
|
|
52
69
|
try {
|
|
53
|
-
|
|
54
|
-
} catch {
|
|
55
|
-
|
|
70
|
+
store.setContent(await getPersisted());
|
|
71
|
+
} catch {
|
|
72
|
+
store.setContent([initialTables, initialValues]);
|
|
73
|
+
}
|
|
56
74
|
});
|
|
57
75
|
return persister;
|
|
58
76
|
},
|
|
59
77
|
startAutoLoad: async (initialTables = {}, initialValues = {}) => {
|
|
60
78
|
persister.stopAutoLoad();
|
|
61
79
|
await persister.load(initialTables, initialValues);
|
|
62
|
-
listening =
|
|
80
|
+
listening = 1;
|
|
63
81
|
listeningHandle = addPersisterListener(
|
|
64
82
|
async (getContent, getTransactionChanges) => {
|
|
65
83
|
await loadLock(async () => {
|
|
@@ -79,27 +97,33 @@ const createCustomPersister = (
|
|
|
79
97
|
if (listening) {
|
|
80
98
|
delPersisterListener(listeningHandle);
|
|
81
99
|
listeningHandle = void 0;
|
|
82
|
-
listening =
|
|
100
|
+
listening = 0;
|
|
83
101
|
}
|
|
84
102
|
return persister;
|
|
85
103
|
},
|
|
86
104
|
save: async (getTransactionChanges) => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
loadSave
|
|
90
|
-
|
|
91
|
-
|
|
105
|
+
await persister.schedule(async () => {
|
|
106
|
+
/* istanbul ignore else */
|
|
107
|
+
if (loadSave != 1) {
|
|
108
|
+
loadSave = 2;
|
|
109
|
+
{
|
|
110
|
+
saves++;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await setPersisted(store.getContent, getTransactionChanges);
|
|
114
|
+
} catch {}
|
|
115
|
+
loadSave = 0;
|
|
92
116
|
}
|
|
93
|
-
|
|
94
|
-
loadSave = 0;
|
|
95
|
-
}
|
|
117
|
+
});
|
|
96
118
|
return persister;
|
|
97
119
|
},
|
|
98
120
|
startAutoSave: async () => {
|
|
99
121
|
await persister.stopAutoSave().save();
|
|
100
122
|
listenerId = store.addDidFinishTransactionListener(
|
|
101
|
-
(_store, getTransactionChanges) =>
|
|
102
|
-
|
|
123
|
+
(_store, getTransactionChanges) => {
|
|
124
|
+
const transactionChanges = getTransactionChanges();
|
|
125
|
+
persister.save(() => transactionChanges);
|
|
126
|
+
},
|
|
103
127
|
);
|
|
104
128
|
return persister;
|
|
105
129
|
},
|
|
@@ -107,6 +131,11 @@ const createCustomPersister = (
|
|
|
107
131
|
ifNotUndefined(listenerId, store.delListener);
|
|
108
132
|
return persister;
|
|
109
133
|
},
|
|
134
|
+
schedule: async (...actions) => {
|
|
135
|
+
arrayPush(scheduledActions, ...actions);
|
|
136
|
+
await run();
|
|
137
|
+
return persister;
|
|
138
|
+
},
|
|
110
139
|
getStore: () => store,
|
|
111
140
|
destroy: () => persister.stopAutoLoad().stopAutoSave(),
|
|
112
141
|
getStats: () => ({loads, saves}),
|
|
@@ -117,13 +146,13 @@ const createCustomPersister = (
|
|
|
117
146
|
const STORAGE = 'storage';
|
|
118
147
|
const WINDOW = globalThis.window;
|
|
119
148
|
const getStoragePersister = (store, storageName, storage) => {
|
|
120
|
-
const getPersisted = async () =>
|
|
149
|
+
const getPersisted = async () => jsonParse(storage.getItem(storageName));
|
|
121
150
|
const setPersisted = async (getContent) =>
|
|
122
151
|
storage.setItem(storageName, jsonString(getContent()));
|
|
123
152
|
const addPersisterListener = (listener) => {
|
|
124
153
|
const storeListener = (event) => {
|
|
125
154
|
if (event.storageArea === storage && event.key === storageName) {
|
|
126
|
-
listener(() =>
|
|
155
|
+
listener(() => jsonParse(event.newValue));
|
|
127
156
|
}
|
|
128
157
|
};
|
|
129
158
|
WINDOW.addEventListener(STORAGE, storeListener);
|