tinybase 5.0.0-beta.1 → 5.0.0-beta.3
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/mergeable-store.cjs +1 -0
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- 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-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.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-indexed-db.cjs +1 -1
- package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-server.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/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-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom.cjs +1 -1
- package/lib/cjs/ui-react-dom.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -0
- package/lib/cjs-es6/mergeable-store.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-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.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-indexed-db.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-server.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/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-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +1863 -0
- package/lib/debug/persisters/persister-automerge.js +54 -53
- package/lib/debug/persisters/persister-browser.js +28 -18
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +80 -57
- package/lib/debug/persisters/persister-electric-sql.js +80 -57
- package/lib/debug/persisters/persister-expo-sqlite-next.js +80 -57
- package/lib/debug/persisters/persister-expo-sqlite.js +80 -57
- package/lib/debug/persisters/persister-file.js +27 -18
- package/lib/debug/persisters/persister-indexed-db.js +34 -23
- package/lib/debug/persisters/persister-partykit-client.js +26 -23
- package/lib/debug/persisters/persister-partykit-server.js +11 -21
- package/lib/debug/persisters/persister-remote.js +28 -18
- package/lib/debug/persisters/persister-sqlite-wasm.js +80 -57
- package/lib/debug/persisters/persister-sqlite3.js +80 -57
- package/lib/debug/persisters/persister-yjs.js +50 -48
- package/lib/debug/persisters.js +27 -18
- package/lib/debug/queries.js +2 -2
- package/lib/debug/store.js +63 -71
- package/lib/debug/tinybase.js +354 -90
- package/lib/debug/tools.js +13 -15
- package/lib/debug/ui-react-dom.js +115 -119
- package/lib/es6/mergeable-store.js +1 -0
- package/lib/es6/mergeable-store.js.gz +0 -0
- 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-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.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-indexed-db.js +1 -1
- package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -1
- package/lib/es6/persisters/persister-partykit-server.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/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-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/es6/ui-react-dom.js +1 -1
- package/lib/es6/ui-react-dom.js.gz +0 -0
- package/lib/mergeable-store.js +1 -0
- package/lib/mergeable-store.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-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.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-indexed-db.js +1 -1
- package/lib/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/persisters/persister-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -1
- package/lib/persisters/persister-partykit-server.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/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/mergeable-store.d.ts +79 -0
- package/lib/types/persisters/persister-automerge.d.ts +8 -7
- package/lib/types/persisters/persister-browser.d.ts +2 -0
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
- package/lib/types/persisters/persister-electric-sql.d.ts +1 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -0
- package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -0
- package/lib/types/persisters/persister-file.d.ts +1 -0
- package/lib/types/persisters/persister-indexed-db.d.ts +1 -0
- package/lib/types/persisters/persister-partykit-client.d.ts +1 -0
- package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
- package/lib/types/persisters/persister-remote.d.ts +1 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +1 -0
- package/lib/types/persisters/persister-yjs.d.ts +1 -0
- package/lib/types/persisters.d.ts +50 -30
- package/lib/types/store.d.ts +241 -186
- package/lib/types/tinybase.d.ts +1 -0
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/ui-react.d.ts +1 -0
- package/lib/types/with-schemas/internal/store.d.ts +4 -0
- package/lib/types/with-schemas/mergeable-store.d.ts +112 -0
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +8 -7
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -0
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +1 -0
- package/lib/types/with-schemas/persisters.d.ts +81 -45
- package/lib/types/with-schemas/store.d.ts +364 -273
- package/lib/types/with-schemas/tinybase.d.ts +1 -0
- package/lib/types/with-schemas/tools.d.ts +2 -2
- package/lib/ui-react-dom.js +1 -1
- package/lib/ui-react-dom.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -0
- package/lib/umd/mergeable-store.js.gz +0 -0
- 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-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.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-indexed-db.js +1 -1
- package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -1
- package/lib/umd/persisters/persister-partykit-server.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/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-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd/ui-react-dom.js +1 -1
- package/lib/umd/ui-react-dom.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -0
- package/lib/umd-es6/mergeable-store.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-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.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-indexed-db.js +1 -1
- package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-server.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/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-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom.js +1 -1
- package/lib/umd-es6/ui-react-dom.js.gz +0 -0
- package/package.json +39 -35
- package/readme.md +2 -2
package/lib/debug/tinybase.js
CHANGED
|
@@ -29,6 +29,10 @@ const VALUE = 'Value';
|
|
|
29
29
|
const VALUES = VALUE + 's';
|
|
30
30
|
const VALUE_IDS = VALUE + IDS;
|
|
31
31
|
const id = (key) => EMPTY_STRING + key;
|
|
32
|
+
const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
33
|
+
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
34
|
+
const strSplit = (str, separator = '', limit) => str.split(separator, limit);
|
|
35
|
+
const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
|
|
32
36
|
|
|
33
37
|
const mathMax = Math.max;
|
|
34
38
|
const mathMin = Math.min;
|
|
@@ -84,13 +88,15 @@ const isObject = (obj) =>
|
|
|
84
88
|
/* istanbul ignore next */
|
|
85
89
|
() => true,
|
|
86
90
|
);
|
|
87
|
-
const
|
|
88
|
-
const objHas = (obj, id) =>
|
|
91
|
+
const objNew = (entries = []) => object.fromEntries(entries);
|
|
92
|
+
const objHas = (obj, id) => id in obj;
|
|
89
93
|
const objDel = (obj, id) => {
|
|
90
94
|
delete obj[id];
|
|
91
95
|
return obj;
|
|
92
96
|
};
|
|
93
|
-
const
|
|
97
|
+
const objForEach = (obj, cb) =>
|
|
98
|
+
arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
|
|
99
|
+
const objToArray = (obj, cb) =>
|
|
94
100
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
95
101
|
const objSize = (obj) => size(objIds(obj));
|
|
96
102
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
@@ -124,7 +130,7 @@ const mapEnsure = (map, key, getDefaultValue) => {
|
|
|
124
130
|
return mapGet(map, key);
|
|
125
131
|
};
|
|
126
132
|
const mapMatch = (map, obj, set, del = mapSet) => {
|
|
127
|
-
|
|
133
|
+
objToArray(obj, (value, id) => set(map, id, value));
|
|
128
134
|
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
129
135
|
return map;
|
|
130
136
|
};
|
|
@@ -1086,6 +1092,7 @@ const createCustomPersister = (
|
|
|
1086
1092
|
addPersisterListener,
|
|
1087
1093
|
delPersisterListener,
|
|
1088
1094
|
onIgnoredError,
|
|
1095
|
+
supportsMergeableStore,
|
|
1089
1096
|
[getThing, thing] = [],
|
|
1090
1097
|
scheduleId = [],
|
|
1091
1098
|
) => {
|
|
@@ -1098,6 +1105,10 @@ const createCustomPersister = (
|
|
|
1098
1105
|
let listeningHandle;
|
|
1099
1106
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
1100
1107
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
1108
|
+
const getContent =
|
|
1109
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
1110
|
+
store.getContent;
|
|
1111
|
+
const getChanges = store.getTransactionChanges;
|
|
1101
1112
|
const run = async () => {
|
|
1102
1113
|
/* istanbul ignore else */
|
|
1103
1114
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -1133,7 +1144,10 @@ const createCustomPersister = (
|
|
|
1133
1144
|
load: async (initialTables, initialValues) =>
|
|
1134
1145
|
await loadLock(async () => {
|
|
1135
1146
|
try {
|
|
1136
|
-
|
|
1147
|
+
const content = await getPersisted();
|
|
1148
|
+
(supportsMergeableStore && isString(content[0])
|
|
1149
|
+
? store.applyMergeableChanges
|
|
1150
|
+
: store.setContent)(content);
|
|
1137
1151
|
} catch {
|
|
1138
1152
|
store.setContent([initialTables, initialValues]);
|
|
1139
1153
|
}
|
|
@@ -1143,16 +1157,14 @@ const createCustomPersister = (
|
|
|
1143
1157
|
await persister.load(initialTables, initialValues);
|
|
1144
1158
|
listening = 1;
|
|
1145
1159
|
listeningHandle = addPersisterListener(
|
|
1146
|
-
async (
|
|
1147
|
-
if (
|
|
1148
|
-
const
|
|
1149
|
-
await loadLock(async () =>
|
|
1150
|
-
store.setTransactionChanges(transactionChanges),
|
|
1151
|
-
);
|
|
1160
|
+
async (getContent2, getChanges2) => {
|
|
1161
|
+
if (getChanges2) {
|
|
1162
|
+
const changes = getChanges2();
|
|
1163
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
1152
1164
|
} else {
|
|
1153
1165
|
await loadLock(async () => {
|
|
1154
1166
|
try {
|
|
1155
|
-
store.setContent(
|
|
1167
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
1156
1168
|
} catch (error) {
|
|
1157
1169
|
onIgnoredError?.(error);
|
|
1158
1170
|
}
|
|
@@ -1170,7 +1182,7 @@ const createCustomPersister = (
|
|
|
1170
1182
|
}
|
|
1171
1183
|
return persister;
|
|
1172
1184
|
},
|
|
1173
|
-
save: async (
|
|
1185
|
+
save: async (getChanges2) => {
|
|
1174
1186
|
/* istanbul ignore else */
|
|
1175
1187
|
if (loadSave != 1) {
|
|
1176
1188
|
loadSave = 2;
|
|
@@ -1179,7 +1191,7 @@ const createCustomPersister = (
|
|
|
1179
1191
|
}
|
|
1180
1192
|
await persister.schedule(async () => {
|
|
1181
1193
|
try {
|
|
1182
|
-
await setPersisted(
|
|
1194
|
+
await setPersisted(getContent, getChanges2);
|
|
1183
1195
|
} catch (error) {
|
|
1184
1196
|
/* istanbul ignore next */
|
|
1185
1197
|
onIgnoredError?.(error);
|
|
@@ -1191,14 +1203,12 @@ const createCustomPersister = (
|
|
|
1191
1203
|
},
|
|
1192
1204
|
startAutoSave: async () => {
|
|
1193
1205
|
await persister.stopAutoSave().save();
|
|
1194
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
},
|
|
1201
|
-
);
|
|
1206
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
1207
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
1208
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
1209
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
1210
|
+
}
|
|
1211
|
+
});
|
|
1202
1212
|
return persister;
|
|
1203
1213
|
},
|
|
1204
1214
|
stopAutoSave: () => {
|
|
@@ -1648,7 +1658,7 @@ const createQueries = getCreateFunction((store) => {
|
|
|
1648
1658
|
destroy,
|
|
1649
1659
|
getListenerStats,
|
|
1650
1660
|
};
|
|
1651
|
-
|
|
1661
|
+
objToArray(
|
|
1652
1662
|
{
|
|
1653
1663
|
[TABLE]: [1, 1],
|
|
1654
1664
|
[TABLE + CELL_IDS]: [0, 1],
|
|
@@ -1869,6 +1879,35 @@ const createRelationships = getCreateFunction((store) => {
|
|
|
1869
1879
|
return objFreeze(relationships);
|
|
1870
1880
|
});
|
|
1871
1881
|
|
|
1882
|
+
const stampNew = () => [EMPTY_STRING, void 0];
|
|
1883
|
+
const stampNewMap = () => [EMPTY_STRING, mapNew()];
|
|
1884
|
+
const mapStamp = ([stamp, value], mapper) => [stamp, mapper(value, stamp)];
|
|
1885
|
+
const mapStampMapToObj = (stampedMap, mapper) =>
|
|
1886
|
+
mapStamp(stampedMap, (map) => mapToObj(map, mapper));
|
|
1887
|
+
const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
|
|
1888
|
+
objForEach(newThingStamps, (newThingStamp, thingId) =>
|
|
1889
|
+
mergeStamp(
|
|
1890
|
+
newThingStamp,
|
|
1891
|
+
mapEnsure(thingStamps, thingId, stampNewMap),
|
|
1892
|
+
(changes[thingId] = objNew()),
|
|
1893
|
+
merge,
|
|
1894
|
+
),
|
|
1895
|
+
);
|
|
1896
|
+
const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
|
|
1897
|
+
if (newTime > thingStamp[0]) {
|
|
1898
|
+
thingStamp[0] = newTime;
|
|
1899
|
+
}
|
|
1900
|
+
merge(newThing, thingStamp[1], changes);
|
|
1901
|
+
};
|
|
1902
|
+
const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
|
|
1903
|
+
objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
|
|
1904
|
+
const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
|
|
1905
|
+
if (newTime > leafStamp[0]) {
|
|
1906
|
+
leafStamp[0] = newTime;
|
|
1907
|
+
leafStamp[1] = changes[leafId] = newLeaf;
|
|
1908
|
+
}
|
|
1909
|
+
});
|
|
1910
|
+
|
|
1872
1911
|
const pairNew = (value) => [value, value];
|
|
1873
1912
|
const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
|
|
1874
1913
|
const pairNewMap = () => [mapNew(), mapNew()];
|
|
@@ -1886,7 +1925,7 @@ const validate = (obj, validateChild, onInvalidObj) => {
|
|
|
1886
1925
|
onInvalidObj?.();
|
|
1887
1926
|
return false;
|
|
1888
1927
|
}
|
|
1889
|
-
|
|
1928
|
+
objToArray(obj, (child, id2) => {
|
|
1890
1929
|
if (!validateChild(child, id2)) {
|
|
1891
1930
|
objDel(obj, id2);
|
|
1892
1931
|
}
|
|
@@ -1907,6 +1946,7 @@ const createStore = () => {
|
|
|
1907
1946
|
let hadTables = false;
|
|
1908
1947
|
let hadValues = false;
|
|
1909
1948
|
let transactions = 0;
|
|
1949
|
+
let postTransactionListener;
|
|
1910
1950
|
const changedTableIds = mapNew();
|
|
1911
1951
|
const changedTableCellIds = mapNew();
|
|
1912
1952
|
const changedRowCount = mapNew();
|
|
@@ -2548,44 +2588,6 @@ const createStore = () => {
|
|
|
2548
2588
|
transaction(() => actions(...arrayMap(args, id)));
|
|
2549
2589
|
return store;
|
|
2550
2590
|
};
|
|
2551
|
-
const getTransactionChanges = () => [
|
|
2552
|
-
mapToObj(
|
|
2553
|
-
changedCells,
|
|
2554
|
-
(table, tableId) =>
|
|
2555
|
-
mapGet(changedTableIds, tableId) === -1
|
|
2556
|
-
? null
|
|
2557
|
-
: mapToObj(
|
|
2558
|
-
table,
|
|
2559
|
-
(row, rowId) =>
|
|
2560
|
-
mapGet(mapGet(changedRowIds, tableId), rowId) === -1
|
|
2561
|
-
? null
|
|
2562
|
-
: mapToObj(
|
|
2563
|
-
row,
|
|
2564
|
-
([, newCell]) => newCell ?? null,
|
|
2565
|
-
(_, changedCell) => pairIsEqual(changedCell),
|
|
2566
|
-
),
|
|
2567
|
-
objIsEmpty,
|
|
2568
|
-
),
|
|
2569
|
-
objIsEmpty,
|
|
2570
|
-
),
|
|
2571
|
-
mapToObj(
|
|
2572
|
-
changedValues,
|
|
2573
|
-
([, newValue]) => newValue ?? null,
|
|
2574
|
-
(_, changedValue) => pairIsEqual(changedValue),
|
|
2575
|
-
),
|
|
2576
|
-
];
|
|
2577
|
-
const getTransactionLog = () => ({
|
|
2578
|
-
cellsTouched,
|
|
2579
|
-
valuesTouched,
|
|
2580
|
-
changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
|
|
2581
|
-
invalidCells: mapToObj3(invalidCells),
|
|
2582
|
-
changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
|
|
2583
|
-
invalidValues: mapToObj(invalidValues),
|
|
2584
|
-
changedTableIds: mapToObj(changedTableIds),
|
|
2585
|
-
changedRowIds: mapToObj2(changedRowIds),
|
|
2586
|
-
changedCellIds: mapToObj3(changedCellIds),
|
|
2587
|
-
changedValueIds: mapToObj(changedValueIds),
|
|
2588
|
-
});
|
|
2589
2591
|
const getContent = () => [getTables(), getValues()];
|
|
2590
2592
|
const getTables = () => mapToObj3(tablesMap);
|
|
2591
2593
|
const getTableIds = () => mapKeys(tablesMap);
|
|
@@ -2678,7 +2680,7 @@ const createStore = () => {
|
|
|
2678
2680
|
(tableId2, rowId2) => {
|
|
2679
2681
|
if (validateRow(tableId2, rowId2, partialRow, 1)) {
|
|
2680
2682
|
const table = getOrCreateTable(tableId2);
|
|
2681
|
-
|
|
2683
|
+
objToArray(partialRow, (cell, cellId) =>
|
|
2682
2684
|
setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
|
|
2683
2685
|
);
|
|
2684
2686
|
}
|
|
@@ -2716,7 +2718,7 @@ const createStore = () => {
|
|
|
2716
2718
|
const setPartialValues = (partialValues) =>
|
|
2717
2719
|
fluentTransaction(() =>
|
|
2718
2720
|
validateValues(partialValues, 1)
|
|
2719
|
-
?
|
|
2721
|
+
? objToArray(partialValues, (value, valueId) =>
|
|
2720
2722
|
setValidValue(valueId, value),
|
|
2721
2723
|
)
|
|
2722
2724
|
: 0,
|
|
@@ -2733,20 +2735,20 @@ const createStore = () => {
|
|
|
2733
2735
|
),
|
|
2734
2736
|
valueId,
|
|
2735
2737
|
);
|
|
2736
|
-
const
|
|
2738
|
+
const applyChanges = (changes) =>
|
|
2737
2739
|
fluentTransaction(() => {
|
|
2738
|
-
|
|
2740
|
+
objToArray(changes[0], (table, tableId) =>
|
|
2739
2741
|
isUndefined(table)
|
|
2740
2742
|
? delTable(tableId)
|
|
2741
|
-
:
|
|
2743
|
+
: objToArray(table, (row, rowId) =>
|
|
2742
2744
|
isUndefined(row)
|
|
2743
2745
|
? delRow(tableId, rowId)
|
|
2744
|
-
:
|
|
2746
|
+
: objToArray(row, (cell, cellId) =>
|
|
2745
2747
|
setOrDelCell(store, tableId, rowId, cellId, cell),
|
|
2746
2748
|
),
|
|
2747
2749
|
),
|
|
2748
2750
|
);
|
|
2749
|
-
|
|
2751
|
+
objToArray(changes[1], (value, valueId) =>
|
|
2750
2752
|
setOrDelValue(store, valueId, value),
|
|
2751
2753
|
);
|
|
2752
2754
|
});
|
|
@@ -2873,15 +2875,48 @@ const createStore = () => {
|
|
|
2873
2875
|
transactions++;
|
|
2874
2876
|
}
|
|
2875
2877
|
if (transactions == 1) {
|
|
2876
|
-
callListeners(
|
|
2877
|
-
startTransactionListeners,
|
|
2878
|
-
void 0,
|
|
2879
|
-
getTransactionChanges,
|
|
2880
|
-
getTransactionLog,
|
|
2881
|
-
);
|
|
2878
|
+
callListeners(startTransactionListeners, void 0);
|
|
2882
2879
|
}
|
|
2883
2880
|
return store;
|
|
2884
2881
|
};
|
|
2882
|
+
const getTransactionChanges = () => [
|
|
2883
|
+
mapToObj(
|
|
2884
|
+
changedCells,
|
|
2885
|
+
(table, tableId) =>
|
|
2886
|
+
mapGet(changedTableIds, tableId) === -1
|
|
2887
|
+
? void 0
|
|
2888
|
+
: mapToObj(
|
|
2889
|
+
table,
|
|
2890
|
+
(row, rowId) =>
|
|
2891
|
+
mapGet(mapGet(changedRowIds, tableId), rowId) === -1
|
|
2892
|
+
? void 0
|
|
2893
|
+
: mapToObj(
|
|
2894
|
+
row,
|
|
2895
|
+
([, newCell]) => newCell,
|
|
2896
|
+
(_, changedCell) => pairIsEqual(changedCell),
|
|
2897
|
+
),
|
|
2898
|
+
objIsEmpty,
|
|
2899
|
+
),
|
|
2900
|
+
objIsEmpty,
|
|
2901
|
+
),
|
|
2902
|
+
mapToObj(
|
|
2903
|
+
changedValues,
|
|
2904
|
+
([, newValue]) => newValue,
|
|
2905
|
+
(_, changedValue) => pairIsEqual(changedValue),
|
|
2906
|
+
),
|
|
2907
|
+
];
|
|
2908
|
+
const getTransactionLog = () => [
|
|
2909
|
+
cellsTouched,
|
|
2910
|
+
valuesTouched,
|
|
2911
|
+
mapToObj3(changedCells, pairClone, pairIsEqual),
|
|
2912
|
+
mapToObj3(invalidCells),
|
|
2913
|
+
mapToObj(changedValues, pairClone, pairIsEqual),
|
|
2914
|
+
mapToObj(invalidValues),
|
|
2915
|
+
mapToObj(changedTableIds),
|
|
2916
|
+
mapToObj2(changedRowIds),
|
|
2917
|
+
mapToObj3(changedCellIds),
|
|
2918
|
+
mapToObj(changedValueIds),
|
|
2919
|
+
];
|
|
2885
2920
|
const finishTransaction = (doRollback) => {
|
|
2886
2921
|
if (transactions > 0) {
|
|
2887
2922
|
transactions--;
|
|
@@ -2897,7 +2932,7 @@ const createStore = () => {
|
|
|
2897
2932
|
if (valuesTouched) {
|
|
2898
2933
|
callValuesListenersForChanges(1);
|
|
2899
2934
|
}
|
|
2900
|
-
if (doRollback?.(
|
|
2935
|
+
if (doRollback?.(store)) {
|
|
2901
2936
|
collForEach(changedCells, (table, tableId) =>
|
|
2902
2937
|
collForEach(table, (row, rowId) =>
|
|
2903
2938
|
collForEach(row, ([oldCell], cellId) =>
|
|
@@ -2910,12 +2945,7 @@ const createStore = () => {
|
|
|
2910
2945
|
);
|
|
2911
2946
|
cellsTouched = valuesTouched = false;
|
|
2912
2947
|
}
|
|
2913
|
-
callListeners(
|
|
2914
|
-
finishTransactionListeners[0],
|
|
2915
|
-
void 0,
|
|
2916
|
-
getTransactionChanges,
|
|
2917
|
-
getTransactionLog,
|
|
2918
|
-
);
|
|
2948
|
+
callListeners(finishTransactionListeners[0], void 0);
|
|
2919
2949
|
transactions = -1;
|
|
2920
2950
|
callInvalidCellListeners(0);
|
|
2921
2951
|
if (cellsTouched) {
|
|
@@ -2925,12 +2955,8 @@ const createStore = () => {
|
|
|
2925
2955
|
if (valuesTouched) {
|
|
2926
2956
|
callValuesListenersForChanges(0);
|
|
2927
2957
|
}
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
void 0,
|
|
2931
|
-
getTransactionChanges,
|
|
2932
|
-
getTransactionLog,
|
|
2933
|
-
);
|
|
2958
|
+
postTransactionListener?.(store);
|
|
2959
|
+
callListeners(finishTransactionListeners[1], void 0);
|
|
2934
2960
|
transactions = 0;
|
|
2935
2961
|
cellsTouched = valuesTouched = false;
|
|
2936
2962
|
hadTables = hasTables();
|
|
@@ -3057,6 +3083,9 @@ const createStore = () => {
|
|
|
3057
3083
|
collSize2(startTransactionListeners) +
|
|
3058
3084
|
pairCollSize2(finishTransactionListeners),
|
|
3059
3085
|
});
|
|
3086
|
+
const addPostTransactionListener = (listener) => {
|
|
3087
|
+
postTransactionListener = listener;
|
|
3088
|
+
};
|
|
3060
3089
|
const store = {
|
|
3061
3090
|
getContent,
|
|
3062
3091
|
getTables,
|
|
@@ -3097,7 +3126,7 @@ const createStore = () => {
|
|
|
3097
3126
|
setValues,
|
|
3098
3127
|
setPartialValues,
|
|
3099
3128
|
setValue,
|
|
3100
|
-
|
|
3129
|
+
applyChanges,
|
|
3101
3130
|
setTablesJson,
|
|
3102
3131
|
setValuesJson,
|
|
3103
3132
|
setJson,
|
|
@@ -3115,6 +3144,8 @@ const createStore = () => {
|
|
|
3115
3144
|
delSchema,
|
|
3116
3145
|
transaction,
|
|
3117
3146
|
startTransaction,
|
|
3147
|
+
getTransactionChanges,
|
|
3148
|
+
getTransactionLog,
|
|
3118
3149
|
finishTransaction,
|
|
3119
3150
|
forEachTable,
|
|
3120
3151
|
forEachTableCell,
|
|
@@ -3132,8 +3163,9 @@ const createStore = () => {
|
|
|
3132
3163
|
createStore,
|
|
3133
3164
|
addListener,
|
|
3134
3165
|
callListeners,
|
|
3166
|
+
addPostTransactionListener,
|
|
3135
3167
|
};
|
|
3136
|
-
|
|
3168
|
+
objToArray(
|
|
3137
3169
|
{
|
|
3138
3170
|
[HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
|
|
3139
3171
|
[TABLES]: [0, tablesListeners],
|
|
@@ -3206,10 +3238,242 @@ const createStore = () => {
|
|
|
3206
3238
|
return objFreeze(store);
|
|
3207
3239
|
};
|
|
3208
3240
|
|
|
3241
|
+
const MASK6 = 63;
|
|
3242
|
+
const SHIFT36 = 2 ** 36;
|
|
3243
|
+
const SHIFT30 = 2 ** 30;
|
|
3244
|
+
const SHIFT24 = 2 ** 24;
|
|
3245
|
+
const SHIFT18 = 2 ** 18;
|
|
3246
|
+
const SHIFT12 = 2 ** 12;
|
|
3247
|
+
const SHIFT6 = 2 ** 6;
|
|
3248
|
+
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
3249
|
+
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
3250
|
+
const hash = (value) =>
|
|
3251
|
+
arrayReduce(
|
|
3252
|
+
strSplit(value),
|
|
3253
|
+
(hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
|
|
3254
|
+
5381,
|
|
3255
|
+
) >>> 0;
|
|
3256
|
+
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
3257
|
+
toB64(logicalTime42 / SHIFT36) +
|
|
3258
|
+
toB64(logicalTime42 / SHIFT30) +
|
|
3259
|
+
toB64(logicalTime42 / SHIFT24) +
|
|
3260
|
+
toB64(logicalTime42 / SHIFT18) +
|
|
3261
|
+
toB64(logicalTime42 / SHIFT12) +
|
|
3262
|
+
toB64(logicalTime42 / SHIFT6) +
|
|
3263
|
+
toB64(logicalTime42) +
|
|
3264
|
+
toB64(counter24 / SHIFT18) +
|
|
3265
|
+
toB64(counter24 / SHIFT12) +
|
|
3266
|
+
toB64(counter24 / SHIFT6) +
|
|
3267
|
+
toB64(counter24) +
|
|
3268
|
+
toB64(clientHash30 / SHIFT24) +
|
|
3269
|
+
toB64(clientHash30 / SHIFT18) +
|
|
3270
|
+
toB64(clientHash30 / SHIFT12) +
|
|
3271
|
+
toB64(clientHash30 / SHIFT6) +
|
|
3272
|
+
toB64(clientHash30);
|
|
3273
|
+
const decodeHlc = (hlc16) => [
|
|
3274
|
+
fromB64(hlc16, 0) * SHIFT36 +
|
|
3275
|
+
fromB64(hlc16, 1) * SHIFT30 +
|
|
3276
|
+
fromB64(hlc16, 2) * SHIFT24 +
|
|
3277
|
+
fromB64(hlc16, 3) * SHIFT18 +
|
|
3278
|
+
fromB64(hlc16, 4) * SHIFT12 +
|
|
3279
|
+
fromB64(hlc16, 5) * SHIFT6 +
|
|
3280
|
+
fromB64(hlc16, 6),
|
|
3281
|
+
fromB64(hlc16, 7) * SHIFT18 +
|
|
3282
|
+
fromB64(hlc16, 8) * SHIFT12 +
|
|
3283
|
+
fromB64(hlc16, 9) * SHIFT6 +
|
|
3284
|
+
fromB64(hlc16, 10),
|
|
3285
|
+
fromB64(hlc16, 11) * SHIFT24 +
|
|
3286
|
+
fromB64(hlc16, 12) * SHIFT18 +
|
|
3287
|
+
fromB64(hlc16, 13) * SHIFT12 +
|
|
3288
|
+
fromB64(hlc16, 14) * SHIFT6 +
|
|
3289
|
+
fromB64(hlc16, 15),
|
|
3290
|
+
];
|
|
3291
|
+
const getHlcFunctions = (uniqueId) => {
|
|
3292
|
+
let logicalTime = 0;
|
|
3293
|
+
let counter = 0;
|
|
3294
|
+
const uniqueIdHash = hash(uniqueId);
|
|
3295
|
+
const getHlc = () => {
|
|
3296
|
+
seenHlc();
|
|
3297
|
+
return encodeHlc(logicalTime, ++counter, uniqueIdHash);
|
|
3298
|
+
};
|
|
3299
|
+
const seenHlc = (hlc) => {
|
|
3300
|
+
const previousLogicalTime = logicalTime;
|
|
3301
|
+
const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
|
|
3302
|
+
? [0, 0]
|
|
3303
|
+
: decodeHlc(hlc);
|
|
3304
|
+
logicalTime = Math.max(previousLogicalTime, remoteLogicalTime, Date.now());
|
|
3305
|
+
counter =
|
|
3306
|
+
logicalTime == previousLogicalTime
|
|
3307
|
+
? logicalTime == remoteLogicalTime
|
|
3308
|
+
? Math.max(counter, remoteCounter)
|
|
3309
|
+
: counter
|
|
3310
|
+
: logicalTime == remoteLogicalTime
|
|
3311
|
+
? remoteCounter
|
|
3312
|
+
: -1;
|
|
3313
|
+
};
|
|
3314
|
+
return [getHlc, seenHlc];
|
|
3315
|
+
};
|
|
3316
|
+
|
|
3317
|
+
const LISTENER_ARGS = {
|
|
3318
|
+
HasTable: 1,
|
|
3319
|
+
Table: 1,
|
|
3320
|
+
TableCellIds: 1,
|
|
3321
|
+
HasTableCell: 2,
|
|
3322
|
+
RowCount: 1,
|
|
3323
|
+
RowIds: 1,
|
|
3324
|
+
SortedRowIds: 5,
|
|
3325
|
+
HasRow: 2,
|
|
3326
|
+
Row: 2,
|
|
3327
|
+
CellIds: 2,
|
|
3328
|
+
HasCell: 3,
|
|
3329
|
+
Cell: 3,
|
|
3330
|
+
HasValue: 1,
|
|
3331
|
+
Value: 1,
|
|
3332
|
+
InvalidCell: 3,
|
|
3333
|
+
InvalidValue: 1,
|
|
3334
|
+
};
|
|
3335
|
+
const newContentStamp = () => [EMPTY_STRING, [stampNewMap(), stampNewMap()]];
|
|
3336
|
+
const createMergeableStore = (id) => {
|
|
3337
|
+
let listening = 1;
|
|
3338
|
+
let contentStamp = newContentStamp();
|
|
3339
|
+
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
3340
|
+
const store = createStore();
|
|
3341
|
+
const disableListening = (actions) => {
|
|
3342
|
+
const wasListening = listening;
|
|
3343
|
+
listening = 0;
|
|
3344
|
+
actions();
|
|
3345
|
+
listening = wasListening;
|
|
3346
|
+
};
|
|
3347
|
+
const postTransactionListener = () => {
|
|
3348
|
+
if (listening) {
|
|
3349
|
+
const stamp = getHlc();
|
|
3350
|
+
const [cellsTouched, valuesTouched, changedCells, , changedValues] =
|
|
3351
|
+
store.getTransactionLog();
|
|
3352
|
+
const [tablesStamp, valuesStamp] = contentStamp[1];
|
|
3353
|
+
contentStamp[0] = stamp;
|
|
3354
|
+
if (cellsTouched) {
|
|
3355
|
+
tablesStamp[0] = stamp;
|
|
3356
|
+
objToArray(changedCells, (changedTable, tableId) => {
|
|
3357
|
+
const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNew);
|
|
3358
|
+
const rowsStamp = (tableStamp[1] ??= mapNew());
|
|
3359
|
+
tableStamp[0] = stamp;
|
|
3360
|
+
objToArray(changedTable, (changedRow, rowId) => {
|
|
3361
|
+
const rowStamp = mapEnsure(rowsStamp, rowId, stampNew);
|
|
3362
|
+
const cellsStamp = (rowStamp[1] ??= mapNew());
|
|
3363
|
+
rowStamp[0] = stamp;
|
|
3364
|
+
objToArray(changedRow, ([, newCell], cellId) =>
|
|
3365
|
+
mapSet(cellsStamp, cellId, [stamp, newCell]),
|
|
3366
|
+
);
|
|
3367
|
+
});
|
|
3368
|
+
});
|
|
3369
|
+
}
|
|
3370
|
+
if (valuesTouched) {
|
|
3371
|
+
valuesStamp[0] = stamp;
|
|
3372
|
+
objToArray(changedValues, ([, newValue], valueId) => {
|
|
3373
|
+
mapSet(valuesStamp[1], valueId, [stamp, newValue]);
|
|
3374
|
+
});
|
|
3375
|
+
}
|
|
3376
|
+
}
|
|
3377
|
+
};
|
|
3378
|
+
const merge = (mergeableStore2) => {
|
|
3379
|
+
const mergeableContent = mergeableStore.getMergeableContent();
|
|
3380
|
+
const mergeableContent2 = mergeableStore2.getMergeableContent();
|
|
3381
|
+
mergeableStore2.applyMergeableChanges(mergeableContent);
|
|
3382
|
+
return applyMergeableChanges(mergeableContent2);
|
|
3383
|
+
};
|
|
3384
|
+
const getMergeableContent = () =>
|
|
3385
|
+
mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
|
|
3386
|
+
mapStampMapToObj(tablesStamp, (rowsStamp) =>
|
|
3387
|
+
mapStampMapToObj(rowsStamp, (cellsStamp) =>
|
|
3388
|
+
mapStampMapToObj(cellsStamp, pairClone),
|
|
3389
|
+
),
|
|
3390
|
+
),
|
|
3391
|
+
mapStampMapToObj(valuesStamp, pairClone),
|
|
3392
|
+
]);
|
|
3393
|
+
const setMergeableContent = (mergeableContent) => {
|
|
3394
|
+
disableListening(() =>
|
|
3395
|
+
store.transaction(() => {
|
|
3396
|
+
store.delTables().delValues();
|
|
3397
|
+
contentStamp = newContentStamp();
|
|
3398
|
+
}),
|
|
3399
|
+
);
|
|
3400
|
+
applyMergeableChanges(mergeableContent);
|
|
3401
|
+
return mergeableStore;
|
|
3402
|
+
};
|
|
3403
|
+
const applyMergeableChanges = (newContentStamp2) => {
|
|
3404
|
+
const changes = [{}, {}];
|
|
3405
|
+
seenHlc(newContentStamp2[0]);
|
|
3406
|
+
mergeStamp(
|
|
3407
|
+
newContentStamp2,
|
|
3408
|
+
contentStamp,
|
|
3409
|
+
changes,
|
|
3410
|
+
(
|
|
3411
|
+
[newTablesStamp, newValuesStamp],
|
|
3412
|
+
[tablesStamp, valuesStamp],
|
|
3413
|
+
[tablesChanges, valuesChanges],
|
|
3414
|
+
) => {
|
|
3415
|
+
mergeStamp(
|
|
3416
|
+
newTablesStamp,
|
|
3417
|
+
tablesStamp,
|
|
3418
|
+
tablesChanges,
|
|
3419
|
+
(newTableStamps, tableStamps, tableChanges) =>
|
|
3420
|
+
mergeStamps(
|
|
3421
|
+
newTableStamps,
|
|
3422
|
+
tableStamps,
|
|
3423
|
+
tableChanges,
|
|
3424
|
+
(newRowStamps, rowStamps, rowChanges) =>
|
|
3425
|
+
mergeStamps(
|
|
3426
|
+
newRowStamps,
|
|
3427
|
+
rowStamps,
|
|
3428
|
+
rowChanges,
|
|
3429
|
+
mergeLeafStamps,
|
|
3430
|
+
),
|
|
3431
|
+
),
|
|
3432
|
+
);
|
|
3433
|
+
mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
|
|
3434
|
+
},
|
|
3435
|
+
);
|
|
3436
|
+
disableListening(() => store.applyChanges(changes));
|
|
3437
|
+
return mergeableStore;
|
|
3438
|
+
};
|
|
3439
|
+
const mergeableStore = {
|
|
3440
|
+
getMergeableContent,
|
|
3441
|
+
setMergeableContent,
|
|
3442
|
+
applyMergeableChanges,
|
|
3443
|
+
merge,
|
|
3444
|
+
};
|
|
3445
|
+
store.addPostTransactionListener(postTransactionListener);
|
|
3446
|
+
objToArray(
|
|
3447
|
+
store,
|
|
3448
|
+
(method, name) =>
|
|
3449
|
+
(mergeableStore[name] = // fluent methods
|
|
3450
|
+
strStartsWith(name, 'set') ||
|
|
3451
|
+
strStartsWith(name, 'del') ||
|
|
3452
|
+
strStartsWith(name, 'apply') ||
|
|
3453
|
+
strEndsWith(name, 'Transaction') ||
|
|
3454
|
+
name == 'callListener'
|
|
3455
|
+
? (...args) => {
|
|
3456
|
+
method(...args);
|
|
3457
|
+
return mergeableStore;
|
|
3458
|
+
}
|
|
3459
|
+
: strStartsWith(name, 'add') && strEndsWith(name, 'Listener')
|
|
3460
|
+
? (...args) => {
|
|
3461
|
+
const listenerArg = LISTENER_ARGS[slice(name, 3, -8)] ?? 0;
|
|
3462
|
+
const listener = args[listenerArg];
|
|
3463
|
+
args[listenerArg] = (_store, ...args2) =>
|
|
3464
|
+
listener(mergeableStore, ...args2);
|
|
3465
|
+
return method(...args);
|
|
3466
|
+
}
|
|
3467
|
+
: method),
|
|
3468
|
+
);
|
|
3469
|
+
return objFreeze(mergeableStore);
|
|
3470
|
+
};
|
|
3471
|
+
|
|
3209
3472
|
export {
|
|
3210
3473
|
createCheckpoints,
|
|
3211
3474
|
createCustomPersister,
|
|
3212
3475
|
createIndexes,
|
|
3476
|
+
createMergeableStore,
|
|
3213
3477
|
createMetrics,
|
|
3214
3478
|
createQueries,
|
|
3215
3479
|
createRelationships,
|