tinybase 6.1.0-beta.3 → 6.1.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@types/persisters/index.d.ts +83 -40
- package/@types/persisters/persister-automerge/index.d.ts +4 -4
- package/@types/persisters/persister-automerge/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-browser/index.d.ts +4 -4
- package/@types/persisters/persister-browser/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-cr-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-file/index.d.ts +2 -2
- package/@types/persisters/persister-file/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-libsql/index.d.ts +3 -3
- package/@types/persisters/persister-libsql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-partykit-client/index.d.ts +2 -2
- package/@types/persisters/persister-partykit-client/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-pglite/index.d.ts +3 -3
- package/@types/persisters/persister-pglite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-remote/index.d.ts +2 -2
- package/@types/persisters/persister-remote/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-sqlite-bun/index.d.ts +159 -0
- package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +178 -0
- package/@types/persisters/persister-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-yjs/index.d.ts +4 -4
- package/@types/persisters/persister-yjs/with-schemas/index.d.ts +4 -4
- package/@types/persisters/with-schemas/index.d.ts +87 -42
- package/@types/synchronizers/index.d.ts +18 -16
- package/@types/synchronizers/synchronizer-broadcast-channel/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-broadcast-channel/with-schemas/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-local/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +7 -7
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +7 -7
- package/@types/synchronizers/with-schemas/index.d.ts +18 -16
- package/@types/ui-react/index.d.ts +2 -2
- package/@types/ui-react/with-schemas/index.d.ts +2 -2
- package/index.js +23 -17
- package/mergeable-store/index.js +23 -17
- package/mergeable-store/with-schemas/index.js +23 -17
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/mergeable-store/index.js +1 -1
- package/min/mergeable-store/index.js.gz +0 -0
- package/min/mergeable-store/with-schemas/index.js +1 -1
- package/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -0
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/store/index.js +1 -1
- package/min/store/index.js.gz +0 -0
- package/min/store/with-schemas/index.js +1 -1
- package/min/store/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/package.json +46 -6
- package/persisters/index.js +293 -161
- package/persisters/persister-automerge/index.js +55 -50
- package/persisters/persister-automerge/with-schemas/index.js +55 -50
- package/persisters/persister-browser/index.js +56 -55
- package/persisters/persister-browser/with-schemas/index.js +56 -55
- package/persisters/persister-cr-sqlite-wasm/index.js +181 -134
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +181 -134
- package/persisters/persister-durable-object-storage/index.js +58 -53
- package/persisters/persister-durable-object-storage/with-schemas/index.js +58 -53
- package/persisters/persister-electric-sql/index.js +181 -134
- package/persisters/persister-electric-sql/with-schemas/index.js +181 -134
- package/persisters/persister-expo-sqlite/index.js +181 -134
- package/persisters/persister-expo-sqlite/with-schemas/index.js +181 -134
- package/persisters/persister-file/index.js +55 -50
- package/persisters/persister-file/with-schemas/index.js +55 -50
- package/persisters/persister-indexed-db/index.js +82 -78
- package/persisters/persister-indexed-db/with-schemas/index.js +82 -78
- package/persisters/persister-libsql/index.js +182 -135
- package/persisters/persister-libsql/with-schemas/index.js +182 -135
- package/persisters/persister-partykit-client/index.js +56 -51
- package/persisters/persister-partykit-client/with-schemas/index.js +56 -51
- package/persisters/persister-pglite/index.js +299 -173
- package/persisters/persister-pglite/with-schemas/index.js +299 -173
- package/persisters/persister-postgres/index.js +296 -171
- package/persisters/persister-postgres/with-schemas/index.js +296 -171
- package/persisters/persister-powersync/index.js +189 -138
- package/persisters/persister-powersync/with-schemas/index.js +189 -138
- package/persisters/persister-remote/index.js +55 -50
- package/persisters/persister-remote/with-schemas/index.js +55 -50
- package/persisters/persister-sqlite-bun/index.js +1171 -0
- package/persisters/persister-sqlite-bun/with-schemas/index.js +1171 -0
- package/persisters/persister-sqlite-wasm/index.js +182 -135
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +182 -135
- package/persisters/persister-sqlite3/index.js +181 -134
- package/persisters/persister-sqlite3/with-schemas/index.js +181 -134
- package/persisters/persister-yjs/index.js +55 -50
- package/persisters/persister-yjs/with-schemas/index.js +55 -50
- package/persisters/with-schemas/index.js +293 -161
- package/readme.md +2 -2
- package/releases.md +29 -1
- package/store/index.js +20 -15
- package/store/with-schemas/index.js +20 -15
- package/synchronizers/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-local/index.js +68 -63
- package/synchronizers/synchronizer-local/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-server/index.js +79 -70
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +79 -70
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/synchronizers/with-schemas/index.js +68 -63
- package/ui-react-inspector/index.js +68 -60
- package/ui-react-inspector/with-schemas/index.js +68 -60
- package/with-schemas/index.js +23 -17
|
@@ -21,10 +21,20 @@ const isArray = (thing) => Array.isArray(thing);
|
|
|
21
21
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
22
22
|
const size = (arrayOrString) => arrayOrString.length;
|
|
23
23
|
const test = (regex, subject) => regex.test(subject);
|
|
24
|
+
const noop = () => {};
|
|
24
25
|
const promiseNew = (resolver) => new promise(resolver);
|
|
26
|
+
const promiseAll = async (promises) => promise.all(promises);
|
|
25
27
|
const errorNew = (message) => {
|
|
26
28
|
throw new Error(message);
|
|
27
29
|
};
|
|
30
|
+
const tryCatch = async (action, then1, then2) => {
|
|
31
|
+
try {
|
|
32
|
+
return await action();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
then1?.(error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
28
38
|
|
|
29
39
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
30
40
|
const arrayMap = (array, cb) => array.map(cb);
|
|
@@ -78,6 +88,8 @@ const mapKeys = (map) => [...(map?.keys() ?? [])];
|
|
|
78
88
|
const mapGet = (map, key) => map?.get(key);
|
|
79
89
|
const mapForEach = (map, cb) =>
|
|
80
90
|
collForEach(map, (value, key) => cb(key, value));
|
|
91
|
+
const mapMap = (coll, cb) =>
|
|
92
|
+
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
81
93
|
const mapSet = (map, key, value) =>
|
|
82
94
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
83
95
|
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
@@ -320,12 +332,7 @@ const createCustomPersister = (
|
|
|
320
332
|
while (
|
|
321
333
|
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
322
334
|
) {
|
|
323
|
-
|
|
324
|
-
await action();
|
|
325
|
-
} catch (error) {
|
|
326
|
-
/* istanbul ignore next */
|
|
327
|
-
onIgnoredError?.(error);
|
|
328
|
-
}
|
|
335
|
+
await tryCatch(action, onIgnoredError);
|
|
329
336
|
}
|
|
330
337
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
331
338
|
}
|
|
@@ -345,21 +352,23 @@ const createCustomPersister = (
|
|
|
345
352
|
setStatus(1 /* Loading */);
|
|
346
353
|
loads++;
|
|
347
354
|
await schedule(async () => {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
355
|
+
await tryCatch(
|
|
356
|
+
async () => {
|
|
357
|
+
const content = await getPersisted();
|
|
358
|
+
if (isArray(content)) {
|
|
359
|
+
setContentOrChanges(content);
|
|
360
|
+
} else if (initialContent) {
|
|
361
|
+
setDefaultContent(initialContent);
|
|
362
|
+
} else {
|
|
363
|
+
errorNew(`Content is not an array: ${content}`);
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
() => {
|
|
367
|
+
if (initialContent) {
|
|
368
|
+
setDefaultContent(initialContent);
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
);
|
|
363
372
|
setStatus(0 /* Idle */);
|
|
364
373
|
});
|
|
365
374
|
}
|
|
@@ -368,29 +377,33 @@ const createCustomPersister = (
|
|
|
368
377
|
const startAutoLoad = async (initialContent) => {
|
|
369
378
|
stopAutoLoad();
|
|
370
379
|
await load(initialContent);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
380
|
+
await tryCatch(
|
|
381
|
+
async () =>
|
|
382
|
+
(autoLoadHandle = await addPersisterListener(
|
|
383
|
+
async (content, changes) => {
|
|
384
|
+
if (changes || content) {
|
|
385
|
+
/* istanbul ignore else */
|
|
386
|
+
if (status != 2 /* Saving */) {
|
|
387
|
+
setStatus(1 /* Loading */);
|
|
388
|
+
loads++;
|
|
389
|
+
setContentOrChanges(changes ?? content);
|
|
390
|
+
setStatus(0 /* Idle */);
|
|
391
|
+
}
|
|
392
|
+
} else {
|
|
393
|
+
await load();
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
)),
|
|
397
|
+
onIgnoredError,
|
|
398
|
+
);
|
|
389
399
|
return persister;
|
|
390
400
|
};
|
|
391
|
-
const stopAutoLoad = () => {
|
|
401
|
+
const stopAutoLoad = async () => {
|
|
392
402
|
if (autoLoadHandle) {
|
|
393
|
-
|
|
403
|
+
await tryCatch(
|
|
404
|
+
() => delPersisterListener(autoLoadHandle),
|
|
405
|
+
onIgnoredError,
|
|
406
|
+
);
|
|
394
407
|
autoLoadHandle = void 0;
|
|
395
408
|
}
|
|
396
409
|
return persister;
|
|
@@ -402,12 +415,7 @@ const createCustomPersister = (
|
|
|
402
415
|
setStatus(2 /* Saving */);
|
|
403
416
|
saves++;
|
|
404
417
|
await schedule(async () => {
|
|
405
|
-
|
|
406
|
-
await setPersisted(getContent, changes);
|
|
407
|
-
} catch (error) {
|
|
408
|
-
/* istanbul ignore next */
|
|
409
|
-
onIgnoredError?.(error);
|
|
410
|
-
}
|
|
418
|
+
await tryCatch(() => setPersisted(getContent, changes), onIgnoredError);
|
|
411
419
|
setStatus(0 /* Idle */);
|
|
412
420
|
});
|
|
413
421
|
}
|
|
@@ -424,7 +432,7 @@ const createCustomPersister = (
|
|
|
424
432
|
});
|
|
425
433
|
return persister;
|
|
426
434
|
};
|
|
427
|
-
const stopAutoSave = () => {
|
|
435
|
+
const stopAutoSave = async () => {
|
|
428
436
|
if (autoSaveListenerId) {
|
|
429
437
|
store.delListener(autoSaveListenerId);
|
|
430
438
|
autoSaveListenerId = void 0;
|
|
@@ -445,9 +453,10 @@ const createCustomPersister = (
|
|
|
445
453
|
return persister;
|
|
446
454
|
};
|
|
447
455
|
const getStore = () => store;
|
|
448
|
-
const destroy = () => {
|
|
456
|
+
const destroy = async () => {
|
|
449
457
|
arrayClear(mapGet(scheduleActions, scheduleId));
|
|
450
|
-
|
|
458
|
+
await persister.stopAutoLoad();
|
|
459
|
+
return await persister.stopAutoSave();
|
|
451
460
|
};
|
|
452
461
|
const getStats = () => ({loads, saves});
|
|
453
462
|
const persister = {
|
|
@@ -475,7 +484,7 @@ const createCustomSynchronizer = (
|
|
|
475
484
|
store,
|
|
476
485
|
send,
|
|
477
486
|
registerReceive,
|
|
478
|
-
|
|
487
|
+
extraDestroy,
|
|
479
488
|
requestTimeoutSeconds,
|
|
480
489
|
onSend,
|
|
481
490
|
onReceive,
|
|
@@ -528,12 +537,12 @@ const createCustomSynchronizer = (
|
|
|
528
537
|
});
|
|
529
538
|
tablesStamp[1] = getLatestTime(tablesStamp[1], tablesTime2);
|
|
530
539
|
};
|
|
531
|
-
const getChangesFromOtherStore =
|
|
540
|
+
const getChangesFromOtherStore = (
|
|
532
541
|
otherClientId = null,
|
|
533
542
|
otherContentHashes,
|
|
534
543
|
transactionId = getTransactionId(),
|
|
535
|
-
) =>
|
|
536
|
-
|
|
544
|
+
) =>
|
|
545
|
+
tryCatch(async () => {
|
|
537
546
|
if (isUndefined(otherContentHashes)) {
|
|
538
547
|
[otherContentHashes, otherClientId, transactionId] = await request(
|
|
539
548
|
null,
|
|
@@ -592,10 +601,7 @@ const createCustomSynchronizer = (
|
|
|
592
601
|
)[0],
|
|
593
602
|
1,
|
|
594
603
|
];
|
|
595
|
-
}
|
|
596
|
-
onIgnoredError?.(error);
|
|
597
|
-
}
|
|
598
|
-
};
|
|
604
|
+
}, onIgnoredError);
|
|
599
605
|
const getPersisted = async () => {
|
|
600
606
|
const changes = await getChangesFromOtherStore();
|
|
601
607
|
return changes && (!objIsEmpty(changes[0][0]) || !objIsEmpty(changes[1][0]))
|
|
@@ -619,12 +625,15 @@ const createCustomSynchronizer = (
|
|
|
619
625
|
await persister.startAutoLoad(initialContent)
|
|
620
626
|
).startAutoSave();
|
|
621
627
|
};
|
|
622
|
-
const stopSync = () => {
|
|
628
|
+
const stopSync = async () => {
|
|
623
629
|
syncing = 0;
|
|
624
|
-
|
|
630
|
+
await persister.stopAutoLoad();
|
|
631
|
+
await persister.stopAutoSave();
|
|
632
|
+
return persister;
|
|
625
633
|
};
|
|
626
|
-
const destroy = () => {
|
|
627
|
-
|
|
634
|
+
const destroy = async () => {
|
|
635
|
+
await persister.stopSync();
|
|
636
|
+
return persister;
|
|
628
637
|
};
|
|
629
638
|
const getSynchronizerStats = () => ({sends, receives});
|
|
630
639
|
const persister = createCustomPersister(
|
|
@@ -725,7 +734,7 @@ const createWsServer = (
|
|
|
725
734
|
(receive) =>
|
|
726
735
|
(serverClient[3 /* Send */] = (payload) =>
|
|
727
736
|
receivePayload(payload, receive)),
|
|
728
|
-
|
|
737
|
+
noop,
|
|
729
738
|
1,
|
|
730
739
|
void 0,
|
|
731
740
|
void 0,
|
|
@@ -747,9 +756,9 @@ const createWsServer = (
|
|
|
747
756
|
serverClient[5 /* Then */](serverClient[1 /* Persister */].getStore());
|
|
748
757
|
serverClient[0 /* State */] = 0 /* Ready */;
|
|
749
758
|
};
|
|
750
|
-
const stopServerClient = (serverClient) => {
|
|
751
|
-
serverClient[1 /* Persister */]?.destroy();
|
|
752
|
-
serverClient[2 /* Synchronizer */]?.destroy();
|
|
759
|
+
const stopServerClient = async (serverClient) => {
|
|
760
|
+
await serverClient[1 /* Persister */]?.destroy();
|
|
761
|
+
await serverClient[2 /* Synchronizer */]?.destroy();
|
|
753
762
|
};
|
|
754
763
|
const getMessageHandler = (clientId, clients, serverClient) => (payload) =>
|
|
755
764
|
ifPayloadValid(payload, (toClientId, remainder) => {
|
|
@@ -798,11 +807,11 @@ const createWsServer = (
|
|
|
798
807
|
arrayForEach(serverClient[4 /* Buffer */], messageHandler);
|
|
799
808
|
serverClient[4 /* Buffer */] = [];
|
|
800
809
|
}
|
|
801
|
-
client.on('close', () => {
|
|
810
|
+
client.on('close', async () => {
|
|
802
811
|
collDel(clients, clientId);
|
|
803
812
|
callListeners(clientIdListeners, [pathId], clientId, -1);
|
|
804
813
|
if (collIsEmpty(clients)) {
|
|
805
|
-
stopServerClient(serverClient);
|
|
814
|
+
await stopServerClient(serverClient);
|
|
806
815
|
collDel(serverClientsByPath, pathId);
|
|
807
816
|
collDel(clientsByPath, pathId);
|
|
808
817
|
callListeners(pathIdListeners, void 0, pathId, -1);
|
|
@@ -832,9 +841,9 @@ const createWsServer = (
|
|
|
832
841
|
paths: collSize(clientsByPath),
|
|
833
842
|
clients: collSize2(clientsByPath),
|
|
834
843
|
});
|
|
835
|
-
const destroy = () => {
|
|
844
|
+
const destroy = async () => {
|
|
836
845
|
collClear(clientsByPath);
|
|
837
|
-
|
|
846
|
+
await promiseAll(mapMap(serverClientsByPath, stopServerClient));
|
|
838
847
|
webSocketServer.close();
|
|
839
848
|
};
|
|
840
849
|
const wsServer = {
|
|
@@ -21,10 +21,20 @@ const isArray = (thing) => Array.isArray(thing);
|
|
|
21
21
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
22
22
|
const size = (arrayOrString) => arrayOrString.length;
|
|
23
23
|
const test = (regex, subject) => regex.test(subject);
|
|
24
|
+
const noop = () => {};
|
|
24
25
|
const promiseNew = (resolver) => new promise(resolver);
|
|
26
|
+
const promiseAll = async (promises) => promise.all(promises);
|
|
25
27
|
const errorNew = (message) => {
|
|
26
28
|
throw new Error(message);
|
|
27
29
|
};
|
|
30
|
+
const tryCatch = async (action, then1, then2) => {
|
|
31
|
+
try {
|
|
32
|
+
return await action();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
then1?.(error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
28
38
|
|
|
29
39
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
30
40
|
const arrayMap = (array, cb) => array.map(cb);
|
|
@@ -78,6 +88,8 @@ const mapKeys = (map) => [...(map?.keys() ?? [])];
|
|
|
78
88
|
const mapGet = (map, key) => map?.get(key);
|
|
79
89
|
const mapForEach = (map, cb) =>
|
|
80
90
|
collForEach(map, (value, key) => cb(key, value));
|
|
91
|
+
const mapMap = (coll, cb) =>
|
|
92
|
+
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
81
93
|
const mapSet = (map, key, value) =>
|
|
82
94
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
83
95
|
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
@@ -320,12 +332,7 @@ const createCustomPersister = (
|
|
|
320
332
|
while (
|
|
321
333
|
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
322
334
|
) {
|
|
323
|
-
|
|
324
|
-
await action();
|
|
325
|
-
} catch (error) {
|
|
326
|
-
/* istanbul ignore next */
|
|
327
|
-
onIgnoredError?.(error);
|
|
328
|
-
}
|
|
335
|
+
await tryCatch(action, onIgnoredError);
|
|
329
336
|
}
|
|
330
337
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
331
338
|
}
|
|
@@ -345,21 +352,23 @@ const createCustomPersister = (
|
|
|
345
352
|
setStatus(1 /* Loading */);
|
|
346
353
|
loads++;
|
|
347
354
|
await schedule(async () => {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
355
|
+
await tryCatch(
|
|
356
|
+
async () => {
|
|
357
|
+
const content = await getPersisted();
|
|
358
|
+
if (isArray(content)) {
|
|
359
|
+
setContentOrChanges(content);
|
|
360
|
+
} else if (initialContent) {
|
|
361
|
+
setDefaultContent(initialContent);
|
|
362
|
+
} else {
|
|
363
|
+
errorNew(`Content is not an array: ${content}`);
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
() => {
|
|
367
|
+
if (initialContent) {
|
|
368
|
+
setDefaultContent(initialContent);
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
);
|
|
363
372
|
setStatus(0 /* Idle */);
|
|
364
373
|
});
|
|
365
374
|
}
|
|
@@ -368,29 +377,33 @@ const createCustomPersister = (
|
|
|
368
377
|
const startAutoLoad = async (initialContent) => {
|
|
369
378
|
stopAutoLoad();
|
|
370
379
|
await load(initialContent);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
380
|
+
await tryCatch(
|
|
381
|
+
async () =>
|
|
382
|
+
(autoLoadHandle = await addPersisterListener(
|
|
383
|
+
async (content, changes) => {
|
|
384
|
+
if (changes || content) {
|
|
385
|
+
/* istanbul ignore else */
|
|
386
|
+
if (status != 2 /* Saving */) {
|
|
387
|
+
setStatus(1 /* Loading */);
|
|
388
|
+
loads++;
|
|
389
|
+
setContentOrChanges(changes ?? content);
|
|
390
|
+
setStatus(0 /* Idle */);
|
|
391
|
+
}
|
|
392
|
+
} else {
|
|
393
|
+
await load();
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
)),
|
|
397
|
+
onIgnoredError,
|
|
398
|
+
);
|
|
389
399
|
return persister;
|
|
390
400
|
};
|
|
391
|
-
const stopAutoLoad = () => {
|
|
401
|
+
const stopAutoLoad = async () => {
|
|
392
402
|
if (autoLoadHandle) {
|
|
393
|
-
|
|
403
|
+
await tryCatch(
|
|
404
|
+
() => delPersisterListener(autoLoadHandle),
|
|
405
|
+
onIgnoredError,
|
|
406
|
+
);
|
|
394
407
|
autoLoadHandle = void 0;
|
|
395
408
|
}
|
|
396
409
|
return persister;
|
|
@@ -402,12 +415,7 @@ const createCustomPersister = (
|
|
|
402
415
|
setStatus(2 /* Saving */);
|
|
403
416
|
saves++;
|
|
404
417
|
await schedule(async () => {
|
|
405
|
-
|
|
406
|
-
await setPersisted(getContent, changes);
|
|
407
|
-
} catch (error) {
|
|
408
|
-
/* istanbul ignore next */
|
|
409
|
-
onIgnoredError?.(error);
|
|
410
|
-
}
|
|
418
|
+
await tryCatch(() => setPersisted(getContent, changes), onIgnoredError);
|
|
411
419
|
setStatus(0 /* Idle */);
|
|
412
420
|
});
|
|
413
421
|
}
|
|
@@ -424,7 +432,7 @@ const createCustomPersister = (
|
|
|
424
432
|
});
|
|
425
433
|
return persister;
|
|
426
434
|
};
|
|
427
|
-
const stopAutoSave = () => {
|
|
435
|
+
const stopAutoSave = async () => {
|
|
428
436
|
if (autoSaveListenerId) {
|
|
429
437
|
store.delListener(autoSaveListenerId);
|
|
430
438
|
autoSaveListenerId = void 0;
|
|
@@ -445,9 +453,10 @@ const createCustomPersister = (
|
|
|
445
453
|
return persister;
|
|
446
454
|
};
|
|
447
455
|
const getStore = () => store;
|
|
448
|
-
const destroy = () => {
|
|
456
|
+
const destroy = async () => {
|
|
449
457
|
arrayClear(mapGet(scheduleActions, scheduleId));
|
|
450
|
-
|
|
458
|
+
await persister.stopAutoLoad();
|
|
459
|
+
return await persister.stopAutoSave();
|
|
451
460
|
};
|
|
452
461
|
const getStats = () => ({loads, saves});
|
|
453
462
|
const persister = {
|
|
@@ -475,7 +484,7 @@ const createCustomSynchronizer = (
|
|
|
475
484
|
store,
|
|
476
485
|
send,
|
|
477
486
|
registerReceive,
|
|
478
|
-
|
|
487
|
+
extraDestroy,
|
|
479
488
|
requestTimeoutSeconds,
|
|
480
489
|
onSend,
|
|
481
490
|
onReceive,
|
|
@@ -528,12 +537,12 @@ const createCustomSynchronizer = (
|
|
|
528
537
|
});
|
|
529
538
|
tablesStamp[1] = getLatestTime(tablesStamp[1], tablesTime2);
|
|
530
539
|
};
|
|
531
|
-
const getChangesFromOtherStore =
|
|
540
|
+
const getChangesFromOtherStore = (
|
|
532
541
|
otherClientId = null,
|
|
533
542
|
otherContentHashes,
|
|
534
543
|
transactionId = getTransactionId(),
|
|
535
|
-
) =>
|
|
536
|
-
|
|
544
|
+
) =>
|
|
545
|
+
tryCatch(async () => {
|
|
537
546
|
if (isUndefined(otherContentHashes)) {
|
|
538
547
|
[otherContentHashes, otherClientId, transactionId] = await request(
|
|
539
548
|
null,
|
|
@@ -592,10 +601,7 @@ const createCustomSynchronizer = (
|
|
|
592
601
|
)[0],
|
|
593
602
|
1,
|
|
594
603
|
];
|
|
595
|
-
}
|
|
596
|
-
onIgnoredError?.(error);
|
|
597
|
-
}
|
|
598
|
-
};
|
|
604
|
+
}, onIgnoredError);
|
|
599
605
|
const getPersisted = async () => {
|
|
600
606
|
const changes = await getChangesFromOtherStore();
|
|
601
607
|
return changes && (!objIsEmpty(changes[0][0]) || !objIsEmpty(changes[1][0]))
|
|
@@ -619,12 +625,15 @@ const createCustomSynchronizer = (
|
|
|
619
625
|
await persister.startAutoLoad(initialContent)
|
|
620
626
|
).startAutoSave();
|
|
621
627
|
};
|
|
622
|
-
const stopSync = () => {
|
|
628
|
+
const stopSync = async () => {
|
|
623
629
|
syncing = 0;
|
|
624
|
-
|
|
630
|
+
await persister.stopAutoLoad();
|
|
631
|
+
await persister.stopAutoSave();
|
|
632
|
+
return persister;
|
|
625
633
|
};
|
|
626
|
-
const destroy = () => {
|
|
627
|
-
|
|
634
|
+
const destroy = async () => {
|
|
635
|
+
await persister.stopSync();
|
|
636
|
+
return persister;
|
|
628
637
|
};
|
|
629
638
|
const getSynchronizerStats = () => ({sends, receives});
|
|
630
639
|
const persister = createCustomPersister(
|
|
@@ -725,7 +734,7 @@ const createWsServer = (
|
|
|
725
734
|
(receive) =>
|
|
726
735
|
(serverClient[3 /* Send */] = (payload) =>
|
|
727
736
|
receivePayload(payload, receive)),
|
|
728
|
-
|
|
737
|
+
noop,
|
|
729
738
|
1,
|
|
730
739
|
void 0,
|
|
731
740
|
void 0,
|
|
@@ -747,9 +756,9 @@ const createWsServer = (
|
|
|
747
756
|
serverClient[5 /* Then */](serverClient[1 /* Persister */].getStore());
|
|
748
757
|
serverClient[0 /* State */] = 0 /* Ready */;
|
|
749
758
|
};
|
|
750
|
-
const stopServerClient = (serverClient) => {
|
|
751
|
-
serverClient[1 /* Persister */]?.destroy();
|
|
752
|
-
serverClient[2 /* Synchronizer */]?.destroy();
|
|
759
|
+
const stopServerClient = async (serverClient) => {
|
|
760
|
+
await serverClient[1 /* Persister */]?.destroy();
|
|
761
|
+
await serverClient[2 /* Synchronizer */]?.destroy();
|
|
753
762
|
};
|
|
754
763
|
const getMessageHandler = (clientId, clients, serverClient) => (payload) =>
|
|
755
764
|
ifPayloadValid(payload, (toClientId, remainder) => {
|
|
@@ -798,11 +807,11 @@ const createWsServer = (
|
|
|
798
807
|
arrayForEach(serverClient[4 /* Buffer */], messageHandler);
|
|
799
808
|
serverClient[4 /* Buffer */] = [];
|
|
800
809
|
}
|
|
801
|
-
client.on('close', () => {
|
|
810
|
+
client.on('close', async () => {
|
|
802
811
|
collDel(clients, clientId);
|
|
803
812
|
callListeners(clientIdListeners, [pathId], clientId, -1);
|
|
804
813
|
if (collIsEmpty(clients)) {
|
|
805
|
-
stopServerClient(serverClient);
|
|
814
|
+
await stopServerClient(serverClient);
|
|
806
815
|
collDel(serverClientsByPath, pathId);
|
|
807
816
|
collDel(clientsByPath, pathId);
|
|
808
817
|
callListeners(pathIdListeners, void 0, pathId, -1);
|
|
@@ -832,9 +841,9 @@ const createWsServer = (
|
|
|
832
841
|
paths: collSize(clientsByPath),
|
|
833
842
|
clients: collSize2(clientsByPath),
|
|
834
843
|
});
|
|
835
|
-
const destroy = () => {
|
|
844
|
+
const destroy = async () => {
|
|
836
845
|
collClear(clientsByPath);
|
|
837
|
-
|
|
846
|
+
await promiseAll(mapMap(serverClientsByPath, stopServerClient));
|
|
838
847
|
webSocketServer.close();
|
|
839
848
|
};
|
|
840
849
|
const wsServer = {
|