tinybase 4.3.8 → 4.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -1
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -1
- package/lib/cjs/metrics.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-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.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-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/queries.cjs +1 -1
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -1
- package/lib/cjs/relationships.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -1
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -1
- package/lib/cjs-es6/metrics.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-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.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-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/queries.cjs +1 -1
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -1
- package/lib/cjs-es6/relationships.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/checkpoints.js +12 -12
- package/lib/debug/indexes.js +9 -9
- package/lib/debug/metrics.js +9 -9
- package/lib/debug/persisters/persister-automerge.js +6 -6
- package/lib/debug/persisters/persister-browser.js +2 -2
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +5 -5
- package/lib/debug/persisters/persister-expo-sqlite.js +5 -5
- package/lib/debug/persisters/persister-file.js +2 -2
- package/lib/debug/persisters/persister-indexed-db.js +6 -6
- package/lib/debug/persisters/persister-partykit-client.js +15 -5
- package/lib/debug/persisters/persister-partykit-server.js +44 -30
- package/lib/debug/persisters/persister-remote.js +2 -2
- package/lib/debug/persisters/persister-sqlite-wasm.js +5 -5
- package/lib/debug/persisters/persister-sqlite3.js +5 -5
- package/lib/debug/persisters/persister-yjs.js +9 -9
- package/lib/debug/persisters.js +2 -2
- package/lib/debug/queries.js +15 -15
- package/lib/debug/relationships.js +9 -9
- package/lib/debug/store.js +9 -9
- package/lib/debug/tinybase.js +15 -15
- package/lib/debug/tools.js +6 -7
- package/lib/debug/ui-react-dom.js +10 -10
- package/lib/debug/ui-react.js +2 -2
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/indexes.js +1 -1
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/metrics.js +1 -1
- package/lib/es6/metrics.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-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.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-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/queries.js +1 -1
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -1
- package/lib/es6/relationships.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.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-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.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-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/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/persisters/persister-partykit-client.d.ts +43 -4
- package/lib/types/persisters/persister-partykit-server.d.ts +66 -0
- package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +44 -5
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +66 -0
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.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-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.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-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/queries.js +1 -1
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -1
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -1
- package/lib/umd-es6/metrics.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-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.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-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/queries.js +1 -1
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -1
- package/lib/umd-es6/relationships.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +7 -7
- package/readme.md +2 -2
package/lib/debug/checkpoints.js
CHANGED
|
@@ -4,12 +4,12 @@ const isUndefined = (thing) => thing == void 0;
|
|
|
4
4
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
5
5
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
6
6
|
const isArray = (thing) => Array.isArray(thing);
|
|
7
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
7
8
|
const test = (regex, subject) => regex.test(subject);
|
|
8
9
|
|
|
9
10
|
const arrayHas = (array, value) => array.includes(value);
|
|
10
11
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
11
|
-
const
|
|
12
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
12
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
13
13
|
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
14
14
|
const arrayClear = (array, to) => array.splice(0, to);
|
|
15
15
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
@@ -47,10 +47,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
47
47
|
(ensureLeaf ? mapEnsure : mapGet)(
|
|
48
48
|
node,
|
|
49
49
|
path[p],
|
|
50
|
-
p >
|
|
50
|
+
p > size(path) - 2 ? ensureLeaf : mapNew,
|
|
51
51
|
),
|
|
52
52
|
(nodeOrLeaf) => {
|
|
53
|
-
if (p >
|
|
53
|
+
if (p > size(path) - 2) {
|
|
54
54
|
if (pruneLeaf?.(nodeOrLeaf)) {
|
|
55
55
|
mapSet(node, path[p]);
|
|
56
56
|
}
|
|
@@ -96,7 +96,7 @@ const getPoolFunctions = () => {
|
|
|
96
96
|
return [
|
|
97
97
|
(reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
|
|
98
98
|
(id) => {
|
|
99
|
-
if (test(INTEGER, id) &&
|
|
99
|
+
if (test(INTEGER, id) && size(pool) < 1e3) {
|
|
100
100
|
arrayPush(pool, id);
|
|
101
101
|
}
|
|
102
102
|
},
|
|
@@ -106,7 +106,7 @@ const getPoolFunctions = () => {
|
|
|
106
106
|
const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
107
107
|
const leaves = [];
|
|
108
108
|
const deep = (node, p) =>
|
|
109
|
-
p ==
|
|
109
|
+
p == size(path)
|
|
110
110
|
? arrayPush(leaves, node)
|
|
111
111
|
: path[p] === null
|
|
112
112
|
? collForEach(node, (node2) => deep(node2, p + 1))
|
|
@@ -158,8 +158,8 @@ const getListenerFunctions = (getThing) => {
|
|
|
158
158
|
mapGet(allListeners, id),
|
|
159
159
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
160
160
|
const callWithIds = (...ids) => {
|
|
161
|
-
const index =
|
|
162
|
-
index ==
|
|
161
|
+
const index = size(ids);
|
|
162
|
+
index == size(path)
|
|
163
163
|
? listener(thing, ...ids, ...extraArgsGetter(ids))
|
|
164
164
|
: isUndefined(path[index])
|
|
165
165
|
? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
@@ -214,11 +214,11 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
214
214
|
};
|
|
215
215
|
const clearCheckpointIds = (checkpointIds, to) =>
|
|
216
216
|
arrayForEach(
|
|
217
|
-
arrayClear(checkpointIds, to ??
|
|
217
|
+
arrayClear(checkpointIds, to ?? size(checkpointIds)),
|
|
218
218
|
clearCheckpointId,
|
|
219
219
|
);
|
|
220
220
|
const trimBackwardsIds = () =>
|
|
221
|
-
clearCheckpointIds(backwardIds,
|
|
221
|
+
clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
|
|
222
222
|
const storeChanged = () =>
|
|
223
223
|
ifNotUndefined(currentId, () => {
|
|
224
224
|
arrayPush(backwardIds, currentId);
|
|
@@ -307,8 +307,8 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
307
307
|
checkpointsChanged = 0;
|
|
308
308
|
}
|
|
309
309
|
};
|
|
310
|
-
const setSize = (
|
|
311
|
-
backwardIdsSize =
|
|
310
|
+
const setSize = (size2) => {
|
|
311
|
+
backwardIdsSize = size2;
|
|
312
312
|
trimBackwardsIds();
|
|
313
313
|
return checkpoints;
|
|
314
314
|
};
|
package/lib/debug/indexes.js
CHANGED
|
@@ -8,11 +8,12 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
8
8
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
9
9
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
10
10
|
const isArray = (thing) => Array.isArray(thing);
|
|
11
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
11
12
|
const test = (regex, subject) => regex.test(subject);
|
|
12
13
|
|
|
13
14
|
const arrayEvery = (array, cb) => array.every(cb);
|
|
14
15
|
const arrayIsEqual = (array1, array2) =>
|
|
15
|
-
|
|
16
|
+
size(array1) === size(array2) &&
|
|
16
17
|
arrayEvery(array1, (value1, index) => array2[index] === value1);
|
|
17
18
|
const arrayIsSorted = (array, sorter) =>
|
|
18
19
|
arrayEvery(
|
|
@@ -22,8 +23,7 @@ const arrayIsSorted = (array, sorter) =>
|
|
|
22
23
|
const arraySort = (array, sorter) => array.sort(sorter);
|
|
23
24
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
24
25
|
const arrayMap = (array, cb) => array.map(cb);
|
|
25
|
-
const
|
|
26
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
26
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
27
27
|
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
28
28
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
29
29
|
const arrayShift = (array) => array.shift();
|
|
@@ -61,10 +61,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
61
61
|
(ensureLeaf ? mapEnsure : mapGet)(
|
|
62
62
|
node,
|
|
63
63
|
path[p],
|
|
64
|
-
p >
|
|
64
|
+
p > size(path) - 2 ? ensureLeaf : mapNew,
|
|
65
65
|
),
|
|
66
66
|
(nodeOrLeaf) => {
|
|
67
|
-
if (p >
|
|
67
|
+
if (p > size(path) - 2) {
|
|
68
68
|
if (pruneLeaf?.(nodeOrLeaf)) {
|
|
69
69
|
mapSet(node, path[p]);
|
|
70
70
|
}
|
|
@@ -266,7 +266,7 @@ const getPoolFunctions = () => {
|
|
|
266
266
|
return [
|
|
267
267
|
(reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
|
|
268
268
|
(id) => {
|
|
269
|
-
if (test(INTEGER, id) &&
|
|
269
|
+
if (test(INTEGER, id) && size(pool) < 1e3) {
|
|
270
270
|
arrayPush(pool, id);
|
|
271
271
|
}
|
|
272
272
|
},
|
|
@@ -276,7 +276,7 @@ const getPoolFunctions = () => {
|
|
|
276
276
|
const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
277
277
|
const leaves = [];
|
|
278
278
|
const deep = (node, p) =>
|
|
279
|
-
p ==
|
|
279
|
+
p == size(path)
|
|
280
280
|
? arrayPush(leaves, node)
|
|
281
281
|
: path[p] === null
|
|
282
282
|
? collForEach(node, (node2) => deep(node2, p + 1))
|
|
@@ -328,8 +328,8 @@ const getListenerFunctions = (getThing) => {
|
|
|
328
328
|
mapGet(allListeners, id),
|
|
329
329
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
330
330
|
const callWithIds = (...ids) => {
|
|
331
|
-
const index =
|
|
332
|
-
index ==
|
|
331
|
+
const index = size(ids);
|
|
332
|
+
index == size(path)
|
|
333
333
|
? listener(thing, ...ids, ...extraArgsGetter(ids))
|
|
334
334
|
: isUndefined(path[index])
|
|
335
335
|
? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
package/lib/debug/metrics.js
CHANGED
|
@@ -16,17 +16,17 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
16
16
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
17
17
|
const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
|
|
18
18
|
const isArray = (thing) => Array.isArray(thing);
|
|
19
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
19
20
|
const test = (regex, subject) => regex.test(subject);
|
|
20
21
|
const getUndefined = () => void 0;
|
|
21
22
|
|
|
22
23
|
const arrayEvery = (array, cb) => array.every(cb);
|
|
23
24
|
const arrayIsEqual = (array1, array2) =>
|
|
24
|
-
|
|
25
|
+
size(array1) === size(array2) &&
|
|
25
26
|
arrayEvery(array1, (value1, index) => array2[index] === value1);
|
|
26
27
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
27
28
|
const arraySum = (array) => arrayReduce(array, (i, j) => i + j, 0);
|
|
28
|
-
const
|
|
29
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
29
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
30
30
|
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
31
31
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
32
32
|
const arrayShift = (array) => array.shift();
|
|
@@ -63,10 +63,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
63
63
|
(ensureLeaf ? mapEnsure : mapGet)(
|
|
64
64
|
node,
|
|
65
65
|
path[p],
|
|
66
|
-
p >
|
|
66
|
+
p > size(path) - 2 ? ensureLeaf : mapNew,
|
|
67
67
|
),
|
|
68
68
|
(nodeOrLeaf) => {
|
|
69
|
-
if (p >
|
|
69
|
+
if (p > size(path) - 2) {
|
|
70
70
|
if (pruneLeaf?.(nodeOrLeaf)) {
|
|
71
71
|
mapSet(node, path[p]);
|
|
72
72
|
}
|
|
@@ -334,7 +334,7 @@ const getPoolFunctions = () => {
|
|
|
334
334
|
return [
|
|
335
335
|
(reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
|
|
336
336
|
(id) => {
|
|
337
|
-
if (test(INTEGER, id) &&
|
|
337
|
+
if (test(INTEGER, id) && size(pool) < 1e3) {
|
|
338
338
|
arrayPush(pool, id);
|
|
339
339
|
}
|
|
340
340
|
},
|
|
@@ -344,7 +344,7 @@ const getPoolFunctions = () => {
|
|
|
344
344
|
const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
345
345
|
const leaves = [];
|
|
346
346
|
const deep = (node, p) =>
|
|
347
|
-
p ==
|
|
347
|
+
p == size(path)
|
|
348
348
|
? arrayPush(leaves, node)
|
|
349
349
|
: path[p] === null
|
|
350
350
|
? collForEach(node, (node2) => deep(node2, p + 1))
|
|
@@ -396,8 +396,8 @@ const getListenerFunctions = (getThing) => {
|
|
|
396
396
|
mapGet(allListeners, id),
|
|
397
397
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
398
398
|
const callWithIds = (...ids) => {
|
|
399
|
-
const index =
|
|
400
|
-
index ==
|
|
399
|
+
const index = size(ids);
|
|
400
|
+
index == size(path)
|
|
401
401
|
? listener(thing, ...ids, ...extraArgsGetter(ids))
|
|
402
402
|
: isUndefined(path[index])
|
|
403
403
|
? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
const TINYBASE = 'tinybase';
|
|
2
2
|
|
|
3
|
-
const arrayMap = (array, cb) => array.map(cb);
|
|
4
|
-
const arrayLength = (array) => array.length;
|
|
5
|
-
const arrayPush = (array, ...values) => array.push(...values);
|
|
6
|
-
const arrayShift = (array) => array.shift();
|
|
7
|
-
|
|
8
3
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
9
4
|
const isUndefined = (thing) => thing == void 0;
|
|
10
5
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
11
6
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
7
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
8
|
+
|
|
9
|
+
const arrayMap = (array, cb) => array.map(cb);
|
|
10
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
11
|
+
const arrayShift = (array) => array.shift();
|
|
12
12
|
|
|
13
13
|
const object = Object;
|
|
14
14
|
const objIds = object.keys;
|
|
@@ -23,7 +23,7 @@ const objDel = (obj, id) => {
|
|
|
23
23
|
};
|
|
24
24
|
const objMap = (obj, cb) =>
|
|
25
25
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
26
|
-
const objSize = (obj) =>
|
|
26
|
+
const objSize = (obj) => size(objIds(obj));
|
|
27
27
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
28
28
|
const objEnsure = (obj, id, getDefaultValue) => {
|
|
29
29
|
if (!objHas(obj, id)) {
|
|
@@ -2,8 +2,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
|
2
2
|
const isUndefined = (thing) => thing == void 0;
|
|
3
3
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
4
4
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
5
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
5
6
|
|
|
6
|
-
const arrayLength = (array) => array.length;
|
|
7
7
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
8
8
|
const arrayShift = (array) => array.shift();
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ const objIds = object.keys;
|
|
|
12
12
|
const objFreeze = object.freeze;
|
|
13
13
|
const isObject = (obj) =>
|
|
14
14
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
15
|
-
const objSize = (obj) =>
|
|
15
|
+
const objSize = (obj) => size(objIds(obj));
|
|
16
16
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
17
17
|
|
|
18
18
|
const jsonString = (obj) =>
|
|
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
15
15
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
16
16
|
const isArray = (thing) => Array.isArray(thing);
|
|
17
17
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
18
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
18
19
|
const promiseAll = async (promises) => promise.all(promises);
|
|
19
20
|
|
|
20
21
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
21
22
|
const arrayMap = (array, cb) => array.map(cb);
|
|
22
|
-
const
|
|
23
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
23
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
24
24
|
const arrayFilter = (array, cb) => array.filter(cb);
|
|
25
25
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
26
26
|
const arrayShift = (array) => array.shift();
|
|
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
|
|
|
46
46
|
const objMap = (obj, cb) =>
|
|
47
47
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
48
48
|
const objValues = (obj) => object.values(obj);
|
|
49
|
-
const objSize = (obj) =>
|
|
49
|
+
const objSize = (obj) => size(objIds(obj));
|
|
50
50
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
51
51
|
|
|
52
52
|
const mapNew = (entries) => new Map(entries);
|
|
@@ -317,8 +317,8 @@ const upsert = async (
|
|
|
317
317
|
')VALUES' +
|
|
318
318
|
slice(
|
|
319
319
|
strRepeat(
|
|
320
|
-
`,(?${strRepeat(',?',
|
|
321
|
-
|
|
320
|
+
`,(?${strRepeat(',?', size(changingColumnNames))})`,
|
|
321
|
+
size(args) / (size(changingColumnNames) + 1),
|
|
322
322
|
),
|
|
323
323
|
1,
|
|
324
324
|
) +
|
|
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
15
15
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
16
16
|
const isArray = (thing) => Array.isArray(thing);
|
|
17
17
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
18
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
18
19
|
const promiseAll = async (promises) => promise.all(promises);
|
|
19
20
|
|
|
20
21
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
21
22
|
const arrayMap = (array, cb) => array.map(cb);
|
|
22
|
-
const
|
|
23
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
23
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
24
24
|
const arrayFilter = (array, cb) => array.filter(cb);
|
|
25
25
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
26
26
|
const arrayShift = (array) => array.shift();
|
|
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
|
|
|
46
46
|
const objMap = (obj, cb) =>
|
|
47
47
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
48
48
|
const objValues = (obj) => object.values(obj);
|
|
49
|
-
const objSize = (obj) =>
|
|
49
|
+
const objSize = (obj) => size(objIds(obj));
|
|
50
50
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
51
51
|
|
|
52
52
|
const mapNew = (entries) => new Map(entries);
|
|
@@ -317,8 +317,8 @@ const upsert = async (
|
|
|
317
317
|
')VALUES' +
|
|
318
318
|
slice(
|
|
319
319
|
strRepeat(
|
|
320
|
-
`,(?${strRepeat(',?',
|
|
321
|
-
|
|
320
|
+
`,(?${strRepeat(',?', size(changingColumnNames))})`,
|
|
321
|
+
size(args) / (size(changingColumnNames) + 1),
|
|
322
322
|
),
|
|
323
323
|
1,
|
|
324
324
|
) +
|
|
@@ -7,8 +7,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
|
7
7
|
const isUndefined = (thing) => thing == void 0;
|
|
8
8
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
9
9
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
10
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
10
11
|
|
|
11
|
-
const arrayLength = (array) => array.length;
|
|
12
12
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
13
13
|
const arrayShift = (array) => array.shift();
|
|
14
14
|
|
|
@@ -17,7 +17,7 @@ const objIds = object.keys;
|
|
|
17
17
|
const objFreeze = object.freeze;
|
|
18
18
|
const isObject = (obj) =>
|
|
19
19
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
20
|
-
const objSize = (obj) =>
|
|
20
|
+
const objSize = (obj) => size(objIds(obj));
|
|
21
21
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
22
22
|
|
|
23
23
|
const jsonString = (obj) =>
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
const T = 't';
|
|
2
2
|
const V = 'v';
|
|
3
3
|
|
|
4
|
-
const arrayMap = (array, cb) => array.map(cb);
|
|
5
|
-
const arrayLength = (array) => array.length;
|
|
6
|
-
const arrayPush = (array, ...values) => array.push(...values);
|
|
7
|
-
const arrayShift = (array) => array.shift();
|
|
8
|
-
|
|
9
4
|
const promise = Promise;
|
|
10
5
|
const startInterval = setInterval;
|
|
11
6
|
const stopInterval = clearInterval;
|
|
@@ -13,9 +8,14 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
|
13
8
|
const isUndefined = (thing) => thing == void 0;
|
|
14
9
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
15
10
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
11
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
16
12
|
const promiseNew = (resolver) => new promise(resolver);
|
|
17
13
|
const promiseAll = async (promises) => promise.all(promises);
|
|
18
14
|
|
|
15
|
+
const arrayMap = (array, cb) => array.map(cb);
|
|
16
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
17
|
+
const arrayShift = (array) => array.shift();
|
|
18
|
+
|
|
19
19
|
const object = Object;
|
|
20
20
|
const objIds = object.keys;
|
|
21
21
|
const objFreeze = object.freeze;
|
|
@@ -26,7 +26,7 @@ const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
|
|
|
26
26
|
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
27
27
|
const objMap = (obj, cb) =>
|
|
28
28
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
29
|
-
const objSize = (obj) =>
|
|
29
|
+
const objSize = (obj) => size(objIds(obj));
|
|
30
30
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
31
31
|
|
|
32
32
|
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
@@ -8,8 +8,8 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
8
8
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
9
9
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
10
10
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
11
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
11
12
|
|
|
12
|
-
const arrayLength = (array) => array.length;
|
|
13
13
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
14
14
|
const arrayShift = (array) => array.shift();
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@ const objIds = object.keys;
|
|
|
18
18
|
const objFreeze = object.freeze;
|
|
19
19
|
const isObject = (obj) =>
|
|
20
20
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
21
|
-
const objSize = (obj) =>
|
|
21
|
+
const objSize = (obj) => size(objIds(obj));
|
|
22
22
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
23
23
|
|
|
24
24
|
const jsonString = (obj) =>
|
|
@@ -191,22 +191,32 @@ const createCustomPersister = (
|
|
|
191
191
|
};
|
|
192
192
|
|
|
193
193
|
const MESSAGE = 'message';
|
|
194
|
+
const DEFAULT_CONFIG = {
|
|
195
|
+
storeProtocol: 'https',
|
|
196
|
+
storePath: STORE_PATH,
|
|
197
|
+
};
|
|
194
198
|
const createPartyKitPersister = (
|
|
195
199
|
store,
|
|
196
200
|
connection,
|
|
197
|
-
|
|
201
|
+
configOrStoreProtocol,
|
|
198
202
|
onIgnoredError,
|
|
199
203
|
) => {
|
|
200
204
|
const {host, room} = connection.partySocketOptions;
|
|
205
|
+
const {storeProtocol, storePath} = {
|
|
206
|
+
...DEFAULT_CONFIG,
|
|
207
|
+
...(isString(configOrStoreProtocol)
|
|
208
|
+
? {storeProtocol: configOrStoreProtocol}
|
|
209
|
+
: configOrStoreProtocol),
|
|
210
|
+
};
|
|
201
211
|
const storeUrl =
|
|
202
|
-
|
|
212
|
+
storeProtocol +
|
|
203
213
|
'://' +
|
|
204
214
|
host +
|
|
205
215
|
'/parties/' +
|
|
206
216
|
(connection.name ?? 'main') +
|
|
207
217
|
'/' +
|
|
208
218
|
room +
|
|
209
|
-
|
|
219
|
+
storePath;
|
|
210
220
|
const getOrSetStore = async (content) =>
|
|
211
221
|
await (
|
|
212
222
|
await fetch(storeUrl, {
|
|
@@ -11,12 +11,12 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
11
11
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
12
12
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
13
13
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
14
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
14
15
|
const promiseAll = async (promises) => promise.all(promises);
|
|
15
16
|
|
|
16
17
|
const arrayEvery = (array, cb) => array.every(cb);
|
|
17
18
|
const arrayMap = (array, cb) => array.map(cb);
|
|
18
|
-
const
|
|
19
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
19
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
20
20
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
21
21
|
const arrayUnshift = (array, ...values) => array.unshift(...values);
|
|
22
22
|
|
|
@@ -55,52 +55,59 @@ const mapForEach = (map, cb) =>
|
|
|
55
55
|
collForEach(map, (value, key) => cb(key, value));
|
|
56
56
|
|
|
57
57
|
const HAS_STORE = 'hasStore';
|
|
58
|
-
const
|
|
58
|
+
const RESPONSE_HEADERS = objNew(
|
|
59
59
|
arrayMap(['Origin', 'Methods', 'Headers'], (suffix) => [
|
|
60
60
|
'Access-Control-Allow-' + suffix,
|
|
61
61
|
'*',
|
|
62
62
|
]),
|
|
63
63
|
);
|
|
64
|
-
const hasStoreInStorage = async (storage) =>
|
|
65
|
-
|
|
64
|
+
const hasStoreInStorage = async (storage, prefix) =>
|
|
65
|
+
await storage.get(prefix + HAS_STORE);
|
|
66
|
+
const loadStoreFromStorage = async (storage, prefix) => {
|
|
66
67
|
const tables = {};
|
|
67
68
|
const values = {};
|
|
68
69
|
mapForEach(await storage.list(), (key, cellOrValue) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const [
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
if (key.startsWith(prefix)) {
|
|
71
|
+
key = slice(key, size(prefix));
|
|
72
|
+
const [type, ids] = deconstructMessage(key);
|
|
73
|
+
if (type == T) {
|
|
74
|
+
const [tableId, rowId, cellId] = jsonParse('[' + ids + ']');
|
|
75
|
+
objEnsure(objEnsure(tables, tableId, objNew), rowId, objNew)[cellId] =
|
|
76
|
+
cellOrValue;
|
|
77
|
+
} else if (type == V) {
|
|
78
|
+
values[ids] = cellOrValue;
|
|
79
|
+
}
|
|
76
80
|
}
|
|
77
81
|
});
|
|
78
82
|
return [tables, values];
|
|
79
83
|
};
|
|
80
|
-
const saveStoreToStorage = async (storage, transactionChanges) => {
|
|
81
|
-
const promises = [storage.put(HAS_STORE, 1)];
|
|
84
|
+
const saveStoreToStorage = async (storage, prefix, transactionChanges) => {
|
|
85
|
+
const promises = [storage.put(prefix + HAS_STORE, 1)];
|
|
82
86
|
const keyPrefixesToDelete = [];
|
|
83
87
|
objMap(transactionChanges[0], (table, tableId) =>
|
|
84
88
|
isUndefined(table)
|
|
85
|
-
? arrayUnshift(
|
|
89
|
+
? arrayUnshift(
|
|
90
|
+
keyPrefixesToDelete,
|
|
91
|
+
prefix + getStoreStorageKey(T, tableId),
|
|
92
|
+
)
|
|
86
93
|
: objMap(table, (row, rowId) =>
|
|
87
94
|
isUndefined(row)
|
|
88
95
|
? arrayPush(
|
|
89
96
|
keyPrefixesToDelete,
|
|
90
|
-
getStoreStorageKey(T, tableId, rowId),
|
|
97
|
+
prefix + getStoreStorageKey(T, tableId, rowId),
|
|
91
98
|
)
|
|
92
99
|
: objMap(row, (cell, cellId) =>
|
|
93
100
|
promiseToSetOrDelStorage(
|
|
94
101
|
promises,
|
|
95
102
|
storage,
|
|
96
|
-
getStoreStorageKey(T, tableId, rowId, cellId),
|
|
103
|
+
prefix + getStoreStorageKey(T, tableId, rowId, cellId),
|
|
97
104
|
cell,
|
|
98
105
|
),
|
|
99
106
|
),
|
|
100
107
|
),
|
|
101
108
|
);
|
|
102
109
|
objMap(transactionChanges[1], (value, valueId) =>
|
|
103
|
-
promiseToSetOrDelStorage(promises, storage, V + valueId, value),
|
|
110
|
+
promiseToSetOrDelStorage(promises, storage, prefix + V + valueId, value),
|
|
104
111
|
);
|
|
105
112
|
if (!arrayIsEmpty(keyPrefixesToDelete)) {
|
|
106
113
|
mapForEach(await storage.list(), (key) =>
|
|
@@ -121,38 +128,45 @@ const promiseToSetOrDelStorage = (promises, storage, key, value) =>
|
|
|
121
128
|
promises,
|
|
122
129
|
isUndefined(value) ? storage.delete(key) : storage.put(key, value),
|
|
123
130
|
);
|
|
124
|
-
const newResponse = (status, body = null) =>
|
|
125
|
-
new Response(body, {status, headers: CORS_HEADERS});
|
|
126
131
|
class TinyBasePartyKitServer {
|
|
127
132
|
constructor(party) {
|
|
128
133
|
this.party = party;
|
|
134
|
+
this.config = {};
|
|
135
|
+
this.createResponse = (status, body = null) =>
|
|
136
|
+
new Response(body, {
|
|
137
|
+
status,
|
|
138
|
+
headers: this.config.responseHeaders ?? RESPONSE_HEADERS,
|
|
139
|
+
});
|
|
129
140
|
}
|
|
130
141
|
async onRequest(request) {
|
|
131
142
|
const storage = this.party.storage;
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
const prefix = this.config.storagePrefix ?? EMPTY_STRING;
|
|
144
|
+
const storePath = this.config.storePath ?? STORE_PATH;
|
|
145
|
+
if (new URL(request.url).pathname.endsWith(storePath)) {
|
|
146
|
+
const hasStore = await hasStoreInStorage(storage, prefix);
|
|
134
147
|
const text = await request.text();
|
|
135
148
|
if (request.method == PUT) {
|
|
136
149
|
if (hasStore) {
|
|
137
|
-
return
|
|
150
|
+
return this.createResponse(205);
|
|
138
151
|
}
|
|
139
|
-
await saveStoreToStorage(
|
|
140
|
-
return
|
|
152
|
+
await saveStoreToStorage(storage, prefix, jsonParse(text));
|
|
153
|
+
return this.createResponse(201);
|
|
141
154
|
}
|
|
142
|
-
return
|
|
155
|
+
return this.createResponse(
|
|
143
156
|
200,
|
|
144
157
|
hasStore
|
|
145
|
-
? jsonString(await loadStoreFromStorage(storage))
|
|
158
|
+
? jsonString(await loadStoreFromStorage(storage, prefix))
|
|
146
159
|
: EMPTY_STRING,
|
|
147
160
|
);
|
|
148
161
|
}
|
|
149
|
-
return
|
|
162
|
+
return this.createResponse(404);
|
|
150
163
|
}
|
|
151
164
|
async onMessage(message, client) {
|
|
152
165
|
const storage = this.party.storage;
|
|
166
|
+
const prefix = this.config.storagePrefix ?? EMPTY_STRING;
|
|
153
167
|
const [type, payload] = deconstructMessage(message, 1);
|
|
154
|
-
if (type == SET_CHANGES && (await hasStoreInStorage(storage))) {
|
|
155
|
-
await saveStoreToStorage(storage, payload);
|
|
168
|
+
if (type == SET_CHANGES && (await hasStoreInStorage(storage, prefix))) {
|
|
169
|
+
await saveStoreToStorage(storage, prefix, payload);
|
|
156
170
|
this.party.broadcast(constructMessage(SET_CHANGES, payload), [client.id]);
|
|
157
171
|
}
|
|
158
172
|
}
|
|
@@ -4,8 +4,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
|
4
4
|
const isUndefined = (thing) => thing == void 0;
|
|
5
5
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
6
6
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
7
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
7
8
|
|
|
8
|
-
const arrayLength = (array) => array.length;
|
|
9
9
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
10
10
|
const arrayShift = (array) => array.shift();
|
|
11
11
|
|
|
@@ -14,7 +14,7 @@ const objIds = object.keys;
|
|
|
14
14
|
const objFreeze = object.freeze;
|
|
15
15
|
const isObject = (obj) =>
|
|
16
16
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
17
|
-
const objSize = (obj) =>
|
|
17
|
+
const objSize = (obj) => size(objIds(obj));
|
|
18
18
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
19
19
|
|
|
20
20
|
const jsonString = (obj) =>
|
|
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
|
|
|
15
15
|
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
16
16
|
const isArray = (thing) => Array.isArray(thing);
|
|
17
17
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
18
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
18
19
|
const promiseAll = async (promises) => promise.all(promises);
|
|
19
20
|
|
|
20
21
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
21
22
|
const arrayMap = (array, cb) => array.map(cb);
|
|
22
|
-
const
|
|
23
|
-
const arrayIsEmpty = (array) => arrayLength(array) == 0;
|
|
23
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
24
24
|
const arrayFilter = (array, cb) => array.filter(cb);
|
|
25
25
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
26
26
|
const arrayShift = (array) => array.shift();
|
|
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
|
|
|
46
46
|
const objMap = (obj, cb) =>
|
|
47
47
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
48
48
|
const objValues = (obj) => object.values(obj);
|
|
49
|
-
const objSize = (obj) =>
|
|
49
|
+
const objSize = (obj) => size(objIds(obj));
|
|
50
50
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
51
51
|
|
|
52
52
|
const mapNew = (entries) => new Map(entries);
|
|
@@ -317,8 +317,8 @@ const upsert = async (
|
|
|
317
317
|
')VALUES' +
|
|
318
318
|
slice(
|
|
319
319
|
strRepeat(
|
|
320
|
-
`,(?${strRepeat(',?',
|
|
321
|
-
|
|
320
|
+
`,(?${strRepeat(',?', size(changingColumnNames))})`,
|
|
321
|
+
size(args) / (size(changingColumnNames) + 1),
|
|
322
322
|
),
|
|
323
323
|
1,
|
|
324
324
|
) +
|