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.
Files changed (165) hide show
  1. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  2. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  4. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  6. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -0
  8. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-file.cjs +1 -1
  10. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  12. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  14. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  16. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  18. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  19. package/lib/cjs/persisters.cjs +1 -1
  20. package/lib/cjs/persisters.cjs.gz +0 -0
  21. package/lib/cjs/tinybase.cjs +1 -1
  22. package/lib/cjs/tinybase.cjs.gz +0 -0
  23. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  24. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  25. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  26. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  27. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  28. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -0
  30. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  32. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  33. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  34. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  35. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  36. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  37. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  38. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  39. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  40. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  41. package/lib/cjs-es6/persisters.cjs +1 -1
  42. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  43. package/lib/cjs-es6/tinybase.cjs +1 -1
  44. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  45. package/lib/debug/persisters/persister-automerge.js +56 -18
  46. package/lib/debug/persisters/persister-browser.js +55 -22
  47. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +106 -62
  48. package/lib/debug/persisters/persister-expo-sqlite.js +813 -0
  49. package/lib/debug/persisters/persister-file.js +51 -18
  50. package/lib/debug/persisters/persister-remote.js +51 -17
  51. package/lib/debug/persisters/persister-sqlite-wasm.js +106 -62
  52. package/lib/debug/persisters/persister-sqlite3.js +113 -64
  53. package/lib/debug/persisters/persister-yjs.js +63 -27
  54. package/lib/debug/persisters.js +49 -17
  55. package/lib/debug/tinybase.js +35 -17
  56. package/lib/es6/persisters/persister-automerge.js +1 -1
  57. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  58. package/lib/es6/persisters/persister-browser.js +1 -1
  59. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  60. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  61. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  62. package/lib/es6/persisters/persister-expo-sqlite.js +1 -0
  63. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  64. package/lib/es6/persisters/persister-file.js +1 -1
  65. package/lib/es6/persisters/persister-file.js.gz +0 -0
  66. package/lib/es6/persisters/persister-remote.js +1 -1
  67. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  68. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  69. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  70. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  71. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  72. package/lib/es6/persisters/persister-yjs.js +1 -1
  73. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  74. package/lib/es6/persisters.js +1 -1
  75. package/lib/es6/persisters.js.gz +0 -0
  76. package/lib/es6/tinybase.js +1 -1
  77. package/lib/es6/tinybase.js.gz +0 -0
  78. package/lib/persisters/persister-automerge.js +1 -1
  79. package/lib/persisters/persister-automerge.js.gz +0 -0
  80. package/lib/persisters/persister-browser.js +1 -1
  81. package/lib/persisters/persister-browser.js.gz +0 -0
  82. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  83. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  84. package/lib/persisters/persister-expo-sqlite.js +1 -0
  85. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  86. package/lib/persisters/persister-file.js +1 -1
  87. package/lib/persisters/persister-file.js.gz +0 -0
  88. package/lib/persisters/persister-remote.js +1 -1
  89. package/lib/persisters/persister-remote.js.gz +0 -0
  90. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  91. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  92. package/lib/persisters/persister-sqlite3.js +1 -1
  93. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  94. package/lib/persisters/persister-yjs.js +1 -1
  95. package/lib/persisters/persister-yjs.js.gz +0 -0
  96. package/lib/persisters.js +1 -1
  97. package/lib/persisters.js.gz +0 -0
  98. package/lib/tinybase.js +1 -1
  99. package/lib/tinybase.js.gz +0 -0
  100. package/lib/types/persisters/persister-automerge.d.ts +4 -0
  101. package/lib/types/persisters/persister-browser.d.ts +8 -0
  102. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +10 -2
  103. package/lib/types/persisters/persister-expo-sqlite.d.ts +126 -0
  104. package/lib/types/persisters/persister-file.d.ts +8 -1
  105. package/lib/types/persisters/persister-remote.d.ts +4 -0
  106. package/lib/types/persisters/persister-sqlite-wasm.d.ts +8 -0
  107. package/lib/types/persisters/persister-sqlite3.d.ts +8 -0
  108. package/lib/types/persisters/persister-yjs.d.ts +4 -0
  109. package/lib/types/persisters.d.ts +16 -3
  110. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +5 -0
  111. package/lib/types/with-schemas/persisters/persister-browser.d.ts +10 -0
  112. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +12 -2
  113. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +138 -0
  114. package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -1
  115. package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -0
  116. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +10 -0
  117. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +10 -0
  118. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +5 -0
  119. package/lib/types/with-schemas/persisters.d.ts +17 -3
  120. package/lib/umd/persisters/persister-automerge.js +1 -1
  121. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  122. package/lib/umd/persisters/persister-browser.js +1 -1
  123. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  124. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  125. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  126. package/lib/umd/persisters/persister-expo-sqlite.js +1 -0
  127. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  128. package/lib/umd/persisters/persister-file.js +1 -1
  129. package/lib/umd/persisters/persister-file.js.gz +0 -0
  130. package/lib/umd/persisters/persister-remote.js +1 -1
  131. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  132. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  133. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  134. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  135. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  136. package/lib/umd/persisters/persister-yjs.js +1 -1
  137. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  138. package/lib/umd/persisters.js +1 -1
  139. package/lib/umd/persisters.js.gz +0 -0
  140. package/lib/umd/tinybase.js +1 -1
  141. package/lib/umd/tinybase.js.gz +0 -0
  142. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  143. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  144. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  145. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  146. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  147. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  148. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -0
  149. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  150. package/lib/umd-es6/persisters/persister-file.js +1 -1
  151. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  152. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  153. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  154. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  155. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  156. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  157. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  158. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  159. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  160. package/lib/umd-es6/persisters.js +1 -1
  161. package/lib/umd-es6/persisters.js.gz +0 -0
  162. package/lib/umd-es6/tinybase.js +1 -1
  163. package/lib/umd-es6/tinybase.js.gz +0 -0
  164. package/package.json +6 -5
  165. 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
- return [refreshSchema, loadTable, saveTable];
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
- const scheduledActions = [];
364
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
365
+ mapEnsure(scheduleActions, scheduleId, () => []);
351
366
  const run = async () => {
352
367
  /* istanbul ignore else */
353
- if (!running) {
354
- running = 1;
355
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
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
- running = 0;
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
- await loadLock(async () => {
393
- if (getTransactionChanges) {
394
- store.setTransactionChanges(getTransactionChanges());
395
- } else {
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(scheduledActions, ...actions);
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] = getCommandFunctions(
466
- cmd,
467
- managedTableNames,
468
- );
469
- const getPersisted = async () => {
470
- await refreshSchema();
471
- return jsonParse(
472
- (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
473
- SINGLE_ROW_ID
474
- ]?.[STORE_COLUMN],
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
- persister.schedule(refreshSchema, async () => {
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] = getCommandFunctions(
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 refreshSchema();
571
- const tables = await loadTables();
572
- const values = await loadValues();
573
- return !objIsEmpty(tables) || !isUndefined(values)
574
- ? [tables, values]
575
- : void 0;
576
- };
577
- const setPersisted = async (getContent, getTransactionChanges) => {
578
- await refreshSchema();
579
- if (!isUndefined(getTransactionChanges)) {
580
- const [tableChanges, valueChanges] = getTransactionChanges();
581
- await saveTables(tableChanges, true);
582
- await saveValues(valueChanges, true);
583
- } else {
584
- const [tables, values] = getContent();
585
- await saveTables(tables);
586
- await saveValues(values);
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
- logSql,
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
- logSql
780
+ onSqlCommand
742
781
  ? async (sql, args) => {
743
- logSql(sql, args);
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 = (store, db, configOrStoreTableName, logSql) =>
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
- logSql,
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
- const scheduledActions = [];
71
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
72
+ mapEnsure(scheduleActions, scheduleId, () => []);
52
73
  const run = async () => {
53
74
  /* istanbul ignore else */
54
- if (!running) {
55
- running = 1;
56
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
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
- running = 0;
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
- await loadLock(async () => {
94
- if (getTransactionChanges) {
95
- store.setTransactionChanges(getTransactionChanges());
96
- } else {
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(scheduledActions, ...actions);
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 = (store, yDoc, yMapName = TINYBASE) => {
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
 
@@ -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
- const scheduledActions = [];
50
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
51
+ mapEnsure(scheduleActions, scheduleId, () => []);
34
52
  const run = async () => {
35
53
  /* istanbul ignore else */
36
- if (!running) {
37
- running = 1;
38
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
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
- running = 0;
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
- await loadLock(async () => {
76
- if (getTransactionChanges) {
77
- store.setTransactionChanges(getTransactionChanges());
78
- } else {
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(scheduledActions, ...actions);
160
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
129
161
  await run();
130
162
  return persister;
131
163
  },