tinybase 4.0.0-beta.4 → 4.0.0-beta.5
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} +57 -30
- package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +48 -19
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
- package/lib/debug/{persister-file.js → persisters/persister-file.js} +50 -24
- package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +47 -18
- 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} +48 -19
- package/lib/debug/persisters.js +46 -17
- package/lib/debug/store.js +77 -27
- package/lib/debug/tinybase.js +120 -43
- 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 +38 -21
- 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,9 +1,11 @@
|
|
|
1
|
-
import {readFile, writeFile} from 'fs/promises';
|
|
2
1
|
import {watch} from 'fs';
|
|
2
|
+
import {readFile, writeFile} from 'fs/promises';
|
|
3
3
|
|
|
4
4
|
const UTF8 = 'utf8';
|
|
5
5
|
|
|
6
6
|
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
7
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
8
|
+
const arrayShift = (array) => array.shift();
|
|
7
9
|
|
|
8
10
|
const jsonString = (obj) =>
|
|
9
11
|
JSON.stringify(obj, (_key, value) =>
|
|
@@ -18,6 +20,7 @@ const jsonString = (obj) =>
|
|
|
18
20
|
)
|
|
19
21
|
: value,
|
|
20
22
|
);
|
|
23
|
+
const jsonParse = JSON.parse;
|
|
21
24
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
22
25
|
const isUndefined = (thing) => thing == void 0;
|
|
23
26
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
@@ -37,8 +40,23 @@ const createCustomPersister = (
|
|
|
37
40
|
let loadSave = 0;
|
|
38
41
|
let loads = 0;
|
|
39
42
|
let saves = 0;
|
|
40
|
-
let
|
|
43
|
+
let running = 0;
|
|
44
|
+
let listening = 0;
|
|
45
|
+
let action;
|
|
41
46
|
let listeningHandle;
|
|
47
|
+
const scheduledActions = [];
|
|
48
|
+
const run = async () => {
|
|
49
|
+
/* istanbul ignore else */
|
|
50
|
+
if (!running) {
|
|
51
|
+
running = 1;
|
|
52
|
+
while (!isUndefined((action = arrayShift(scheduledActions)))) {
|
|
53
|
+
try {
|
|
54
|
+
await action();
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
running = 0;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
42
60
|
const loadLock = async (actions) => {
|
|
43
61
|
/* istanbul ignore else */
|
|
44
62
|
if (loadSave != 2) {
|
|
@@ -53,18 +71,18 @@ const createCustomPersister = (
|
|
|
53
71
|
const persister = {
|
|
54
72
|
load: async (initialTables = {}, initialValues = {}) => {
|
|
55
73
|
await loadLock(async () => {
|
|
56
|
-
let content;
|
|
57
74
|
try {
|
|
58
|
-
|
|
59
|
-
} catch {
|
|
60
|
-
|
|
75
|
+
store.setContent(await getPersisted());
|
|
76
|
+
} catch {
|
|
77
|
+
store.setContent([initialTables, initialValues]);
|
|
78
|
+
}
|
|
61
79
|
});
|
|
62
80
|
return persister;
|
|
63
81
|
},
|
|
64
82
|
startAutoLoad: async (initialTables = {}, initialValues = {}) => {
|
|
65
83
|
persister.stopAutoLoad();
|
|
66
84
|
await persister.load(initialTables, initialValues);
|
|
67
|
-
listening =
|
|
85
|
+
listening = 1;
|
|
68
86
|
listeningHandle = addPersisterListener(
|
|
69
87
|
async (getContent, getTransactionChanges) => {
|
|
70
88
|
await loadLock(async () => {
|
|
@@ -84,27 +102,33 @@ const createCustomPersister = (
|
|
|
84
102
|
if (listening) {
|
|
85
103
|
delPersisterListener(listeningHandle);
|
|
86
104
|
listeningHandle = void 0;
|
|
87
|
-
listening =
|
|
105
|
+
listening = 0;
|
|
88
106
|
}
|
|
89
107
|
return persister;
|
|
90
108
|
},
|
|
91
109
|
save: async (getTransactionChanges) => {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
loadSave
|
|
95
|
-
|
|
96
|
-
|
|
110
|
+
await persister.schedule(async () => {
|
|
111
|
+
/* istanbul ignore else */
|
|
112
|
+
if (loadSave != 1) {
|
|
113
|
+
loadSave = 2;
|
|
114
|
+
{
|
|
115
|
+
saves++;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
await setPersisted(store.getContent, getTransactionChanges);
|
|
119
|
+
} catch {}
|
|
120
|
+
loadSave = 0;
|
|
97
121
|
}
|
|
98
|
-
|
|
99
|
-
loadSave = 0;
|
|
100
|
-
}
|
|
122
|
+
});
|
|
101
123
|
return persister;
|
|
102
124
|
},
|
|
103
125
|
startAutoSave: async () => {
|
|
104
126
|
await persister.stopAutoSave().save();
|
|
105
127
|
listenerId = store.addDidFinishTransactionListener(
|
|
106
|
-
(_store, getTransactionChanges) =>
|
|
107
|
-
|
|
128
|
+
(_store, getTransactionChanges) => {
|
|
129
|
+
const transactionChanges = getTransactionChanges();
|
|
130
|
+
persister.save(() => transactionChanges);
|
|
131
|
+
},
|
|
108
132
|
);
|
|
109
133
|
return persister;
|
|
110
134
|
},
|
|
@@ -112,6 +136,11 @@ const createCustomPersister = (
|
|
|
112
136
|
ifNotUndefined(listenerId, store.delListener);
|
|
113
137
|
return persister;
|
|
114
138
|
},
|
|
139
|
+
schedule: async (...actions) => {
|
|
140
|
+
arrayPush(scheduledActions, ...actions);
|
|
141
|
+
await run();
|
|
142
|
+
return persister;
|
|
143
|
+
},
|
|
115
144
|
getStore: () => store,
|
|
116
145
|
destroy: () => persister.stopAutoLoad().stopAutoSave(),
|
|
117
146
|
getStats: () => ({loads, saves}),
|
|
@@ -120,12 +149,9 @@ const createCustomPersister = (
|
|
|
120
149
|
};
|
|
121
150
|
|
|
122
151
|
const createFilePersister = (store, filePath) => {
|
|
123
|
-
const getPersisted = async () =>
|
|
124
|
-
const setPersisted = async (getContent) =>
|
|
125
|
-
|
|
126
|
-
await writeFile(filePath, jsonString(getContent()), UTF8);
|
|
127
|
-
} catch {}
|
|
128
|
-
};
|
|
152
|
+
const getPersisted = async () => jsonParse(await readFile(filePath, UTF8));
|
|
153
|
+
const setPersisted = async (getContent) =>
|
|
154
|
+
await writeFile(filePath, jsonString(getContent()), UTF8);
|
|
129
155
|
const addPersisterListener = (listener) => watch(filePath, () => listener());
|
|
130
156
|
const delPersisterListener = (watcher) => watcher?.close();
|
|
131
157
|
return createCustomPersister(
|
|
@@ -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) {
|
|
@@ -48,18 +66,18 @@ const createCustomPersister = (
|
|
|
48
66
|
const persister = {
|
|
49
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}),
|
|
@@ -125,7 +154,7 @@ const createRemotePersister = (
|
|
|
125
154
|
const getPersisted = async () => {
|
|
126
155
|
const response = await fetch(loadUrl);
|
|
127
156
|
lastEtag = getETag(response);
|
|
128
|
-
return
|
|
157
|
+
return jsonParse(await response.text());
|
|
129
158
|
};
|
|
130
159
|
const setPersisted = async (getContent) =>
|
|
131
160
|
await fetch(saveUrl, {
|