tinybase 5.0.0-beta.3 → 5.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/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -1
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/mergeable-store.cjs +1 -1
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -1
- package/lib/cjs/metrics.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-libsql.cjs +1 -0
- package/lib/cjs/persisters/persister-libsql.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-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/queries.cjs +1 -1
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -1
- package/lib/cjs/relationships.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-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -1
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -1
- package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -1
- package/lib/cjs-es6/metrics.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-libsql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-libsql.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-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/queries.cjs +1 -1
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -1
- package/lib/cjs-es6/relationships.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/debug/checkpoints.js +3 -1
- package/lib/debug/indexes.js +3 -1
- package/lib/debug/mergeable-store.js +247 -139
- package/lib/debug/metrics.js +3 -1
- package/lib/debug/persisters/persister-automerge.js +36 -12
- package/lib/debug/persisters/persister-browser.js +37 -13
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +36 -12
- package/lib/debug/persisters/persister-electric-sql.js +36 -12
- package/lib/debug/persisters/persister-expo-sqlite-next.js +36 -12
- package/lib/debug/persisters/persister-expo-sqlite.js +36 -12
- package/lib/debug/persisters/persister-file.js +37 -13
- package/lib/debug/persisters/persister-indexed-db.js +36 -12
- package/lib/debug/persisters/persister-libsql.js +898 -0
- package/lib/debug/persisters/persister-partykit-client.js +36 -12
- package/lib/debug/persisters/persister-remote.js +36 -12
- package/lib/debug/persisters/persister-sqlite-wasm.js +36 -12
- package/lib/debug/persisters/persister-sqlite3.js +36 -12
- package/lib/debug/persisters/persister-yjs.js +36 -12
- package/lib/debug/persisters.js +36 -12
- package/lib/debug/queries.js +7 -4
- package/lib/debug/relationships.js +3 -1
- package/lib/debug/store.js +21 -22
- package/lib/debug/tinybase.js +279 -150
- package/lib/debug/tools.js +7 -4
- package/lib/debug/ui-react-dom.js +55 -34
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/indexes.js +1 -1
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/mergeable-store.js +1 -1
- package/lib/es6/mergeable-store.js.gz +0 -0
- package/lib/es6/metrics.js +1 -1
- package/lib/es6/metrics.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-libsql.js +1 -0
- package/lib/es6/persisters/persister-libsql.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-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/queries.js +1 -1
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -1
- package/lib/es6/relationships.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/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- package/lib/mergeable-store.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.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-libsql.js +1 -0
- package/lib/persisters/persister-libsql.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-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/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.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 +78 -11
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters/persister-libsql.d.ts +139 -0
- package/lib/types/persisters.d.ts +19 -7
- package/lib/types/with-schemas/mergeable-store.d.ts +314 -31
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
- package/lib/types/with-schemas/persisters.d.ts +14 -6
- package/lib/types/with-schemas/store.d.ts +37 -87
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -1
- package/lib/umd/mergeable-store.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.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-libsql.js +1 -0
- package/lib/umd/persisters/persister-libsql.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-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/queries.js +1 -1
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.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-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -1
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -1
- package/lib/umd-es6/mergeable-store.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -1
- package/lib/umd-es6/metrics.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-libsql.js +1 -0
- package/lib/umd-es6/persisters/persister-libsql.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-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/queries.js +1 -1
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -1
- package/lib/umd-es6/relationships.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/package.json +35 -30
- package/readme.md +2 -2
|
@@ -24,9 +24,9 @@ const VALUE_IDS = VALUE + IDS;
|
|
|
24
24
|
const id = (key) => EMPTY_STRING + key;
|
|
25
25
|
const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
26
26
|
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
27
|
-
const
|
|
28
|
-
const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
|
|
27
|
+
const strCharCodeAt = (str, position) => str.charCodeAt(position);
|
|
29
28
|
|
|
29
|
+
const mathMax = Math.max;
|
|
30
30
|
const isFiniteNumber = isFinite;
|
|
31
31
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
32
32
|
const isUndefined = (thing) => thing == void 0;
|
|
@@ -79,6 +79,12 @@ const objToArray = (obj, cb) =>
|
|
|
79
79
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
80
80
|
const objSize = (obj) => size(objIds(obj));
|
|
81
81
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
82
|
+
const objEnsure = (obj, id, getDefaultValue) => {
|
|
83
|
+
if (!objHas(obj, id)) {
|
|
84
|
+
obj[id] = getDefaultValue();
|
|
85
|
+
}
|
|
86
|
+
return obj[id];
|
|
87
|
+
};
|
|
82
88
|
|
|
83
89
|
const collSizeN = (collSizer) => (coll) =>
|
|
84
90
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -102,9 +108,11 @@ const mapMap = (coll, cb) =>
|
|
|
102
108
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
103
109
|
const mapSet = (map, key, value) =>
|
|
104
110
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
105
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
111
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
106
112
|
if (!collHas(map, key)) {
|
|
107
113
|
mapSet(map, key, getDefaultValue());
|
|
114
|
+
} else {
|
|
115
|
+
hadExistingValue?.(mapGet(map, key));
|
|
108
116
|
}
|
|
109
117
|
return mapGet(map, key);
|
|
110
118
|
};
|
|
@@ -162,34 +170,36 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
162
170
|
},
|
|
163
171
|
);
|
|
164
172
|
|
|
165
|
-
const
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
173
|
+
const textEncoder = new globalThis.TextEncoder();
|
|
174
|
+
const getHash = (value) => {
|
|
175
|
+
let hash = 2166136261;
|
|
176
|
+
arrayForEach(textEncoder.encode(value), (char) => {
|
|
177
|
+
hash ^= char;
|
|
178
|
+
hash +=
|
|
179
|
+
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
180
|
+
});
|
|
181
|
+
return hash >>> 0;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
|
|
185
|
+
const stampNew = (time, thing) => [time, thing];
|
|
186
|
+
const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
|
|
187
|
+
const updateHashStamp = (hashStamp, hash, time) => {
|
|
188
|
+
hashStamp[2] = hash >>> 0;
|
|
189
|
+
if (time > hashStamp[0]) {
|
|
190
|
+
hashStamp[0] = time;
|
|
182
191
|
}
|
|
183
|
-
merge(newThing, thingStamp[1], changes);
|
|
184
192
|
};
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
+
const stampNewObj = (time) => stampNew(time, objNew());
|
|
194
|
+
const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
|
|
195
|
+
const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
|
|
196
|
+
const hashStampMap = ([time, value, hash], mapper) => [
|
|
197
|
+
time,
|
|
198
|
+
mapper(value, time),
|
|
199
|
+
hash,
|
|
200
|
+
];
|
|
201
|
+
const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
|
|
202
|
+
hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
|
|
193
203
|
|
|
194
204
|
const setNew = (entryOrEntries) =>
|
|
195
205
|
new Set(
|
|
@@ -289,9 +299,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
|
|
|
289
299
|
const pairClone = (array) => [...array];
|
|
290
300
|
const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
|
|
291
301
|
|
|
292
|
-
const getCellOrValueType = (
|
|
293
|
-
const type = getTypeOf(
|
|
294
|
-
return isTypeStringOrBoolean(type) ||
|
|
302
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
303
|
+
const type = getTypeOf(cellOrValue);
|
|
304
|
+
return isTypeStringOrBoolean(type) ||
|
|
305
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
295
306
|
? type
|
|
296
307
|
: void 0;
|
|
297
308
|
};
|
|
@@ -332,12 +343,10 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
|
|
|
332
343
|
const createStore = () => {
|
|
333
344
|
let hasTablesSchema;
|
|
334
345
|
let hasValuesSchema;
|
|
335
|
-
let cellsTouched = false;
|
|
336
|
-
let valuesTouched = false;
|
|
337
346
|
let hadTables = false;
|
|
338
347
|
let hadValues = false;
|
|
339
348
|
let transactions = 0;
|
|
340
|
-
let
|
|
349
|
+
let internalListeners = [];
|
|
341
350
|
const changedTableIds = mapNew();
|
|
342
351
|
const changedTableCellIds = mapNew();
|
|
343
352
|
const changedRowCount = mapNew();
|
|
@@ -1297,8 +1306,8 @@ const createStore = () => {
|
|
|
1297
1306
|
),
|
|
1298
1307
|
];
|
|
1299
1308
|
const getTransactionLog = () => [
|
|
1300
|
-
|
|
1301
|
-
|
|
1309
|
+
!collIsEmpty(changedCells),
|
|
1310
|
+
!collIsEmpty(changedValues),
|
|
1302
1311
|
mapToObj3(changedCells, pairClone, pairIsEqual),
|
|
1303
1312
|
mapToObj3(invalidCells),
|
|
1304
1313
|
mapToObj(changedValues, pairClone, pairIsEqual),
|
|
@@ -1312,15 +1321,13 @@ const createStore = () => {
|
|
|
1312
1321
|
if (transactions > 0) {
|
|
1313
1322
|
transactions--;
|
|
1314
1323
|
if (transactions == 0) {
|
|
1315
|
-
cellsTouched = !collIsEmpty(changedCells);
|
|
1316
|
-
valuesTouched = !collIsEmpty(changedValues);
|
|
1317
1324
|
transactions = 1;
|
|
1318
1325
|
callInvalidCellListeners(1);
|
|
1319
|
-
if (
|
|
1326
|
+
if (!collIsEmpty(changedCells)) {
|
|
1320
1327
|
callTabularListenersForChanges(1);
|
|
1321
1328
|
}
|
|
1322
1329
|
callInvalidValueListeners(1);
|
|
1323
|
-
if (
|
|
1330
|
+
if (!collIsEmpty(changedValues)) {
|
|
1324
1331
|
callValuesListenersForChanges(1);
|
|
1325
1332
|
}
|
|
1326
1333
|
if (doRollback?.(store)) {
|
|
@@ -1331,25 +1338,26 @@ const createStore = () => {
|
|
|
1331
1338
|
),
|
|
1332
1339
|
),
|
|
1333
1340
|
);
|
|
1341
|
+
collClear(changedCells);
|
|
1334
1342
|
collForEach(changedValues, ([oldValue], valueId) =>
|
|
1335
1343
|
setOrDelValue(store, valueId, oldValue),
|
|
1336
1344
|
);
|
|
1337
|
-
|
|
1345
|
+
collClear(changedValues);
|
|
1338
1346
|
}
|
|
1339
1347
|
callListeners(finishTransactionListeners[0], void 0);
|
|
1340
1348
|
transactions = -1;
|
|
1341
1349
|
callInvalidCellListeners(0);
|
|
1342
|
-
if (
|
|
1350
|
+
if (!collIsEmpty(changedCells)) {
|
|
1343
1351
|
callTabularListenersForChanges(0);
|
|
1344
1352
|
}
|
|
1345
1353
|
callInvalidValueListeners(0);
|
|
1346
|
-
if (
|
|
1354
|
+
if (!collIsEmpty(changedValues)) {
|
|
1347
1355
|
callValuesListenersForChanges(0);
|
|
1348
1356
|
}
|
|
1349
|
-
|
|
1357
|
+
internalListeners[0]?.(store);
|
|
1350
1358
|
callListeners(finishTransactionListeners[1], void 0);
|
|
1359
|
+
internalListeners[1]?.(store);
|
|
1351
1360
|
transactions = 0;
|
|
1352
|
-
cellsTouched = valuesTouched = false;
|
|
1353
1361
|
hadTables = hasTables();
|
|
1354
1362
|
hadValues = hasValues();
|
|
1355
1363
|
arrayForEach(
|
|
@@ -1474,9 +1482,8 @@ const createStore = () => {
|
|
|
1474
1482
|
collSize2(startTransactionListeners) +
|
|
1475
1483
|
pairCollSize2(finishTransactionListeners),
|
|
1476
1484
|
});
|
|
1477
|
-
const
|
|
1478
|
-
|
|
1479
|
-
};
|
|
1485
|
+
const setInternalListeners = (preFinishTransaction, postFinishTransaction) =>
|
|
1486
|
+
(internalListeners = [preFinishTransaction, postFinishTransaction]);
|
|
1480
1487
|
const store = {
|
|
1481
1488
|
getContent,
|
|
1482
1489
|
getTables,
|
|
@@ -1554,7 +1561,7 @@ const createStore = () => {
|
|
|
1554
1561
|
createStore,
|
|
1555
1562
|
addListener,
|
|
1556
1563
|
callListeners,
|
|
1557
|
-
|
|
1564
|
+
setInternalListeners,
|
|
1558
1565
|
};
|
|
1559
1566
|
objToArray(
|
|
1560
1567
|
{
|
|
@@ -1638,12 +1645,6 @@ const SHIFT12 = 2 ** 12;
|
|
|
1638
1645
|
const SHIFT6 = 2 ** 6;
|
|
1639
1646
|
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
1640
1647
|
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
1641
|
-
const hash = (value) =>
|
|
1642
|
-
arrayReduce(
|
|
1643
|
-
strSplit(value),
|
|
1644
|
-
(hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
|
|
1645
|
-
5381,
|
|
1646
|
-
) >>> 0;
|
|
1647
1648
|
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
1648
1649
|
toB64(logicalTime42 / SHIFT36) +
|
|
1649
1650
|
toB64(logicalTime42 / SHIFT30) +
|
|
@@ -1681,23 +1682,23 @@ const decodeHlc = (hlc16) => [
|
|
|
1681
1682
|
];
|
|
1682
1683
|
const getHlcFunctions = (uniqueId) => {
|
|
1683
1684
|
let logicalTime = 0;
|
|
1684
|
-
let
|
|
1685
|
-
const uniqueIdHash =
|
|
1685
|
+
let lastCounter = -1;
|
|
1686
|
+
const uniqueIdHash = getHash(uniqueId);
|
|
1686
1687
|
const getHlc = () => {
|
|
1687
1688
|
seenHlc();
|
|
1688
|
-
return encodeHlc(logicalTime, ++
|
|
1689
|
+
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
1689
1690
|
};
|
|
1690
1691
|
const seenHlc = (hlc) => {
|
|
1691
1692
|
const previousLogicalTime = logicalTime;
|
|
1692
1693
|
const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
|
|
1693
1694
|
? [0, 0]
|
|
1694
1695
|
: decodeHlc(hlc);
|
|
1695
|
-
logicalTime =
|
|
1696
|
-
|
|
1696
|
+
logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
|
|
1697
|
+
lastCounter =
|
|
1697
1698
|
logicalTime == previousLogicalTime
|
|
1698
1699
|
? logicalTime == remoteLogicalTime
|
|
1699
|
-
?
|
|
1700
|
-
:
|
|
1700
|
+
? mathMax(lastCounter, remoteCounter)
|
|
1701
|
+
: lastCounter
|
|
1701
1702
|
: logicalTime == remoteLogicalTime
|
|
1702
1703
|
? remoteCounter
|
|
1703
1704
|
: -1;
|
|
@@ -1723,10 +1724,16 @@ const LISTENER_ARGS = {
|
|
|
1723
1724
|
InvalidCell: 3,
|
|
1724
1725
|
InvalidValue: 1,
|
|
1725
1726
|
};
|
|
1726
|
-
const
|
|
1727
|
+
const newContentHsm = (time = EMPTY_STRING) => [
|
|
1728
|
+
time,
|
|
1729
|
+
[hashStampNewMap(time), hashStampNewMap(time)],
|
|
1730
|
+
0,
|
|
1731
|
+
];
|
|
1727
1732
|
const createMergeableStore = (id) => {
|
|
1728
1733
|
let listening = 1;
|
|
1729
|
-
let
|
|
1734
|
+
let contentHsm = newContentHsm();
|
|
1735
|
+
let transactionTime;
|
|
1736
|
+
let transactionMergeableChanges;
|
|
1730
1737
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
1731
1738
|
const store = createStore();
|
|
1732
1739
|
const disableListening = (actions) => {
|
|
@@ -1735,105 +1742,206 @@ const createMergeableStore = (id) => {
|
|
|
1735
1742
|
actions();
|
|
1736
1743
|
listening = wasListening;
|
|
1737
1744
|
};
|
|
1738
|
-
const
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1745
|
+
const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
|
|
1746
|
+
const tablesChanges = {};
|
|
1747
|
+
const valuesChanges = {};
|
|
1748
|
+
const [
|
|
1749
|
+
contentOrChangesTime,
|
|
1750
|
+
[[tablesTime, tablesObj, incomingTablesHash], values],
|
|
1751
|
+
incomingContentOrChangesHash,
|
|
1752
|
+
] = contentOrChanges;
|
|
1753
|
+
const [, [tablesHsm, valuesHsm]] = contentHsm;
|
|
1754
|
+
const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
|
|
1755
|
+
if (tablesTime) {
|
|
1756
|
+
let tablesHash = hasHashes
|
|
1757
|
+
? incomingTablesHash
|
|
1758
|
+
: oldTablesHash ^
|
|
1759
|
+
(tablesTime > oldTablesTime
|
|
1760
|
+
? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
|
|
1761
|
+
: 0);
|
|
1762
|
+
objForEach(
|
|
1763
|
+
tablesObj,
|
|
1764
|
+
([tableTime, rowsObj, incomingTableHash], tableId) => {
|
|
1765
|
+
const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
|
|
1766
|
+
const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
|
|
1767
|
+
let tableHash = hasHashes
|
|
1768
|
+
? incomingTableHash
|
|
1769
|
+
: oldTableHash ^
|
|
1770
|
+
(tableTime > oldTableTime
|
|
1771
|
+
? (oldTableTime ? getHash(oldTableTime) : 0) ^
|
|
1772
|
+
getHash(tableTime)
|
|
1773
|
+
: 0);
|
|
1774
|
+
objForEach(rowsObj, (row, rowId) => {
|
|
1775
|
+
const [oldRowHash, rowHash] = mergeCellsOrValues(
|
|
1776
|
+
row,
|
|
1777
|
+
mapEnsure(rowHsms, rowId, hashStampNewMap),
|
|
1778
|
+
objEnsure(
|
|
1779
|
+
objEnsure(tablesChanges, tableId, objNew),
|
|
1780
|
+
rowId,
|
|
1781
|
+
objNew,
|
|
1782
|
+
),
|
|
1783
|
+
hasHashes,
|
|
1757
1784
|
);
|
|
1785
|
+
tableHash ^= hasHashes
|
|
1786
|
+
? 0
|
|
1787
|
+
: (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
|
|
1788
|
+
hashIdAndHash(rowId, rowHash);
|
|
1758
1789
|
});
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1790
|
+
updateHashStamp(tableHsm, tableHash, tableTime);
|
|
1791
|
+
tablesHash ^= hasHashes
|
|
1792
|
+
? 0
|
|
1793
|
+
: (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
|
|
1794
|
+
hashIdAndHash(tableId, tableHsm[2]);
|
|
1795
|
+
},
|
|
1796
|
+
);
|
|
1797
|
+
updateHashStamp(tablesHsm, tablesHash, tablesTime);
|
|
1767
1798
|
}
|
|
1799
|
+
mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
|
|
1800
|
+
updateHashStamp(
|
|
1801
|
+
contentHsm,
|
|
1802
|
+
hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
|
|
1803
|
+
contentOrChangesTime,
|
|
1804
|
+
);
|
|
1805
|
+
return [tablesChanges, valuesChanges];
|
|
1768
1806
|
};
|
|
1769
|
-
const
|
|
1770
|
-
const
|
|
1771
|
-
const
|
|
1772
|
-
|
|
1773
|
-
|
|
1807
|
+
const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
|
|
1808
|
+
const [thingsTime, thingsObj, incomingThingsHash] = things;
|
|
1809
|
+
const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
|
|
1810
|
+
if (thingsTime) {
|
|
1811
|
+
let thingsHash = hasHashes
|
|
1812
|
+
? incomingThingsHash
|
|
1813
|
+
: oldThingsHash ^
|
|
1814
|
+
(thingsTime > oldThingsTime
|
|
1815
|
+
? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
|
|
1816
|
+
: 0);
|
|
1817
|
+
objForEach(
|
|
1818
|
+
thingsObj,
|
|
1819
|
+
([thingTime, thing, incomingThingHash], thingId) => {
|
|
1820
|
+
const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
|
|
1821
|
+
const [oldThingTime, , oldThingHash] = thingHsm;
|
|
1822
|
+
if (thingTime > oldThingTime) {
|
|
1823
|
+
updateHashStamp(
|
|
1824
|
+
thingHsm,
|
|
1825
|
+
hasHashes
|
|
1826
|
+
? incomingThingHash
|
|
1827
|
+
: getHash(jsonString(thing ?? null) + ':' + thingTime),
|
|
1828
|
+
thingTime,
|
|
1829
|
+
);
|
|
1830
|
+
thingHsm[1] = thing;
|
|
1831
|
+
thingsChanges[thingId] = thing;
|
|
1832
|
+
thingsHash ^= hasHashes
|
|
1833
|
+
? 0
|
|
1834
|
+
: hashIdAndHash(thingId, oldThingHash) ^
|
|
1835
|
+
hashIdAndHash(thingId, thingHsm[2]);
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
);
|
|
1839
|
+
updateHashStamp(thingsHsm, thingsHash, thingsTime);
|
|
1840
|
+
}
|
|
1841
|
+
return [oldThingsHash, thingsHsm[2]];
|
|
1842
|
+
};
|
|
1843
|
+
const preFinishTransaction = () => {
|
|
1844
|
+
if (listening) {
|
|
1845
|
+
transactionMergeableChanges = getTransactionMergeableChanges();
|
|
1846
|
+
mergeContentOrChanges(transactionMergeableChanges);
|
|
1847
|
+
}
|
|
1774
1848
|
};
|
|
1849
|
+
const postFinishTransaction = () =>
|
|
1850
|
+
(transactionTime = transactionMergeableChanges = void 0);
|
|
1775
1851
|
const getMergeableContent = () =>
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
mapStampMapToObj(cellsStamp, pairClone),
|
|
1780
|
-
),
|
|
1852
|
+
hashStampMap(contentHsm, ([tables, values]) => [
|
|
1853
|
+
hashStampMapToObj(tables, (table) =>
|
|
1854
|
+
hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
|
|
1781
1855
|
),
|
|
1782
|
-
|
|
1856
|
+
hashStampMapToObj(values),
|
|
1783
1857
|
]);
|
|
1784
1858
|
const setMergeableContent = (mergeableContent) => {
|
|
1785
1859
|
disableListening(() =>
|
|
1786
1860
|
store.transaction(() => {
|
|
1787
1861
|
store.delTables().delValues();
|
|
1788
|
-
|
|
1862
|
+
contentHsm = newContentHsm();
|
|
1789
1863
|
}),
|
|
1790
1864
|
);
|
|
1791
|
-
|
|
1865
|
+
seenHlc(mergeableContent[0]);
|
|
1866
|
+
disableListening(() =>
|
|
1867
|
+
store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
|
|
1868
|
+
);
|
|
1792
1869
|
return mergeableStore;
|
|
1793
1870
|
};
|
|
1794
|
-
const
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
(
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
(
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1871
|
+
const getTransactionMergeableChanges = () => {
|
|
1872
|
+
if (isUndefined(transactionMergeableChanges)) {
|
|
1873
|
+
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
1874
|
+
const time =
|
|
1875
|
+
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
1876
|
+
? transactionTime ?? (transactionTime = getHlc())
|
|
1877
|
+
: EMPTY_STRING;
|
|
1878
|
+
const mergeableChanges = stampNew(time, [
|
|
1879
|
+
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
1880
|
+
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
1881
|
+
]);
|
|
1882
|
+
const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
|
|
1883
|
+
objToArray(changedCells, (changedTable, tableId) => {
|
|
1884
|
+
const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
|
|
1885
|
+
objToArray(changedTable, (changedRow, rowId) => {
|
|
1886
|
+
const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
|
|
1887
|
+
objToArray(
|
|
1888
|
+
changedRow,
|
|
1889
|
+
([, newCell], cellId) =>
|
|
1890
|
+
(cellsObj[cellId] = stampNew(time, newCell)),
|
|
1891
|
+
);
|
|
1892
|
+
});
|
|
1893
|
+
});
|
|
1894
|
+
objToArray(
|
|
1895
|
+
changedValues,
|
|
1896
|
+
([, newValue], valueId) =>
|
|
1897
|
+
(valuesObj[valueId] = stampNew(time, newValue)),
|
|
1898
|
+
);
|
|
1899
|
+
return mergeableChanges;
|
|
1900
|
+
}
|
|
1901
|
+
return transactionMergeableChanges;
|
|
1902
|
+
};
|
|
1903
|
+
const applyMergeableChanges = (mergeableChanges) => {
|
|
1904
|
+
seenHlc(mergeableChanges[0]);
|
|
1905
|
+
disableListening(() =>
|
|
1906
|
+
store.applyChanges(mergeContentOrChanges(mergeableChanges)),
|
|
1826
1907
|
);
|
|
1827
|
-
disableListening(() => store.applyChanges(changes));
|
|
1828
1908
|
return mergeableStore;
|
|
1829
1909
|
};
|
|
1910
|
+
const merge = (mergeableStore2) => {
|
|
1911
|
+
const mergeableChanges = getMergeableContent();
|
|
1912
|
+
const mergeableChanges2 = mergeableStore2.getMergeableContent();
|
|
1913
|
+
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
1914
|
+
return applyMergeableChanges(mergeableChanges2);
|
|
1915
|
+
};
|
|
1916
|
+
const getContentHash = () => contentHsm[2];
|
|
1917
|
+
const getTablesHash = () => contentHsm[1][0][2];
|
|
1918
|
+
const getTableHash = (tableId) =>
|
|
1919
|
+
mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
|
|
1920
|
+
const getRowHash = (tableId, rowId) =>
|
|
1921
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
|
|
1922
|
+
const getCellHash = (tableId, rowId, cellId) =>
|
|
1923
|
+
mapGet(
|
|
1924
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
1925
|
+
cellId,
|
|
1926
|
+
)?.[2] ?? 0;
|
|
1927
|
+
const getValuesHash = () => contentHsm[1][1][2];
|
|
1928
|
+
const getValueHash = (valueId) =>
|
|
1929
|
+
mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
|
|
1830
1930
|
const mergeableStore = {
|
|
1831
1931
|
getMergeableContent,
|
|
1832
1932
|
setMergeableContent,
|
|
1933
|
+
getTransactionMergeableChanges,
|
|
1833
1934
|
applyMergeableChanges,
|
|
1834
1935
|
merge,
|
|
1936
|
+
getContentHash,
|
|
1937
|
+
getTablesHash,
|
|
1938
|
+
getTableHash,
|
|
1939
|
+
getRowHash,
|
|
1940
|
+
getCellHash,
|
|
1941
|
+
getValuesHash,
|
|
1942
|
+
getValueHash,
|
|
1835
1943
|
};
|
|
1836
|
-
store.
|
|
1944
|
+
store.setInternalListeners(preFinishTransaction, postFinishTransaction);
|
|
1837
1945
|
objToArray(
|
|
1838
1946
|
store,
|
|
1839
1947
|
(method, name) =>
|
package/lib/debug/metrics.js
CHANGED
|
@@ -52,9 +52,11 @@ const mapForEach = (map, cb) =>
|
|
|
52
52
|
collForEach(map, (value, key) => cb(key, value));
|
|
53
53
|
const mapSet = (map, key, value) =>
|
|
54
54
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
55
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
55
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
56
56
|
if (!collHas(map, key)) {
|
|
57
57
|
mapSet(map, key, getDefaultValue());
|
|
58
|
+
} else {
|
|
59
|
+
hadExistingValue?.(mapGet(map, key));
|
|
58
60
|
}
|
|
59
61
|
return mapGet(map, key);
|
|
60
62
|
};
|
|
@@ -52,15 +52,34 @@ const mapNew = (entries) => new Map(entries);
|
|
|
52
52
|
const mapGet = (map, key) => map?.get(key);
|
|
53
53
|
const mapSet = (map, key, value) =>
|
|
54
54
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
55
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
55
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
56
56
|
if (!collHas(map, key)) {
|
|
57
57
|
mapSet(map, key, getDefaultValue());
|
|
58
|
+
} else {
|
|
59
|
+
hadExistingValue?.(mapGet(map, key));
|
|
58
60
|
}
|
|
59
61
|
return mapGet(map, key);
|
|
60
62
|
};
|
|
61
63
|
|
|
62
64
|
const scheduleRunning = mapNew();
|
|
63
65
|
const scheduleActions = mapNew();
|
|
66
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
67
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
68
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
69
|
+
? [
|
|
70
|
+
0,
|
|
71
|
+
store.getContent,
|
|
72
|
+
store.getTransactionChanges,
|
|
73
|
+
([changedTables, changedValues]) =>
|
|
74
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
75
|
+
]
|
|
76
|
+
: [
|
|
77
|
+
1,
|
|
78
|
+
store.getMergeableContent,
|
|
79
|
+
store.getTransactionMergeableChanges,
|
|
80
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
81
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
82
|
+
];
|
|
64
83
|
const createCustomPersister = (
|
|
65
84
|
store,
|
|
66
85
|
getPersisted,
|
|
@@ -81,10 +100,8 @@ const createCustomPersister = (
|
|
|
81
100
|
let listeningHandle;
|
|
82
101
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
83
102
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
84
|
-
const getContent =
|
|
85
|
-
(supportsMergeableStore
|
|
86
|
-
store.getContent;
|
|
87
|
-
const getChanges = store.getTransactionChanges;
|
|
103
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
104
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
88
105
|
const run = async () => {
|
|
89
106
|
/* istanbul ignore else */
|
|
90
107
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -121,8 +138,8 @@ const createCustomPersister = (
|
|
|
121
138
|
await loadLock(async () => {
|
|
122
139
|
try {
|
|
123
140
|
const content = await getPersisted();
|
|
124
|
-
(
|
|
125
|
-
? store.
|
|
141
|
+
(isMergeableStore && isMergeable(content)
|
|
142
|
+
? store.setMergeableContent
|
|
126
143
|
: store.setContent)(content);
|
|
127
144
|
} catch {
|
|
128
145
|
store.setContent([initialTables, initialValues]);
|
|
@@ -136,11 +153,18 @@ const createCustomPersister = (
|
|
|
136
153
|
async (getContent2, getChanges2) => {
|
|
137
154
|
if (getChanges2) {
|
|
138
155
|
const changes = getChanges2();
|
|
139
|
-
await loadLock(async () =>
|
|
156
|
+
await loadLock(async () =>
|
|
157
|
+
(isMergeableStore && isMergeable(changes)
|
|
158
|
+
? store.applyMergeableChanges
|
|
159
|
+
: store.applyChanges)(changes),
|
|
160
|
+
);
|
|
140
161
|
} else {
|
|
141
162
|
await loadLock(async () => {
|
|
142
163
|
try {
|
|
143
|
-
|
|
164
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
165
|
+
(isMergeableStore && isMergeable(content)
|
|
166
|
+
? store.setMergeableContent
|
|
167
|
+
: store.setContent)(content);
|
|
144
168
|
} catch (error) {
|
|
145
169
|
onIgnoredError?.(error);
|
|
146
170
|
}
|
|
@@ -180,9 +204,9 @@ const createCustomPersister = (
|
|
|
180
204
|
startAutoSave: async () => {
|
|
181
205
|
await persister.stopAutoSave().save();
|
|
182
206
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
183
|
-
const
|
|
184
|
-
if (
|
|
185
|
-
persister.save(() =>
|
|
207
|
+
const changes = getChanges();
|
|
208
|
+
if (hasChanges(changes)) {
|
|
209
|
+
persister.save(() => changes);
|
|
186
210
|
}
|
|
187
211
|
});
|
|
188
212
|
return persister;
|