tinybase 5.0.0-beta.5 → 5.0.0-beta.7
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 -1
- 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-libsql.cjs +1 -1
- 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-powersync.cjs +1 -0
- package/lib/cjs/persisters/persister-powersync.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/synchronizers/synchronizer-local.cjs +1 -0
- package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs/synchronizers.cjs +1 -0
- package/lib/cjs/synchronizers.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.cjs +1 -1
- package/lib/cjs/ui-react.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/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 -1
- 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-powersync.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.cjs +1 -0
- package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers.cjs +1 -0
- package/lib/cjs-es6/synchronizers.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.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +287 -130
- package/lib/debug/persisters/persister-automerge.js +39 -46
- package/lib/debug/persisters/persister-browser.js +39 -46
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +64 -60
- package/lib/debug/persisters/persister-electric-sql.js +64 -60
- package/lib/debug/persisters/persister-expo-sqlite-next.js +64 -60
- package/lib/debug/persisters/persister-expo-sqlite.js +64 -60
- package/lib/debug/persisters/persister-file.js +39 -46
- package/lib/debug/persisters/persister-indexed-db.js +39 -46
- package/lib/debug/persisters/persister-libsql.js +64 -60
- package/lib/debug/persisters/persister-partykit-client.js +39 -46
- package/lib/debug/persisters/persister-powersync.js +917 -0
- package/lib/debug/persisters/persister-remote.js +39 -46
- package/lib/debug/persisters/persister-sqlite-wasm.js +64 -60
- package/lib/debug/persisters/persister-sqlite3.js +64 -60
- package/lib/debug/persisters/persister-yjs.js +41 -48
- package/lib/debug/persisters.js +38 -45
- package/lib/debug/store.js +44 -32
- package/lib/debug/synchronizers/synchronizer-local.js +502 -0
- package/lib/debug/synchronizers/synchronizer-ws-client.js +525 -0
- package/lib/debug/synchronizers/synchronizer-ws-server.js +57 -0
- package/lib/debug/synchronizers.js +466 -0
- package/lib/debug/tinybase.js +569 -250
- package/lib/debug/tools.js +2 -2
- package/lib/debug/ui-react-dom.js +81 -76
- package/lib/debug/ui-react.js +1 -1
- package/lib/es6/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -0
- package/lib/es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -0
- package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
- package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
- package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/es6/synchronizers.js +1 -0
- package/lib/es6/synchronizers.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.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -0
- package/lib/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -0
- package/lib/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-client.js +1 -0
- package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-server.js +1 -0
- package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/synchronizers.js +1 -0
- package/lib/synchronizers.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/checkpoints.d.ts +2 -2
- package/lib/types/indexes.d.ts +2 -2
- package/lib/types/mergeable-store.d.ts +121 -59
- package/lib/types/metrics.d.ts +2 -2
- package/lib/types/persisters/persister-automerge.d.ts +3 -0
- package/lib/types/persisters/persister-browser.d.ts +9 -2
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
- package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
- package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
- package/lib/types/persisters/persister-file.d.ts +5 -1
- package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
- package/lib/types/persisters/persister-libsql.d.ts +3 -0
- package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
- package/lib/types/persisters/persister-powersync.d.ts +157 -0
- package/lib/types/persisters/persister-remote.d.ts +3 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
- package/lib/types/persisters/persister-yjs.d.ts +5 -2
- package/lib/types/persisters.d.ts +68 -19
- package/lib/types/queries.d.ts +2 -2
- package/lib/types/relationships.d.ts +2 -2
- package/lib/types/store.d.ts +36 -3
- package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
- package/lib/types/synchronizers/synchronizer-ws-client.d.ts +30 -0
- package/lib/types/synchronizers/synchronizer-ws-server.d.ts +24 -0
- package/lib/types/synchronizers.d.ts +131 -0
- package/lib/types/tinybase.d.ts +10 -9
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/ui-react.d.ts +8 -8
- package/lib/types/with-schemas/checkpoints.d.ts +2 -2
- package/lib/types/with-schemas/indexes.d.ts +2 -2
- package/lib/types/with-schemas/mergeable-store.d.ts +185 -87
- package/lib/types/with-schemas/metrics.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
- package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
- package/lib/types/with-schemas/persisters.d.ts +90 -62
- package/lib/types/with-schemas/queries.d.ts +3 -3
- package/lib/types/with-schemas/relationships.d.ts +2 -2
- package/lib/types/with-schemas/store.d.ts +100 -3
- package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
- package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +32 -0
- package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +24 -0
- package/lib/types/with-schemas/synchronizers.d.ts +146 -0
- package/lib/types/with-schemas/tinybase.d.ts +9 -9
- package/lib/types/with-schemas/tools.d.ts +2 -2
- package/lib/types/with-schemas/ui-react.d.ts +8 -8
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -0
- package/lib/umd/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -0
- package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
- package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
- package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd/synchronizers.js +1 -0
- package/lib/umd/synchronizers.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.js +1 -1
- package/lib/umd/ui-react.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/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 -1
- 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-powersync.js +1 -0
- package/lib/umd-es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -0
- package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd-es6/synchronizers.js +1 -0
- package/lib/umd-es6/synchronizers.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.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +37 -26
- package/readme.md +2 -2
package/lib/debug/tinybase.js
CHANGED
|
@@ -33,6 +33,7 @@ const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
|
33
33
|
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
34
34
|
const strCharCodeAt = (str, position) => str.charCodeAt(position);
|
|
35
35
|
|
|
36
|
+
const promise = Promise;
|
|
36
37
|
const mathMax = Math.max;
|
|
37
38
|
const mathMin = Math.min;
|
|
38
39
|
const isFiniteNumber = isFinite;
|
|
@@ -48,6 +49,7 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
|
48
49
|
const size = (arrayOrString) => arrayOrString.length;
|
|
49
50
|
const test = (regex, subject) => regex.test(subject);
|
|
50
51
|
const getUndefined = () => void 0;
|
|
52
|
+
const promiseNew = (resolver) => new promise(resolver);
|
|
51
53
|
|
|
52
54
|
const arrayHas = (array, value) => array.includes(value);
|
|
53
55
|
const arrayEvery = (array, cb) => array.every(cb);
|
|
@@ -74,9 +76,7 @@ const arrayShift = (array) => array.shift();
|
|
|
74
76
|
const object = Object;
|
|
75
77
|
const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
|
|
76
78
|
const objEntries = object.entries;
|
|
77
|
-
const objIds = object.keys;
|
|
78
79
|
const objFrozen = object.isFrozen;
|
|
79
|
-
const objFreeze = object.freeze;
|
|
80
80
|
const isObject = (obj) =>
|
|
81
81
|
!isUndefined(obj) &&
|
|
82
82
|
ifNotUndefined(
|
|
@@ -87,6 +87,8 @@ const isObject = (obj) =>
|
|
|
87
87
|
/* istanbul ignore next */
|
|
88
88
|
() => true,
|
|
89
89
|
);
|
|
90
|
+
const objIds = object.keys;
|
|
91
|
+
const objFreeze = object.freeze;
|
|
90
92
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
91
93
|
const objHas = (obj, id) => id in obj;
|
|
92
94
|
const objDel = (obj, id) => {
|
|
@@ -97,6 +99,8 @@ const objForEach = (obj, cb) =>
|
|
|
97
99
|
arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
|
|
98
100
|
const objToArray = (obj, cb) =>
|
|
99
101
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
102
|
+
const objMap = (obj, cb) =>
|
|
103
|
+
objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
|
|
100
104
|
const objSize = (obj) => size(objIds(obj));
|
|
101
105
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
102
106
|
const objEnsure = (obj, id, getDefaultValue) => {
|
|
@@ -105,6 +109,23 @@ const objEnsure = (obj, id, getDefaultValue) => {
|
|
|
105
109
|
}
|
|
106
110
|
return obj[id];
|
|
107
111
|
};
|
|
112
|
+
const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
|
|
113
|
+
if (
|
|
114
|
+
isUndefined(obj) ||
|
|
115
|
+
!isObject(obj) ||
|
|
116
|
+
(!emptyIsValid && objIsEmpty(obj)) ||
|
|
117
|
+
objFrozen(obj)
|
|
118
|
+
) {
|
|
119
|
+
onInvalidObj?.();
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
objToArray(obj, (child, id) => {
|
|
123
|
+
if (!validateChild(child, id)) {
|
|
124
|
+
objDel(obj, id);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return emptyIsValid ? true : !objIsEmpty(obj);
|
|
128
|
+
};
|
|
108
129
|
|
|
109
130
|
const collSizeN = (collSizer) => (coll) =>
|
|
110
131
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -141,24 +162,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
|
|
|
141
162
|
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
142
163
|
return map;
|
|
143
164
|
};
|
|
144
|
-
const mapToObj = (map,
|
|
165
|
+
const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
145
166
|
const obj = {};
|
|
146
|
-
collForEach(map, (
|
|
147
|
-
|
|
148
|
-
|
|
167
|
+
collForEach(map, (mapValue, id) => {
|
|
168
|
+
if (!excludeMapValue?.(mapValue, id)) {
|
|
169
|
+
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
170
|
+
excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
|
|
171
|
+
}
|
|
149
172
|
});
|
|
150
173
|
return obj;
|
|
151
174
|
};
|
|
152
|
-
const mapToObj2 = (map,
|
|
175
|
+
const mapToObj2 = (map, valueMapper, excludeMapValue) =>
|
|
153
176
|
mapToObj(
|
|
154
177
|
map,
|
|
155
|
-
(childMap) => mapToObj(childMap,
|
|
178
|
+
(childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
|
|
179
|
+
collIsEmpty,
|
|
156
180
|
objIsEmpty,
|
|
157
181
|
);
|
|
158
|
-
const mapToObj3 = (map,
|
|
182
|
+
const mapToObj3 = (map, valueMapper, excludeMapValue) =>
|
|
159
183
|
mapToObj(
|
|
160
184
|
map,
|
|
161
|
-
(childMap) => mapToObj2(childMap,
|
|
185
|
+
(childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
|
|
186
|
+
collIsEmpty,
|
|
162
187
|
objIsEmpty,
|
|
163
188
|
);
|
|
164
189
|
const mapClone = (map, mapValue) => {
|
|
@@ -197,6 +222,8 @@ const getCellOrValueType = (cellOrValue) => {
|
|
|
197
222
|
? type
|
|
198
223
|
: void 0;
|
|
199
224
|
};
|
|
225
|
+
const isCellOrValueOrNull = (cellOrValue) =>
|
|
226
|
+
cellOrValue === null || !isUndefined(getCellOrValueType(cellOrValue));
|
|
200
227
|
const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
|
|
201
228
|
isUndefined(cell)
|
|
202
229
|
? store.delCell(tableId, rowId, cellId, true)
|
|
@@ -1093,7 +1120,6 @@ const createMetrics = getCreateFunction((store) => {
|
|
|
1093
1120
|
|
|
1094
1121
|
const scheduleRunning = mapNew();
|
|
1095
1122
|
const scheduleActions = mapNew();
|
|
1096
|
-
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
1097
1123
|
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
1098
1124
|
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
1099
1125
|
? [
|
|
@@ -1118,16 +1144,15 @@ const createCustomPersister = (
|
|
|
1118
1144
|
delPersisterListener,
|
|
1119
1145
|
onIgnoredError,
|
|
1120
1146
|
supportsMergeableStore,
|
|
1121
|
-
|
|
1147
|
+
extra = {},
|
|
1122
1148
|
scheduleId = [],
|
|
1123
1149
|
) => {
|
|
1124
|
-
let listenerId;
|
|
1125
1150
|
let loadSave = 0;
|
|
1126
1151
|
let loads = 0;
|
|
1127
1152
|
let saves = 0;
|
|
1128
|
-
let listening = 0;
|
|
1129
1153
|
let action;
|
|
1130
|
-
let
|
|
1154
|
+
let autoLoadHandle;
|
|
1155
|
+
let autoSaveListenerId;
|
|
1131
1156
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
1132
1157
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
1133
1158
|
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
@@ -1163,55 +1188,51 @@ const createCustomPersister = (
|
|
|
1163
1188
|
}
|
|
1164
1189
|
return persister;
|
|
1165
1190
|
};
|
|
1191
|
+
const setContentOrChanges = (contentOrChanges) => {
|
|
1192
|
+
(isMergeableStore && isString(contentOrChanges?.[0])
|
|
1193
|
+
? contentOrChanges?.[1][2] === 1
|
|
1194
|
+
? store.applyMergeableChanges
|
|
1195
|
+
: store.setMergeableContent
|
|
1196
|
+
: contentOrChanges?.[2] === 1
|
|
1197
|
+
? store.applyChanges
|
|
1198
|
+
: store.setContent)(contentOrChanges);
|
|
1199
|
+
};
|
|
1166
1200
|
const persister = {
|
|
1167
1201
|
load: async (initialTables, initialValues) =>
|
|
1168
1202
|
await loadLock(async () => {
|
|
1169
1203
|
try {
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
: store.setContent)(content);
|
|
1174
|
-
} catch {
|
|
1204
|
+
setContentOrChanges(await getPersisted());
|
|
1205
|
+
} catch (error) {
|
|
1206
|
+
onIgnoredError?.(error);
|
|
1175
1207
|
store.setContent([initialTables, initialValues]);
|
|
1176
1208
|
}
|
|
1177
1209
|
}),
|
|
1178
1210
|
startAutoLoad: async (initialTables = {}, initialValues = {}) => {
|
|
1179
|
-
persister.stopAutoLoad();
|
|
1180
|
-
|
|
1181
|
-
listening = 1;
|
|
1182
|
-
listeningHandle = addPersisterListener(
|
|
1211
|
+
await persister.stopAutoLoad().load(initialTables, initialValues);
|
|
1212
|
+
autoLoadHandle = addPersisterListener(
|
|
1183
1213
|
async (getContent2, getChanges2) => {
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
(
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
)
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
const content = getContent2?.() ?? (await getPersisted());
|
|
1195
|
-
(isMergeableStore && isMergeable(content)
|
|
1196
|
-
? store.setMergeableContent
|
|
1197
|
-
: store.setContent)(content);
|
|
1198
|
-
} catch (error) {
|
|
1199
|
-
onIgnoredError?.(error);
|
|
1200
|
-
}
|
|
1201
|
-
});
|
|
1202
|
-
}
|
|
1214
|
+
const changes = getChanges2?.();
|
|
1215
|
+
await loadLock(async () => {
|
|
1216
|
+
try {
|
|
1217
|
+
setContentOrChanges(
|
|
1218
|
+
changes ?? getContent2?.() ?? (await getPersisted()),
|
|
1219
|
+
);
|
|
1220
|
+
} catch (error) {
|
|
1221
|
+
onIgnoredError?.(error);
|
|
1222
|
+
}
|
|
1223
|
+
});
|
|
1203
1224
|
},
|
|
1204
1225
|
);
|
|
1205
1226
|
return persister;
|
|
1206
1227
|
},
|
|
1207
1228
|
stopAutoLoad: () => {
|
|
1208
|
-
if (
|
|
1209
|
-
delPersisterListener(
|
|
1210
|
-
|
|
1211
|
-
listening = 0;
|
|
1229
|
+
if (autoLoadHandle) {
|
|
1230
|
+
delPersisterListener(autoLoadHandle);
|
|
1231
|
+
autoLoadHandle = void 0;
|
|
1212
1232
|
}
|
|
1213
1233
|
return persister;
|
|
1214
1234
|
},
|
|
1235
|
+
isAutoLoading: () => !isUndefined(autoLoadHandle),
|
|
1215
1236
|
save: async (getChanges2) => {
|
|
1216
1237
|
/* istanbul ignore else */
|
|
1217
1238
|
if (loadSave != 1) {
|
|
@@ -1233,7 +1254,7 @@ const createCustomPersister = (
|
|
|
1233
1254
|
},
|
|
1234
1255
|
startAutoSave: async () => {
|
|
1235
1256
|
await persister.stopAutoSave().save();
|
|
1236
|
-
|
|
1257
|
+
autoSaveListenerId = store.addDidFinishTransactionListener(() => {
|
|
1237
1258
|
const changes = getChanges();
|
|
1238
1259
|
if (hasChanges(changes)) {
|
|
1239
1260
|
persister.save(() => changes);
|
|
@@ -1242,10 +1263,11 @@ const createCustomPersister = (
|
|
|
1242
1263
|
return persister;
|
|
1243
1264
|
},
|
|
1244
1265
|
stopAutoSave: () => {
|
|
1245
|
-
ifNotUndefined(
|
|
1246
|
-
|
|
1266
|
+
ifNotUndefined(autoSaveListenerId, store.delListener);
|
|
1267
|
+
autoSaveListenerId = void 0;
|
|
1247
1268
|
return persister;
|
|
1248
1269
|
},
|
|
1270
|
+
isAutoSaving: () => !isUndefined(autoSaveListenerId),
|
|
1249
1271
|
schedule: async (...actions) => {
|
|
1250
1272
|
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
1251
1273
|
await run();
|
|
@@ -1254,13 +1276,262 @@ const createCustomPersister = (
|
|
|
1254
1276
|
getStore: () => store,
|
|
1255
1277
|
destroy: () => persister.stopAutoLoad().stopAutoSave(),
|
|
1256
1278
|
getStats: () => ({loads, saves}),
|
|
1279
|
+
...extra,
|
|
1257
1280
|
};
|
|
1258
|
-
if (getThing) {
|
|
1259
|
-
persister[getThing] = () => thing;
|
|
1260
|
-
}
|
|
1261
1281
|
return objFreeze(persister);
|
|
1262
1282
|
};
|
|
1263
1283
|
|
|
1284
|
+
const textEncoder = new globalThis.TextEncoder();
|
|
1285
|
+
const getHash = (value) => {
|
|
1286
|
+
let hash = 2166136261;
|
|
1287
|
+
arrayForEach(textEncoder.encode(value), (char) => {
|
|
1288
|
+
hash ^= char;
|
|
1289
|
+
hash +=
|
|
1290
|
+
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
1291
|
+
});
|
|
1292
|
+
return hash >>> 0;
|
|
1293
|
+
};
|
|
1294
|
+
|
|
1295
|
+
const MASK6 = 63;
|
|
1296
|
+
const SHIFT36 = 2 ** 36;
|
|
1297
|
+
const SHIFT30 = 2 ** 30;
|
|
1298
|
+
const SHIFT24 = 2 ** 24;
|
|
1299
|
+
const SHIFT18 = 2 ** 18;
|
|
1300
|
+
const SHIFT12 = 2 ** 12;
|
|
1301
|
+
const SHIFT6 = 2 ** 6;
|
|
1302
|
+
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
1303
|
+
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
1304
|
+
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
1305
|
+
toB64(logicalTime42 / SHIFT36) +
|
|
1306
|
+
toB64(logicalTime42 / SHIFT30) +
|
|
1307
|
+
toB64(logicalTime42 / SHIFT24) +
|
|
1308
|
+
toB64(logicalTime42 / SHIFT18) +
|
|
1309
|
+
toB64(logicalTime42 / SHIFT12) +
|
|
1310
|
+
toB64(logicalTime42 / SHIFT6) +
|
|
1311
|
+
toB64(logicalTime42) +
|
|
1312
|
+
toB64(counter24 / SHIFT18) +
|
|
1313
|
+
toB64(counter24 / SHIFT12) +
|
|
1314
|
+
toB64(counter24 / SHIFT6) +
|
|
1315
|
+
toB64(counter24) +
|
|
1316
|
+
toB64(clientHash30 / SHIFT24) +
|
|
1317
|
+
toB64(clientHash30 / SHIFT18) +
|
|
1318
|
+
toB64(clientHash30 / SHIFT12) +
|
|
1319
|
+
toB64(clientHash30 / SHIFT6) +
|
|
1320
|
+
toB64(clientHash30);
|
|
1321
|
+
const decodeHlc = (hlc16) => [
|
|
1322
|
+
fromB64(hlc16, 0) * SHIFT36 +
|
|
1323
|
+
fromB64(hlc16, 1) * SHIFT30 +
|
|
1324
|
+
fromB64(hlc16, 2) * SHIFT24 +
|
|
1325
|
+
fromB64(hlc16, 3) * SHIFT18 +
|
|
1326
|
+
fromB64(hlc16, 4) * SHIFT12 +
|
|
1327
|
+
fromB64(hlc16, 5) * SHIFT6 +
|
|
1328
|
+
fromB64(hlc16, 6),
|
|
1329
|
+
fromB64(hlc16, 7) * SHIFT18 +
|
|
1330
|
+
fromB64(hlc16, 8) * SHIFT12 +
|
|
1331
|
+
fromB64(hlc16, 9) * SHIFT6 +
|
|
1332
|
+
fromB64(hlc16, 10),
|
|
1333
|
+
fromB64(hlc16, 11) * SHIFT24 +
|
|
1334
|
+
fromB64(hlc16, 12) * SHIFT18 +
|
|
1335
|
+
fromB64(hlc16, 13) * SHIFT12 +
|
|
1336
|
+
fromB64(hlc16, 14) * SHIFT6 +
|
|
1337
|
+
fromB64(hlc16, 15),
|
|
1338
|
+
];
|
|
1339
|
+
const getHlcFunctions = (uniqueId) => {
|
|
1340
|
+
let logicalTime = 0;
|
|
1341
|
+
let lastCounter = -1;
|
|
1342
|
+
const uniqueIdHash = getHash(uniqueId);
|
|
1343
|
+
const getHlc = () => {
|
|
1344
|
+
seenHlc();
|
|
1345
|
+
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
1346
|
+
};
|
|
1347
|
+
const seenHlc = (hlc) => {
|
|
1348
|
+
const previousLogicalTime = logicalTime;
|
|
1349
|
+
const [remoteLogicalTime, remoteCounter] =
|
|
1350
|
+
isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
|
|
1351
|
+
logicalTime = mathMax(
|
|
1352
|
+
previousLogicalTime,
|
|
1353
|
+
remoteLogicalTime,
|
|
1354
|
+
globalThis.HLC_TIME ?? Date.now(),
|
|
1355
|
+
);
|
|
1356
|
+
lastCounter =
|
|
1357
|
+
logicalTime == previousLogicalTime
|
|
1358
|
+
? logicalTime == remoteLogicalTime
|
|
1359
|
+
? mathMax(lastCounter, remoteCounter)
|
|
1360
|
+
: lastCounter
|
|
1361
|
+
: logicalTime == remoteLogicalTime
|
|
1362
|
+
? remoteCounter
|
|
1363
|
+
: -1;
|
|
1364
|
+
};
|
|
1365
|
+
return [getHlc, seenHlc];
|
|
1366
|
+
};
|
|
1367
|
+
|
|
1368
|
+
const RESPONSE = 0;
|
|
1369
|
+
const CONTENT_HASHES = 1;
|
|
1370
|
+
const GET_CONTENT_HASHES = 2;
|
|
1371
|
+
const GET_TABLE_IDS_DIFF = 3;
|
|
1372
|
+
const GET_ROW_IDS_DIFF = 4;
|
|
1373
|
+
const GET_TABLES_CHANGES = 5;
|
|
1374
|
+
const GET_VALUES_CHANGES = 6;
|
|
1375
|
+
const createCustomSynchronizer = (
|
|
1376
|
+
store,
|
|
1377
|
+
send,
|
|
1378
|
+
onReceive,
|
|
1379
|
+
destroy,
|
|
1380
|
+
requestTimeoutSeconds = 1,
|
|
1381
|
+
onIgnoredError,
|
|
1382
|
+
) => {
|
|
1383
|
+
let persisterListener;
|
|
1384
|
+
let sends = 0;
|
|
1385
|
+
let receives = 0;
|
|
1386
|
+
const [getHlc] = getHlcFunctions(store.getId());
|
|
1387
|
+
const pendingRequests = mapNew();
|
|
1388
|
+
onReceive((fromClientId, requestId, messageType, messageBody) => {
|
|
1389
|
+
{
|
|
1390
|
+
receives++;
|
|
1391
|
+
}
|
|
1392
|
+
if (messageType == RESPONSE) {
|
|
1393
|
+
ifNotUndefined(
|
|
1394
|
+
mapGet(pendingRequests, requestId),
|
|
1395
|
+
([toClientId, handleResponse]) =>
|
|
1396
|
+
isUndefined(toClientId) || toClientId == fromClientId
|
|
1397
|
+
? handleResponse(messageBody, fromClientId)
|
|
1398
|
+
: /* istanbul ignore next */
|
|
1399
|
+
0,
|
|
1400
|
+
);
|
|
1401
|
+
} else if (messageType == CONTENT_HASHES && persister.isAutoLoading()) {
|
|
1402
|
+
getChangesFromOtherStore(fromClientId, messageBody).then((changes) =>
|
|
1403
|
+
persisterListener?.(void 0, () => changes),
|
|
1404
|
+
);
|
|
1405
|
+
} else {
|
|
1406
|
+
ifNotUndefined(
|
|
1407
|
+
messageType == GET_CONTENT_HASHES && persister.isAutoSaving()
|
|
1408
|
+
? store.getMergeableContentHashes()
|
|
1409
|
+
: messageType == GET_TABLE_IDS_DIFF
|
|
1410
|
+
? store.getMergeableTableIdsDiff(messageBody)
|
|
1411
|
+
: messageType == GET_ROW_IDS_DIFF
|
|
1412
|
+
? store.getMergeableRowIdsDiff(messageBody)
|
|
1413
|
+
: messageType == GET_TABLES_CHANGES
|
|
1414
|
+
? store.getMergeableTablesChanges(messageBody)
|
|
1415
|
+
: messageType == GET_VALUES_CHANGES
|
|
1416
|
+
? store.getMergeableValuesChanges(messageBody)
|
|
1417
|
+
: void 0,
|
|
1418
|
+
(response) => {
|
|
1419
|
+
{
|
|
1420
|
+
sends++;
|
|
1421
|
+
}
|
|
1422
|
+
send(fromClientId, requestId, RESPONSE, response);
|
|
1423
|
+
},
|
|
1424
|
+
);
|
|
1425
|
+
}
|
|
1426
|
+
});
|
|
1427
|
+
const request = async (toClientId, messageType, messageBody = EMPTY_STRING) =>
|
|
1428
|
+
promiseNew((resolve, reject) => {
|
|
1429
|
+
const requestId = getHlc();
|
|
1430
|
+
const timeout = setTimeout(() => {
|
|
1431
|
+
collDel(pendingRequests, requestId);
|
|
1432
|
+
reject(
|
|
1433
|
+
`No response from ${toClientId ?? 'anyone'} to '${messageType}'`,
|
|
1434
|
+
);
|
|
1435
|
+
}, requestTimeoutSeconds * 1e3);
|
|
1436
|
+
mapSet(pendingRequests, requestId, [
|
|
1437
|
+
toClientId,
|
|
1438
|
+
(response, fromClientId) => {
|
|
1439
|
+
clearTimeout(timeout);
|
|
1440
|
+
collDel(pendingRequests, requestId);
|
|
1441
|
+
resolve([response, fromClientId]);
|
|
1442
|
+
},
|
|
1443
|
+
]);
|
|
1444
|
+
{
|
|
1445
|
+
sends++;
|
|
1446
|
+
}
|
|
1447
|
+
send(toClientId, requestId, messageType, messageBody);
|
|
1448
|
+
});
|
|
1449
|
+
const getChangesFromOtherStore = async (
|
|
1450
|
+
otherClientId = null,
|
|
1451
|
+
otherContentHashes,
|
|
1452
|
+
) => {
|
|
1453
|
+
if (isUndefined(otherContentHashes)) {
|
|
1454
|
+
[otherContentHashes, otherClientId] = await request(
|
|
1455
|
+
otherClientId,
|
|
1456
|
+
GET_CONTENT_HASHES,
|
|
1457
|
+
);
|
|
1458
|
+
}
|
|
1459
|
+
const [otherContentTime, [otherTablesHash, otherValuesHash]] =
|
|
1460
|
+
otherContentHashes;
|
|
1461
|
+
const [, [tablesHash, valuesHash]] = store.getMergeableContentHashes();
|
|
1462
|
+
const changes = [EMPTY_STRING, [[EMPTY_STRING, {}], [EMPTY_STRING, {}], 1]];
|
|
1463
|
+
if (tablesHash != otherTablesHash) {
|
|
1464
|
+
changes[0] = otherContentTime;
|
|
1465
|
+
changes[1][0] = (
|
|
1466
|
+
await request(
|
|
1467
|
+
otherClientId,
|
|
1468
|
+
GET_TABLES_CHANGES,
|
|
1469
|
+
store.getMergeableCellHashes(
|
|
1470
|
+
(
|
|
1471
|
+
await request(
|
|
1472
|
+
otherClientId,
|
|
1473
|
+
GET_ROW_IDS_DIFF,
|
|
1474
|
+
store.getMergeableRowHashes(
|
|
1475
|
+
(
|
|
1476
|
+
await request(
|
|
1477
|
+
otherClientId,
|
|
1478
|
+
GET_TABLE_IDS_DIFF,
|
|
1479
|
+
store.getMergeableTableHashes(),
|
|
1480
|
+
)
|
|
1481
|
+
)[0],
|
|
1482
|
+
),
|
|
1483
|
+
)
|
|
1484
|
+
)[0],
|
|
1485
|
+
),
|
|
1486
|
+
)
|
|
1487
|
+
)[0];
|
|
1488
|
+
}
|
|
1489
|
+
if (valuesHash != otherValuesHash) {
|
|
1490
|
+
changes[0] = otherContentTime;
|
|
1491
|
+
changes[1][1] = (
|
|
1492
|
+
await request(
|
|
1493
|
+
otherClientId,
|
|
1494
|
+
GET_VALUES_CHANGES,
|
|
1495
|
+
store.getMergeableValuesHashes(),
|
|
1496
|
+
)
|
|
1497
|
+
)[0];
|
|
1498
|
+
}
|
|
1499
|
+
return changes;
|
|
1500
|
+
};
|
|
1501
|
+
const getPersisted = async () => {
|
|
1502
|
+
const changes = await getChangesFromOtherStore();
|
|
1503
|
+
return changes[0] != EMPTY_STRING ? changes : void 0;
|
|
1504
|
+
};
|
|
1505
|
+
const setPersisted = async () => {
|
|
1506
|
+
{
|
|
1507
|
+
sends++;
|
|
1508
|
+
}
|
|
1509
|
+
send(null, null, CONTENT_HASHES, store.getMergeableContentHashes());
|
|
1510
|
+
};
|
|
1511
|
+
const addPersisterListener = (listener) => (persisterListener = listener);
|
|
1512
|
+
const delPersisterListener = () => (persisterListener = void 0);
|
|
1513
|
+
const persister = createCustomPersister(
|
|
1514
|
+
store,
|
|
1515
|
+
getPersisted,
|
|
1516
|
+
setPersisted,
|
|
1517
|
+
addPersisterListener,
|
|
1518
|
+
delPersisterListener,
|
|
1519
|
+
onIgnoredError,
|
|
1520
|
+
true,
|
|
1521
|
+
{
|
|
1522
|
+
startSync: async () =>
|
|
1523
|
+
await (await persister.startAutoLoad()).startAutoSave(),
|
|
1524
|
+
stopSync: () => persister.stopAutoLoad().stopAutoSave(),
|
|
1525
|
+
destroy: () => {
|
|
1526
|
+
destroy();
|
|
1527
|
+
return persister.stopSync();
|
|
1528
|
+
},
|
|
1529
|
+
getSynchronizerStats: () => ({sends, receives}),
|
|
1530
|
+
},
|
|
1531
|
+
);
|
|
1532
|
+
return persister;
|
|
1533
|
+
};
|
|
1534
|
+
|
|
1264
1535
|
const createQueries = getCreateFunction((store) => {
|
|
1265
1536
|
const createStore = store.createStore;
|
|
1266
1537
|
const preStore = createStore();
|
|
@@ -1909,36 +2180,29 @@ const createRelationships = getCreateFunction((store) => {
|
|
|
1909
2180
|
return objFreeze(relationships);
|
|
1910
2181
|
});
|
|
1911
2182
|
|
|
1912
|
-
const
|
|
1913
|
-
const
|
|
1914
|
-
|
|
1915
|
-
arrayForEach(textEncoder.encode(value), (char) => {
|
|
1916
|
-
hash ^= char;
|
|
1917
|
-
hash +=
|
|
1918
|
-
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
1919
|
-
});
|
|
1920
|
-
return hash >>> 0;
|
|
1921
|
-
};
|
|
1922
|
-
|
|
1923
|
-
const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
|
|
1924
|
-
const stampNew = (time, thing) => [time, thing];
|
|
2183
|
+
const stampCloneWithHash = ([time, value, hash]) => [time, value, hash];
|
|
2184
|
+
const stampClone = ([time, value]) => [time, value];
|
|
2185
|
+
const getStampHash = (stamp) => stamp[2];
|
|
1925
2186
|
const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
|
|
1926
|
-
const
|
|
1927
|
-
|
|
1928
|
-
if (time >
|
|
1929
|
-
|
|
2187
|
+
const stampUpdate = (stamp, hash, time) => {
|
|
2188
|
+
stamp[2] = hash >>> 0;
|
|
2189
|
+
if (time > stamp[0]) {
|
|
2190
|
+
stamp[0] = time;
|
|
1930
2191
|
}
|
|
1931
2192
|
};
|
|
1932
|
-
const stampNewObj = (time) =>
|
|
1933
|
-
const
|
|
1934
|
-
const
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
2193
|
+
const stampNewObj = (time) => [time, objNew()];
|
|
2194
|
+
const stampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
|
|
2195
|
+
const stampMapToObjWithHash = (
|
|
2196
|
+
[time, map, hash],
|
|
2197
|
+
mapper = stampCloneWithHash,
|
|
2198
|
+
) => [time, mapToObj(map, mapper), hash];
|
|
2199
|
+
const stampValidate = (stamp, validateThing) =>
|
|
2200
|
+
isArray(stamp) &&
|
|
2201
|
+
size(stamp) == 3 &&
|
|
2202
|
+
isString(stamp[0]) &&
|
|
2203
|
+
validateThing(stamp[1]) &&
|
|
2204
|
+
getTypeOf(stamp[2]) == NUMBER &&
|
|
2205
|
+
isFiniteNumber(stamp[2]);
|
|
1942
2206
|
|
|
1943
2207
|
const pairNew = (value) => [value, value];
|
|
1944
2208
|
const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
|
|
@@ -1952,18 +2216,6 @@ const jsonString = (obj) =>
|
|
|
1952
2216
|
);
|
|
1953
2217
|
const jsonParse = JSON.parse;
|
|
1954
2218
|
|
|
1955
|
-
const validate = (obj, validateChild, onInvalidObj) => {
|
|
1956
|
-
if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
|
|
1957
|
-
onInvalidObj?.();
|
|
1958
|
-
return false;
|
|
1959
|
-
}
|
|
1960
|
-
objToArray(obj, (child, id2) => {
|
|
1961
|
-
if (!validateChild(child, id2)) {
|
|
1962
|
-
objDel(obj, id2);
|
|
1963
|
-
}
|
|
1964
|
-
});
|
|
1965
|
-
return !objIsEmpty(obj);
|
|
1966
|
-
};
|
|
1967
2219
|
const idsChanged = (changedIds, id2, addedOrRemoved) =>
|
|
1968
2220
|
mapSet(
|
|
1969
2221
|
changedIds,
|
|
@@ -2023,13 +2275,13 @@ const createStore = () => {
|
|
|
2023
2275
|
const [addListener, callListeners, delListenerImpl, callListenerImpl] =
|
|
2024
2276
|
getListenerFunctions(() => store);
|
|
2025
2277
|
const validateTablesSchema = (tableSchema) =>
|
|
2026
|
-
|
|
2027
|
-
|
|
2278
|
+
objValidate(tableSchema, (tableSchema2) =>
|
|
2279
|
+
objValidate(tableSchema2, validateCellOrValueSchema),
|
|
2028
2280
|
);
|
|
2029
2281
|
const validateValuesSchema = (valuesSchema) =>
|
|
2030
|
-
|
|
2282
|
+
objValidate(valuesSchema, validateCellOrValueSchema);
|
|
2031
2283
|
const validateCellOrValueSchema = (schema) => {
|
|
2032
|
-
if (!
|
|
2284
|
+
if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
|
|
2033
2285
|
return false;
|
|
2034
2286
|
}
|
|
2035
2287
|
const type = schema[TYPE];
|
|
@@ -2042,18 +2294,18 @@ const createStore = () => {
|
|
|
2042
2294
|
return true;
|
|
2043
2295
|
};
|
|
2044
2296
|
const validateTables = (tables) =>
|
|
2045
|
-
|
|
2297
|
+
objValidate(tables, validateTable, cellInvalid);
|
|
2046
2298
|
const validateTable = (table, tableId) =>
|
|
2047
2299
|
(!hasTablesSchema ||
|
|
2048
2300
|
collHas(tablesSchemaMap, tableId) ||
|
|
2049
2301
|
cellInvalid(tableId)) &&
|
|
2050
|
-
|
|
2302
|
+
objValidate(
|
|
2051
2303
|
table,
|
|
2052
2304
|
(row, rowId) => validateRow(tableId, rowId, row),
|
|
2053
2305
|
() => cellInvalid(tableId),
|
|
2054
2306
|
);
|
|
2055
2307
|
const validateRow = (tableId, rowId, row, skipDefaults) =>
|
|
2056
|
-
|
|
2308
|
+
objValidate(
|
|
2057
2309
|
skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
|
|
2058
2310
|
(cell, cellId) =>
|
|
2059
2311
|
ifNotUndefined(
|
|
@@ -2080,7 +2332,7 @@ const createStore = () => {
|
|
|
2080
2332
|
? cellInvalid(tableId, rowId, cellId, cell)
|
|
2081
2333
|
: cell;
|
|
2082
2334
|
const validateValues = (values, skipDefaults) =>
|
|
2083
|
-
|
|
2335
|
+
objValidate(
|
|
2084
2336
|
skipDefaults ? values : addDefaultsToValues(values),
|
|
2085
2337
|
(value, valueId) =>
|
|
2086
2338
|
ifNotUndefined(
|
|
@@ -2923,17 +3175,20 @@ const createStore = () => {
|
|
|
2923
3175
|
: mapToObj(
|
|
2924
3176
|
row,
|
|
2925
3177
|
([, newCell]) => newCell,
|
|
2926
|
-
(
|
|
3178
|
+
(changedCell) => pairIsEqual(changedCell),
|
|
2927
3179
|
),
|
|
3180
|
+
collIsEmpty,
|
|
2928
3181
|
objIsEmpty,
|
|
2929
3182
|
),
|
|
3183
|
+
collIsEmpty,
|
|
2930
3184
|
objIsEmpty,
|
|
2931
3185
|
),
|
|
2932
3186
|
mapToObj(
|
|
2933
3187
|
changedValues,
|
|
2934
3188
|
([, newValue]) => newValue,
|
|
2935
|
-
(
|
|
3189
|
+
(changedValue) => pairIsEqual(changedValue),
|
|
2936
3190
|
),
|
|
3191
|
+
1,
|
|
2937
3192
|
];
|
|
2938
3193
|
const getTransactionLog = () => [
|
|
2939
3194
|
!collIsEmpty(changedCells),
|
|
@@ -3266,76 +3521,6 @@ const createStore = () => {
|
|
|
3266
3521
|
return objFreeze(store);
|
|
3267
3522
|
};
|
|
3268
3523
|
|
|
3269
|
-
const MASK6 = 63;
|
|
3270
|
-
const SHIFT36 = 2 ** 36;
|
|
3271
|
-
const SHIFT30 = 2 ** 30;
|
|
3272
|
-
const SHIFT24 = 2 ** 24;
|
|
3273
|
-
const SHIFT18 = 2 ** 18;
|
|
3274
|
-
const SHIFT12 = 2 ** 12;
|
|
3275
|
-
const SHIFT6 = 2 ** 6;
|
|
3276
|
-
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
3277
|
-
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
3278
|
-
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
3279
|
-
toB64(logicalTime42 / SHIFT36) +
|
|
3280
|
-
toB64(logicalTime42 / SHIFT30) +
|
|
3281
|
-
toB64(logicalTime42 / SHIFT24) +
|
|
3282
|
-
toB64(logicalTime42 / SHIFT18) +
|
|
3283
|
-
toB64(logicalTime42 / SHIFT12) +
|
|
3284
|
-
toB64(logicalTime42 / SHIFT6) +
|
|
3285
|
-
toB64(logicalTime42) +
|
|
3286
|
-
toB64(counter24 / SHIFT18) +
|
|
3287
|
-
toB64(counter24 / SHIFT12) +
|
|
3288
|
-
toB64(counter24 / SHIFT6) +
|
|
3289
|
-
toB64(counter24) +
|
|
3290
|
-
toB64(clientHash30 / SHIFT24) +
|
|
3291
|
-
toB64(clientHash30 / SHIFT18) +
|
|
3292
|
-
toB64(clientHash30 / SHIFT12) +
|
|
3293
|
-
toB64(clientHash30 / SHIFT6) +
|
|
3294
|
-
toB64(clientHash30);
|
|
3295
|
-
const decodeHlc = (hlc16) => [
|
|
3296
|
-
fromB64(hlc16, 0) * SHIFT36 +
|
|
3297
|
-
fromB64(hlc16, 1) * SHIFT30 +
|
|
3298
|
-
fromB64(hlc16, 2) * SHIFT24 +
|
|
3299
|
-
fromB64(hlc16, 3) * SHIFT18 +
|
|
3300
|
-
fromB64(hlc16, 4) * SHIFT12 +
|
|
3301
|
-
fromB64(hlc16, 5) * SHIFT6 +
|
|
3302
|
-
fromB64(hlc16, 6),
|
|
3303
|
-
fromB64(hlc16, 7) * SHIFT18 +
|
|
3304
|
-
fromB64(hlc16, 8) * SHIFT12 +
|
|
3305
|
-
fromB64(hlc16, 9) * SHIFT6 +
|
|
3306
|
-
fromB64(hlc16, 10),
|
|
3307
|
-
fromB64(hlc16, 11) * SHIFT24 +
|
|
3308
|
-
fromB64(hlc16, 12) * SHIFT18 +
|
|
3309
|
-
fromB64(hlc16, 13) * SHIFT12 +
|
|
3310
|
-
fromB64(hlc16, 14) * SHIFT6 +
|
|
3311
|
-
fromB64(hlc16, 15),
|
|
3312
|
-
];
|
|
3313
|
-
const getHlcFunctions = (uniqueId) => {
|
|
3314
|
-
let logicalTime = 0;
|
|
3315
|
-
let lastCounter = -1;
|
|
3316
|
-
const uniqueIdHash = getHash(uniqueId);
|
|
3317
|
-
const getHlc = () => {
|
|
3318
|
-
seenHlc();
|
|
3319
|
-
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
3320
|
-
};
|
|
3321
|
-
const seenHlc = (hlc) => {
|
|
3322
|
-
const previousLogicalTime = logicalTime;
|
|
3323
|
-
const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
|
|
3324
|
-
? [0, 0]
|
|
3325
|
-
: decodeHlc(hlc);
|
|
3326
|
-
logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
|
|
3327
|
-
lastCounter =
|
|
3328
|
-
logicalTime == previousLogicalTime
|
|
3329
|
-
? logicalTime == remoteLogicalTime
|
|
3330
|
-
? mathMax(lastCounter, remoteCounter)
|
|
3331
|
-
: lastCounter
|
|
3332
|
-
: logicalTime == remoteLogicalTime
|
|
3333
|
-
? remoteCounter
|
|
3334
|
-
: -1;
|
|
3335
|
-
};
|
|
3336
|
-
return [getHlc, seenHlc];
|
|
3337
|
-
};
|
|
3338
|
-
|
|
3339
3524
|
const LISTENER_ARGS = {
|
|
3340
3525
|
HasTable: 1,
|
|
3341
3526
|
Table: 1,
|
|
@@ -3354,14 +3539,54 @@ const LISTENER_ARGS = {
|
|
|
3354
3539
|
InvalidCell: 3,
|
|
3355
3540
|
InvalidValue: 1,
|
|
3356
3541
|
};
|
|
3357
|
-
const
|
|
3542
|
+
const newContentStampMap = (time = EMPTY_STRING) => [
|
|
3358
3543
|
time,
|
|
3359
|
-
[
|
|
3544
|
+
[stampNewMap(time), stampNewMap(time)],
|
|
3360
3545
|
0,
|
|
3361
3546
|
];
|
|
3547
|
+
const validateMergeableContent = (mergeableContent) =>
|
|
3548
|
+
stampValidate(
|
|
3549
|
+
mergeableContent,
|
|
3550
|
+
(content) =>
|
|
3551
|
+
isArray(content) &&
|
|
3552
|
+
size(content) == 2 &&
|
|
3553
|
+
stampValidate(content[0], (tableStamps) =>
|
|
3554
|
+
objValidate(
|
|
3555
|
+
tableStamps,
|
|
3556
|
+
(tableStamp) =>
|
|
3557
|
+
stampValidate(tableStamp, (rowStamps) =>
|
|
3558
|
+
objValidate(
|
|
3559
|
+
rowStamps,
|
|
3560
|
+
(rowStamp) =>
|
|
3561
|
+
stampValidate(rowStamp, (cellStamps) =>
|
|
3562
|
+
objValidate(
|
|
3563
|
+
cellStamps,
|
|
3564
|
+
(cellStamp) =>
|
|
3565
|
+
stampValidate(cellStamp, isCellOrValueOrNull),
|
|
3566
|
+
void 0,
|
|
3567
|
+
1,
|
|
3568
|
+
),
|
|
3569
|
+
),
|
|
3570
|
+
void 0,
|
|
3571
|
+
1,
|
|
3572
|
+
),
|
|
3573
|
+
),
|
|
3574
|
+
void 0,
|
|
3575
|
+
1,
|
|
3576
|
+
),
|
|
3577
|
+
) &&
|
|
3578
|
+
stampValidate(content[1], (values) =>
|
|
3579
|
+
objValidate(
|
|
3580
|
+
values,
|
|
3581
|
+
(value) => stampValidate(value, isCellOrValueOrNull),
|
|
3582
|
+
void 0,
|
|
3583
|
+
1,
|
|
3584
|
+
),
|
|
3585
|
+
),
|
|
3586
|
+
);
|
|
3362
3587
|
const createMergeableStore = (id) => {
|
|
3363
3588
|
let listening = 1;
|
|
3364
|
-
let
|
|
3589
|
+
let contentStampMap = newContentStampMap();
|
|
3365
3590
|
let transactionTime;
|
|
3366
3591
|
let transactionMergeableChanges;
|
|
3367
3592
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
@@ -3371,6 +3596,7 @@ const createMergeableStore = (id) => {
|
|
|
3371
3596
|
listening = 0;
|
|
3372
3597
|
actions();
|
|
3373
3598
|
listening = wasListening;
|
|
3599
|
+
return mergeableStore;
|
|
3374
3600
|
};
|
|
3375
3601
|
const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
|
|
3376
3602
|
const tablesChanges = {};
|
|
@@ -3380,8 +3606,8 @@ const createMergeableStore = (id) => {
|
|
|
3380
3606
|
[[tablesTime, tablesObj, incomingTablesHash], values],
|
|
3381
3607
|
incomingContentOrChangesHash,
|
|
3382
3608
|
] = contentOrChanges;
|
|
3383
|
-
const [, [
|
|
3384
|
-
const [oldTablesTime,
|
|
3609
|
+
const [, [tablesStampMap, valuesStampMap]] = contentStampMap;
|
|
3610
|
+
const [oldTablesTime, tableStampMaps, oldTablesHash] = tablesStampMap;
|
|
3385
3611
|
if (tablesTime) {
|
|
3386
3612
|
let tablesHash = hasHashes
|
|
3387
3613
|
? incomingTablesHash
|
|
@@ -3392,8 +3618,8 @@ const createMergeableStore = (id) => {
|
|
|
3392
3618
|
objForEach(
|
|
3393
3619
|
tablesObj,
|
|
3394
3620
|
([tableTime, rowsObj, incomingTableHash], tableId) => {
|
|
3395
|
-
const
|
|
3396
|
-
const [oldTableTime,
|
|
3621
|
+
const tableStampMap = mapEnsure(tableStampMaps, tableId, stampNewMap);
|
|
3622
|
+
const [oldTableTime, rowStampMaps, oldTableHash] = tableStampMap;
|
|
3397
3623
|
let tableHash = hasHashes
|
|
3398
3624
|
? incomingTableHash
|
|
3399
3625
|
: oldTableHash ^
|
|
@@ -3404,7 +3630,7 @@ const createMergeableStore = (id) => {
|
|
|
3404
3630
|
objForEach(rowsObj, (row, rowId) => {
|
|
3405
3631
|
const [oldRowHash, rowHash] = mergeCellsOrValues(
|
|
3406
3632
|
row,
|
|
3407
|
-
mapEnsure(
|
|
3633
|
+
mapEnsure(rowStampMaps, rowId, stampNewMap),
|
|
3408
3634
|
objEnsure(
|
|
3409
3635
|
objEnsure(tablesChanges, tableId, objNew),
|
|
3410
3636
|
rowId,
|
|
@@ -3417,26 +3643,33 @@ const createMergeableStore = (id) => {
|
|
|
3417
3643
|
: (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
|
|
3418
3644
|
hashIdAndHash(rowId, rowHash);
|
|
3419
3645
|
});
|
|
3420
|
-
|
|
3646
|
+
stampUpdate(tableStampMap, tableHash, tableTime);
|
|
3421
3647
|
tablesHash ^= hasHashes
|
|
3422
3648
|
? 0
|
|
3423
3649
|
: (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
|
|
3424
|
-
hashIdAndHash(tableId,
|
|
3650
|
+
hashIdAndHash(tableId, tableStampMap[2]);
|
|
3425
3651
|
},
|
|
3426
3652
|
);
|
|
3427
|
-
|
|
3653
|
+
stampUpdate(tablesStampMap, tablesHash, tablesTime);
|
|
3428
3654
|
}
|
|
3429
|
-
mergeCellsOrValues(values,
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
hasHashes
|
|
3655
|
+
mergeCellsOrValues(values, valuesStampMap, valuesChanges, hasHashes);
|
|
3656
|
+
stampUpdate(
|
|
3657
|
+
contentStampMap,
|
|
3658
|
+
hasHashes
|
|
3659
|
+
? incomingContentOrChangesHash
|
|
3660
|
+
: tablesStampMap[2] ^ valuesStampMap[2],
|
|
3433
3661
|
contentOrChangesTime,
|
|
3434
3662
|
);
|
|
3435
|
-
return [tablesChanges, valuesChanges];
|
|
3663
|
+
return [tablesChanges, valuesChanges, 1];
|
|
3436
3664
|
};
|
|
3437
|
-
const mergeCellsOrValues = (
|
|
3665
|
+
const mergeCellsOrValues = (
|
|
3666
|
+
things,
|
|
3667
|
+
thingsStampMap,
|
|
3668
|
+
thingsChanges,
|
|
3669
|
+
hasHashes,
|
|
3670
|
+
) => {
|
|
3438
3671
|
const [thingsTime, thingsObj, incomingThingsHash] = things;
|
|
3439
|
-
const [oldThingsTime,
|
|
3672
|
+
const [oldThingsTime, thingStampMaps, oldThingsHash] = thingsStampMap;
|
|
3440
3673
|
if (thingsTime) {
|
|
3441
3674
|
let thingsHash = hasHashes
|
|
3442
3675
|
? incomingThingsHash
|
|
@@ -3447,28 +3680,32 @@ const createMergeableStore = (id) => {
|
|
|
3447
3680
|
objForEach(
|
|
3448
3681
|
thingsObj,
|
|
3449
3682
|
([thingTime, thing, incomingThingHash], thingId) => {
|
|
3450
|
-
const
|
|
3451
|
-
|
|
3683
|
+
const thingStampMap = mapEnsure(thingStampMaps, thingId, () => [
|
|
3684
|
+
EMPTY_STRING,
|
|
3685
|
+
void 0,
|
|
3686
|
+
0,
|
|
3687
|
+
]);
|
|
3688
|
+
const [oldThingTime, , oldThingHash] = thingStampMap;
|
|
3452
3689
|
if (thingTime > oldThingTime) {
|
|
3453
|
-
|
|
3454
|
-
|
|
3690
|
+
stampUpdate(
|
|
3691
|
+
thingStampMap,
|
|
3455
3692
|
hasHashes
|
|
3456
3693
|
? incomingThingHash
|
|
3457
3694
|
: getHash(jsonString(thing ?? null) + ':' + thingTime),
|
|
3458
3695
|
thingTime,
|
|
3459
3696
|
);
|
|
3460
|
-
|
|
3697
|
+
thingStampMap[1] = thing;
|
|
3461
3698
|
thingsChanges[thingId] = thing;
|
|
3462
3699
|
thingsHash ^= hasHashes
|
|
3463
3700
|
? 0
|
|
3464
3701
|
: hashIdAndHash(thingId, oldThingHash) ^
|
|
3465
|
-
hashIdAndHash(thingId,
|
|
3702
|
+
hashIdAndHash(thingId, thingStampMap[2]);
|
|
3466
3703
|
}
|
|
3467
3704
|
},
|
|
3468
3705
|
);
|
|
3469
|
-
|
|
3706
|
+
stampUpdate(thingsStampMap, thingsHash, thingsTime);
|
|
3470
3707
|
}
|
|
3471
|
-
return [oldThingsHash,
|
|
3708
|
+
return [oldThingsHash, thingsStampMap[2]];
|
|
3472
3709
|
};
|
|
3473
3710
|
const preFinishTransaction = () => {
|
|
3474
3711
|
if (listening) {
|
|
@@ -3478,26 +3715,118 @@ const createMergeableStore = (id) => {
|
|
|
3478
3715
|
};
|
|
3479
3716
|
const postFinishTransaction = () =>
|
|
3480
3717
|
(transactionTime = transactionMergeableChanges = void 0);
|
|
3481
|
-
const
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3718
|
+
const getId = () => id;
|
|
3719
|
+
const getMergeableContent = () => [
|
|
3720
|
+
contentStampMap[0],
|
|
3721
|
+
[
|
|
3722
|
+
stampMapToObjWithHash(contentStampMap[1][0], (tableStampMap) =>
|
|
3723
|
+
stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
|
|
3724
|
+
stampMapToObjWithHash(rowStampMap),
|
|
3725
|
+
),
|
|
3485
3726
|
),
|
|
3486
|
-
|
|
3487
|
-
]
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3727
|
+
stampMapToObjWithHash(contentStampMap[1][1]),
|
|
3728
|
+
],
|
|
3729
|
+
contentStampMap[2],
|
|
3730
|
+
];
|
|
3731
|
+
const getMergeableContentHashes = () => [
|
|
3732
|
+
contentStampMap[0],
|
|
3733
|
+
[contentStampMap[1][0][2], contentStampMap[1][1][2]],
|
|
3734
|
+
];
|
|
3735
|
+
const getMergeableTableHashes = () =>
|
|
3736
|
+
mapToObj(contentStampMap[1][0][1], getStampHash);
|
|
3737
|
+
const getMergeableTableIdsDiff = (relativeTo) => {
|
|
3738
|
+
const tableIds = [];
|
|
3739
|
+
mapForEach(contentStampMap[1][0][1], (tableId, [, , hash]) => {
|
|
3740
|
+
if (hash !== relativeTo?.[tableId]) {
|
|
3741
|
+
arrayPush(tableIds, tableId);
|
|
3742
|
+
}
|
|
3743
|
+
});
|
|
3744
|
+
return tableIds;
|
|
3745
|
+
};
|
|
3746
|
+
const getMergeableRowHashes = (tablesDelta) =>
|
|
3747
|
+
objNew(
|
|
3748
|
+
arrayMap(tablesDelta, (tableId) => [
|
|
3749
|
+
tableId,
|
|
3750
|
+
mapToObj(mapGet(contentStampMap[1][0][1], tableId)?.[1], getStampHash),
|
|
3751
|
+
]),
|
|
3494
3752
|
);
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3753
|
+
const getMergeableRowIdsDiff = (relativeTo) =>
|
|
3754
|
+
objMap(relativeTo, (rowHashes, tableId) => {
|
|
3755
|
+
const rowIds = [];
|
|
3756
|
+
mapForEach(
|
|
3757
|
+
mapGet(contentStampMap[1][0][1], tableId)?.[1],
|
|
3758
|
+
(rowId, [, , hash]) => {
|
|
3759
|
+
if (hash !== rowHashes?.[rowId]) {
|
|
3760
|
+
arrayPush(rowIds, rowId);
|
|
3761
|
+
}
|
|
3762
|
+
},
|
|
3763
|
+
);
|
|
3764
|
+
return rowIds;
|
|
3765
|
+
});
|
|
3766
|
+
const getMergeableCellHashes = (tableDelta) =>
|
|
3767
|
+
objMap(tableDelta, (rowIds, tableId) =>
|
|
3768
|
+
objNew(
|
|
3769
|
+
arrayMap(rowIds, (rowId) => [
|
|
3770
|
+
rowId,
|
|
3771
|
+
mapToObj(
|
|
3772
|
+
mapGet(mapGet(contentStampMap[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
3773
|
+
getStampHash,
|
|
3774
|
+
),
|
|
3775
|
+
]),
|
|
3776
|
+
),
|
|
3498
3777
|
);
|
|
3499
|
-
|
|
3778
|
+
const getMergeableTablesChanges = (relativeTo) => {
|
|
3779
|
+
const [, [[tablesTime, tableStampMaps]]] = contentStampMap;
|
|
3780
|
+
const tables = {};
|
|
3781
|
+
objForEach(relativeTo, (rowCellHashes, tableId) =>
|
|
3782
|
+
ifNotUndefined(
|
|
3783
|
+
mapGet(tableStampMaps, tableId),
|
|
3784
|
+
([tableTime, rowStampMaps]) => {
|
|
3785
|
+
const table = {};
|
|
3786
|
+
objForEach(rowCellHashes, (cellHashes, rowId) =>
|
|
3787
|
+
ifNotUndefined(
|
|
3788
|
+
mapGet(rowStampMaps, rowId),
|
|
3789
|
+
([rowTime, cellStampMaps]) => {
|
|
3790
|
+
const row = mapToObj(
|
|
3791
|
+
cellStampMaps,
|
|
3792
|
+
stampClone,
|
|
3793
|
+
([, , hash], cellId) => hash == cellHashes?.[cellId],
|
|
3794
|
+
);
|
|
3795
|
+
if (!objIsEmpty(row)) {
|
|
3796
|
+
table[rowId] = [rowTime, row];
|
|
3797
|
+
}
|
|
3798
|
+
},
|
|
3799
|
+
),
|
|
3800
|
+
);
|
|
3801
|
+
if (!objIsEmpty(table)) {
|
|
3802
|
+
tables[tableId] = [tableTime, table];
|
|
3803
|
+
}
|
|
3804
|
+
},
|
|
3805
|
+
),
|
|
3806
|
+
);
|
|
3807
|
+
return [tablesTime, tables];
|
|
3500
3808
|
};
|
|
3809
|
+
const getMergeableValuesHashes = () =>
|
|
3810
|
+
mapToObj(contentStampMap[1][1][1], getStampHash);
|
|
3811
|
+
const getMergeableValuesChanges = (relativeTo) => [
|
|
3812
|
+
contentStampMap[1][1][0],
|
|
3813
|
+
mapToObj(
|
|
3814
|
+
contentStampMap[1][1][1],
|
|
3815
|
+
stampClone,
|
|
3816
|
+
([, , hash], valueId) => hash == relativeTo?.[valueId],
|
|
3817
|
+
),
|
|
3818
|
+
];
|
|
3819
|
+
const setMergeableContent = (mergeableContent) =>
|
|
3820
|
+
disableListening(() =>
|
|
3821
|
+
validateMergeableContent(mergeableContent)
|
|
3822
|
+
? store.transaction(() => {
|
|
3823
|
+
store.delTables().delValues();
|
|
3824
|
+
contentStampMap = newContentStampMap();
|
|
3825
|
+
seenHlc(mergeableContent[0]);
|
|
3826
|
+
store.applyChanges(mergeContentOrChanges(mergeableContent, 1));
|
|
3827
|
+
})
|
|
3828
|
+
: 0,
|
|
3829
|
+
);
|
|
3501
3830
|
const getTransactionMergeableChanges = () => {
|
|
3502
3831
|
if (isUndefined(transactionMergeableChanges)) {
|
|
3503
3832
|
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
@@ -3505,10 +3834,14 @@ const createMergeableStore = (id) => {
|
|
|
3505
3834
|
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
3506
3835
|
? transactionTime ?? (transactionTime = getHlc())
|
|
3507
3836
|
: EMPTY_STRING;
|
|
3508
|
-
const mergeableChanges =
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3837
|
+
const mergeableChanges = [
|
|
3838
|
+
time,
|
|
3839
|
+
[
|
|
3840
|
+
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
3841
|
+
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
3842
|
+
1,
|
|
3843
|
+
],
|
|
3844
|
+
];
|
|
3512
3845
|
const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
|
|
3513
3846
|
objToArray(changedCells, (changedTable, tableId) => {
|
|
3514
3847
|
const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
|
|
@@ -3516,60 +3849,45 @@ const createMergeableStore = (id) => {
|
|
|
3516
3849
|
const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
|
|
3517
3850
|
objToArray(
|
|
3518
3851
|
changedRow,
|
|
3519
|
-
([, newCell], cellId) =>
|
|
3520
|
-
(cellsObj[cellId] = stampNew(time, newCell)),
|
|
3852
|
+
([, newCell], cellId) => (cellsObj[cellId] = [time, newCell]),
|
|
3521
3853
|
);
|
|
3522
3854
|
});
|
|
3523
3855
|
});
|
|
3524
3856
|
objToArray(
|
|
3525
3857
|
changedValues,
|
|
3526
|
-
([, newValue], valueId) =>
|
|
3527
|
-
(valuesObj[valueId] = stampNew(time, newValue)),
|
|
3858
|
+
([, newValue], valueId) => (valuesObj[valueId] = [time, newValue]),
|
|
3528
3859
|
);
|
|
3529
3860
|
return mergeableChanges;
|
|
3530
3861
|
}
|
|
3531
3862
|
return transactionMergeableChanges;
|
|
3532
3863
|
};
|
|
3533
|
-
const applyMergeableChanges = (mergeableChanges) =>
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
store.applyChanges(mergeContentOrChanges(mergeableChanges))
|
|
3537
|
-
);
|
|
3538
|
-
return mergeableStore;
|
|
3539
|
-
};
|
|
3864
|
+
const applyMergeableChanges = (mergeableChanges) =>
|
|
3865
|
+
disableListening(() => {
|
|
3866
|
+
seenHlc(mergeableChanges[0]);
|
|
3867
|
+
store.applyChanges(mergeContentOrChanges(mergeableChanges));
|
|
3868
|
+
});
|
|
3540
3869
|
const merge = (mergeableStore2) => {
|
|
3541
3870
|
const mergeableChanges = getMergeableContent();
|
|
3542
3871
|
const mergeableChanges2 = mergeableStore2.getMergeableContent();
|
|
3543
3872
|
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
3544
3873
|
return applyMergeableChanges(mergeableChanges2);
|
|
3545
3874
|
};
|
|
3546
|
-
const getContentHash = () => contentHsm[2];
|
|
3547
|
-
const getTablesHash = () => contentHsm[1][0][2];
|
|
3548
|
-
const getTableHash = (tableId) =>
|
|
3549
|
-
mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
|
|
3550
|
-
const getRowHash = (tableId, rowId) =>
|
|
3551
|
-
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
|
|
3552
|
-
const getCellHash = (tableId, rowId, cellId) =>
|
|
3553
|
-
mapGet(
|
|
3554
|
-
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
3555
|
-
cellId,
|
|
3556
|
-
)?.[2] ?? 0;
|
|
3557
|
-
const getValuesHash = () => contentHsm[1][1][2];
|
|
3558
|
-
const getValueHash = (valueId) =>
|
|
3559
|
-
mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
|
|
3560
3875
|
const mergeableStore = {
|
|
3876
|
+
getId,
|
|
3561
3877
|
getMergeableContent,
|
|
3878
|
+
getMergeableContentHashes,
|
|
3879
|
+
getMergeableTableHashes,
|
|
3880
|
+
getMergeableTableIdsDiff,
|
|
3881
|
+
getMergeableRowHashes,
|
|
3882
|
+
getMergeableRowIdsDiff,
|
|
3883
|
+
getMergeableCellHashes,
|
|
3884
|
+
getMergeableTablesChanges,
|
|
3885
|
+
getMergeableValuesHashes,
|
|
3886
|
+
getMergeableValuesChanges,
|
|
3562
3887
|
setMergeableContent,
|
|
3563
3888
|
getTransactionMergeableChanges,
|
|
3564
3889
|
applyMergeableChanges,
|
|
3565
3890
|
merge,
|
|
3566
|
-
getContentHash,
|
|
3567
|
-
getTablesHash,
|
|
3568
|
-
getTableHash,
|
|
3569
|
-
getRowHash,
|
|
3570
|
-
getCellHash,
|
|
3571
|
-
getValuesHash,
|
|
3572
|
-
getValueHash,
|
|
3573
3891
|
};
|
|
3574
3892
|
store.setInternalListeners(preFinishTransaction, postFinishTransaction);
|
|
3575
3893
|
objToArray(
|
|
@@ -3601,6 +3919,7 @@ const createMergeableStore = (id) => {
|
|
|
3601
3919
|
export {
|
|
3602
3920
|
createCheckpoints,
|
|
3603
3921
|
createCustomPersister,
|
|
3922
|
+
createCustomSynchronizer,
|
|
3604
3923
|
createIndexes,
|
|
3605
3924
|
createMergeableStore,
|
|
3606
3925
|
createMetrics,
|