tinybase 5.0.0-beta.2 → 5.0.0-beta.4
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-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -1
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-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-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +223 -211
- package/lib/debug/persisters/persister-automerge.js +62 -41
- package/lib/debug/persisters/persister-browser.js +48 -16
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +97 -52
- package/lib/debug/persisters/persister-electric-sql.js +97 -52
- package/lib/debug/persisters/persister-expo-sqlite-next.js +97 -52
- package/lib/debug/persisters/persister-expo-sqlite.js +97 -52
- package/lib/debug/persisters/persister-file.js +47 -16
- package/lib/debug/persisters/persister-indexed-db.js +48 -18
- package/lib/debug/persisters/persister-partykit-client.js +46 -21
- package/lib/debug/persisters/persister-partykit-server.js +8 -18
- package/lib/debug/persisters/persister-remote.js +48 -16
- package/lib/debug/persisters/persister-sqlite-wasm.js +97 -52
- package/lib/debug/persisters/persister-sqlite3.js +97 -52
- package/lib/debug/persisters/persister-yjs.js +64 -40
- package/lib/debug/persisters.js +47 -16
- package/lib/debug/store.js +61 -83
- package/lib/debug/tinybase.js +264 -227
- package/lib/debug/tools.js +9 -11
- package/lib/debug/ui-react-dom.js +104 -99
- 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-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -1
- package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -1
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/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-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -1
- package/lib/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -1
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/mergeable-store.d.ts +43 -13
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters/persister-partykit-server.d.ts +7 -8
- package/lib/types/persisters.d.ts +61 -30
- package/lib/types/store.d.ts +153 -111
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/with-schemas/mergeable-store.d.ts +46 -13
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +10 -11
- package/lib/types/with-schemas/persisters.d.ts +88 -45
- package/lib/types/with-schemas/store.d.ts +165 -136
- package/lib/types/with-schemas/tools.d.ts +2 -2
- 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-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -1
- package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -1
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-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-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -1
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +29 -25
- package/readme.md +2 -2
package/lib/debug/tinybase.js
CHANGED
|
@@ -88,8 +88,8 @@ const isObject = (obj) =>
|
|
|
88
88
|
/* istanbul ignore next */
|
|
89
89
|
() => true,
|
|
90
90
|
);
|
|
91
|
-
const
|
|
92
|
-
const objHas = (obj, id) =>
|
|
91
|
+
const objNew = (entries = []) => object.fromEntries(entries);
|
|
92
|
+
const objHas = (obj, id) => id in obj;
|
|
93
93
|
const objDel = (obj, id) => {
|
|
94
94
|
delete obj[id];
|
|
95
95
|
return obj;
|
|
@@ -1085,6 +1085,23 @@ const createMetrics = getCreateFunction((store) => {
|
|
|
1085
1085
|
|
|
1086
1086
|
const scheduleRunning = mapNew();
|
|
1087
1087
|
const scheduleActions = mapNew();
|
|
1088
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
1089
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
1090
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
1091
|
+
? [
|
|
1092
|
+
0,
|
|
1093
|
+
store.getContent,
|
|
1094
|
+
store.getTransactionChanges,
|
|
1095
|
+
([changedTables, changedValues]) =>
|
|
1096
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
1097
|
+
]
|
|
1098
|
+
: [
|
|
1099
|
+
1,
|
|
1100
|
+
store.getMergeableContent,
|
|
1101
|
+
store.getTransactionMergeableChanges,
|
|
1102
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
1103
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
1104
|
+
];
|
|
1088
1105
|
const createCustomPersister = (
|
|
1089
1106
|
store,
|
|
1090
1107
|
getPersisted,
|
|
@@ -1092,6 +1109,7 @@ const createCustomPersister = (
|
|
|
1092
1109
|
addPersisterListener,
|
|
1093
1110
|
delPersisterListener,
|
|
1094
1111
|
onIgnoredError,
|
|
1112
|
+
supportsMergeableStore,
|
|
1095
1113
|
[getThing, thing] = [],
|
|
1096
1114
|
scheduleId = [],
|
|
1097
1115
|
) => {
|
|
@@ -1104,6 +1122,8 @@ const createCustomPersister = (
|
|
|
1104
1122
|
let listeningHandle;
|
|
1105
1123
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
1106
1124
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
1125
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
1126
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
1107
1127
|
const run = async () => {
|
|
1108
1128
|
/* istanbul ignore else */
|
|
1109
1129
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -1139,7 +1159,10 @@ const createCustomPersister = (
|
|
|
1139
1159
|
load: async (initialTables, initialValues) =>
|
|
1140
1160
|
await loadLock(async () => {
|
|
1141
1161
|
try {
|
|
1142
|
-
|
|
1162
|
+
const content = await getPersisted();
|
|
1163
|
+
(isMergeableStore && isMergeable(content)
|
|
1164
|
+
? store.setMergeableContent
|
|
1165
|
+
: store.setContent)(content);
|
|
1143
1166
|
} catch {
|
|
1144
1167
|
store.setContent([initialTables, initialValues]);
|
|
1145
1168
|
}
|
|
@@ -1149,16 +1172,21 @@ const createCustomPersister = (
|
|
|
1149
1172
|
await persister.load(initialTables, initialValues);
|
|
1150
1173
|
listening = 1;
|
|
1151
1174
|
listeningHandle = addPersisterListener(
|
|
1152
|
-
async (
|
|
1153
|
-
if (
|
|
1154
|
-
const
|
|
1175
|
+
async (getContent2, getChanges2) => {
|
|
1176
|
+
if (getChanges2) {
|
|
1177
|
+
const changes = getChanges2();
|
|
1155
1178
|
await loadLock(async () =>
|
|
1156
|
-
|
|
1179
|
+
(isMergeableStore && isMergeable(changes)
|
|
1180
|
+
? store.applyMergeableChanges
|
|
1181
|
+
: store.applyChanges)(changes),
|
|
1157
1182
|
);
|
|
1158
1183
|
} else {
|
|
1159
1184
|
await loadLock(async () => {
|
|
1160
1185
|
try {
|
|
1161
|
-
|
|
1186
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
1187
|
+
(isMergeableStore && isMergeable(content)
|
|
1188
|
+
? store.setMergeableContent
|
|
1189
|
+
: store.setContent)(content);
|
|
1162
1190
|
} catch (error) {
|
|
1163
1191
|
onIgnoredError?.(error);
|
|
1164
1192
|
}
|
|
@@ -1176,7 +1204,7 @@ const createCustomPersister = (
|
|
|
1176
1204
|
}
|
|
1177
1205
|
return persister;
|
|
1178
1206
|
},
|
|
1179
|
-
save: async (
|
|
1207
|
+
save: async (getChanges2) => {
|
|
1180
1208
|
/* istanbul ignore else */
|
|
1181
1209
|
if (loadSave != 1) {
|
|
1182
1210
|
loadSave = 2;
|
|
@@ -1185,7 +1213,7 @@ const createCustomPersister = (
|
|
|
1185
1213
|
}
|
|
1186
1214
|
await persister.schedule(async () => {
|
|
1187
1215
|
try {
|
|
1188
|
-
await setPersisted(
|
|
1216
|
+
await setPersisted(getContent, getChanges2);
|
|
1189
1217
|
} catch (error) {
|
|
1190
1218
|
/* istanbul ignore next */
|
|
1191
1219
|
onIgnoredError?.(error);
|
|
@@ -1197,14 +1225,12 @@ const createCustomPersister = (
|
|
|
1197
1225
|
},
|
|
1198
1226
|
startAutoSave: async () => {
|
|
1199
1227
|
await persister.stopAutoSave().save();
|
|
1200
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
},
|
|
1207
|
-
);
|
|
1228
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
1229
|
+
const changes = getChanges();
|
|
1230
|
+
if (hasChanges(changes)) {
|
|
1231
|
+
persister.save(() => changes);
|
|
1232
|
+
}
|
|
1233
|
+
});
|
|
1208
1234
|
return persister;
|
|
1209
1235
|
},
|
|
1210
1236
|
stopAutoSave: () => {
|
|
@@ -1875,51 +1901,36 @@ const createRelationships = getCreateFunction((store) => {
|
|
|
1875
1901
|
return objFreeze(relationships);
|
|
1876
1902
|
});
|
|
1877
1903
|
|
|
1878
|
-
const
|
|
1879
|
-
const
|
|
1880
|
-
const
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
const
|
|
1886
|
-
|
|
1887
|
-
[newStamp, newThing],
|
|
1888
|
-
currentStampedThing,
|
|
1889
|
-
getNextCurrentThing,
|
|
1890
|
-
ifNewer = 0,
|
|
1891
|
-
) => {
|
|
1892
|
-
const isNewer = newStamp > currentStampedThing[0];
|
|
1893
|
-
if ((!ifNewer && currentStampedThing[1] !== null) || isNewer) {
|
|
1894
|
-
currentStampedThing[1] = getNextCurrentThing(
|
|
1895
|
-
newThing,
|
|
1896
|
-
currentStampedThing[1],
|
|
1897
|
-
);
|
|
1898
|
-
}
|
|
1899
|
-
if (isNewer) {
|
|
1900
|
-
currentStampedThing[0] = newStamp;
|
|
1901
|
-
}
|
|
1902
|
-
return currentStampedThing;
|
|
1903
|
-
};
|
|
1904
|
-
const mergeEachStamp = (thingStamps, allThingStamps, changes, forEachThing) => {
|
|
1905
|
-
objForEach(thingStamps, (thingStamp, thingId) =>
|
|
1904
|
+
const stampNew = (time = EMPTY_STRING, thing) => [time, thing];
|
|
1905
|
+
const stampNewMap = (time = EMPTY_STRING) => stampNew(time, mapNew());
|
|
1906
|
+
const stampNewObj = (time) => stampNew(time, objNew());
|
|
1907
|
+
const mapStamp = ([time, value], mapper) => [time, mapper(value, time)];
|
|
1908
|
+
const cloneStamp = ([time, value]) => [time, value];
|
|
1909
|
+
const mapStampMapToObj = (stampedMap, mapper) =>
|
|
1910
|
+
mapStamp(stampedMap, (map) => mapToObj(map, mapper));
|
|
1911
|
+
const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
|
|
1912
|
+
objForEach(newThingStamps, (newThingStamp, thingId) =>
|
|
1906
1913
|
mergeStamp(
|
|
1907
|
-
|
|
1908
|
-
mapEnsure(
|
|
1909
|
-
(
|
|
1910
|
-
|
|
1911
|
-
return (changes[thingId] = newThing ?? null);
|
|
1912
|
-
}
|
|
1913
|
-
currentThing ??= mapNew();
|
|
1914
|
-
changes[thingId] = {};
|
|
1915
|
-
forEachThing(newThing, currentThing, thingId);
|
|
1916
|
-
return currentThing;
|
|
1917
|
-
},
|
|
1918
|
-
forEachThing ? 0 : 1,
|
|
1914
|
+
newThingStamp,
|
|
1915
|
+
mapEnsure(thingStamps, thingId, stampNewMap),
|
|
1916
|
+
(changes[thingId] = objNew()),
|
|
1917
|
+
merge,
|
|
1919
1918
|
),
|
|
1920
1919
|
);
|
|
1921
|
-
|
|
1920
|
+
const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
|
|
1921
|
+
if (newTime > thingStamp[0]) {
|
|
1922
|
+
thingStamp[0] = newTime;
|
|
1923
|
+
}
|
|
1924
|
+
merge(newThing, thingStamp[1], changes);
|
|
1922
1925
|
};
|
|
1926
|
+
const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
|
|
1927
|
+
objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
|
|
1928
|
+
const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
|
|
1929
|
+
if (newTime > leafStamp[0]) {
|
|
1930
|
+
leafStamp[0] = newTime;
|
|
1931
|
+
leafStamp[1] = changes[leafId] = newLeaf;
|
|
1932
|
+
}
|
|
1933
|
+
});
|
|
1923
1934
|
|
|
1924
1935
|
const pairNew = (value) => [value, value];
|
|
1925
1936
|
const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
|
|
@@ -1954,12 +1965,10 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
|
|
|
1954
1965
|
const createStore = () => {
|
|
1955
1966
|
let hasTablesSchema;
|
|
1956
1967
|
let hasValuesSchema;
|
|
1957
|
-
let cellsTouched = false;
|
|
1958
|
-
let valuesTouched = false;
|
|
1959
1968
|
let hadTables = false;
|
|
1960
1969
|
let hadValues = false;
|
|
1961
1970
|
let transactions = 0;
|
|
1962
|
-
let
|
|
1971
|
+
let internalListeners = [];
|
|
1963
1972
|
const changedTableIds = mapNew();
|
|
1964
1973
|
const changedTableCellIds = mapNew();
|
|
1965
1974
|
const changedRowCount = mapNew();
|
|
@@ -2601,44 +2610,6 @@ const createStore = () => {
|
|
|
2601
2610
|
transaction(() => actions(...arrayMap(args, id)));
|
|
2602
2611
|
return store;
|
|
2603
2612
|
};
|
|
2604
|
-
const getTransactionChanges = () => [
|
|
2605
|
-
mapToObj(
|
|
2606
|
-
changedCells,
|
|
2607
|
-
(table, tableId) =>
|
|
2608
|
-
mapGet(changedTableIds, tableId) === -1
|
|
2609
|
-
? null
|
|
2610
|
-
: mapToObj(
|
|
2611
|
-
table,
|
|
2612
|
-
(row, rowId) =>
|
|
2613
|
-
mapGet(mapGet(changedRowIds, tableId), rowId) === -1
|
|
2614
|
-
? null
|
|
2615
|
-
: mapToObj(
|
|
2616
|
-
row,
|
|
2617
|
-
([, newCell]) => newCell ?? null,
|
|
2618
|
-
(_, changedCell) => pairIsEqual(changedCell),
|
|
2619
|
-
),
|
|
2620
|
-
objIsEmpty,
|
|
2621
|
-
),
|
|
2622
|
-
objIsEmpty,
|
|
2623
|
-
),
|
|
2624
|
-
mapToObj(
|
|
2625
|
-
changedValues,
|
|
2626
|
-
([, newValue]) => newValue ?? null,
|
|
2627
|
-
(_, changedValue) => pairIsEqual(changedValue),
|
|
2628
|
-
),
|
|
2629
|
-
];
|
|
2630
|
-
const getTransactionLog = () => ({
|
|
2631
|
-
cellsTouched,
|
|
2632
|
-
valuesTouched,
|
|
2633
|
-
changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
|
|
2634
|
-
invalidCells: mapToObj3(invalidCells),
|
|
2635
|
-
changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
|
|
2636
|
-
invalidValues: mapToObj(invalidValues),
|
|
2637
|
-
changedTableIds: mapToObj(changedTableIds),
|
|
2638
|
-
changedRowIds: mapToObj2(changedRowIds),
|
|
2639
|
-
changedCellIds: mapToObj3(changedCellIds),
|
|
2640
|
-
changedValueIds: mapToObj(changedValueIds),
|
|
2641
|
-
});
|
|
2642
2613
|
const getContent = () => [getTables(), getValues()];
|
|
2643
2614
|
const getTables = () => mapToObj3(tablesMap);
|
|
2644
2615
|
const getTableIds = () => mapKeys(tablesMap);
|
|
@@ -2786,9 +2757,9 @@ const createStore = () => {
|
|
|
2786
2757
|
),
|
|
2787
2758
|
valueId,
|
|
2788
2759
|
);
|
|
2789
|
-
const
|
|
2760
|
+
const applyChanges = (changes) =>
|
|
2790
2761
|
fluentTransaction(() => {
|
|
2791
|
-
objToArray(
|
|
2762
|
+
objToArray(changes[0], (table, tableId) =>
|
|
2792
2763
|
isUndefined(table)
|
|
2793
2764
|
? delTable(tableId)
|
|
2794
2765
|
: objToArray(table, (row, rowId) =>
|
|
@@ -2799,7 +2770,7 @@ const createStore = () => {
|
|
|
2799
2770
|
),
|
|
2800
2771
|
),
|
|
2801
2772
|
);
|
|
2802
|
-
objToArray(
|
|
2773
|
+
objToArray(changes[1], (value, valueId) =>
|
|
2803
2774
|
setOrDelValue(store, valueId, value),
|
|
2804
2775
|
);
|
|
2805
2776
|
});
|
|
@@ -2926,31 +2897,62 @@ const createStore = () => {
|
|
|
2926
2897
|
transactions++;
|
|
2927
2898
|
}
|
|
2928
2899
|
if (transactions == 1) {
|
|
2929
|
-
callListeners(
|
|
2930
|
-
startTransactionListeners,
|
|
2931
|
-
void 0,
|
|
2932
|
-
getTransactionChanges,
|
|
2933
|
-
getTransactionLog,
|
|
2934
|
-
);
|
|
2900
|
+
callListeners(startTransactionListeners, void 0);
|
|
2935
2901
|
}
|
|
2936
2902
|
return store;
|
|
2937
2903
|
};
|
|
2904
|
+
const getTransactionChanges = () => [
|
|
2905
|
+
mapToObj(
|
|
2906
|
+
changedCells,
|
|
2907
|
+
(table, tableId) =>
|
|
2908
|
+
mapGet(changedTableIds, tableId) === -1
|
|
2909
|
+
? void 0
|
|
2910
|
+
: mapToObj(
|
|
2911
|
+
table,
|
|
2912
|
+
(row, rowId) =>
|
|
2913
|
+
mapGet(mapGet(changedRowIds, tableId), rowId) === -1
|
|
2914
|
+
? void 0
|
|
2915
|
+
: mapToObj(
|
|
2916
|
+
row,
|
|
2917
|
+
([, newCell]) => newCell,
|
|
2918
|
+
(_, changedCell) => pairIsEqual(changedCell),
|
|
2919
|
+
),
|
|
2920
|
+
objIsEmpty,
|
|
2921
|
+
),
|
|
2922
|
+
objIsEmpty,
|
|
2923
|
+
),
|
|
2924
|
+
mapToObj(
|
|
2925
|
+
changedValues,
|
|
2926
|
+
([, newValue]) => newValue,
|
|
2927
|
+
(_, changedValue) => pairIsEqual(changedValue),
|
|
2928
|
+
),
|
|
2929
|
+
];
|
|
2930
|
+
const getTransactionLog = () => [
|
|
2931
|
+
!collIsEmpty(changedCells),
|
|
2932
|
+
!collIsEmpty(changedValues),
|
|
2933
|
+
mapToObj3(changedCells, pairClone, pairIsEqual),
|
|
2934
|
+
mapToObj3(invalidCells),
|
|
2935
|
+
mapToObj(changedValues, pairClone, pairIsEqual),
|
|
2936
|
+
mapToObj(invalidValues),
|
|
2937
|
+
mapToObj(changedTableIds),
|
|
2938
|
+
mapToObj2(changedRowIds),
|
|
2939
|
+
mapToObj3(changedCellIds),
|
|
2940
|
+
mapToObj(changedValueIds),
|
|
2941
|
+
];
|
|
2938
2942
|
const finishTransaction = (doRollback) => {
|
|
2939
2943
|
if (transactions > 0) {
|
|
2940
2944
|
transactions--;
|
|
2941
2945
|
if (transactions == 0) {
|
|
2942
|
-
cellsTouched = !collIsEmpty(changedCells);
|
|
2943
|
-
valuesTouched = !collIsEmpty(changedValues);
|
|
2944
2946
|
transactions = 1;
|
|
2945
2947
|
callInvalidCellListeners(1);
|
|
2946
|
-
if (
|
|
2948
|
+
if (!collIsEmpty(changedCells)) {
|
|
2947
2949
|
callTabularListenersForChanges(1);
|
|
2948
2950
|
}
|
|
2949
2951
|
callInvalidValueListeners(1);
|
|
2950
|
-
if (
|
|
2952
|
+
if (!collIsEmpty(changedValues)) {
|
|
2951
2953
|
callValuesListenersForChanges(1);
|
|
2952
2954
|
}
|
|
2953
|
-
if (doRollback?.(
|
|
2955
|
+
if (doRollback?.(store)) {
|
|
2954
2956
|
collForEach(changedCells, (table, tableId) =>
|
|
2955
2957
|
collForEach(table, (row, rowId) =>
|
|
2956
2958
|
collForEach(row, ([oldCell], cellId) =>
|
|
@@ -2958,39 +2960,26 @@ const createStore = () => {
|
|
|
2958
2960
|
),
|
|
2959
2961
|
),
|
|
2960
2962
|
);
|
|
2963
|
+
collClear(changedCells);
|
|
2961
2964
|
collForEach(changedValues, ([oldValue], valueId) =>
|
|
2962
2965
|
setOrDelValue(store, valueId, oldValue),
|
|
2963
2966
|
);
|
|
2964
|
-
|
|
2967
|
+
collClear(changedValues);
|
|
2965
2968
|
}
|
|
2966
|
-
callListeners(
|
|
2967
|
-
finishTransactionListeners[0],
|
|
2968
|
-
void 0,
|
|
2969
|
-
getTransactionChanges,
|
|
2970
|
-
getTransactionLog,
|
|
2971
|
-
);
|
|
2969
|
+
callListeners(finishTransactionListeners[0], void 0);
|
|
2972
2970
|
transactions = -1;
|
|
2973
2971
|
callInvalidCellListeners(0);
|
|
2974
|
-
if (
|
|
2972
|
+
if (!collIsEmpty(changedCells)) {
|
|
2975
2973
|
callTabularListenersForChanges(0);
|
|
2976
2974
|
}
|
|
2977
2975
|
callInvalidValueListeners(0);
|
|
2978
|
-
if (
|
|
2976
|
+
if (!collIsEmpty(changedValues)) {
|
|
2979
2977
|
callValuesListenersForChanges(0);
|
|
2980
2978
|
}
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
getTransactionChanges,
|
|
2985
|
-
getTransactionLog,
|
|
2986
|
-
);
|
|
2987
|
-
postTransactionListener?.(
|
|
2988
|
-
store,
|
|
2989
|
-
getTransactionChanges,
|
|
2990
|
-
getTransactionLog,
|
|
2991
|
-
);
|
|
2979
|
+
internalListeners[0]?.(store);
|
|
2980
|
+
callListeners(finishTransactionListeners[1], void 0);
|
|
2981
|
+
internalListeners[1]?.(store);
|
|
2992
2982
|
transactions = 0;
|
|
2993
|
-
cellsTouched = valuesTouched = false;
|
|
2994
2983
|
hadTables = hasTables();
|
|
2995
2984
|
hadValues = hasValues();
|
|
2996
2985
|
arrayForEach(
|
|
@@ -3115,9 +3104,8 @@ const createStore = () => {
|
|
|
3115
3104
|
collSize2(startTransactionListeners) +
|
|
3116
3105
|
pairCollSize2(finishTransactionListeners),
|
|
3117
3106
|
});
|
|
3118
|
-
const
|
|
3119
|
-
|
|
3120
|
-
};
|
|
3107
|
+
const setInternalListeners = (preFinishTransaction, postFinishTransaction) =>
|
|
3108
|
+
(internalListeners = [preFinishTransaction, postFinishTransaction]);
|
|
3121
3109
|
const store = {
|
|
3122
3110
|
getContent,
|
|
3123
3111
|
getTables,
|
|
@@ -3158,7 +3146,7 @@ const createStore = () => {
|
|
|
3158
3146
|
setValues,
|
|
3159
3147
|
setPartialValues,
|
|
3160
3148
|
setValue,
|
|
3161
|
-
|
|
3149
|
+
applyChanges,
|
|
3162
3150
|
setTablesJson,
|
|
3163
3151
|
setValuesJson,
|
|
3164
3152
|
setJson,
|
|
@@ -3176,6 +3164,8 @@ const createStore = () => {
|
|
|
3176
3164
|
delSchema,
|
|
3177
3165
|
transaction,
|
|
3178
3166
|
startTransaction,
|
|
3167
|
+
getTransactionChanges,
|
|
3168
|
+
getTransactionLog,
|
|
3179
3169
|
finishTransaction,
|
|
3180
3170
|
forEachTable,
|
|
3181
3171
|
forEachTableCell,
|
|
@@ -3193,7 +3183,7 @@ const createStore = () => {
|
|
|
3193
3183
|
createStore,
|
|
3194
3184
|
addListener,
|
|
3195
3185
|
callListeners,
|
|
3196
|
-
|
|
3186
|
+
setInternalListeners,
|
|
3197
3187
|
};
|
|
3198
3188
|
objToArray(
|
|
3199
3189
|
{
|
|
@@ -3320,23 +3310,23 @@ const decodeHlc = (hlc16) => [
|
|
|
3320
3310
|
];
|
|
3321
3311
|
const getHlcFunctions = (uniqueId) => {
|
|
3322
3312
|
let logicalTime = 0;
|
|
3323
|
-
let
|
|
3313
|
+
let lastCounter = -1;
|
|
3324
3314
|
const uniqueIdHash = hash(uniqueId);
|
|
3325
3315
|
const getHlc = () => {
|
|
3326
3316
|
seenHlc();
|
|
3327
|
-
return encodeHlc(logicalTime, ++
|
|
3317
|
+
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
3328
3318
|
};
|
|
3329
3319
|
const seenHlc = (hlc) => {
|
|
3330
3320
|
const previousLogicalTime = logicalTime;
|
|
3331
3321
|
const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
|
|
3332
3322
|
? [0, 0]
|
|
3333
3323
|
: decodeHlc(hlc);
|
|
3334
|
-
logicalTime =
|
|
3335
|
-
|
|
3324
|
+
logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
|
|
3325
|
+
lastCounter =
|
|
3336
3326
|
logicalTime == previousLogicalTime
|
|
3337
3327
|
? logicalTime == remoteLogicalTime
|
|
3338
|
-
?
|
|
3339
|
-
:
|
|
3328
|
+
? mathMax(lastCounter, remoteCounter)
|
|
3329
|
+
: lastCounter
|
|
3340
3330
|
: logicalTime == remoteLogicalTime
|
|
3341
3331
|
? remoteCounter
|
|
3342
3332
|
: -1;
|
|
@@ -3362,119 +3352,166 @@ const LISTENER_ARGS = {
|
|
|
3362
3352
|
InvalidCell: 3,
|
|
3363
3353
|
InvalidValue: 1,
|
|
3364
3354
|
};
|
|
3355
|
+
const newContentStamp = (time = EMPTY_STRING) => [
|
|
3356
|
+
time,
|
|
3357
|
+
[stampNewMap(time), stampNewMap(time)],
|
|
3358
|
+
];
|
|
3365
3359
|
const createMergeableStore = (id) => {
|
|
3366
3360
|
let listening = 1;
|
|
3361
|
+
let contentStamp = newContentStamp();
|
|
3362
|
+
let transactionTime;
|
|
3363
|
+
let finishTransactionMergeableChanges;
|
|
3367
3364
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
3368
3365
|
const store = createStore();
|
|
3369
|
-
const
|
|
3370
|
-
|
|
3366
|
+
const disableListening = (actions) => {
|
|
3367
|
+
const wasListening = listening;
|
|
3368
|
+
listening = 0;
|
|
3369
|
+
actions();
|
|
3370
|
+
listening = wasListening;
|
|
3371
|
+
};
|
|
3372
|
+
const preFinishTransaction = () => {
|
|
3371
3373
|
if (listening) {
|
|
3372
|
-
|
|
3373
|
-
const [
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
allTablesStamp[1],
|
|
3381
|
-
tableId,
|
|
3382
|
-
newStamped,
|
|
3383
|
-
);
|
|
3384
|
-
allTableStamp[0] = stamp;
|
|
3385
|
-
if (isUndefined(tableChanges)) {
|
|
3386
|
-
allTableStamp[1] = null;
|
|
3387
|
-
} else {
|
|
3388
|
-
const allRowsStamp = (allTableStamp[1] ??= mapNew());
|
|
3389
|
-
objToArray(tableChanges, (rowChanges, rowId) => {
|
|
3390
|
-
const allRowStamp = mapEnsure(allRowsStamp, rowId, newStamped);
|
|
3391
|
-
allRowStamp[0] = stamp;
|
|
3392
|
-
if (isUndefined(rowChanges)) {
|
|
3393
|
-
allRowStamp[1] = null;
|
|
3394
|
-
} else {
|
|
3395
|
-
const allCellStamps = (allRowStamp[1] ??= mapNew());
|
|
3396
|
-
objToArray(rowChanges, (cellChanges, cellId) =>
|
|
3397
|
-
mapSet(allCellStamps, cellId, [stamp, cellChanges]),
|
|
3398
|
-
);
|
|
3399
|
-
}
|
|
3400
|
-
});
|
|
3401
|
-
}
|
|
3402
|
-
});
|
|
3374
|
+
finishTransactionMergeableChanges = getTransactionMergeableChanges();
|
|
3375
|
+
const [time, [changedTablesStamp, changedValuesStamp]] =
|
|
3376
|
+
finishTransactionMergeableChanges;
|
|
3377
|
+
const cellsTouched = !objIsEmpty(changedTablesStamp[1]);
|
|
3378
|
+
const valuesTouched = !objIsEmpty(changedValuesStamp[1]);
|
|
3379
|
+
const [, [tablesStamp, valuesStamp]] = contentStamp;
|
|
3380
|
+
if (cellsTouched || valuesTouched) {
|
|
3381
|
+
contentStamp[0] = time;
|
|
3403
3382
|
}
|
|
3404
|
-
if (
|
|
3405
|
-
|
|
3406
|
-
objToArray(
|
|
3407
|
-
|
|
3383
|
+
if (cellsTouched) {
|
|
3384
|
+
tablesStamp[0] = time;
|
|
3385
|
+
objToArray(changedTablesStamp[1], ([, changedRowStamps], tableId) => {
|
|
3386
|
+
const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNewMap);
|
|
3387
|
+
tableStamp[0] = time;
|
|
3388
|
+
objToArray(changedRowStamps, ([, changedCellStamps], rowId) => {
|
|
3389
|
+
const rowStamp = mapEnsure(tableStamp[1], rowId, stampNewMap);
|
|
3390
|
+
rowStamp[0] = time;
|
|
3391
|
+
objToArray(changedCellStamps, ([, newCell], cellId) =>
|
|
3392
|
+
mapSet(rowStamp[1], cellId, stampNew(time, newCell)),
|
|
3393
|
+
);
|
|
3394
|
+
});
|
|
3408
3395
|
});
|
|
3409
3396
|
}
|
|
3397
|
+
if (valuesTouched) {
|
|
3398
|
+
valuesStamp[0] = time;
|
|
3399
|
+
objToArray(changedValuesStamp[1], ([, newValue], valueId) =>
|
|
3400
|
+
mapSet(valuesStamp[1], valueId, stampNew(time, newValue)),
|
|
3401
|
+
);
|
|
3402
|
+
}
|
|
3410
3403
|
}
|
|
3411
3404
|
};
|
|
3405
|
+
const postFinishTransaction = () =>
|
|
3406
|
+
(transactionTime = finishTransactionMergeableChanges = void 0);
|
|
3412
3407
|
const merge = (mergeableStore2) => {
|
|
3413
3408
|
const mergeableContent = mergeableStore.getMergeableContent();
|
|
3414
3409
|
const mergeableContent2 = mergeableStore2.getMergeableContent();
|
|
3415
|
-
mergeableStore2.
|
|
3416
|
-
return
|
|
3410
|
+
mergeableStore2.applyMergeableChanges(mergeableContent);
|
|
3411
|
+
return applyMergeableChanges(mergeableContent2);
|
|
3417
3412
|
};
|
|
3418
3413
|
const getMergeableContent = () =>
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
mapStampedMapToObj(allRowStamp, (allCellsStamp) =>
|
|
3424
|
-
mapStampedMapToObj(allCellsStamp, pairClone),
|
|
3425
|
-
),
|
|
3414
|
+
mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
|
|
3415
|
+
mapStampMapToObj(tablesStamp, (rowsStamp) =>
|
|
3416
|
+
mapStampMapToObj(rowsStamp, (cellsStamp) =>
|
|
3417
|
+
mapStampMapToObj(cellsStamp, cloneStamp),
|
|
3426
3418
|
),
|
|
3427
|
-
|
|
3428
|
-
|
|
3419
|
+
),
|
|
3420
|
+
mapStampMapToObj(valuesStamp, cloneStamp),
|
|
3429
3421
|
]);
|
|
3430
|
-
const
|
|
3422
|
+
const setMergeableContent = (mergeableContent) => {
|
|
3423
|
+
disableListening(() =>
|
|
3424
|
+
store.transaction(() => {
|
|
3425
|
+
store.delTables().delValues();
|
|
3426
|
+
contentStamp = newContentStamp();
|
|
3427
|
+
}),
|
|
3428
|
+
);
|
|
3429
|
+
applyMergeableChanges(mergeableContent);
|
|
3430
|
+
return mergeableStore;
|
|
3431
|
+
};
|
|
3432
|
+
const getTransactionMergeableChanges = () => {
|
|
3433
|
+
if (isUndefined(finishTransactionMergeableChanges)) {
|
|
3434
|
+
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
3435
|
+
const time =
|
|
3436
|
+
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
3437
|
+
? transactionTime ?? (transactionTime = getHlc())
|
|
3438
|
+
: EMPTY_STRING;
|
|
3439
|
+
const mergeableChanges = stampNew(time, [
|
|
3440
|
+
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
3441
|
+
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
3442
|
+
]);
|
|
3443
|
+
const [[, tableStamps], [, valuesStamp]] = mergeableChanges[1];
|
|
3444
|
+
objToArray(changedCells, (changedTable, tableId) => {
|
|
3445
|
+
const [, rowStamps] = (tableStamps[tableId] = stampNewObj(time));
|
|
3446
|
+
objToArray(changedTable, (changedRow, rowId) => {
|
|
3447
|
+
const [, cellStamps] = (rowStamps[rowId] = stampNewObj(time));
|
|
3448
|
+
objToArray(
|
|
3449
|
+
changedRow,
|
|
3450
|
+
([, newCell], cellId) =>
|
|
3451
|
+
(cellStamps[cellId] = stampNew(time, newCell)),
|
|
3452
|
+
);
|
|
3453
|
+
});
|
|
3454
|
+
});
|
|
3455
|
+
objToArray(
|
|
3456
|
+
changedValues,
|
|
3457
|
+
([, newValue], valueId) =>
|
|
3458
|
+
(valuesStamp[valueId] = stampNew(time, newValue)),
|
|
3459
|
+
);
|
|
3460
|
+
return mergeableChanges;
|
|
3461
|
+
}
|
|
3462
|
+
return finishTransactionMergeableChanges;
|
|
3463
|
+
};
|
|
3464
|
+
const applyMergeableChanges = (newContentStamp2) => {
|
|
3431
3465
|
const changes = [{}, {}];
|
|
3432
|
-
seenHlc(
|
|
3466
|
+
seenHlc(newContentStamp2[0]);
|
|
3433
3467
|
mergeStamp(
|
|
3434
|
-
|
|
3435
|
-
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3468
|
+
newContentStamp2,
|
|
3469
|
+
contentStamp,
|
|
3470
|
+
changes,
|
|
3471
|
+
(
|
|
3472
|
+
[newTablesStamp, newValuesStamp],
|
|
3473
|
+
[tablesStamp, valuesStamp],
|
|
3474
|
+
[tablesChanges, valuesChanges],
|
|
3475
|
+
) => {
|
|
3476
|
+
mergeStamp(
|
|
3477
|
+
newTablesStamp,
|
|
3478
|
+
tablesStamp,
|
|
3479
|
+
tablesChanges,
|
|
3480
|
+
(newTableStamps, tableStamps, tableChanges) =>
|
|
3481
|
+
mergeStamps(
|
|
3482
|
+
newTableStamps,
|
|
3483
|
+
tableStamps,
|
|
3484
|
+
tableChanges,
|
|
3485
|
+
(newRowStamps, rowStamps, rowChanges) =>
|
|
3486
|
+
mergeStamps(
|
|
3487
|
+
newRowStamps,
|
|
3488
|
+
rowStamps,
|
|
3489
|
+
rowChanges,
|
|
3490
|
+
mergeLeafStamps,
|
|
3491
|
+
),
|
|
3492
|
+
),
|
|
3493
|
+
);
|
|
3494
|
+
mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
|
|
3495
|
+
},
|
|
3460
3496
|
);
|
|
3461
|
-
|
|
3462
|
-
store.setTransactionChanges(changes);
|
|
3463
|
-
listening = 1;
|
|
3497
|
+
disableListening(() => store.applyChanges(changes));
|
|
3464
3498
|
return mergeableStore;
|
|
3465
3499
|
};
|
|
3466
3500
|
const mergeableStore = {
|
|
3467
3501
|
getMergeableContent,
|
|
3468
|
-
|
|
3502
|
+
setMergeableContent,
|
|
3503
|
+
getTransactionMergeableChanges,
|
|
3504
|
+
applyMergeableChanges,
|
|
3469
3505
|
merge,
|
|
3470
3506
|
};
|
|
3471
|
-
store.
|
|
3507
|
+
store.setInternalListeners(preFinishTransaction, postFinishTransaction);
|
|
3472
3508
|
objToArray(
|
|
3473
3509
|
store,
|
|
3474
3510
|
(method, name) =>
|
|
3475
3511
|
(mergeableStore[name] = // fluent methods
|
|
3476
3512
|
strStartsWith(name, 'set') ||
|
|
3477
3513
|
strStartsWith(name, 'del') ||
|
|
3514
|
+
strStartsWith(name, 'apply') ||
|
|
3478
3515
|
strEndsWith(name, 'Transaction') ||
|
|
3479
3516
|
name == 'callListener'
|
|
3480
3517
|
? (...args) => {
|