tinybase 4.0.2 → 4.0.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/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-expo-sqlite.cjs +1 -0
- 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-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/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.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-expo-sqlite.cjs +1 -0
- 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-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/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/debug/persisters/persister-automerge.js +56 -18
- package/lib/debug/persisters/persister-browser.js +55 -22
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +106 -62
- package/lib/debug/persisters/persister-expo-sqlite.js +813 -0
- package/lib/debug/persisters/persister-file.js +51 -18
- package/lib/debug/persisters/persister-remote.js +51 -17
- package/lib/debug/persisters/persister-sqlite-wasm.js +106 -62
- package/lib/debug/persisters/persister-sqlite3.js +113 -64
- package/lib/debug/persisters/persister-yjs.js +63 -27
- package/lib/debug/persisters.js +49 -17
- package/lib/debug/tinybase.js +35 -17
- 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-expo-sqlite.js +1 -0
- 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-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/tinybase.js +1 -1
- package/lib/es6/tinybase.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-expo-sqlite.js +1 -0
- 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-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/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/types/persisters/persister-automerge.d.ts +4 -0
- package/lib/types/persisters/persister-browser.d.ts +8 -0
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +10 -2
- package/lib/types/persisters/persister-expo-sqlite.d.ts +126 -0
- package/lib/types/persisters/persister-file.d.ts +8 -1
- package/lib/types/persisters/persister-remote.d.ts +4 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +8 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +8 -0
- package/lib/types/persisters/persister-yjs.d.ts +4 -0
- package/lib/types/persisters.d.ts +16 -3
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +5 -0
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +12 -2
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +138 -0
- package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -1
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -0
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +10 -0
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +5 -0
- package/lib/types/with-schemas/persisters.d.ts +17 -3
- 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-expo-sqlite.js +1 -0
- 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-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/tinybase.js +1 -1
- package/lib/umd/tinybase.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-expo-sqlite.js +1 -0
- 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-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/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/package.json +6 -5
- package/readme.md +2 -2
|
@@ -84,7 +84,7 @@ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
|
84
84
|
const SELECT_STAR_FROM = 'SELECT*FROM';
|
|
85
85
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
86
86
|
const WHERE = 'WHERE';
|
|
87
|
-
const getCommandFunctions = (cmd, managedTableNames) => {
|
|
87
|
+
const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
88
88
|
const schemaMap = mapNew();
|
|
89
89
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
90
90
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -282,7 +282,18 @@ const getCommandFunctions = (cmd, managedTableNames) => {
|
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
};
|
|
285
|
-
|
|
285
|
+
const transaction = async (actions) => {
|
|
286
|
+
let result;
|
|
287
|
+
await cmd('BEGIN');
|
|
288
|
+
try {
|
|
289
|
+
result = await actions();
|
|
290
|
+
} catch (error) {
|
|
291
|
+
onIgnoredError?.(error);
|
|
292
|
+
}
|
|
293
|
+
await cmd('END');
|
|
294
|
+
return result;
|
|
295
|
+
};
|
|
296
|
+
return [refreshSchema, loadTable, saveTable, transaction];
|
|
286
297
|
};
|
|
287
298
|
const upsert = async (
|
|
288
299
|
cmd,
|
|
@@ -332,32 +343,41 @@ const jsonString = (obj) =>
|
|
|
332
343
|
);
|
|
333
344
|
const jsonParse = JSON.parse;
|
|
334
345
|
|
|
346
|
+
const scheduleRunning = mapNew();
|
|
347
|
+
const scheduleActions = mapNew();
|
|
335
348
|
const createCustomPersister = (
|
|
336
349
|
store,
|
|
337
350
|
getPersisted,
|
|
338
351
|
setPersisted,
|
|
339
352
|
addPersisterListener,
|
|
340
353
|
delPersisterListener,
|
|
354
|
+
onIgnoredError,
|
|
355
|
+
scheduleId = [],
|
|
341
356
|
) => {
|
|
342
357
|
let listenerId;
|
|
343
358
|
let loadSave = 0;
|
|
344
359
|
let loads = 0;
|
|
345
360
|
let saves = 0;
|
|
346
|
-
let running = 0;
|
|
347
361
|
let listening = 0;
|
|
348
362
|
let action;
|
|
349
363
|
let listeningHandle;
|
|
350
|
-
|
|
364
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
365
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
351
366
|
const run = async () => {
|
|
352
367
|
/* istanbul ignore else */
|
|
353
|
-
if (!
|
|
354
|
-
|
|
355
|
-
while (
|
|
368
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
369
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
370
|
+
while (
|
|
371
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
372
|
+
) {
|
|
356
373
|
try {
|
|
357
374
|
await action();
|
|
358
|
-
} catch {
|
|
375
|
+
} catch (error) {
|
|
376
|
+
/* istanbul ignore next */
|
|
377
|
+
onIgnoredError?.(error);
|
|
378
|
+
}
|
|
359
379
|
}
|
|
360
|
-
|
|
380
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
361
381
|
}
|
|
362
382
|
};
|
|
363
383
|
const loadLock = async (actions) => {
|
|
@@ -388,16 +408,22 @@ const createCustomPersister = (
|
|
|
388
408
|
await persister.load(initialTables, initialValues);
|
|
389
409
|
listening = 1;
|
|
390
410
|
listeningHandle = addPersisterListener(
|
|
391
|
-
async (getContent, getTransactionChanges) =>
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
411
|
+
async (getContent, getTransactionChanges) => {
|
|
412
|
+
if (getTransactionChanges) {
|
|
413
|
+
const transactionChanges = getTransactionChanges();
|
|
414
|
+
await loadLock(async () =>
|
|
415
|
+
store.setTransactionChanges(transactionChanges),
|
|
416
|
+
);
|
|
417
|
+
} else {
|
|
418
|
+
await loadLock(async () => {
|
|
396
419
|
try {
|
|
397
420
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
398
|
-
} catch {
|
|
399
|
-
|
|
400
|
-
|
|
421
|
+
} catch (error) {
|
|
422
|
+
onIgnoredError?.(error);
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
},
|
|
401
427
|
);
|
|
402
428
|
return persister;
|
|
403
429
|
},
|
|
@@ -419,7 +445,10 @@ const createCustomPersister = (
|
|
|
419
445
|
await persister.schedule(async () => {
|
|
420
446
|
try {
|
|
421
447
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
422
|
-
} catch {
|
|
448
|
+
} catch (error) {
|
|
449
|
+
/* istanbul ignore next */
|
|
450
|
+
onIgnoredError?.(error);
|
|
451
|
+
}
|
|
423
452
|
loadSave = 0;
|
|
424
453
|
});
|
|
425
454
|
}
|
|
@@ -442,7 +471,7 @@ const createCustomPersister = (
|
|
|
442
471
|
return persister;
|
|
443
472
|
},
|
|
444
473
|
schedule: async (...actions) => {
|
|
445
|
-
arrayPush(
|
|
474
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
446
475
|
await run();
|
|
447
476
|
return persister;
|
|
448
477
|
},
|
|
@@ -459,28 +488,30 @@ const createJsonSqlitePersister = (
|
|
|
459
488
|
cmd,
|
|
460
489
|
addPersisterListener,
|
|
461
490
|
delPersisterListener,
|
|
491
|
+
onIgnoredError,
|
|
462
492
|
[storeTableName],
|
|
463
493
|
managedTableNames,
|
|
494
|
+
scheduleId,
|
|
464
495
|
) => {
|
|
465
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
466
|
-
cmd,
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
);
|
|
476
|
-
};
|
|
496
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
497
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
498
|
+
const getPersisted = async () =>
|
|
499
|
+
await transaction(async () => {
|
|
500
|
+
await refreshSchema();
|
|
501
|
+
return jsonParse(
|
|
502
|
+
(await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
|
|
503
|
+
SINGLE_ROW_ID
|
|
504
|
+
]?.[STORE_COLUMN] ?? 'null',
|
|
505
|
+
);
|
|
506
|
+
});
|
|
477
507
|
const setPersisted = async (getContent) =>
|
|
478
|
-
|
|
508
|
+
await transaction(async () => {
|
|
509
|
+
await refreshSchema();
|
|
479
510
|
await saveTable(
|
|
480
511
|
storeTableName,
|
|
481
512
|
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
482
513
|
{
|
|
483
|
-
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent())},
|
|
514
|
+
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent() ?? null)},
|
|
484
515
|
},
|
|
485
516
|
true,
|
|
486
517
|
true,
|
|
@@ -492,6 +523,8 @@ const createJsonSqlitePersister = (
|
|
|
492
523
|
setPersisted,
|
|
493
524
|
addPersisterListener,
|
|
494
525
|
delPersisterListener,
|
|
526
|
+
onIgnoredError,
|
|
527
|
+
scheduleId,
|
|
495
528
|
);
|
|
496
529
|
return persister;
|
|
497
530
|
};
|
|
@@ -501,17 +534,17 @@ const createTabularSqlitePersister = (
|
|
|
501
534
|
cmd,
|
|
502
535
|
addPersisterListener,
|
|
503
536
|
delPersisterListener,
|
|
537
|
+
onIgnoredError,
|
|
504
538
|
[
|
|
505
539
|
tablesLoadConfig,
|
|
506
540
|
tablesSaveConfig,
|
|
507
541
|
[valuesLoad, valuesSave, valuesTableName],
|
|
508
542
|
],
|
|
509
543
|
managedTableNames,
|
|
544
|
+
scheduleId,
|
|
510
545
|
) => {
|
|
511
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
512
|
-
cmd,
|
|
513
|
-
managedTableNames,
|
|
514
|
-
);
|
|
546
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
547
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
515
548
|
const saveTables = async (tables, partial) =>
|
|
516
549
|
await promiseAll(
|
|
517
550
|
mapMap(
|
|
@@ -566,32 +599,36 @@ const createTabularSqlitePersister = (
|
|
|
566
599
|
SINGLE_ROW_ID
|
|
567
600
|
]
|
|
568
601
|
: {};
|
|
569
|
-
const getPersisted = async () =>
|
|
570
|
-
await
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
602
|
+
const getPersisted = async () =>
|
|
603
|
+
await transaction(async () => {
|
|
604
|
+
await refreshSchema();
|
|
605
|
+
const tables = await loadTables();
|
|
606
|
+
const values = await loadValues();
|
|
607
|
+
return !objIsEmpty(tables) || !isUndefined(values)
|
|
608
|
+
? [tables, values]
|
|
609
|
+
: void 0;
|
|
610
|
+
});
|
|
611
|
+
const setPersisted = async (getContent, getTransactionChanges) =>
|
|
612
|
+
await transaction(async () => {
|
|
613
|
+
await refreshSchema();
|
|
614
|
+
if (!isUndefined(getTransactionChanges)) {
|
|
615
|
+
const [tableChanges, valueChanges] = getTransactionChanges();
|
|
616
|
+
await saveTables(tableChanges, true);
|
|
617
|
+
await saveValues(valueChanges, true);
|
|
618
|
+
} else {
|
|
619
|
+
const [tables, values] = getContent();
|
|
620
|
+
await saveTables(tables);
|
|
621
|
+
await saveValues(values);
|
|
622
|
+
}
|
|
623
|
+
});
|
|
589
624
|
const persister = createCustomPersister(
|
|
590
625
|
store,
|
|
591
626
|
getPersisted,
|
|
592
627
|
setPersisted,
|
|
593
628
|
addPersisterListener,
|
|
594
629
|
delPersisterListener,
|
|
630
|
+
onIgnoredError,
|
|
631
|
+
scheduleId,
|
|
595
632
|
);
|
|
596
633
|
return persister;
|
|
597
634
|
};
|
|
@@ -698,7 +735,9 @@ const createSqlitePersister = (
|
|
|
698
735
|
cmd,
|
|
699
736
|
addUpdateListener,
|
|
700
737
|
delUpdateListener,
|
|
701
|
-
|
|
738
|
+
onSqlCommand,
|
|
739
|
+
onIgnoredError,
|
|
740
|
+
scheduleId,
|
|
702
741
|
) => {
|
|
703
742
|
let dataVersion;
|
|
704
743
|
let schemaVersion;
|
|
@@ -738,26 +777,34 @@ const createSqlitePersister = (
|
|
|
738
777
|
};
|
|
739
778
|
return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
|
|
740
779
|
store,
|
|
741
|
-
|
|
780
|
+
onSqlCommand
|
|
742
781
|
? async (sql, args) => {
|
|
743
|
-
|
|
782
|
+
onSqlCommand(sql, args);
|
|
744
783
|
return await cmd(sql, args);
|
|
745
784
|
}
|
|
746
785
|
: cmd,
|
|
747
786
|
addPersisterListener,
|
|
748
787
|
delPersisterListener,
|
|
788
|
+
onIgnoredError,
|
|
749
789
|
defaultedConfig,
|
|
750
790
|
collValues(managedTableNamesSet),
|
|
791
|
+
scheduleId,
|
|
751
792
|
);
|
|
752
793
|
};
|
|
753
794
|
|
|
754
795
|
const CHANGE = 'change';
|
|
755
|
-
const createSqlite3Persister = (
|
|
796
|
+
const createSqlite3Persister = (
|
|
797
|
+
store,
|
|
798
|
+
db,
|
|
799
|
+
configOrStoreTableName,
|
|
800
|
+
onSqlCommand,
|
|
801
|
+
onIgnoredError,
|
|
802
|
+
) =>
|
|
756
803
|
createSqlitePersister(
|
|
757
804
|
store,
|
|
758
805
|
configOrStoreTableName,
|
|
759
|
-
(sql, args = []) =>
|
|
760
|
-
promiseNew((resolve, reject) =>
|
|
806
|
+
async (sql, args = []) =>
|
|
807
|
+
await promiseNew((resolve, reject) =>
|
|
761
808
|
db.all(sql, args, (error, rows) =>
|
|
762
809
|
error ? reject(error) : resolve(rows.map((row) => ({...row}))),
|
|
763
810
|
),
|
|
@@ -768,7 +815,9 @@ const createSqlite3Persister = (store, db, configOrStoreTableName, logSql) =>
|
|
|
768
815
|
return observer;
|
|
769
816
|
},
|
|
770
817
|
(observer) => db.off(CHANGE, observer),
|
|
771
|
-
|
|
818
|
+
onSqlCommand,
|
|
819
|
+
onIgnoredError,
|
|
820
|
+
db,
|
|
772
821
|
);
|
|
773
822
|
|
|
774
823
|
export {createSqlite3Persister};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {Map} from 'yjs';
|
|
1
|
+
import {Map as Map$1} from 'yjs';
|
|
2
2
|
|
|
3
3
|
const TINYBASE = 'tinybase';
|
|
4
4
|
|
|
@@ -33,32 +33,58 @@ const objEnsure = (obj, id, getDefaultValue) => {
|
|
|
33
33
|
return obj[id];
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
37
|
+
const collForEach = (coll, cb) => coll?.forEach(cb);
|
|
38
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
39
|
+
|
|
40
|
+
const mapNew = (entries) => new Map(entries);
|
|
41
|
+
const mapGet = (map, key) => map?.get(key);
|
|
42
|
+
const mapForEach = (map, cb) =>
|
|
43
|
+
collForEach(map, (value, key) => cb(key, value));
|
|
44
|
+
const mapSet = (map, key, value) =>
|
|
45
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
46
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
47
|
+
if (!collHas(map, key)) {
|
|
48
|
+
mapSet(map, key, getDefaultValue());
|
|
49
|
+
}
|
|
50
|
+
return mapGet(map, key);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const scheduleRunning = mapNew();
|
|
54
|
+
const scheduleActions = mapNew();
|
|
36
55
|
const createCustomPersister = (
|
|
37
56
|
store,
|
|
38
57
|
getPersisted,
|
|
39
58
|
setPersisted,
|
|
40
59
|
addPersisterListener,
|
|
41
60
|
delPersisterListener,
|
|
61
|
+
onIgnoredError,
|
|
62
|
+
scheduleId = [],
|
|
42
63
|
) => {
|
|
43
64
|
let listenerId;
|
|
44
65
|
let loadSave = 0;
|
|
45
66
|
let loads = 0;
|
|
46
67
|
let saves = 0;
|
|
47
|
-
let running = 0;
|
|
48
68
|
let listening = 0;
|
|
49
69
|
let action;
|
|
50
70
|
let listeningHandle;
|
|
51
|
-
|
|
71
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
72
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
52
73
|
const run = async () => {
|
|
53
74
|
/* istanbul ignore else */
|
|
54
|
-
if (!
|
|
55
|
-
|
|
56
|
-
while (
|
|
75
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
76
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
77
|
+
while (
|
|
78
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
79
|
+
) {
|
|
57
80
|
try {
|
|
58
81
|
await action();
|
|
59
|
-
} catch {
|
|
82
|
+
} catch (error) {
|
|
83
|
+
/* istanbul ignore next */
|
|
84
|
+
onIgnoredError?.(error);
|
|
85
|
+
}
|
|
60
86
|
}
|
|
61
|
-
|
|
87
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
62
88
|
}
|
|
63
89
|
};
|
|
64
90
|
const loadLock = async (actions) => {
|
|
@@ -89,16 +115,22 @@ const createCustomPersister = (
|
|
|
89
115
|
await persister.load(initialTables, initialValues);
|
|
90
116
|
listening = 1;
|
|
91
117
|
listeningHandle = addPersisterListener(
|
|
92
|
-
async (getContent, getTransactionChanges) =>
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
118
|
+
async (getContent, getTransactionChanges) => {
|
|
119
|
+
if (getTransactionChanges) {
|
|
120
|
+
const transactionChanges = getTransactionChanges();
|
|
121
|
+
await loadLock(async () =>
|
|
122
|
+
store.setTransactionChanges(transactionChanges),
|
|
123
|
+
);
|
|
124
|
+
} else {
|
|
125
|
+
await loadLock(async () => {
|
|
97
126
|
try {
|
|
98
127
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
99
|
-
} catch {
|
|
100
|
-
|
|
101
|
-
|
|
128
|
+
} catch (error) {
|
|
129
|
+
onIgnoredError?.(error);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
},
|
|
102
134
|
);
|
|
103
135
|
return persister;
|
|
104
136
|
},
|
|
@@ -120,7 +152,10 @@ const createCustomPersister = (
|
|
|
120
152
|
await persister.schedule(async () => {
|
|
121
153
|
try {
|
|
122
154
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
123
|
-
} catch {
|
|
155
|
+
} catch (error) {
|
|
156
|
+
/* istanbul ignore next */
|
|
157
|
+
onIgnoredError?.(error);
|
|
158
|
+
}
|
|
124
159
|
loadSave = 0;
|
|
125
160
|
});
|
|
126
161
|
}
|
|
@@ -143,7 +178,7 @@ const createCustomPersister = (
|
|
|
143
178
|
return persister;
|
|
144
179
|
},
|
|
145
180
|
schedule: async (...actions) => {
|
|
146
|
-
arrayPush(
|
|
181
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
147
182
|
await run();
|
|
148
183
|
return persister;
|
|
149
184
|
},
|
|
@@ -154,18 +189,13 @@ const createCustomPersister = (
|
|
|
154
189
|
return objFreeze(persister);
|
|
155
190
|
};
|
|
156
191
|
|
|
157
|
-
const collForEach = (coll, cb) => coll?.forEach(cb);
|
|
158
|
-
|
|
159
|
-
const mapForEach = (map, cb) =>
|
|
160
|
-
collForEach(map, (value, key) => cb(key, value));
|
|
161
|
-
|
|
162
192
|
const tablesKey = 't';
|
|
163
193
|
const valuesKey = 'v';
|
|
164
194
|
const DELETE = 'delete';
|
|
165
195
|
const ensureYContent = (yContent) => {
|
|
166
196
|
if (!yContent.size) {
|
|
167
|
-
yContent.set(tablesKey, new Map());
|
|
168
|
-
yContent.set(valuesKey, new Map());
|
|
197
|
+
yContent.set(tablesKey, new Map$1());
|
|
198
|
+
yContent.set(valuesKey, new Map$1());
|
|
169
199
|
}
|
|
170
200
|
};
|
|
171
201
|
const getYContent = (yContent) => [
|
|
@@ -292,7 +322,7 @@ const setTransactionChangesToYDoc = (
|
|
|
292
322
|
const yMapMatch = (yMapOrParent, idInParent, obj, set) => {
|
|
293
323
|
const yMap = isUndefined(idInParent)
|
|
294
324
|
? yMapOrParent
|
|
295
|
-
: yMapOrParent.get(idInParent) ?? yMapOrParent.set(idInParent, new Map());
|
|
325
|
+
: yMapOrParent.get(idInParent) ?? yMapOrParent.set(idInParent, new Map$1());
|
|
296
326
|
let changed;
|
|
297
327
|
objMap(obj, (value, id) => {
|
|
298
328
|
if (set(yMap, id, value)) {
|
|
@@ -310,7 +340,12 @@ const yMapMatch = (yMapOrParent, idInParent, obj, set) => {
|
|
|
310
340
|
}
|
|
311
341
|
return changed;
|
|
312
342
|
};
|
|
313
|
-
const createYjsPersister = (
|
|
343
|
+
const createYjsPersister = (
|
|
344
|
+
store,
|
|
345
|
+
yDoc,
|
|
346
|
+
yMapName = TINYBASE,
|
|
347
|
+
onIgnoredError,
|
|
348
|
+
) => {
|
|
314
349
|
const yContent = yDoc.getMap(yMapName);
|
|
315
350
|
const getPersisted = async () =>
|
|
316
351
|
yContent.size
|
|
@@ -335,6 +370,7 @@ const createYjsPersister = (store, yDoc, yMapName = TINYBASE) => {
|
|
|
335
370
|
setPersisted,
|
|
336
371
|
addPersisterListener,
|
|
337
372
|
delPersisterListener,
|
|
373
|
+
onIgnoredError,
|
|
338
374
|
);
|
|
339
375
|
};
|
|
340
376
|
|
package/lib/debug/persisters.js
CHANGED
|
@@ -15,32 +15,55 @@ const isObject = (obj) =>
|
|
|
15
15
|
const objSize = (obj) => arrayLength(objIds(obj));
|
|
16
16
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
17
17
|
|
|
18
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
19
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
20
|
+
|
|
21
|
+
const mapNew = (entries) => new Map(entries);
|
|
22
|
+
const mapGet = (map, key) => map?.get(key);
|
|
23
|
+
const mapSet = (map, key, value) =>
|
|
24
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
25
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
26
|
+
if (!collHas(map, key)) {
|
|
27
|
+
mapSet(map, key, getDefaultValue());
|
|
28
|
+
}
|
|
29
|
+
return mapGet(map, key);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const scheduleRunning = mapNew();
|
|
33
|
+
const scheduleActions = mapNew();
|
|
18
34
|
const createCustomPersister = (
|
|
19
35
|
store,
|
|
20
36
|
getPersisted,
|
|
21
37
|
setPersisted,
|
|
22
38
|
addPersisterListener,
|
|
23
39
|
delPersisterListener,
|
|
40
|
+
onIgnoredError,
|
|
41
|
+
scheduleId = [],
|
|
24
42
|
) => {
|
|
25
43
|
let listenerId;
|
|
26
44
|
let loadSave = 0;
|
|
27
45
|
let loads = 0;
|
|
28
46
|
let saves = 0;
|
|
29
|
-
let running = 0;
|
|
30
47
|
let listening = 0;
|
|
31
48
|
let action;
|
|
32
49
|
let listeningHandle;
|
|
33
|
-
|
|
50
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
51
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
34
52
|
const run = async () => {
|
|
35
53
|
/* istanbul ignore else */
|
|
36
|
-
if (!
|
|
37
|
-
|
|
38
|
-
while (
|
|
54
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
55
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
56
|
+
while (
|
|
57
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
58
|
+
) {
|
|
39
59
|
try {
|
|
40
60
|
await action();
|
|
41
|
-
} catch {
|
|
61
|
+
} catch (error) {
|
|
62
|
+
/* istanbul ignore next */
|
|
63
|
+
onIgnoredError?.(error);
|
|
64
|
+
}
|
|
42
65
|
}
|
|
43
|
-
|
|
66
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
44
67
|
}
|
|
45
68
|
};
|
|
46
69
|
const loadLock = async (actions) => {
|
|
@@ -71,16 +94,22 @@ const createCustomPersister = (
|
|
|
71
94
|
await persister.load(initialTables, initialValues);
|
|
72
95
|
listening = 1;
|
|
73
96
|
listeningHandle = addPersisterListener(
|
|
74
|
-
async (getContent, getTransactionChanges) =>
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
97
|
+
async (getContent, getTransactionChanges) => {
|
|
98
|
+
if (getTransactionChanges) {
|
|
99
|
+
const transactionChanges = getTransactionChanges();
|
|
100
|
+
await loadLock(async () =>
|
|
101
|
+
store.setTransactionChanges(transactionChanges),
|
|
102
|
+
);
|
|
103
|
+
} else {
|
|
104
|
+
await loadLock(async () => {
|
|
79
105
|
try {
|
|
80
106
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
81
|
-
} catch {
|
|
82
|
-
|
|
83
|
-
|
|
107
|
+
} catch (error) {
|
|
108
|
+
onIgnoredError?.(error);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
},
|
|
84
113
|
);
|
|
85
114
|
return persister;
|
|
86
115
|
},
|
|
@@ -102,7 +131,10 @@ const createCustomPersister = (
|
|
|
102
131
|
await persister.schedule(async () => {
|
|
103
132
|
try {
|
|
104
133
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
105
|
-
} catch {
|
|
134
|
+
} catch (error) {
|
|
135
|
+
/* istanbul ignore next */
|
|
136
|
+
onIgnoredError?.(error);
|
|
137
|
+
}
|
|
106
138
|
loadSave = 0;
|
|
107
139
|
});
|
|
108
140
|
}
|
|
@@ -125,7 +157,7 @@ const createCustomPersister = (
|
|
|
125
157
|
return persister;
|
|
126
158
|
},
|
|
127
159
|
schedule: async (...actions) => {
|
|
128
|
-
arrayPush(
|
|
160
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
129
161
|
await run();
|
|
130
162
|
return persister;
|
|
131
163
|
},
|