tinybase 4.0.3 → 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 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-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 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-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 +111 -62
- 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 +111 -62
- 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 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-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 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-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 +8 -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 +10 -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 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-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 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-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 +5 -5
- package/readme.md +2 -2
|
@@ -83,7 +83,7 @@ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
|
83
83
|
const SELECT_STAR_FROM = 'SELECT*FROM';
|
|
84
84
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
85
85
|
const WHERE = 'WHERE';
|
|
86
|
-
const getCommandFunctions = (cmd, managedTableNames) => {
|
|
86
|
+
const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
87
87
|
const schemaMap = mapNew();
|
|
88
88
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
89
89
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -281,7 +281,18 @@ const getCommandFunctions = (cmd, managedTableNames) => {
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
};
|
|
284
|
-
|
|
284
|
+
const transaction = async (actions) => {
|
|
285
|
+
let result;
|
|
286
|
+
await cmd('BEGIN');
|
|
287
|
+
try {
|
|
288
|
+
result = await actions();
|
|
289
|
+
} catch (error) {
|
|
290
|
+
onIgnoredError?.(error);
|
|
291
|
+
}
|
|
292
|
+
await cmd('END');
|
|
293
|
+
return result;
|
|
294
|
+
};
|
|
295
|
+
return [refreshSchema, loadTable, saveTable, transaction];
|
|
285
296
|
};
|
|
286
297
|
const upsert = async (
|
|
287
298
|
cmd,
|
|
@@ -331,32 +342,41 @@ const jsonString = (obj) =>
|
|
|
331
342
|
);
|
|
332
343
|
const jsonParse = JSON.parse;
|
|
333
344
|
|
|
345
|
+
const scheduleRunning = mapNew();
|
|
346
|
+
const scheduleActions = mapNew();
|
|
334
347
|
const createCustomPersister = (
|
|
335
348
|
store,
|
|
336
349
|
getPersisted,
|
|
337
350
|
setPersisted,
|
|
338
351
|
addPersisterListener,
|
|
339
352
|
delPersisterListener,
|
|
353
|
+
onIgnoredError,
|
|
354
|
+
scheduleId = [],
|
|
340
355
|
) => {
|
|
341
356
|
let listenerId;
|
|
342
357
|
let loadSave = 0;
|
|
343
358
|
let loads = 0;
|
|
344
359
|
let saves = 0;
|
|
345
|
-
let running = 0;
|
|
346
360
|
let listening = 0;
|
|
347
361
|
let action;
|
|
348
362
|
let listeningHandle;
|
|
349
|
-
|
|
363
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
364
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
350
365
|
const run = async () => {
|
|
351
366
|
/* istanbul ignore else */
|
|
352
|
-
if (!
|
|
353
|
-
|
|
354
|
-
while (
|
|
367
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
368
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
369
|
+
while (
|
|
370
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
371
|
+
) {
|
|
355
372
|
try {
|
|
356
373
|
await action();
|
|
357
|
-
} catch {
|
|
374
|
+
} catch (error) {
|
|
375
|
+
/* istanbul ignore next */
|
|
376
|
+
onIgnoredError?.(error);
|
|
377
|
+
}
|
|
358
378
|
}
|
|
359
|
-
|
|
379
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
360
380
|
}
|
|
361
381
|
};
|
|
362
382
|
const loadLock = async (actions) => {
|
|
@@ -387,16 +407,22 @@ const createCustomPersister = (
|
|
|
387
407
|
await persister.load(initialTables, initialValues);
|
|
388
408
|
listening = 1;
|
|
389
409
|
listeningHandle = addPersisterListener(
|
|
390
|
-
async (getContent, getTransactionChanges) =>
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
410
|
+
async (getContent, getTransactionChanges) => {
|
|
411
|
+
if (getTransactionChanges) {
|
|
412
|
+
const transactionChanges = getTransactionChanges();
|
|
413
|
+
await loadLock(async () =>
|
|
414
|
+
store.setTransactionChanges(transactionChanges),
|
|
415
|
+
);
|
|
416
|
+
} else {
|
|
417
|
+
await loadLock(async () => {
|
|
395
418
|
try {
|
|
396
419
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
397
|
-
} catch {
|
|
398
|
-
|
|
399
|
-
|
|
420
|
+
} catch (error) {
|
|
421
|
+
onIgnoredError?.(error);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
},
|
|
400
426
|
);
|
|
401
427
|
return persister;
|
|
402
428
|
},
|
|
@@ -418,7 +444,10 @@ const createCustomPersister = (
|
|
|
418
444
|
await persister.schedule(async () => {
|
|
419
445
|
try {
|
|
420
446
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
421
|
-
} catch {
|
|
447
|
+
} catch (error) {
|
|
448
|
+
/* istanbul ignore next */
|
|
449
|
+
onIgnoredError?.(error);
|
|
450
|
+
}
|
|
422
451
|
loadSave = 0;
|
|
423
452
|
});
|
|
424
453
|
}
|
|
@@ -441,7 +470,7 @@ const createCustomPersister = (
|
|
|
441
470
|
return persister;
|
|
442
471
|
},
|
|
443
472
|
schedule: async (...actions) => {
|
|
444
|
-
arrayPush(
|
|
473
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
445
474
|
await run();
|
|
446
475
|
return persister;
|
|
447
476
|
},
|
|
@@ -458,28 +487,30 @@ const createJsonSqlitePersister = (
|
|
|
458
487
|
cmd,
|
|
459
488
|
addPersisterListener,
|
|
460
489
|
delPersisterListener,
|
|
490
|
+
onIgnoredError,
|
|
461
491
|
[storeTableName],
|
|
462
492
|
managedTableNames,
|
|
493
|
+
scheduleId,
|
|
463
494
|
) => {
|
|
464
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
465
|
-
cmd,
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
);
|
|
475
|
-
};
|
|
495
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
496
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
497
|
+
const getPersisted = async () =>
|
|
498
|
+
await transaction(async () => {
|
|
499
|
+
await refreshSchema();
|
|
500
|
+
return jsonParse(
|
|
501
|
+
(await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
|
|
502
|
+
SINGLE_ROW_ID
|
|
503
|
+
]?.[STORE_COLUMN] ?? 'null',
|
|
504
|
+
);
|
|
505
|
+
});
|
|
476
506
|
const setPersisted = async (getContent) =>
|
|
477
|
-
|
|
507
|
+
await transaction(async () => {
|
|
508
|
+
await refreshSchema();
|
|
478
509
|
await saveTable(
|
|
479
510
|
storeTableName,
|
|
480
511
|
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
481
512
|
{
|
|
482
|
-
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent())},
|
|
513
|
+
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent() ?? null)},
|
|
483
514
|
},
|
|
484
515
|
true,
|
|
485
516
|
true,
|
|
@@ -491,6 +522,8 @@ const createJsonSqlitePersister = (
|
|
|
491
522
|
setPersisted,
|
|
492
523
|
addPersisterListener,
|
|
493
524
|
delPersisterListener,
|
|
525
|
+
onIgnoredError,
|
|
526
|
+
scheduleId,
|
|
494
527
|
);
|
|
495
528
|
return persister;
|
|
496
529
|
};
|
|
@@ -500,17 +533,17 @@ const createTabularSqlitePersister = (
|
|
|
500
533
|
cmd,
|
|
501
534
|
addPersisterListener,
|
|
502
535
|
delPersisterListener,
|
|
536
|
+
onIgnoredError,
|
|
503
537
|
[
|
|
504
538
|
tablesLoadConfig,
|
|
505
539
|
tablesSaveConfig,
|
|
506
540
|
[valuesLoad, valuesSave, valuesTableName],
|
|
507
541
|
],
|
|
508
542
|
managedTableNames,
|
|
543
|
+
scheduleId,
|
|
509
544
|
) => {
|
|
510
|
-
const [refreshSchema, loadTable, saveTable] =
|
|
511
|
-
cmd,
|
|
512
|
-
managedTableNames,
|
|
513
|
-
);
|
|
545
|
+
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
546
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
514
547
|
const saveTables = async (tables, partial) =>
|
|
515
548
|
await promiseAll(
|
|
516
549
|
mapMap(
|
|
@@ -565,32 +598,36 @@ const createTabularSqlitePersister = (
|
|
|
565
598
|
SINGLE_ROW_ID
|
|
566
599
|
]
|
|
567
600
|
: {};
|
|
568
|
-
const getPersisted = async () =>
|
|
569
|
-
await
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
601
|
+
const getPersisted = async () =>
|
|
602
|
+
await transaction(async () => {
|
|
603
|
+
await refreshSchema();
|
|
604
|
+
const tables = await loadTables();
|
|
605
|
+
const values = await loadValues();
|
|
606
|
+
return !objIsEmpty(tables) || !isUndefined(values)
|
|
607
|
+
? [tables, values]
|
|
608
|
+
: void 0;
|
|
609
|
+
});
|
|
610
|
+
const setPersisted = async (getContent, getTransactionChanges) =>
|
|
611
|
+
await transaction(async () => {
|
|
612
|
+
await refreshSchema();
|
|
613
|
+
if (!isUndefined(getTransactionChanges)) {
|
|
614
|
+
const [tableChanges, valueChanges] = getTransactionChanges();
|
|
615
|
+
await saveTables(tableChanges, true);
|
|
616
|
+
await saveValues(valueChanges, true);
|
|
617
|
+
} else {
|
|
618
|
+
const [tables, values] = getContent();
|
|
619
|
+
await saveTables(tables);
|
|
620
|
+
await saveValues(values);
|
|
621
|
+
}
|
|
622
|
+
});
|
|
588
623
|
const persister = createCustomPersister(
|
|
589
624
|
store,
|
|
590
625
|
getPersisted,
|
|
591
626
|
setPersisted,
|
|
592
627
|
addPersisterListener,
|
|
593
628
|
delPersisterListener,
|
|
629
|
+
onIgnoredError,
|
|
630
|
+
scheduleId,
|
|
594
631
|
);
|
|
595
632
|
return persister;
|
|
596
633
|
};
|
|
@@ -697,7 +734,9 @@ const createSqlitePersister = (
|
|
|
697
734
|
cmd,
|
|
698
735
|
addUpdateListener,
|
|
699
736
|
delUpdateListener,
|
|
700
|
-
|
|
737
|
+
onSqlCommand,
|
|
738
|
+
onIgnoredError,
|
|
739
|
+
scheduleId,
|
|
701
740
|
) => {
|
|
702
741
|
let dataVersion;
|
|
703
742
|
let schemaVersion;
|
|
@@ -737,20 +776,28 @@ const createSqlitePersister = (
|
|
|
737
776
|
};
|
|
738
777
|
return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
|
|
739
778
|
store,
|
|
740
|
-
|
|
779
|
+
onSqlCommand
|
|
741
780
|
? async (sql, args) => {
|
|
742
|
-
|
|
781
|
+
onSqlCommand(sql, args);
|
|
743
782
|
return await cmd(sql, args);
|
|
744
783
|
}
|
|
745
784
|
: cmd,
|
|
746
785
|
addPersisterListener,
|
|
747
786
|
delPersisterListener,
|
|
787
|
+
onIgnoredError,
|
|
748
788
|
defaultedConfig,
|
|
749
789
|
collValues(managedTableNamesSet),
|
|
790
|
+
scheduleId,
|
|
750
791
|
);
|
|
751
792
|
};
|
|
752
793
|
|
|
753
|
-
const createExpoSqlitePersister = (
|
|
794
|
+
const createExpoSqlitePersister = (
|
|
795
|
+
store,
|
|
796
|
+
db,
|
|
797
|
+
configOrStoreTableName,
|
|
798
|
+
onSqlCommand,
|
|
799
|
+
onIgnoredError,
|
|
800
|
+
) =>
|
|
754
801
|
createSqlitePersister(
|
|
755
802
|
store,
|
|
756
803
|
configOrStoreTableName,
|
|
@@ -758,7 +805,9 @@ const createExpoSqlitePersister = (store, db, configOrStoreTableName, logSql) =>
|
|
|
758
805
|
(await db.execAsync([{sql, args}], false))[0].rows,
|
|
759
806
|
(listener) => db.onDatabaseChange(({tableName}) => listener(tableName)),
|
|
760
807
|
(subscription) => subscription.remove(),
|
|
761
|
-
|
|
808
|
+
onSqlCommand,
|
|
809
|
+
onIgnoredError,
|
|
810
|
+
db,
|
|
762
811
|
);
|
|
763
812
|
|
|
764
813
|
export {createExpoSqlitePersister};
|
|
@@ -26,32 +26,55 @@ const jsonString = (obj) =>
|
|
|
26
26
|
);
|
|
27
27
|
const jsonParse = JSON.parse;
|
|
28
28
|
|
|
29
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
30
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
31
|
+
|
|
32
|
+
const mapNew = (entries) => new Map(entries);
|
|
33
|
+
const mapGet = (map, key) => map?.get(key);
|
|
34
|
+
const mapSet = (map, key, value) =>
|
|
35
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
36
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
37
|
+
if (!collHas(map, key)) {
|
|
38
|
+
mapSet(map, key, getDefaultValue());
|
|
39
|
+
}
|
|
40
|
+
return mapGet(map, key);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const scheduleRunning = mapNew();
|
|
44
|
+
const scheduleActions = mapNew();
|
|
29
45
|
const createCustomPersister = (
|
|
30
46
|
store,
|
|
31
47
|
getPersisted,
|
|
32
48
|
setPersisted,
|
|
33
49
|
addPersisterListener,
|
|
34
50
|
delPersisterListener,
|
|
51
|
+
onIgnoredError,
|
|
52
|
+
scheduleId = [],
|
|
35
53
|
) => {
|
|
36
54
|
let listenerId;
|
|
37
55
|
let loadSave = 0;
|
|
38
56
|
let loads = 0;
|
|
39
57
|
let saves = 0;
|
|
40
|
-
let running = 0;
|
|
41
58
|
let listening = 0;
|
|
42
59
|
let action;
|
|
43
60
|
let listeningHandle;
|
|
44
|
-
|
|
61
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
62
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
45
63
|
const run = async () => {
|
|
46
64
|
/* istanbul ignore else */
|
|
47
|
-
if (!
|
|
48
|
-
|
|
49
|
-
while (
|
|
65
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
66
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
67
|
+
while (
|
|
68
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
69
|
+
) {
|
|
50
70
|
try {
|
|
51
71
|
await action();
|
|
52
|
-
} catch {
|
|
72
|
+
} catch (error) {
|
|
73
|
+
/* istanbul ignore next */
|
|
74
|
+
onIgnoredError?.(error);
|
|
75
|
+
}
|
|
53
76
|
}
|
|
54
|
-
|
|
77
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
55
78
|
}
|
|
56
79
|
};
|
|
57
80
|
const loadLock = async (actions) => {
|
|
@@ -82,16 +105,22 @@ const createCustomPersister = (
|
|
|
82
105
|
await persister.load(initialTables, initialValues);
|
|
83
106
|
listening = 1;
|
|
84
107
|
listeningHandle = addPersisterListener(
|
|
85
|
-
async (getContent, getTransactionChanges) =>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
108
|
+
async (getContent, getTransactionChanges) => {
|
|
109
|
+
if (getTransactionChanges) {
|
|
110
|
+
const transactionChanges = getTransactionChanges();
|
|
111
|
+
await loadLock(async () =>
|
|
112
|
+
store.setTransactionChanges(transactionChanges),
|
|
113
|
+
);
|
|
114
|
+
} else {
|
|
115
|
+
await loadLock(async () => {
|
|
90
116
|
try {
|
|
91
117
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
92
|
-
} catch {
|
|
93
|
-
|
|
94
|
-
|
|
118
|
+
} catch (error) {
|
|
119
|
+
onIgnoredError?.(error);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
},
|
|
95
124
|
);
|
|
96
125
|
return persister;
|
|
97
126
|
},
|
|
@@ -113,7 +142,10 @@ const createCustomPersister = (
|
|
|
113
142
|
await persister.schedule(async () => {
|
|
114
143
|
try {
|
|
115
144
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
116
|
-
} catch {
|
|
145
|
+
} catch (error) {
|
|
146
|
+
/* istanbul ignore next */
|
|
147
|
+
onIgnoredError?.(error);
|
|
148
|
+
}
|
|
117
149
|
loadSave = 0;
|
|
118
150
|
});
|
|
119
151
|
}
|
|
@@ -136,7 +168,7 @@ const createCustomPersister = (
|
|
|
136
168
|
return persister;
|
|
137
169
|
},
|
|
138
170
|
schedule: async (...actions) => {
|
|
139
|
-
arrayPush(
|
|
171
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
140
172
|
await run();
|
|
141
173
|
return persister;
|
|
142
174
|
},
|
|
@@ -147,7 +179,7 @@ const createCustomPersister = (
|
|
|
147
179
|
return objFreeze(persister);
|
|
148
180
|
};
|
|
149
181
|
|
|
150
|
-
const createFilePersister = (store, filePath) => {
|
|
182
|
+
const createFilePersister = (store, filePath, onIgnoredError) => {
|
|
151
183
|
const getPersisted = async () => jsonParse(await readFile(filePath, UTF8));
|
|
152
184
|
const setPersisted = async (getContent) =>
|
|
153
185
|
await writeFile(filePath, jsonString(getContent()), UTF8);
|
|
@@ -159,6 +191,7 @@ const createFilePersister = (store, filePath) => {
|
|
|
159
191
|
setPersisted,
|
|
160
192
|
addPersisterListener,
|
|
161
193
|
delPersisterListener,
|
|
194
|
+
onIgnoredError,
|
|
162
195
|
);
|
|
163
196
|
};
|
|
164
197
|
|
|
@@ -21,32 +21,55 @@ const jsonString = (obj) =>
|
|
|
21
21
|
);
|
|
22
22
|
const jsonParse = JSON.parse;
|
|
23
23
|
|
|
24
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
25
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
26
|
+
|
|
27
|
+
const mapNew = (entries) => new Map(entries);
|
|
28
|
+
const mapGet = (map, key) => map?.get(key);
|
|
29
|
+
const mapSet = (map, key, value) =>
|
|
30
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
31
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
32
|
+
if (!collHas(map, key)) {
|
|
33
|
+
mapSet(map, key, getDefaultValue());
|
|
34
|
+
}
|
|
35
|
+
return mapGet(map, key);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const scheduleRunning = mapNew();
|
|
39
|
+
const scheduleActions = mapNew();
|
|
24
40
|
const createCustomPersister = (
|
|
25
41
|
store,
|
|
26
42
|
getPersisted,
|
|
27
43
|
setPersisted,
|
|
28
44
|
addPersisterListener,
|
|
29
45
|
delPersisterListener,
|
|
46
|
+
onIgnoredError,
|
|
47
|
+
scheduleId = [],
|
|
30
48
|
) => {
|
|
31
49
|
let listenerId;
|
|
32
50
|
let loadSave = 0;
|
|
33
51
|
let loads = 0;
|
|
34
52
|
let saves = 0;
|
|
35
|
-
let running = 0;
|
|
36
53
|
let listening = 0;
|
|
37
54
|
let action;
|
|
38
55
|
let listeningHandle;
|
|
39
|
-
|
|
56
|
+
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
57
|
+
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
40
58
|
const run = async () => {
|
|
41
59
|
/* istanbul ignore else */
|
|
42
|
-
if (!
|
|
43
|
-
|
|
44
|
-
while (
|
|
60
|
+
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
61
|
+
mapSet(scheduleRunning, scheduleId, 1);
|
|
62
|
+
while (
|
|
63
|
+
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
64
|
+
) {
|
|
45
65
|
try {
|
|
46
66
|
await action();
|
|
47
|
-
} catch {
|
|
67
|
+
} catch (error) {
|
|
68
|
+
/* istanbul ignore next */
|
|
69
|
+
onIgnoredError?.(error);
|
|
70
|
+
}
|
|
48
71
|
}
|
|
49
|
-
|
|
72
|
+
mapSet(scheduleRunning, scheduleId, 0);
|
|
50
73
|
}
|
|
51
74
|
};
|
|
52
75
|
const loadLock = async (actions) => {
|
|
@@ -77,16 +100,22 @@ const createCustomPersister = (
|
|
|
77
100
|
await persister.load(initialTables, initialValues);
|
|
78
101
|
listening = 1;
|
|
79
102
|
listeningHandle = addPersisterListener(
|
|
80
|
-
async (getContent, getTransactionChanges) =>
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
async (getContent, getTransactionChanges) => {
|
|
104
|
+
if (getTransactionChanges) {
|
|
105
|
+
const transactionChanges = getTransactionChanges();
|
|
106
|
+
await loadLock(async () =>
|
|
107
|
+
store.setTransactionChanges(transactionChanges),
|
|
108
|
+
);
|
|
109
|
+
} else {
|
|
110
|
+
await loadLock(async () => {
|
|
85
111
|
try {
|
|
86
112
|
store.setContent(getContent?.() ?? (await getPersisted()));
|
|
87
|
-
} catch {
|
|
88
|
-
|
|
89
|
-
|
|
113
|
+
} catch (error) {
|
|
114
|
+
onIgnoredError?.(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
},
|
|
90
119
|
);
|
|
91
120
|
return persister;
|
|
92
121
|
},
|
|
@@ -108,7 +137,10 @@ const createCustomPersister = (
|
|
|
108
137
|
await persister.schedule(async () => {
|
|
109
138
|
try {
|
|
110
139
|
await setPersisted(store.getContent, getTransactionChanges);
|
|
111
|
-
} catch {
|
|
140
|
+
} catch (error) {
|
|
141
|
+
/* istanbul ignore next */
|
|
142
|
+
onIgnoredError?.(error);
|
|
143
|
+
}
|
|
112
144
|
loadSave = 0;
|
|
113
145
|
});
|
|
114
146
|
}
|
|
@@ -131,7 +163,7 @@ const createCustomPersister = (
|
|
|
131
163
|
return persister;
|
|
132
164
|
},
|
|
133
165
|
schedule: async (...actions) => {
|
|
134
|
-
arrayPush(
|
|
166
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
135
167
|
await run();
|
|
136
168
|
return persister;
|
|
137
169
|
},
|
|
@@ -148,6 +180,7 @@ const createRemotePersister = (
|
|
|
148
180
|
loadUrl,
|
|
149
181
|
saveUrl,
|
|
150
182
|
autoLoadIntervalSeconds,
|
|
183
|
+
onIgnoredError,
|
|
151
184
|
) => {
|
|
152
185
|
let lastEtag;
|
|
153
186
|
const getPersisted = async () => {
|
|
@@ -181,6 +214,7 @@ const createRemotePersister = (
|
|
|
181
214
|
setPersisted,
|
|
182
215
|
addPersisterListener,
|
|
183
216
|
delPersisterListener,
|
|
217
|
+
onIgnoredError,
|
|
184
218
|
);
|
|
185
219
|
};
|
|
186
220
|
|