tinybase 5.0.0-beta.10 → 5.0.0-beta.11
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 -1
- 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 -1
- package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -1
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -1
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs/synchronizers.cjs +1 -1
- 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/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.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 -1
- 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 -1
- package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -1
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -1
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers.cjs +1 -1
- 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/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +1 -1
- package/lib/debug/persisters/persister-automerge.js +113 -101
- package/lib/debug/persisters/persister-browser.js +113 -97
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +113 -102
- package/lib/debug/persisters/persister-electric-sql.js +113 -102
- package/lib/debug/persisters/persister-expo-sqlite-next.js +113 -102
- package/lib/debug/persisters/persister-expo-sqlite.js +113 -102
- package/lib/debug/persisters/persister-file.js +108 -96
- package/lib/debug/persisters/persister-indexed-db.js +108 -96
- package/lib/debug/persisters/persister-libsql.js +113 -102
- package/lib/debug/persisters/persister-partykit-client.js +112 -100
- package/lib/debug/persisters/persister-powersync.js +113 -102
- package/lib/debug/persisters/persister-remote.js +108 -96
- package/lib/debug/persisters/persister-sqlite-wasm.js +113 -102
- package/lib/debug/persisters/persister-sqlite3.js +113 -102
- package/lib/debug/persisters/persister-yjs.js +113 -101
- package/lib/debug/persisters.js +107 -95
- package/lib/debug/store.js +1 -1
- package/lib/debug/synchronizers/synchronizer-local.js +114 -102
- package/lib/debug/synchronizers/synchronizer-ws-client.js +113 -101
- package/lib/debug/synchronizers/synchronizer-ws-server.js +151 -6
- package/lib/debug/synchronizers.js +113 -101
- package/lib/debug/tinybase.js +114 -102
- package/lib/debug/ui-react-dom.js +114 -98
- 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 -1
- 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 -1
- package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/es6/synchronizers.js +1 -1
- 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/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.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 -1
- 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 -1
- package/lib/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/synchronizers.js +1 -1
- package/lib/synchronizers.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters.d.ts +73 -47
- package/lib/types/synchronizers/synchronizer-ws-server.d.ts +24 -3
- package/lib/types/synchronizers.d.ts +1 -1
- 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.d.ts +99 -87
- package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +24 -3
- package/lib/types/with-schemas/synchronizers.d.ts +1 -1
- 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 -1
- 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 -1
- package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd/synchronizers.js +1 -1
- 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/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.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 -1
- 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 -1
- package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd-es6/synchronizers.js +1 -1
- 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/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -390,24 +390,27 @@ const jsonParse = JSON.parse;
|
|
|
390
390
|
|
|
391
391
|
const scheduleRunning = mapNew();
|
|
392
392
|
const scheduleActions = mapNew();
|
|
393
|
-
const getStoreFunctions = (
|
|
394
|
-
|
|
393
|
+
const getStoreFunctions = (supportedStoreType = 1, store) =>
|
|
394
|
+
supportedStoreType > 1 && 'getMergeableContent' in store
|
|
395
395
|
? [
|
|
396
|
-
0,
|
|
397
|
-
store.getContent,
|
|
398
|
-
store.getTransactionChanges,
|
|
399
|
-
([changedTables, changedValues]) =>
|
|
400
|
-
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
401
|
-
store.setContent,
|
|
402
|
-
]
|
|
403
|
-
: [
|
|
404
396
|
1,
|
|
405
397
|
store.getMergeableContent,
|
|
406
398
|
store.getTransactionMergeableChanges,
|
|
407
399
|
([[changedTables], [changedValues]]) =>
|
|
408
400
|
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
409
401
|
store.setDefaultContent,
|
|
410
|
-
]
|
|
402
|
+
]
|
|
403
|
+
: supportedStoreType != 2
|
|
404
|
+
? [
|
|
405
|
+
0,
|
|
406
|
+
store.getContent,
|
|
407
|
+
store.getTransactionChanges,
|
|
408
|
+
([changedTables, changedValues]) =>
|
|
409
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
410
|
+
store.setContent,
|
|
411
|
+
]
|
|
412
|
+
: /* istanbul ignore next */
|
|
413
|
+
0;
|
|
411
414
|
const createCustomPersister = (
|
|
412
415
|
store,
|
|
413
416
|
getPersisted,
|
|
@@ -415,7 +418,7 @@ const createCustomPersister = (
|
|
|
415
418
|
addPersisterListener,
|
|
416
419
|
delPersisterListener,
|
|
417
420
|
onIgnoredError,
|
|
418
|
-
|
|
421
|
+
supportedStoreType,
|
|
419
422
|
extra = {},
|
|
420
423
|
scheduleId = [],
|
|
421
424
|
) => {
|
|
@@ -433,7 +436,7 @@ const createCustomPersister = (
|
|
|
433
436
|
getChanges,
|
|
434
437
|
hasChanges,
|
|
435
438
|
setDefaultContent,
|
|
436
|
-
] = getStoreFunctions(
|
|
439
|
+
] = getStoreFunctions(supportedStoreType, store);
|
|
437
440
|
const run = async () => {
|
|
438
441
|
/* istanbul ignore else */
|
|
439
442
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -451,20 +454,6 @@ const createCustomPersister = (
|
|
|
451
454
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
452
455
|
}
|
|
453
456
|
};
|
|
454
|
-
const loadLock = async (actions) => {
|
|
455
|
-
/* istanbul ignore else */
|
|
456
|
-
if (loadSave != 2) {
|
|
457
|
-
loadSave = 1;
|
|
458
|
-
{
|
|
459
|
-
loads++;
|
|
460
|
-
}
|
|
461
|
-
await persister.schedule(async () => {
|
|
462
|
-
await actions();
|
|
463
|
-
loadSave = 0;
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
return persister;
|
|
467
|
-
};
|
|
468
457
|
const setContentOrChanges = (contentOrChanges) => {
|
|
469
458
|
(isMergeableStore && isArray(contentOrChanges?.[0])
|
|
470
459
|
? contentOrChanges?.[2] === 1
|
|
@@ -474,9 +463,14 @@ const createCustomPersister = (
|
|
|
474
463
|
? store.applyChanges
|
|
475
464
|
: store.setContent)(contentOrChanges);
|
|
476
465
|
};
|
|
477
|
-
const
|
|
478
|
-
|
|
479
|
-
|
|
466
|
+
const load = async (initialContent) => {
|
|
467
|
+
/* istanbul ignore else */
|
|
468
|
+
if (loadSave != 2) {
|
|
469
|
+
loadSave = 1;
|
|
470
|
+
{
|
|
471
|
+
loads++;
|
|
472
|
+
}
|
|
473
|
+
await schedule(async () => {
|
|
480
474
|
try {
|
|
481
475
|
setContentOrChanges(await getPersisted());
|
|
482
476
|
} catch (error) {
|
|
@@ -485,76 +479,94 @@ const createCustomPersister = (
|
|
|
485
479
|
setDefaultContent(initialContent);
|
|
486
480
|
}
|
|
487
481
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
});
|
|
503
|
-
},
|
|
504
|
-
);
|
|
505
|
-
return persister;
|
|
506
|
-
},
|
|
507
|
-
stopAutoLoad: () => {
|
|
508
|
-
if (autoLoadHandle) {
|
|
509
|
-
delPersisterListener(autoLoadHandle);
|
|
510
|
-
autoLoadHandle = void 0;
|
|
511
|
-
}
|
|
512
|
-
return persister;
|
|
513
|
-
},
|
|
514
|
-
isAutoLoading: () => !isUndefined(autoLoadHandle),
|
|
515
|
-
save: async (getChanges2) => {
|
|
516
|
-
/* istanbul ignore else */
|
|
517
|
-
if (loadSave != 1) {
|
|
518
|
-
loadSave = 2;
|
|
519
|
-
{
|
|
520
|
-
saves++;
|
|
521
|
-
}
|
|
522
|
-
await persister.schedule(async () => {
|
|
523
|
-
try {
|
|
524
|
-
await setPersisted(getContent, getChanges2);
|
|
525
|
-
} catch (error) {
|
|
526
|
-
/* istanbul ignore next */
|
|
527
|
-
onIgnoredError?.(error);
|
|
482
|
+
loadSave = 0;
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
return persister;
|
|
486
|
+
};
|
|
487
|
+
const startAutoLoad = async (initialContent) => {
|
|
488
|
+
await stopAutoLoad().load(initialContent);
|
|
489
|
+
autoLoadHandle = addPersisterListener(async (content, changes) => {
|
|
490
|
+
if (changes || content) {
|
|
491
|
+
/* istanbul ignore else */
|
|
492
|
+
if (loadSave != 2) {
|
|
493
|
+
loadSave = 1;
|
|
494
|
+
{
|
|
495
|
+
loads++;
|
|
528
496
|
}
|
|
497
|
+
setContentOrChanges(changes ?? content);
|
|
529
498
|
loadSave = 0;
|
|
530
|
-
}
|
|
499
|
+
}
|
|
500
|
+
} else {
|
|
501
|
+
await load();
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
return persister;
|
|
505
|
+
};
|
|
506
|
+
const stopAutoLoad = () => {
|
|
507
|
+
if (autoLoadHandle) {
|
|
508
|
+
delPersisterListener(autoLoadHandle);
|
|
509
|
+
autoLoadHandle = void 0;
|
|
510
|
+
}
|
|
511
|
+
return persister;
|
|
512
|
+
};
|
|
513
|
+
const isAutoLoading = () => !isUndefined(autoLoadHandle);
|
|
514
|
+
const save = async (changes) => {
|
|
515
|
+
/* istanbul ignore else */
|
|
516
|
+
if (loadSave != 1) {
|
|
517
|
+
loadSave = 2;
|
|
518
|
+
{
|
|
519
|
+
saves++;
|
|
531
520
|
}
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
if (hasChanges(changes)) {
|
|
539
|
-
persister.save(() => changes);
|
|
521
|
+
await schedule(async () => {
|
|
522
|
+
try {
|
|
523
|
+
await setPersisted(getContent, changes);
|
|
524
|
+
} catch (error) {
|
|
525
|
+
/* istanbul ignore next */
|
|
526
|
+
onIgnoredError?.(error);
|
|
540
527
|
}
|
|
528
|
+
loadSave = 0;
|
|
541
529
|
});
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
530
|
+
}
|
|
531
|
+
return persister;
|
|
532
|
+
};
|
|
533
|
+
const startAutoSave = async () => {
|
|
534
|
+
await stopAutoSave().save();
|
|
535
|
+
autoSaveListenerId = store.addDidFinishTransactionListener(() => {
|
|
536
|
+
const changes = getChanges();
|
|
537
|
+
if (hasChanges(changes)) {
|
|
538
|
+
save(changes);
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
return persister;
|
|
542
|
+
};
|
|
543
|
+
const stopAutoSave = () => {
|
|
544
|
+
ifNotUndefined(autoSaveListenerId, store.delListener);
|
|
545
|
+
autoSaveListenerId = void 0;
|
|
546
|
+
return persister;
|
|
547
|
+
};
|
|
548
|
+
const isAutoSaving = () => !isUndefined(autoSaveListenerId);
|
|
549
|
+
const schedule = async (...actions) => {
|
|
550
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
551
|
+
await run();
|
|
552
|
+
return persister;
|
|
553
|
+
};
|
|
554
|
+
const getStore = () => store;
|
|
555
|
+
const destroy = () => stopAutoLoad().stopAutoSave();
|
|
556
|
+
const getStats = () => ({loads, saves});
|
|
557
|
+
const persister = {
|
|
558
|
+
load,
|
|
559
|
+
startAutoLoad,
|
|
560
|
+
stopAutoLoad,
|
|
561
|
+
isAutoLoading,
|
|
562
|
+
save,
|
|
563
|
+
startAutoSave,
|
|
564
|
+
stopAutoSave,
|
|
565
|
+
isAutoSaving,
|
|
566
|
+
schedule,
|
|
567
|
+
getStore,
|
|
568
|
+
destroy,
|
|
569
|
+
getStats,
|
|
558
570
|
...extra,
|
|
559
571
|
};
|
|
560
572
|
return objFreeze(persister);
|
|
@@ -606,7 +618,7 @@ const createJsonSqlitePersister = (
|
|
|
606
618
|
addPersisterListener,
|
|
607
619
|
delPersisterListener,
|
|
608
620
|
onIgnoredError,
|
|
609
|
-
|
|
621
|
+
1,
|
|
610
622
|
{[getThing]: () => db},
|
|
611
623
|
db,
|
|
612
624
|
);
|
|
@@ -693,13 +705,12 @@ const createTabularSqlitePersister = (
|
|
|
693
705
|
? [tables, values]
|
|
694
706
|
: void 0;
|
|
695
707
|
});
|
|
696
|
-
const setPersisted = async (getContent,
|
|
708
|
+
const setPersisted = async (getContent, changes) =>
|
|
697
709
|
await transaction(async () => {
|
|
698
710
|
await refreshSchema();
|
|
699
|
-
if (!isUndefined(
|
|
700
|
-
|
|
701
|
-
await
|
|
702
|
-
await saveValues(valueChanges, true);
|
|
711
|
+
if (!isUndefined(changes)) {
|
|
712
|
+
await saveTables(changes[0], true);
|
|
713
|
+
await saveValues(changes[1], true);
|
|
703
714
|
} else {
|
|
704
715
|
const [tables, values] = getContent();
|
|
705
716
|
await saveTables(tables);
|
|
@@ -713,7 +724,7 @@ const createTabularSqlitePersister = (
|
|
|
713
724
|
addPersisterListener,
|
|
714
725
|
delPersisterListener,
|
|
715
726
|
onIgnoredError,
|
|
716
|
-
|
|
727
|
+
1,
|
|
717
728
|
{[getThing]: () => db},
|
|
718
729
|
db,
|
|
719
730
|
);
|
|
@@ -388,24 +388,27 @@ const jsonParse = JSON.parse;
|
|
|
388
388
|
|
|
389
389
|
const scheduleRunning = mapNew();
|
|
390
390
|
const scheduleActions = mapNew();
|
|
391
|
-
const getStoreFunctions = (
|
|
392
|
-
|
|
391
|
+
const getStoreFunctions = (supportedStoreType = 1, store) =>
|
|
392
|
+
supportedStoreType > 1 && 'getMergeableContent' in store
|
|
393
393
|
? [
|
|
394
|
-
0,
|
|
395
|
-
store.getContent,
|
|
396
|
-
store.getTransactionChanges,
|
|
397
|
-
([changedTables, changedValues]) =>
|
|
398
|
-
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
399
|
-
store.setContent,
|
|
400
|
-
]
|
|
401
|
-
: [
|
|
402
394
|
1,
|
|
403
395
|
store.getMergeableContent,
|
|
404
396
|
store.getTransactionMergeableChanges,
|
|
405
397
|
([[changedTables], [changedValues]]) =>
|
|
406
398
|
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
407
399
|
store.setDefaultContent,
|
|
408
|
-
]
|
|
400
|
+
]
|
|
401
|
+
: supportedStoreType != 2
|
|
402
|
+
? [
|
|
403
|
+
0,
|
|
404
|
+
store.getContent,
|
|
405
|
+
store.getTransactionChanges,
|
|
406
|
+
([changedTables, changedValues]) =>
|
|
407
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
408
|
+
store.setContent,
|
|
409
|
+
]
|
|
410
|
+
: /* istanbul ignore next */
|
|
411
|
+
0;
|
|
409
412
|
const createCustomPersister = (
|
|
410
413
|
store,
|
|
411
414
|
getPersisted,
|
|
@@ -413,7 +416,7 @@ const createCustomPersister = (
|
|
|
413
416
|
addPersisterListener,
|
|
414
417
|
delPersisterListener,
|
|
415
418
|
onIgnoredError,
|
|
416
|
-
|
|
419
|
+
supportedStoreType,
|
|
417
420
|
extra = {},
|
|
418
421
|
scheduleId = [],
|
|
419
422
|
) => {
|
|
@@ -431,7 +434,7 @@ const createCustomPersister = (
|
|
|
431
434
|
getChanges,
|
|
432
435
|
hasChanges,
|
|
433
436
|
setDefaultContent,
|
|
434
|
-
] = getStoreFunctions(
|
|
437
|
+
] = getStoreFunctions(supportedStoreType, store);
|
|
435
438
|
const run = async () => {
|
|
436
439
|
/* istanbul ignore else */
|
|
437
440
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -449,20 +452,6 @@ const createCustomPersister = (
|
|
|
449
452
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
450
453
|
}
|
|
451
454
|
};
|
|
452
|
-
const loadLock = async (actions) => {
|
|
453
|
-
/* istanbul ignore else */
|
|
454
|
-
if (loadSave != 2) {
|
|
455
|
-
loadSave = 1;
|
|
456
|
-
{
|
|
457
|
-
loads++;
|
|
458
|
-
}
|
|
459
|
-
await persister.schedule(async () => {
|
|
460
|
-
await actions();
|
|
461
|
-
loadSave = 0;
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
return persister;
|
|
465
|
-
};
|
|
466
455
|
const setContentOrChanges = (contentOrChanges) => {
|
|
467
456
|
(isMergeableStore && isArray(contentOrChanges?.[0])
|
|
468
457
|
? contentOrChanges?.[2] === 1
|
|
@@ -472,9 +461,14 @@ const createCustomPersister = (
|
|
|
472
461
|
? store.applyChanges
|
|
473
462
|
: store.setContent)(contentOrChanges);
|
|
474
463
|
};
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
|
|
464
|
+
const load = async (initialContent) => {
|
|
465
|
+
/* istanbul ignore else */
|
|
466
|
+
if (loadSave != 2) {
|
|
467
|
+
loadSave = 1;
|
|
468
|
+
{
|
|
469
|
+
loads++;
|
|
470
|
+
}
|
|
471
|
+
await schedule(async () => {
|
|
478
472
|
try {
|
|
479
473
|
setContentOrChanges(await getPersisted());
|
|
480
474
|
} catch (error) {
|
|
@@ -483,76 +477,94 @@ const createCustomPersister = (
|
|
|
483
477
|
setDefaultContent(initialContent);
|
|
484
478
|
}
|
|
485
479
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
});
|
|
501
|
-
},
|
|
502
|
-
);
|
|
503
|
-
return persister;
|
|
504
|
-
},
|
|
505
|
-
stopAutoLoad: () => {
|
|
506
|
-
if (autoLoadHandle) {
|
|
507
|
-
delPersisterListener(autoLoadHandle);
|
|
508
|
-
autoLoadHandle = void 0;
|
|
509
|
-
}
|
|
510
|
-
return persister;
|
|
511
|
-
},
|
|
512
|
-
isAutoLoading: () => !isUndefined(autoLoadHandle),
|
|
513
|
-
save: async (getChanges2) => {
|
|
514
|
-
/* istanbul ignore else */
|
|
515
|
-
if (loadSave != 1) {
|
|
516
|
-
loadSave = 2;
|
|
517
|
-
{
|
|
518
|
-
saves++;
|
|
519
|
-
}
|
|
520
|
-
await persister.schedule(async () => {
|
|
521
|
-
try {
|
|
522
|
-
await setPersisted(getContent, getChanges2);
|
|
523
|
-
} catch (error) {
|
|
524
|
-
/* istanbul ignore next */
|
|
525
|
-
onIgnoredError?.(error);
|
|
480
|
+
loadSave = 0;
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
return persister;
|
|
484
|
+
};
|
|
485
|
+
const startAutoLoad = async (initialContent) => {
|
|
486
|
+
await stopAutoLoad().load(initialContent);
|
|
487
|
+
autoLoadHandle = addPersisterListener(async (content, changes) => {
|
|
488
|
+
if (changes || content) {
|
|
489
|
+
/* istanbul ignore else */
|
|
490
|
+
if (loadSave != 2) {
|
|
491
|
+
loadSave = 1;
|
|
492
|
+
{
|
|
493
|
+
loads++;
|
|
526
494
|
}
|
|
495
|
+
setContentOrChanges(changes ?? content);
|
|
527
496
|
loadSave = 0;
|
|
528
|
-
}
|
|
497
|
+
}
|
|
498
|
+
} else {
|
|
499
|
+
await load();
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
return persister;
|
|
503
|
+
};
|
|
504
|
+
const stopAutoLoad = () => {
|
|
505
|
+
if (autoLoadHandle) {
|
|
506
|
+
delPersisterListener(autoLoadHandle);
|
|
507
|
+
autoLoadHandle = void 0;
|
|
508
|
+
}
|
|
509
|
+
return persister;
|
|
510
|
+
};
|
|
511
|
+
const isAutoLoading = () => !isUndefined(autoLoadHandle);
|
|
512
|
+
const save = async (changes) => {
|
|
513
|
+
/* istanbul ignore else */
|
|
514
|
+
if (loadSave != 1) {
|
|
515
|
+
loadSave = 2;
|
|
516
|
+
{
|
|
517
|
+
saves++;
|
|
529
518
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
if (hasChanges(changes)) {
|
|
537
|
-
persister.save(() => changes);
|
|
519
|
+
await schedule(async () => {
|
|
520
|
+
try {
|
|
521
|
+
await setPersisted(getContent, changes);
|
|
522
|
+
} catch (error) {
|
|
523
|
+
/* istanbul ignore next */
|
|
524
|
+
onIgnoredError?.(error);
|
|
538
525
|
}
|
|
526
|
+
loadSave = 0;
|
|
539
527
|
});
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
528
|
+
}
|
|
529
|
+
return persister;
|
|
530
|
+
};
|
|
531
|
+
const startAutoSave = async () => {
|
|
532
|
+
await stopAutoSave().save();
|
|
533
|
+
autoSaveListenerId = store.addDidFinishTransactionListener(() => {
|
|
534
|
+
const changes = getChanges();
|
|
535
|
+
if (hasChanges(changes)) {
|
|
536
|
+
save(changes);
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
return persister;
|
|
540
|
+
};
|
|
541
|
+
const stopAutoSave = () => {
|
|
542
|
+
ifNotUndefined(autoSaveListenerId, store.delListener);
|
|
543
|
+
autoSaveListenerId = void 0;
|
|
544
|
+
return persister;
|
|
545
|
+
};
|
|
546
|
+
const isAutoSaving = () => !isUndefined(autoSaveListenerId);
|
|
547
|
+
const schedule = async (...actions) => {
|
|
548
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
549
|
+
await run();
|
|
550
|
+
return persister;
|
|
551
|
+
};
|
|
552
|
+
const getStore = () => store;
|
|
553
|
+
const destroy = () => stopAutoLoad().stopAutoSave();
|
|
554
|
+
const getStats = () => ({loads, saves});
|
|
555
|
+
const persister = {
|
|
556
|
+
load,
|
|
557
|
+
startAutoLoad,
|
|
558
|
+
stopAutoLoad,
|
|
559
|
+
isAutoLoading,
|
|
560
|
+
save,
|
|
561
|
+
startAutoSave,
|
|
562
|
+
stopAutoSave,
|
|
563
|
+
isAutoSaving,
|
|
564
|
+
schedule,
|
|
565
|
+
getStore,
|
|
566
|
+
destroy,
|
|
567
|
+
getStats,
|
|
556
568
|
...extra,
|
|
557
569
|
};
|
|
558
570
|
return objFreeze(persister);
|
|
@@ -604,7 +616,7 @@ const createJsonSqlitePersister = (
|
|
|
604
616
|
addPersisterListener,
|
|
605
617
|
delPersisterListener,
|
|
606
618
|
onIgnoredError,
|
|
607
|
-
|
|
619
|
+
1,
|
|
608
620
|
{[getThing]: () => db},
|
|
609
621
|
db,
|
|
610
622
|
);
|
|
@@ -691,13 +703,12 @@ const createTabularSqlitePersister = (
|
|
|
691
703
|
? [tables, values]
|
|
692
704
|
: void 0;
|
|
693
705
|
});
|
|
694
|
-
const setPersisted = async (getContent,
|
|
706
|
+
const setPersisted = async (getContent, changes) =>
|
|
695
707
|
await transaction(async () => {
|
|
696
708
|
await refreshSchema();
|
|
697
|
-
if (!isUndefined(
|
|
698
|
-
|
|
699
|
-
await
|
|
700
|
-
await saveValues(valueChanges, true);
|
|
709
|
+
if (!isUndefined(changes)) {
|
|
710
|
+
await saveTables(changes[0], true);
|
|
711
|
+
await saveValues(changes[1], true);
|
|
701
712
|
} else {
|
|
702
713
|
const [tables, values] = getContent();
|
|
703
714
|
await saveTables(tables);
|
|
@@ -711,7 +722,7 @@ const createTabularSqlitePersister = (
|
|
|
711
722
|
addPersisterListener,
|
|
712
723
|
delPersisterListener,
|
|
713
724
|
onIgnoredError,
|
|
714
|
-
|
|
725
|
+
1,
|
|
715
726
|
{[getThing]: () => db},
|
|
716
727
|
db,
|
|
717
728
|
);
|