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.
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 -1
  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 -1
  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 +111 -62
  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 +111 -62
  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 -1
  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 -1
  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 +8 -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 +10 -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 -1
  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 -1
  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 +5 -5
  165. package/readme.md +2 -2
@@ -32,32 +32,55 @@ const objEnsure = (obj, id, getDefaultValue) => {
32
32
  return obj[id];
33
33
  };
34
34
 
35
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
36
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
37
+
38
+ const mapNew = (entries) => new Map(entries);
39
+ const mapGet = (map, key) => map?.get(key);
40
+ const mapSet = (map, key, value) =>
41
+ isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
42
+ const mapEnsure = (map, key, getDefaultValue) => {
43
+ if (!collHas(map, key)) {
44
+ mapSet(map, key, getDefaultValue());
45
+ }
46
+ return mapGet(map, key);
47
+ };
48
+
49
+ const scheduleRunning = mapNew();
50
+ const scheduleActions = mapNew();
35
51
  const createCustomPersister = (
36
52
  store,
37
53
  getPersisted,
38
54
  setPersisted,
39
55
  addPersisterListener,
40
56
  delPersisterListener,
57
+ onIgnoredError,
58
+ scheduleId = [],
41
59
  ) => {
42
60
  let listenerId;
43
61
  let loadSave = 0;
44
62
  let loads = 0;
45
63
  let saves = 0;
46
- let running = 0;
47
64
  let listening = 0;
48
65
  let action;
49
66
  let listeningHandle;
50
- const scheduledActions = [];
67
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
68
+ mapEnsure(scheduleActions, scheduleId, () => []);
51
69
  const run = async () => {
52
70
  /* istanbul ignore else */
53
- if (!running) {
54
- running = 1;
55
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
71
+ if (!mapGet(scheduleRunning, scheduleId)) {
72
+ mapSet(scheduleRunning, scheduleId, 1);
73
+ while (
74
+ !isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
75
+ ) {
56
76
  try {
57
77
  await action();
58
- } catch {}
78
+ } catch (error) {
79
+ /* istanbul ignore next */
80
+ onIgnoredError?.(error);
81
+ }
59
82
  }
60
- running = 0;
83
+ mapSet(scheduleRunning, scheduleId, 0);
61
84
  }
62
85
  };
63
86
  const loadLock = async (actions) => {
@@ -88,16 +111,22 @@ const createCustomPersister = (
88
111
  await persister.load(initialTables, initialValues);
89
112
  listening = 1;
90
113
  listeningHandle = addPersisterListener(
91
- async (getContent, getTransactionChanges) =>
92
- await loadLock(async () => {
93
- if (getTransactionChanges) {
94
- store.setTransactionChanges(getTransactionChanges());
95
- } else {
114
+ async (getContent, getTransactionChanges) => {
115
+ if (getTransactionChanges) {
116
+ const transactionChanges = getTransactionChanges();
117
+ await loadLock(async () =>
118
+ store.setTransactionChanges(transactionChanges),
119
+ );
120
+ } else {
121
+ await loadLock(async () => {
96
122
  try {
97
123
  store.setContent(getContent?.() ?? (await getPersisted()));
98
- } catch {}
99
- }
100
- }),
124
+ } catch (error) {
125
+ onIgnoredError?.(error);
126
+ }
127
+ });
128
+ }
129
+ },
101
130
  );
102
131
  return persister;
103
132
  },
@@ -119,7 +148,10 @@ const createCustomPersister = (
119
148
  await persister.schedule(async () => {
120
149
  try {
121
150
  await setPersisted(store.getContent, getTransactionChanges);
122
- } catch {}
151
+ } catch (error) {
152
+ /* istanbul ignore next */
153
+ onIgnoredError?.(error);
154
+ }
123
155
  loadSave = 0;
124
156
  });
125
157
  }
@@ -142,7 +174,7 @@ const createCustomPersister = (
142
174
  return persister;
143
175
  },
144
176
  schedule: async (...actions) => {
145
- arrayPush(scheduledActions, ...actions);
177
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
146
178
  await run();
147
179
  return persister;
148
180
  },
@@ -251,7 +283,12 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
251
283
  }
252
284
  return changed;
253
285
  };
254
- const createAutomergePersister = (store, docHandle, docObjName = TINYBASE) => {
286
+ const createAutomergePersister = (
287
+ store,
288
+ docHandle,
289
+ docObjName = TINYBASE,
290
+ onIgnoredError,
291
+ ) => {
255
292
  docHandle.change((doc) => (doc[docObjName] = {}));
256
293
  const getPersisted = async () =>
257
294
  objSize(docHandle.doc[docObjName]) == 2
@@ -280,6 +317,7 @@ const createAutomergePersister = (store, docHandle, docObjName = TINYBASE) => {
280
317
  setPersisted,
281
318
  addPersisterListener,
282
319
  delPersisterListener,
320
+ onIgnoredError,
283
321
  );
284
322
  };
285
323
 
@@ -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
- const scheduledActions = [];
56
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
57
+ mapEnsure(scheduleActions, scheduleId, () => []);
40
58
  const run = async () => {
41
59
  /* istanbul ignore else */
42
- if (!running) {
43
- running = 1;
44
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
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
- running = 0;
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
- await loadLock(async () => {
82
- if (getTransactionChanges) {
83
- store.setTransactionChanges(getTransactionChanges());
84
- } else {
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(scheduledActions, ...actions);
166
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
135
167
  await run();
136
168
  return persister;
137
169
  },
@@ -144,7 +176,7 @@ const createCustomPersister = (
144
176
 
145
177
  const STORAGE = 'storage';
146
178
  const WINDOW = globalThis.window;
147
- const getStoragePersister = (store, storageName, storage) => {
179
+ const getStoragePersister = (store, storageName, storage, onIgnoredError) => {
148
180
  const getPersisted = async () => jsonParse(storage.getItem(storageName));
149
181
  const setPersisted = async (getContent) =>
150
182
  storage.setItem(storageName, jsonString(getContent()));
@@ -165,11 +197,12 @@ const getStoragePersister = (store, storageName, storage) => {
165
197
  setPersisted,
166
198
  addPersisterListener,
167
199
  delPersisterListener,
200
+ onIgnoredError,
168
201
  );
169
202
  };
170
- const createLocalPersister = (store, storageName) =>
171
- getStoragePersister(store, storageName, localStorage);
172
- const createSessionPersister = (store, storageName) =>
173
- getStoragePersister(store, storageName, sessionStorage);
203
+ const createLocalPersister = (store, storageName, onIgnoredError) =>
204
+ getStoragePersister(store, storageName, localStorage, onIgnoredError);
205
+ const createSessionPersister = (store, storageName, onIgnoredError) =>
206
+ getStoragePersister(store, storageName, sessionStorage, onIgnoredError);
174
207
 
175
208
  export {createLocalPersister, createSessionPersister};
@@ -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
- return [refreshSchema, loadTable, saveTable];
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
- const scheduledActions = [];
363
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
364
+ mapEnsure(scheduleActions, scheduleId, () => []);
350
365
  const run = async () => {
351
366
  /* istanbul ignore else */
352
- if (!running) {
353
- running = 1;
354
- while (!isUndefined((action = arrayShift(scheduledActions)))) {
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
- running = 0;
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
- await loadLock(async () => {
392
- if (getTransactionChanges) {
393
- store.setTransactionChanges(getTransactionChanges());
394
- } else {
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(scheduledActions, ...actions);
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] = getCommandFunctions(
465
- cmd,
466
- managedTableNames,
467
- );
468
- const getPersisted = async () => {
469
- await refreshSchema();
470
- return jsonParse(
471
- (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
472
- SINGLE_ROW_ID
473
- ]?.[STORE_COLUMN],
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
- persister.schedule(refreshSchema, async () => {
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] = getCommandFunctions(
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 refreshSchema();
570
- const tables = await loadTables();
571
- const values = await loadValues();
572
- return !objIsEmpty(tables) || !isUndefined(values)
573
- ? [tables, values]
574
- : void 0;
575
- };
576
- const setPersisted = async (getContent, getTransactionChanges) => {
577
- await refreshSchema();
578
- if (!isUndefined(getTransactionChanges)) {
579
- const [tableChanges, valueChanges] = getTransactionChanges();
580
- await saveTables(tableChanges, true);
581
- await saveValues(valueChanges, true);
582
- } else {
583
- const [tables, values] = getContent();
584
- await saveTables(tables);
585
- await saveValues(values);
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
- logSql,
737
+ onSqlCommand,
738
+ onIgnoredError,
739
+ scheduleId,
701
740
  ) => {
702
741
  let dataVersion;
703
742
  let schemaVersion;
@@ -737,16 +776,18 @@ const createSqlitePersister = (
737
776
  };
738
777
  return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
739
778
  store,
740
- logSql
779
+ onSqlCommand
741
780
  ? async (sql, args) => {
742
- logSql(sql, args);
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
 
@@ -754,7 +795,8 @@ const createCrSqliteWasmPersister = (
754
795
  store,
755
796
  db,
756
797
  configOrStoreTableName,
757
- logSql,
798
+ onSqlCommand,
799
+ onIgnoredError,
758
800
  ) =>
759
801
  createSqlitePersister(
760
802
  store,
@@ -762,7 +804,9 @@ const createCrSqliteWasmPersister = (
762
804
  async (sql, args = []) => await db.execO(sql, args),
763
805
  (listener) => db.onUpdate((_, _2, tableName) => listener(tableName)),
764
806
  (removeListener) => removeListener(),
765
- logSql,
807
+ onSqlCommand,
808
+ onIgnoredError,
809
+ db,
766
810
  );
767
811
 
768
812
  export {createCrSqliteWasmPersister};