tinybase 9.4.0-beta.1 → 9.4.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/@types/persisters/index.d.ts +4 -0
- package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -2
- package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +9 -2
- package/@types/persisters/with-schemas/index.d.ts +4 -0
- package/@types/queries/index.d.ts +4 -0
- package/@types/queries/with-schemas/index.d.ts +4 -0
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +7 -3
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +7 -3
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +9 -3
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +9 -3
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +6 -3
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +6 -3
- package/@types/ui-react-dom/index.d.ts +10 -10
- package/@types/ui-react-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-react-dom-charts/index.d.ts +7 -7
- package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
- package/@types/ui-react-inspector/index.d.ts +1 -1
- package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-solid-dom/index.d.ts +10 -10
- package/@types/ui-solid-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-solid-inspector/index.d.ts +1 -1
- package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-svelte-dom/index.d.ts +10 -10
- package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-svelte-inspector/index.d.ts +1 -1
- package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
- package/index.js +191 -74
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/queries/index.js +1 -1
- package/min/queries/index.js.gz +0 -0
- package/min/queries/with-schemas/index.js +1 -1
- package/min/queries/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/ui-solid-inspector/index.js +1 -1
- package/min/ui-solid-inspector/index.js.gz +0 -0
- package/min/ui-solid-inspector/with-schemas/index.js +1 -1
- package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
- package/min/ui-svelte-inspector/index.js +1 -1
- package/min/ui-svelte-inspector/index.js.gz +0 -0
- package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
- package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/omni/index.js +606 -179
- package/omni/with-schemas/index.js +606 -179
- package/package.json +12 -8
- package/persisters/index.js +49 -10
- package/persisters/persister-automerge/index.js +29 -5
- package/persisters/persister-automerge/with-schemas/index.js +29 -5
- package/persisters/persister-browser/index.js +29 -5
- package/persisters/persister-browser/with-schemas/index.js +29 -5
- package/persisters/persister-cr-sqlite-wasm/index.js +29 -5
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -5
- package/persisters/persister-durable-object-sql-storage/index.js +44 -8
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +44 -8
- package/persisters/persister-durable-object-storage/index.js +31 -5
- package/persisters/persister-durable-object-storage/with-schemas/index.js +31 -5
- package/persisters/persister-electric-sql/index.js +29 -5
- package/persisters/persister-electric-sql/with-schemas/index.js +29 -5
- package/persisters/persister-expo-sqlite/index.js +29 -5
- package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -5
- package/persisters/persister-file/index.js +31 -5
- package/persisters/persister-file/with-schemas/index.js +31 -5
- package/persisters/persister-indexed-db/index.js +29 -5
- package/persisters/persister-indexed-db/with-schemas/index.js +29 -5
- package/persisters/persister-libsql/index.js +29 -5
- package/persisters/persister-libsql/with-schemas/index.js +29 -5
- package/persisters/persister-partykit-client/index.js +31 -5
- package/persisters/persister-partykit-client/with-schemas/index.js +31 -5
- package/persisters/persister-pglite/index.js +49 -10
- package/persisters/persister-pglite/with-schemas/index.js +49 -10
- package/persisters/persister-postgres/index.js +49 -10
- package/persisters/persister-postgres/with-schemas/index.js +49 -10
- package/persisters/persister-powersync/index.js +29 -5
- package/persisters/persister-powersync/with-schemas/index.js +29 -5
- package/persisters/persister-react-native-mmkv/index.js +31 -5
- package/persisters/persister-react-native-mmkv/with-schemas/index.js +31 -5
- package/persisters/persister-react-native-sqlite/index.js +29 -5
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -5
- package/persisters/persister-remote/index.js +31 -5
- package/persisters/persister-remote/with-schemas/index.js +31 -5
- package/persisters/persister-sqlite-bun/index.js +29 -5
- package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -5
- package/persisters/persister-sqlite-wasm/index.js +29 -5
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -5
- package/persisters/persister-sqlite3/index.js +29 -5
- package/persisters/persister-sqlite3/with-schemas/index.js +29 -5
- package/persisters/persister-yjs/index.js +29 -5
- package/persisters/persister-yjs/with-schemas/index.js +29 -5
- package/persisters/with-schemas/index.js +49 -10
- package/queries/index.js +205 -74
- package/queries/with-schemas/index.js +205 -74
- package/readme.md +14 -14
- package/releases.md +84 -67
- package/synchronizers/index.js +31 -5
- package/synchronizers/synchronizer-broadcast-channel/index.js +39 -13
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +39 -13
- package/synchronizers/synchronizer-local/index.js +31 -5
- package/synchronizers/synchronizer-local/with-schemas/index.js +31 -5
- package/synchronizers/synchronizer-ws-client/index.js +220 -61
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +220 -61
- package/synchronizers/synchronizer-ws-server/index.js +253 -73
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +253 -73
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +88 -40
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +88 -40
- package/synchronizers/synchronizer-ws-server-simple/index.js +184 -60
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +184 -60
- package/synchronizers/with-schemas/index.js +31 -5
- package/ui-react-inspector/index.js +29 -5
- package/ui-react-inspector/with-schemas/index.js +29 -5
- package/ui-solid-inspector/index.js +29 -5
- package/ui-solid-inspector/with-schemas/index.js +29 -5
- package/ui-svelte-inspector/index.js +29 -5
- package/ui-svelte-inspector/with-schemas/index.js +29 -5
- package/with-schemas/index.js +191 -74
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinybase",
|
|
3
|
-
"version": "9.4.0
|
|
3
|
+
"version": "9.4.0",
|
|
4
4
|
"author": "jamesgpearce",
|
|
5
|
-
"repository":
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/tinyplex/tinybase.git"
|
|
8
|
+
},
|
|
6
9
|
"license": "MIT",
|
|
7
10
|
"homepage": "https://tinybase.org",
|
|
8
11
|
"description": "A reactive in-memory data store with persistence and synchronization for local-first JavaScript and TypeScript apps.",
|
|
@@ -31,7 +34,7 @@
|
|
|
31
34
|
"sideEffects": false,
|
|
32
35
|
"peerDependencies": {
|
|
33
36
|
"@automerge/automerge-repo": "^2.5.6",
|
|
34
|
-
"@cloudflare/workers-types": "^5.
|
|
37
|
+
"@cloudflare/workers-types": "^5.20260807.2",
|
|
35
38
|
"@electric-sql/pglite": "^0.5.4",
|
|
36
39
|
"@libsql/client": "^0.17.4",
|
|
37
40
|
"@powersync/common": "^2.0.0",
|
|
@@ -40,9 +43,9 @@
|
|
|
40
43
|
"@vlcn.io/crsqlite-wasm": "^0.16.0",
|
|
41
44
|
"arktype": "^2.2.3",
|
|
42
45
|
"bun": "^1.3.14",
|
|
43
|
-
"effect": "^3.22.
|
|
46
|
+
"effect": "^3.22.1",
|
|
44
47
|
"electric-sql": "^0.12.1",
|
|
45
|
-
"expo": "^57.0.
|
|
48
|
+
"expo": "^57.0.11",
|
|
46
49
|
"expo-sqlite": "^57.0.1",
|
|
47
50
|
"partykit": "^0.0.115",
|
|
48
51
|
"partysocket": "^1.3.0",
|
|
@@ -55,8 +58,8 @@
|
|
|
55
58
|
"sqlite3": "^5.1.7",
|
|
56
59
|
"svelte": "^5.56.8",
|
|
57
60
|
"valibot": "^1.4.2",
|
|
58
|
-
"ws": "^8.21.
|
|
59
|
-
"yjs": "^13.6.
|
|
61
|
+
"ws": "^8.21.3",
|
|
62
|
+
"yjs": "^13.6.32",
|
|
60
63
|
"zod": "^4.4.3"
|
|
61
64
|
},
|
|
62
65
|
"peerDependenciesMeta": {
|
|
@@ -148,7 +151,8 @@
|
|
|
148
151
|
"overrides": {
|
|
149
152
|
"@rolldown/plugin-babel": {
|
|
150
153
|
"@babel/plugin-transform-runtime": "7.29.7"
|
|
151
|
-
}
|
|
154
|
+
},
|
|
155
|
+
"better-sqlite3": "$better-sqlite3"
|
|
152
156
|
},
|
|
153
157
|
"main": "./index.js",
|
|
154
158
|
"types": "./@types/index.d.ts",
|
package/persisters/index.js
CHANGED
|
@@ -653,11 +653,35 @@ const createCustomPersister = (
|
|
|
653
653
|
initialContent,
|
|
654
654
|
startSaveFirst = false,
|
|
655
655
|
) => {
|
|
656
|
-
const [call1, call2] = startSaveFirst
|
|
657
|
-
? [startAutoSave, startAutoLoad]
|
|
658
|
-
: [startAutoLoad, startAutoSave];
|
|
659
|
-
|
|
660
|
-
|
|
656
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
657
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
658
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
659
|
+
const start1 = call1(initialContent);
|
|
660
|
+
const generation1 = startSaveFirst
|
|
661
|
+
? autoSaveGeneration
|
|
662
|
+
: autoLoadGeneration;
|
|
663
|
+
await start1;
|
|
664
|
+
const start2 = call2(initialContent);
|
|
665
|
+
const generation2 = startSaveFirst
|
|
666
|
+
? autoLoadGeneration
|
|
667
|
+
: autoSaveGeneration;
|
|
668
|
+
try {
|
|
669
|
+
await start2;
|
|
670
|
+
} catch (error) {
|
|
671
|
+
if (
|
|
672
|
+
generation2 ==
|
|
673
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
674
|
+
) {
|
|
675
|
+
await tryCatchIgnore(stop2);
|
|
676
|
+
}
|
|
677
|
+
if (
|
|
678
|
+
generation1 ==
|
|
679
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
680
|
+
) {
|
|
681
|
+
await tryCatchIgnore(stop1);
|
|
682
|
+
}
|
|
683
|
+
throw error;
|
|
684
|
+
}
|
|
661
685
|
return persister;
|
|
662
686
|
};
|
|
663
687
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -1566,6 +1590,8 @@ const createTabularPersister = (
|
|
|
1566
1590
|
const TABLE_CREATED = 'c';
|
|
1567
1591
|
const DATA_CHANGED = 'd';
|
|
1568
1592
|
const EVENT_REGEX = /^([cd]:)(.+)/;
|
|
1593
|
+
const SIMPLE_TABLE_NAME = /^[A-Za-z0-9_]+$/;
|
|
1594
|
+
const POSTGRES_IDENTIFIER_SIZE = 63;
|
|
1569
1595
|
const listenerResourcesByThing = mapNew();
|
|
1570
1596
|
const createCustomPostgreSqlPersister = (
|
|
1571
1597
|
store,
|
|
@@ -1638,17 +1664,30 @@ const createCustomPostgreSqlPersister = (
|
|
|
1638
1664
|
);
|
|
1639
1665
|
const addDataChangedTriggers = (tableName, dataChangedFunction) =>
|
|
1640
1666
|
promiseAll(
|
|
1641
|
-
arrayMap([INSERT, DELETE, UPDATE], (action, newOrOldOrBoth) =>
|
|
1642
|
-
|
|
1667
|
+
arrayMap([INSERT, DELETE, UPDATE], (action, newOrOldOrBoth) => {
|
|
1668
|
+
const legacyTriggerId = arrayJoin(
|
|
1669
|
+
[TINYBASE, DATA_CHANGED, configHash, tableName, action],
|
|
1670
|
+
'_',
|
|
1671
|
+
);
|
|
1672
|
+
return createTrigger(
|
|
1643
1673
|
OR_REPLACE,
|
|
1644
|
-
|
|
1674
|
+
test(SIMPLE_TABLE_NAME, tableName) &&
|
|
1675
|
+
size(legacyTriggerId) <= POSTGRES_IDENTIFIER_SIZE
|
|
1676
|
+
? escapeId(legacyTriggerId)
|
|
1677
|
+
: escapeIds(
|
|
1678
|
+
TINYBASE,
|
|
1679
|
+
DATA_CHANGED,
|
|
1680
|
+
configHash,
|
|
1681
|
+
action,
|
|
1682
|
+
EMPTY_STRING + getHash(tableName),
|
|
1683
|
+
),
|
|
1645
1684
|
`AFTER ${action} ON${escapeId(tableName)}FOR EACH ROW WHEN(${when(
|
|
1646
1685
|
tableName,
|
|
1647
1686
|
newOrOldOrBoth,
|
|
1648
1687
|
)})`,
|
|
1649
1688
|
dataChangedFunction,
|
|
1650
|
-
)
|
|
1651
|
-
),
|
|
1689
|
+
);
|
|
1690
|
+
}),
|
|
1652
1691
|
);
|
|
1653
1692
|
const dropFunctions = async (functionNames) => {
|
|
1654
1693
|
if (!isEmpty(functionNames)) {
|
|
@@ -618,11 +618,35 @@ const createCustomPersister = (
|
|
|
618
618
|
initialContent,
|
|
619
619
|
startSaveFirst = false,
|
|
620
620
|
) => {
|
|
621
|
-
const [call1, call2] = startSaveFirst
|
|
622
|
-
? [startAutoSave, startAutoLoad]
|
|
623
|
-
: [startAutoLoad, startAutoSave];
|
|
624
|
-
|
|
625
|
-
|
|
621
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
622
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
623
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
624
|
+
const start1 = call1(initialContent);
|
|
625
|
+
const generation1 = startSaveFirst
|
|
626
|
+
? autoSaveGeneration
|
|
627
|
+
: autoLoadGeneration;
|
|
628
|
+
await start1;
|
|
629
|
+
const start2 = call2(initialContent);
|
|
630
|
+
const generation2 = startSaveFirst
|
|
631
|
+
? autoLoadGeneration
|
|
632
|
+
: autoSaveGeneration;
|
|
633
|
+
try {
|
|
634
|
+
await start2;
|
|
635
|
+
} catch (error) {
|
|
636
|
+
if (
|
|
637
|
+
generation2 ==
|
|
638
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
639
|
+
) {
|
|
640
|
+
await tryCatchIgnore(stop2);
|
|
641
|
+
}
|
|
642
|
+
if (
|
|
643
|
+
generation1 ==
|
|
644
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
645
|
+
) {
|
|
646
|
+
await tryCatchIgnore(stop1);
|
|
647
|
+
}
|
|
648
|
+
throw error;
|
|
649
|
+
}
|
|
626
650
|
return persister;
|
|
627
651
|
};
|
|
628
652
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -618,11 +618,35 @@ const createCustomPersister = (
|
|
|
618
618
|
initialContent,
|
|
619
619
|
startSaveFirst = false,
|
|
620
620
|
) => {
|
|
621
|
-
const [call1, call2] = startSaveFirst
|
|
622
|
-
? [startAutoSave, startAutoLoad]
|
|
623
|
-
: [startAutoLoad, startAutoSave];
|
|
624
|
-
|
|
625
|
-
|
|
621
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
622
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
623
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
624
|
+
const start1 = call1(initialContent);
|
|
625
|
+
const generation1 = startSaveFirst
|
|
626
|
+
? autoSaveGeneration
|
|
627
|
+
: autoLoadGeneration;
|
|
628
|
+
await start1;
|
|
629
|
+
const start2 = call2(initialContent);
|
|
630
|
+
const generation2 = startSaveFirst
|
|
631
|
+
? autoLoadGeneration
|
|
632
|
+
: autoSaveGeneration;
|
|
633
|
+
try {
|
|
634
|
+
await start2;
|
|
635
|
+
} catch (error) {
|
|
636
|
+
if (
|
|
637
|
+
generation2 ==
|
|
638
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
639
|
+
) {
|
|
640
|
+
await tryCatchIgnore(stop2);
|
|
641
|
+
}
|
|
642
|
+
if (
|
|
643
|
+
generation1 ==
|
|
644
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
645
|
+
) {
|
|
646
|
+
await tryCatchIgnore(stop1);
|
|
647
|
+
}
|
|
648
|
+
throw error;
|
|
649
|
+
}
|
|
626
650
|
return persister;
|
|
627
651
|
};
|
|
628
652
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -623,11 +623,35 @@ const createCustomPersister = (
|
|
|
623
623
|
initialContent,
|
|
624
624
|
startSaveFirst = false,
|
|
625
625
|
) => {
|
|
626
|
-
const [call1, call2] = startSaveFirst
|
|
627
|
-
? [startAutoSave, startAutoLoad]
|
|
628
|
-
: [startAutoLoad, startAutoSave];
|
|
629
|
-
|
|
630
|
-
|
|
626
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
627
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
628
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
629
|
+
const start1 = call1(initialContent);
|
|
630
|
+
const generation1 = startSaveFirst
|
|
631
|
+
? autoSaveGeneration
|
|
632
|
+
: autoLoadGeneration;
|
|
633
|
+
await start1;
|
|
634
|
+
const start2 = call2(initialContent);
|
|
635
|
+
const generation2 = startSaveFirst
|
|
636
|
+
? autoLoadGeneration
|
|
637
|
+
: autoSaveGeneration;
|
|
638
|
+
try {
|
|
639
|
+
await start2;
|
|
640
|
+
} catch (error) {
|
|
641
|
+
if (
|
|
642
|
+
generation2 ==
|
|
643
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
644
|
+
) {
|
|
645
|
+
await tryCatchIgnore(stop2);
|
|
646
|
+
}
|
|
647
|
+
if (
|
|
648
|
+
generation1 ==
|
|
649
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
650
|
+
) {
|
|
651
|
+
await tryCatchIgnore(stop1);
|
|
652
|
+
}
|
|
653
|
+
throw error;
|
|
654
|
+
}
|
|
631
655
|
return persister;
|
|
632
656
|
};
|
|
633
657
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -623,11 +623,35 @@ const createCustomPersister = (
|
|
|
623
623
|
initialContent,
|
|
624
624
|
startSaveFirst = false,
|
|
625
625
|
) => {
|
|
626
|
-
const [call1, call2] = startSaveFirst
|
|
627
|
-
? [startAutoSave, startAutoLoad]
|
|
628
|
-
: [startAutoLoad, startAutoSave];
|
|
629
|
-
|
|
630
|
-
|
|
626
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
627
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
628
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
629
|
+
const start1 = call1(initialContent);
|
|
630
|
+
const generation1 = startSaveFirst
|
|
631
|
+
? autoSaveGeneration
|
|
632
|
+
: autoLoadGeneration;
|
|
633
|
+
await start1;
|
|
634
|
+
const start2 = call2(initialContent);
|
|
635
|
+
const generation2 = startSaveFirst
|
|
636
|
+
? autoLoadGeneration
|
|
637
|
+
: autoSaveGeneration;
|
|
638
|
+
try {
|
|
639
|
+
await start2;
|
|
640
|
+
} catch (error) {
|
|
641
|
+
if (
|
|
642
|
+
generation2 ==
|
|
643
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
644
|
+
) {
|
|
645
|
+
await tryCatchIgnore(stop2);
|
|
646
|
+
}
|
|
647
|
+
if (
|
|
648
|
+
generation1 ==
|
|
649
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
650
|
+
) {
|
|
651
|
+
await tryCatchIgnore(stop1);
|
|
652
|
+
}
|
|
653
|
+
throw error;
|
|
654
|
+
}
|
|
631
655
|
return persister;
|
|
632
656
|
};
|
|
633
657
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -826,11 +826,35 @@ const createCustomPersister = (
|
|
|
826
826
|
initialContent,
|
|
827
827
|
startSaveFirst = false,
|
|
828
828
|
) => {
|
|
829
|
-
const [call1, call2] = startSaveFirst
|
|
830
|
-
? [startAutoSave, startAutoLoad]
|
|
831
|
-
: [startAutoLoad, startAutoSave];
|
|
832
|
-
|
|
833
|
-
|
|
829
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
830
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
831
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
832
|
+
const start1 = call1(initialContent);
|
|
833
|
+
const generation1 = startSaveFirst
|
|
834
|
+
? autoSaveGeneration
|
|
835
|
+
: autoLoadGeneration;
|
|
836
|
+
await start1;
|
|
837
|
+
const start2 = call2(initialContent);
|
|
838
|
+
const generation2 = startSaveFirst
|
|
839
|
+
? autoLoadGeneration
|
|
840
|
+
: autoSaveGeneration;
|
|
841
|
+
try {
|
|
842
|
+
await start2;
|
|
843
|
+
} catch (error) {
|
|
844
|
+
if (
|
|
845
|
+
generation2 ==
|
|
846
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
847
|
+
) {
|
|
848
|
+
await tryCatchIgnore(stop2);
|
|
849
|
+
}
|
|
850
|
+
if (
|
|
851
|
+
generation1 ==
|
|
852
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
853
|
+
) {
|
|
854
|
+
await tryCatchIgnore(stop1);
|
|
855
|
+
}
|
|
856
|
+
throw error;
|
|
857
|
+
}
|
|
834
858
|
return persister;
|
|
835
859
|
};
|
|
836
860
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -826,11 +826,35 @@ const createCustomPersister = (
|
|
|
826
826
|
initialContent,
|
|
827
827
|
startSaveFirst = false,
|
|
828
828
|
) => {
|
|
829
|
-
const [call1, call2] = startSaveFirst
|
|
830
|
-
? [startAutoSave, startAutoLoad]
|
|
831
|
-
: [startAutoLoad, startAutoSave];
|
|
832
|
-
|
|
833
|
-
|
|
829
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
830
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
831
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
832
|
+
const start1 = call1(initialContent);
|
|
833
|
+
const generation1 = startSaveFirst
|
|
834
|
+
? autoSaveGeneration
|
|
835
|
+
: autoLoadGeneration;
|
|
836
|
+
await start1;
|
|
837
|
+
const start2 = call2(initialContent);
|
|
838
|
+
const generation2 = startSaveFirst
|
|
839
|
+
? autoLoadGeneration
|
|
840
|
+
: autoSaveGeneration;
|
|
841
|
+
try {
|
|
842
|
+
await start2;
|
|
843
|
+
} catch (error) {
|
|
844
|
+
if (
|
|
845
|
+
generation2 ==
|
|
846
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
847
|
+
) {
|
|
848
|
+
await tryCatchIgnore(stop2);
|
|
849
|
+
}
|
|
850
|
+
if (
|
|
851
|
+
generation1 ==
|
|
852
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
853
|
+
) {
|
|
854
|
+
await tryCatchIgnore(stop1);
|
|
855
|
+
}
|
|
856
|
+
throw error;
|
|
857
|
+
}
|
|
834
858
|
return persister;
|
|
835
859
|
};
|
|
836
860
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -687,11 +687,35 @@ const createCustomPersister = (
|
|
|
687
687
|
initialContent,
|
|
688
688
|
startSaveFirst = false,
|
|
689
689
|
) => {
|
|
690
|
-
const [call1, call2] = startSaveFirst
|
|
691
|
-
? [startAutoSave, startAutoLoad]
|
|
692
|
-
: [startAutoLoad, startAutoSave];
|
|
693
|
-
|
|
694
|
-
|
|
690
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
691
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
692
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
693
|
+
const start1 = call1(initialContent);
|
|
694
|
+
const generation1 = startSaveFirst
|
|
695
|
+
? autoSaveGeneration
|
|
696
|
+
: autoLoadGeneration;
|
|
697
|
+
await start1;
|
|
698
|
+
const start2 = call2(initialContent);
|
|
699
|
+
const generation2 = startSaveFirst
|
|
700
|
+
? autoLoadGeneration
|
|
701
|
+
: autoSaveGeneration;
|
|
702
|
+
try {
|
|
703
|
+
await start2;
|
|
704
|
+
} catch (error) {
|
|
705
|
+
if (
|
|
706
|
+
generation2 ==
|
|
707
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
708
|
+
) {
|
|
709
|
+
await tryCatchIgnore(stop2);
|
|
710
|
+
}
|
|
711
|
+
if (
|
|
712
|
+
generation1 ==
|
|
713
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
714
|
+
) {
|
|
715
|
+
await tryCatchIgnore(stop1);
|
|
716
|
+
}
|
|
717
|
+
throw error;
|
|
718
|
+
}
|
|
695
719
|
return persister;
|
|
696
720
|
};
|
|
697
721
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -1759,15 +1783,27 @@ const stampNewObjectWithHash = () =>
|
|
|
1759
1783
|
stampNewWithHash(objNew(), EMPTY_STRING, 0);
|
|
1760
1784
|
const escapeGeneratedId = (id) =>
|
|
1761
1785
|
test(/^[a-zA-Z_][a-zA-Z0-9_]*$/, id) ? id : escapeId(id);
|
|
1786
|
+
const encodeStoragePrefix = (storagePrefix) =>
|
|
1787
|
+
arrayJoin(
|
|
1788
|
+
arrayMap(
|
|
1789
|
+
strSplit(storagePrefix),
|
|
1790
|
+
(character) =>
|
|
1791
|
+
'$' + slice((65536 + character.charCodeAt(0)).toString(16), 1),
|
|
1792
|
+
),
|
|
1793
|
+
);
|
|
1762
1794
|
const createDurableObjectFragmentedSqlStoragePersister = (
|
|
1763
1795
|
store,
|
|
1764
1796
|
sqlStorage,
|
|
1765
1797
|
storagePrefix = EMPTY_STRING,
|
|
1766
1798
|
onIgnoredError,
|
|
1767
1799
|
) => {
|
|
1768
|
-
const tablePrefix =
|
|
1769
|
-
|
|
1770
|
-
|
|
1800
|
+
const tablePrefix = test(/^[a-z0-9_]*$/, storagePrefix)
|
|
1801
|
+
? storagePrefix
|
|
1802
|
+
: `$tinybase$${encodeStoragePrefix(storagePrefix)}$`;
|
|
1803
|
+
const tablesTableId = `${tablePrefix}tinybase_tables`;
|
|
1804
|
+
const valuesTableId = `${tablePrefix}tinybase_values`;
|
|
1805
|
+
const tablesTable = escapeGeneratedId(tablesTableId);
|
|
1806
|
+
const valuesTable = escapeGeneratedId(valuesTableId);
|
|
1771
1807
|
const insertTableSql = `INSERT INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`;
|
|
1772
1808
|
const insertValueSql = `INSERT INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`;
|
|
1773
1809
|
const getRowKey = (tableId, rowId) => jsonString([tableId, rowId]);
|
|
@@ -687,11 +687,35 @@ const createCustomPersister = (
|
|
|
687
687
|
initialContent,
|
|
688
688
|
startSaveFirst = false,
|
|
689
689
|
) => {
|
|
690
|
-
const [call1, call2] = startSaveFirst
|
|
691
|
-
? [startAutoSave, startAutoLoad]
|
|
692
|
-
: [startAutoLoad, startAutoSave];
|
|
693
|
-
|
|
694
|
-
|
|
690
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
691
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
692
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
693
|
+
const start1 = call1(initialContent);
|
|
694
|
+
const generation1 = startSaveFirst
|
|
695
|
+
? autoSaveGeneration
|
|
696
|
+
: autoLoadGeneration;
|
|
697
|
+
await start1;
|
|
698
|
+
const start2 = call2(initialContent);
|
|
699
|
+
const generation2 = startSaveFirst
|
|
700
|
+
? autoLoadGeneration
|
|
701
|
+
: autoSaveGeneration;
|
|
702
|
+
try {
|
|
703
|
+
await start2;
|
|
704
|
+
} catch (error) {
|
|
705
|
+
if (
|
|
706
|
+
generation2 ==
|
|
707
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
708
|
+
) {
|
|
709
|
+
await tryCatchIgnore(stop2);
|
|
710
|
+
}
|
|
711
|
+
if (
|
|
712
|
+
generation1 ==
|
|
713
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
714
|
+
) {
|
|
715
|
+
await tryCatchIgnore(stop1);
|
|
716
|
+
}
|
|
717
|
+
throw error;
|
|
718
|
+
}
|
|
695
719
|
return persister;
|
|
696
720
|
};
|
|
697
721
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -1759,15 +1783,27 @@ const stampNewObjectWithHash = () =>
|
|
|
1759
1783
|
stampNewWithHash(objNew(), EMPTY_STRING, 0);
|
|
1760
1784
|
const escapeGeneratedId = (id) =>
|
|
1761
1785
|
test(/^[a-zA-Z_][a-zA-Z0-9_]*$/, id) ? id : escapeId(id);
|
|
1786
|
+
const encodeStoragePrefix = (storagePrefix) =>
|
|
1787
|
+
arrayJoin(
|
|
1788
|
+
arrayMap(
|
|
1789
|
+
strSplit(storagePrefix),
|
|
1790
|
+
(character) =>
|
|
1791
|
+
'$' + slice((65536 + character.charCodeAt(0)).toString(16), 1),
|
|
1792
|
+
),
|
|
1793
|
+
);
|
|
1762
1794
|
const createDurableObjectFragmentedSqlStoragePersister = (
|
|
1763
1795
|
store,
|
|
1764
1796
|
sqlStorage,
|
|
1765
1797
|
storagePrefix = EMPTY_STRING,
|
|
1766
1798
|
onIgnoredError,
|
|
1767
1799
|
) => {
|
|
1768
|
-
const tablePrefix =
|
|
1769
|
-
|
|
1770
|
-
|
|
1800
|
+
const tablePrefix = test(/^[a-z0-9_]*$/, storagePrefix)
|
|
1801
|
+
? storagePrefix
|
|
1802
|
+
: `$tinybase$${encodeStoragePrefix(storagePrefix)}$`;
|
|
1803
|
+
const tablesTableId = `${tablePrefix}tinybase_tables`;
|
|
1804
|
+
const valuesTableId = `${tablePrefix}tinybase_values`;
|
|
1805
|
+
const tablesTable = escapeGeneratedId(tablesTableId);
|
|
1806
|
+
const valuesTable = escapeGeneratedId(valuesTableId);
|
|
1771
1807
|
const insertTableSql = `INSERT INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`;
|
|
1772
1808
|
const insertValueSql = `INSERT INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`;
|
|
1773
1809
|
const getRowKey = (tableId, rowId) => jsonString([tableId, rowId]);
|
|
@@ -66,6 +66,8 @@ const tryCatch = async (action, onError) => {
|
|
|
66
66
|
onError?.(error);
|
|
67
67
|
}
|
|
68
68
|
};
|
|
69
|
+
const tryCatchIgnore = (action, onIgnoredError) =>
|
|
70
|
+
tryCatch(action, (error) => void tryCatch(() => onIgnoredError?.(error)));
|
|
69
71
|
const tryCatchSync = (action, onError) => {
|
|
70
72
|
try {
|
|
71
73
|
return action();
|
|
@@ -637,11 +639,35 @@ const createCustomPersister = (
|
|
|
637
639
|
initialContent,
|
|
638
640
|
startSaveFirst = false,
|
|
639
641
|
) => {
|
|
640
|
-
const [call1, call2] = startSaveFirst
|
|
641
|
-
? [startAutoSave, startAutoLoad]
|
|
642
|
-
: [startAutoLoad, startAutoSave];
|
|
643
|
-
|
|
644
|
-
|
|
642
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
643
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
644
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
645
|
+
const start1 = call1(initialContent);
|
|
646
|
+
const generation1 = startSaveFirst
|
|
647
|
+
? autoSaveGeneration
|
|
648
|
+
: autoLoadGeneration;
|
|
649
|
+
await start1;
|
|
650
|
+
const start2 = call2(initialContent);
|
|
651
|
+
const generation2 = startSaveFirst
|
|
652
|
+
? autoLoadGeneration
|
|
653
|
+
: autoSaveGeneration;
|
|
654
|
+
try {
|
|
655
|
+
await start2;
|
|
656
|
+
} catch (error) {
|
|
657
|
+
if (
|
|
658
|
+
generation2 ==
|
|
659
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
660
|
+
) {
|
|
661
|
+
await tryCatchIgnore(stop2);
|
|
662
|
+
}
|
|
663
|
+
if (
|
|
664
|
+
generation1 ==
|
|
665
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
666
|
+
) {
|
|
667
|
+
await tryCatchIgnore(stop1);
|
|
668
|
+
}
|
|
669
|
+
throw error;
|
|
670
|
+
}
|
|
645
671
|
return persister;
|
|
646
672
|
};
|
|
647
673
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -66,6 +66,8 @@ const tryCatch = async (action, onError) => {
|
|
|
66
66
|
onError?.(error);
|
|
67
67
|
}
|
|
68
68
|
};
|
|
69
|
+
const tryCatchIgnore = (action, onIgnoredError) =>
|
|
70
|
+
tryCatch(action, (error) => void tryCatch(() => onIgnoredError?.(error)));
|
|
69
71
|
const tryCatchSync = (action, onError) => {
|
|
70
72
|
try {
|
|
71
73
|
return action();
|
|
@@ -637,11 +639,35 @@ const createCustomPersister = (
|
|
|
637
639
|
initialContent,
|
|
638
640
|
startSaveFirst = false,
|
|
639
641
|
) => {
|
|
640
|
-
const [call1, call2] = startSaveFirst
|
|
641
|
-
? [startAutoSave, startAutoLoad]
|
|
642
|
-
: [startAutoLoad, startAutoSave];
|
|
643
|
-
|
|
644
|
-
|
|
642
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
643
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
644
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
645
|
+
const start1 = call1(initialContent);
|
|
646
|
+
const generation1 = startSaveFirst
|
|
647
|
+
? autoSaveGeneration
|
|
648
|
+
: autoLoadGeneration;
|
|
649
|
+
await start1;
|
|
650
|
+
const start2 = call2(initialContent);
|
|
651
|
+
const generation2 = startSaveFirst
|
|
652
|
+
? autoLoadGeneration
|
|
653
|
+
: autoSaveGeneration;
|
|
654
|
+
try {
|
|
655
|
+
await start2;
|
|
656
|
+
} catch (error) {
|
|
657
|
+
if (
|
|
658
|
+
generation2 ==
|
|
659
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
660
|
+
) {
|
|
661
|
+
await tryCatchIgnore(stop2);
|
|
662
|
+
}
|
|
663
|
+
if (
|
|
664
|
+
generation1 ==
|
|
665
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
666
|
+
) {
|
|
667
|
+
await tryCatchIgnore(stop1);
|
|
668
|
+
}
|
|
669
|
+
throw error;
|
|
670
|
+
}
|
|
645
671
|
return persister;
|
|
646
672
|
};
|
|
647
673
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|
|
@@ -826,11 +826,35 @@ const createCustomPersister = (
|
|
|
826
826
|
initialContent,
|
|
827
827
|
startSaveFirst = false,
|
|
828
828
|
) => {
|
|
829
|
-
const [call1, call2] = startSaveFirst
|
|
830
|
-
? [startAutoSave, startAutoLoad]
|
|
831
|
-
: [startAutoLoad, startAutoSave];
|
|
832
|
-
|
|
833
|
-
|
|
829
|
+
const [call1, call2, stop1, stop2] = startSaveFirst
|
|
830
|
+
? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
|
|
831
|
+
: [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
|
|
832
|
+
const start1 = call1(initialContent);
|
|
833
|
+
const generation1 = startSaveFirst
|
|
834
|
+
? autoSaveGeneration
|
|
835
|
+
: autoLoadGeneration;
|
|
836
|
+
await start1;
|
|
837
|
+
const start2 = call2(initialContent);
|
|
838
|
+
const generation2 = startSaveFirst
|
|
839
|
+
? autoLoadGeneration
|
|
840
|
+
: autoSaveGeneration;
|
|
841
|
+
try {
|
|
842
|
+
await start2;
|
|
843
|
+
} catch (error) {
|
|
844
|
+
if (
|
|
845
|
+
generation2 ==
|
|
846
|
+
(startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
|
|
847
|
+
) {
|
|
848
|
+
await tryCatchIgnore(stop2);
|
|
849
|
+
}
|
|
850
|
+
if (
|
|
851
|
+
generation1 ==
|
|
852
|
+
(startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
|
|
853
|
+
) {
|
|
854
|
+
await tryCatchIgnore(stop1);
|
|
855
|
+
}
|
|
856
|
+
throw error;
|
|
857
|
+
}
|
|
834
858
|
return persister;
|
|
835
859
|
};
|
|
836
860
|
const stopAutoPersisting = async (stopSaveFirst = false) => {
|