tinybase 4.0.0-beta.4 → 4.0.0-beta.5.1

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 (269) hide show
  1. package/lib/cjs/persisters/persister-automerge.cjs +1 -0
  2. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-browser.cjs +1 -0
  4. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  6. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-file.cjs +1 -0
  8. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-remote.cjs +1 -0
  10. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
  12. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
  14. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-yjs.cjs +1 -0
  16. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  17. package/lib/cjs/persisters.cjs +1 -1
  18. package/lib/cjs/persisters.cjs.gz +0 -0
  19. package/lib/cjs/store.cjs +1 -1
  20. package/lib/cjs/store.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/tools.cjs +1 -1
  24. package/lib/cjs/tools.cjs.gz +0 -0
  25. package/lib/cjs/ui-react.cjs +1 -1
  26. package/lib/cjs/ui-react.cjs.gz +0 -0
  27. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
  28. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
  30. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  32. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  33. package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
  34. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  35. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
  36. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
  38. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
  40. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  41. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
  42. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs-es6/persisters.cjs +1 -1
  44. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  45. package/lib/cjs-es6/store.cjs +1 -1
  46. package/lib/cjs-es6/store.cjs.gz +0 -0
  47. package/lib/cjs-es6/tinybase.cjs +1 -1
  48. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  49. package/lib/cjs-es6/tools.cjs +1 -1
  50. package/lib/cjs-es6/tools.cjs.gz +0 -0
  51. package/lib/cjs-es6/ui-react.cjs +1 -1
  52. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  53. package/lib/debug/{persister-automerge.js → persisters/persister-automerge.js} +58 -31
  54. package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +49 -20
  55. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
  56. package/lib/debug/{persister-file.js → persisters/persister-file.js} +51 -25
  57. package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +48 -19
  58. package/lib/debug/persisters/persister-sqlite-wasm.js +673 -0
  59. package/lib/debug/persisters/persister-sqlite3.js +676 -0
  60. package/lib/debug/{persister-yjs.js → persisters/persister-yjs.js} +49 -20
  61. package/lib/debug/persisters.js +47 -18
  62. package/lib/debug/store.js +79 -29
  63. package/lib/debug/tinybase.js +123 -46
  64. package/lib/debug/tools.js +121 -27
  65. package/lib/debug/ui-react.js +24 -0
  66. package/lib/es6/persisters/persister-automerge.js +1 -0
  67. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  68. package/lib/es6/persisters/persister-browser.js +1 -0
  69. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  70. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  71. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  72. package/lib/es6/persisters/persister-file.js +1 -0
  73. package/lib/es6/persisters/persister-file.js.gz +0 -0
  74. package/lib/es6/persisters/persister-remote.js +1 -0
  75. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  76. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
  77. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  78. package/lib/es6/persisters/persister-sqlite3.js +1 -0
  79. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  80. package/lib/es6/persisters/persister-yjs.js +1 -0
  81. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  82. package/lib/es6/persisters.js +1 -1
  83. package/lib/es6/persisters.js.gz +0 -0
  84. package/lib/es6/store.js +1 -1
  85. package/lib/es6/store.js.gz +0 -0
  86. package/lib/es6/tinybase.js +1 -1
  87. package/lib/es6/tinybase.js.gz +0 -0
  88. package/lib/es6/tools.js +1 -1
  89. package/lib/es6/tools.js.gz +0 -0
  90. package/lib/es6/ui-react.js +1 -1
  91. package/lib/es6/ui-react.js.gz +0 -0
  92. package/lib/persisters/persister-automerge.js +1 -0
  93. package/lib/persisters/persister-automerge.js.gz +0 -0
  94. package/lib/persisters/persister-browser.js +1 -0
  95. package/lib/persisters/persister-browser.js.gz +0 -0
  96. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
  97. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  98. package/lib/persisters/persister-file.js +1 -0
  99. package/lib/persisters/persister-file.js.gz +0 -0
  100. package/lib/persisters/persister-remote.js +1 -0
  101. package/lib/persisters/persister-remote.js.gz +0 -0
  102. package/lib/persisters/persister-sqlite-wasm.js +1 -0
  103. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  104. package/lib/persisters/persister-sqlite3.js +1 -0
  105. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  106. package/lib/persisters/persister-yjs.js +1 -0
  107. package/lib/persisters/persister-yjs.js.gz +0 -0
  108. package/lib/persisters.js +1 -1
  109. package/lib/persisters.js.gz +0 -0
  110. package/lib/store.js +1 -1
  111. package/lib/store.js.gz +0 -0
  112. package/lib/tinybase.js +1 -1
  113. package/lib/tinybase.js.gz +0 -0
  114. package/lib/tools.js +1 -1
  115. package/lib/tools.js.gz +0 -0
  116. package/lib/types/checkpoints.d.ts +0 -27
  117. package/lib/types/common.d.ts +0 -9
  118. package/lib/types/indexes.d.ts +0 -26
  119. package/lib/types/metrics.d.ts +0 -23
  120. package/lib/types/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  121. package/lib/types/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  122. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +95 -0
  123. package/lib/types/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  124. package/lib/types/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  125. package/lib/types/persisters/persister-sqlite-wasm.d.ts +102 -0
  126. package/lib/types/persisters/persister-sqlite3.d.ts +109 -0
  127. package/lib/types/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  128. package/lib/types/persisters.d.ts +517 -27
  129. package/lib/types/queries.d.ts +52 -127
  130. package/lib/types/relationships.d.ts +0 -26
  131. package/lib/types/store.d.ts +347 -196
  132. package/lib/types/tinybase.d.ts +0 -1
  133. package/lib/types/tools.d.ts +15 -28
  134. package/lib/types/ui-react.d.ts +196 -181
  135. package/lib/types/with-schemas/checkpoints.d.ts +5 -32
  136. package/lib/types/with-schemas/common.d.ts +0 -9
  137. package/lib/types/with-schemas/indexes.d.ts +9 -35
  138. package/lib/types/with-schemas/metrics.d.ts +9 -32
  139. package/lib/types/with-schemas/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  140. package/lib/types/with-schemas/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  141. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +105 -0
  142. package/lib/types/with-schemas/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  143. package/lib/types/with-schemas/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  144. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +113 -0
  145. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +119 -0
  146. package/lib/types/with-schemas/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  147. package/lib/types/with-schemas/persisters.d.ts +534 -29
  148. package/lib/types/with-schemas/queries.d.ts +61 -224
  149. package/lib/types/with-schemas/relationships.d.ts +9 -35
  150. package/lib/types/with-schemas/store.d.ts +488 -239
  151. package/lib/types/with-schemas/tinybase.d.ts +0 -1
  152. package/lib/types/with-schemas/tools.d.ts +19 -32
  153. package/lib/types/with-schemas/ui-react.d.ts +221 -186
  154. package/lib/ui-react.js +1 -1
  155. package/lib/ui-react.js.gz +0 -0
  156. package/lib/umd/persisters/persister-automerge.js +1 -0
  157. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  158. package/lib/umd/persisters/persister-browser.js +1 -0
  159. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  160. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
  161. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  162. package/lib/umd/persisters/persister-file.js +1 -0
  163. package/lib/umd/persisters/persister-file.js.gz +0 -0
  164. package/lib/umd/persisters/persister-remote.js +1 -0
  165. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  166. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
  167. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  168. package/lib/umd/persisters/persister-sqlite3.js +1 -0
  169. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  170. package/lib/umd/persisters/persister-yjs.js +1 -0
  171. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  172. package/lib/umd/persisters.js +1 -1
  173. package/lib/umd/persisters.js.gz +0 -0
  174. package/lib/umd/store.js +1 -1
  175. package/lib/umd/store.js.gz +0 -0
  176. package/lib/umd/tinybase.js +1 -1
  177. package/lib/umd/tinybase.js.gz +0 -0
  178. package/lib/umd/tools.js +1 -1
  179. package/lib/umd/tools.js.gz +0 -0
  180. package/lib/umd/ui-react.js +1 -1
  181. package/lib/umd/ui-react.js.gz +0 -0
  182. package/lib/umd-es6/persisters/persister-automerge.js +1 -0
  183. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  184. package/lib/umd-es6/persisters/persister-browser.js +1 -0
  185. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  186. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  187. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  188. package/lib/umd-es6/persisters/persister-file.js +1 -0
  189. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  190. package/lib/umd-es6/persisters/persister-remote.js +1 -0
  191. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  192. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
  193. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  194. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
  195. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  196. package/lib/umd-es6/persisters/persister-yjs.js +1 -0
  197. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  198. package/lib/umd-es6/persisters.js +1 -1
  199. package/lib/umd-es6/persisters.js.gz +0 -0
  200. package/lib/umd-es6/store.js +1 -1
  201. package/lib/umd-es6/store.js.gz +0 -0
  202. package/lib/umd-es6/tinybase.js +1 -1
  203. package/lib/umd-es6/tinybase.js.gz +0 -0
  204. package/lib/umd-es6/tools.js +1 -1
  205. package/lib/umd-es6/tools.js.gz +0 -0
  206. package/lib/umd-es6/ui-react.js +1 -1
  207. package/lib/umd-es6/ui-react.js.gz +0 -0
  208. package/package.json +39 -22
  209. package/readme.md +3 -3
  210. package/lib/cjs/persister-automerge.cjs +0 -1
  211. package/lib/cjs/persister-automerge.cjs.gz +0 -0
  212. package/lib/cjs/persister-browser.cjs +0 -1
  213. package/lib/cjs/persister-browser.cjs.gz +0 -0
  214. package/lib/cjs/persister-file.cjs +0 -1
  215. package/lib/cjs/persister-file.cjs.gz +0 -0
  216. package/lib/cjs/persister-remote.cjs +0 -1
  217. package/lib/cjs/persister-remote.cjs.gz +0 -0
  218. package/lib/cjs/persister-yjs.cjs +0 -1
  219. package/lib/cjs/persister-yjs.cjs.gz +0 -0
  220. package/lib/cjs-es6/persister-automerge.cjs +0 -1
  221. package/lib/cjs-es6/persister-automerge.cjs.gz +0 -0
  222. package/lib/cjs-es6/persister-browser.cjs +0 -1
  223. package/lib/cjs-es6/persister-browser.cjs.gz +0 -0
  224. package/lib/cjs-es6/persister-file.cjs +0 -1
  225. package/lib/cjs-es6/persister-file.cjs.gz +0 -0
  226. package/lib/cjs-es6/persister-remote.cjs +0 -1
  227. package/lib/cjs-es6/persister-remote.cjs.gz +0 -0
  228. package/lib/cjs-es6/persister-yjs.cjs +0 -1
  229. package/lib/cjs-es6/persister-yjs.cjs.gz +0 -0
  230. package/lib/es6/persister-automerge.js +0 -1
  231. package/lib/es6/persister-automerge.js.gz +0 -0
  232. package/lib/es6/persister-browser.js +0 -1
  233. package/lib/es6/persister-browser.js.gz +0 -0
  234. package/lib/es6/persister-file.js +0 -1
  235. package/lib/es6/persister-file.js.gz +0 -0
  236. package/lib/es6/persister-remote.js +0 -1
  237. package/lib/es6/persister-remote.js.gz +0 -0
  238. package/lib/es6/persister-yjs.js +0 -1
  239. package/lib/es6/persister-yjs.js.gz +0 -0
  240. package/lib/persister-automerge.js +0 -1
  241. package/lib/persister-automerge.js.gz +0 -0
  242. package/lib/persister-browser.js +0 -1
  243. package/lib/persister-browser.js.gz +0 -0
  244. package/lib/persister-file.js +0 -1
  245. package/lib/persister-file.js.gz +0 -0
  246. package/lib/persister-remote.js +0 -1
  247. package/lib/persister-remote.js.gz +0 -0
  248. package/lib/persister-yjs.js +0 -1
  249. package/lib/persister-yjs.js.gz +0 -0
  250. package/lib/umd/persister-automerge.js +0 -1
  251. package/lib/umd/persister-automerge.js.gz +0 -0
  252. package/lib/umd/persister-browser.js +0 -1
  253. package/lib/umd/persister-browser.js.gz +0 -0
  254. package/lib/umd/persister-file.js +0 -1
  255. package/lib/umd/persister-file.js.gz +0 -0
  256. package/lib/umd/persister-remote.js +0 -1
  257. package/lib/umd/persister-remote.js.gz +0 -0
  258. package/lib/umd/persister-yjs.js +0 -1
  259. package/lib/umd/persister-yjs.js.gz +0 -0
  260. package/lib/umd-es6/persister-automerge.js +0 -1
  261. package/lib/umd-es6/persister-automerge.js.gz +0 -0
  262. package/lib/umd-es6/persister-browser.js +0 -1
  263. package/lib/umd-es6/persister-browser.js.gz +0 -0
  264. package/lib/umd-es6/persister-file.js +0 -1
  265. package/lib/umd-es6/persister-file.js.gz +0 -0
  266. package/lib/umd-es6/persister-remote.js +0 -1
  267. package/lib/umd-es6/persister-remote.js.gz +0 -0
  268. package/lib/umd-es6/persister-yjs.js +0 -1
  269. package/lib/umd-es6/persister-yjs.js.gz +0 -0
@@ -1,6 +1,9 @@
1
+ const TINYBASE = 'tinybase';
2
+
1
3
  const arrayMap = (array, cb) => array.map(cb);
2
4
  const arrayLength = (array) => array.length;
3
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
5
+ const arrayPush = (array, ...values) => array.push(...values);
6
+ const arrayShift = (array) => array.shift();
4
7
 
5
8
  const isInstanceOf = (thing, cls) => thing instanceof cls;
6
9
  const isUndefined = (thing) => thing == void 0;
@@ -14,10 +17,14 @@ const isObject = (obj) =>
14
17
  isInstanceOf(obj, object) && obj.constructor == object;
15
18
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
16
19
  const objHas = (obj, id) => !isUndefined(objGet(obj, id));
17
- const objDel = (obj, id) => delete obj[id];
20
+ const objDel = (obj, id) => {
21
+ delete obj[id];
22
+ return obj;
23
+ };
18
24
  const objMap = (obj, cb) =>
19
25
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
20
- const objIsEmpty = (obj) => isObject(obj) && arrayIsEmpty(objIds(obj));
26
+ const objSize = (obj) => arrayLength(objIds(obj));
27
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
21
28
  const objEnsure = (obj, id, getDefaultValue) => {
22
29
  if (!objHas(obj, id)) {
23
30
  obj[id] = getDefaultValue();
@@ -36,8 +43,23 @@ const createCustomPersister = (
36
43
  let loadSave = 0;
37
44
  let loads = 0;
38
45
  let saves = 0;
39
- let listening = false;
46
+ let running = 0;
47
+ let listening = 0;
48
+ let action;
40
49
  let listeningHandle;
50
+ const scheduledActions = [];
51
+ const run = async () => {
52
+ /* istanbul ignore else */
53
+ if (!running) {
54
+ running = 1;
55
+ while (!isUndefined((action = arrayShift(scheduledActions)))) {
56
+ try {
57
+ await action();
58
+ } catch {}
59
+ }
60
+ running = 0;
61
+ }
62
+ };
41
63
  const loadLock = async (actions) => {
42
64
  /* istanbul ignore else */
43
65
  if (loadSave != 2) {
@@ -50,20 +72,20 @@ const createCustomPersister = (
50
72
  }
51
73
  };
52
74
  const persister = {
53
- load: async (initialTables = {}, initialValues = {}) => {
75
+ load: async (initialTables, initialValues) => {
54
76
  await loadLock(async () => {
55
- let content;
56
77
  try {
57
- content = await getPersisted();
58
- } catch {}
59
- store.setContent(content ?? [initialTables, initialValues]);
78
+ store.setContent(await getPersisted());
79
+ } catch {
80
+ store.setContent([initialTables, initialValues]);
81
+ }
60
82
  });
61
83
  return persister;
62
84
  },
63
85
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
64
86
  persister.stopAutoLoad();
65
87
  await persister.load(initialTables, initialValues);
66
- listening = true;
88
+ listening = 1;
67
89
  listeningHandle = addPersisterListener(
68
90
  async (getContent, getTransactionChanges) => {
69
91
  await loadLock(async () => {
@@ -83,27 +105,33 @@ const createCustomPersister = (
83
105
  if (listening) {
84
106
  delPersisterListener(listeningHandle);
85
107
  listeningHandle = void 0;
86
- listening = false;
108
+ listening = 0;
87
109
  }
88
110
  return persister;
89
111
  },
90
112
  save: async (getTransactionChanges) => {
91
- /* istanbul ignore else */
92
- if (loadSave != 1) {
93
- loadSave = 2;
94
- {
95
- saves++;
113
+ await persister.schedule(async () => {
114
+ /* istanbul ignore else */
115
+ if (loadSave != 1) {
116
+ loadSave = 2;
117
+ {
118
+ saves++;
119
+ }
120
+ try {
121
+ await setPersisted(store.getContent, getTransactionChanges);
122
+ } catch {}
123
+ loadSave = 0;
96
124
  }
97
- await setPersisted(store.getContent, getTransactionChanges);
98
- loadSave = 0;
99
- }
125
+ });
100
126
  return persister;
101
127
  },
102
128
  startAutoSave: async () => {
103
129
  await persister.stopAutoSave().save();
104
130
  listenerId = store.addDidFinishTransactionListener(
105
- (_store, getTransactionChanges) =>
106
- persister.save(getTransactionChanges),
131
+ (_store, getTransactionChanges) => {
132
+ const transactionChanges = getTransactionChanges();
133
+ persister.save(() => transactionChanges);
134
+ },
107
135
  );
108
136
  return persister;
109
137
  },
@@ -111,6 +139,11 @@ const createCustomPersister = (
111
139
  ifNotUndefined(listenerId, store.delListener);
112
140
  return persister;
113
141
  },
142
+ schedule: async (...actions) => {
143
+ arrayPush(scheduledActions, ...actions);
144
+ await run();
145
+ return persister;
146
+ },
114
147
  getStore: () => store,
115
148
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
116
149
  getStats: () => ({loads, saves}),
@@ -216,18 +249,13 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
216
249
  }
217
250
  return changed;
218
251
  };
219
- const createAutomergePersister = (
220
- store,
221
- docHandle,
222
- docObjName = 'tinybase',
223
- ) => {
252
+ const createAutomergePersister = (store, docHandle, docObjName = TINYBASE) => {
224
253
  docHandle.change((doc) => (doc[docObjName] = {}));
225
- const getPersisted = async () => {
226
- return arrayLength(objIds(docHandle.doc[docObjName])) == 2
254
+ const getPersisted = async () =>
255
+ objSize(docHandle.doc[docObjName]) == 2
227
256
  ? getDocContent(docHandle.doc, docObjName)
228
257
  : void 0;
229
- };
230
- const setPersisted = async (getContent, getTransactionChanges) => {
258
+ const setPersisted = async (getContent, getTransactionChanges) =>
231
259
  docHandle.change((doc) =>
232
260
  setTransactionChangesToDoc(
233
261
  doc,
@@ -236,7 +264,6 @@ const createAutomergePersister = (
236
264
  getTransactionChanges,
237
265
  ),
238
266
  );
239
- };
240
267
  const addPersisterListener = (listener) => {
241
268
  const observer = ({doc}) => listener(() => getDocContent(doc, docObjName));
242
269
  docHandle.on('change', observer);
@@ -1,4 +1,6 @@
1
1
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
2
+ const arrayPush = (array, ...values) => array.push(...values);
3
+ const arrayShift = (array) => array.shift();
2
4
 
3
5
  const jsonString = (obj) =>
4
6
  JSON.stringify(obj, (_key, value) =>
@@ -13,6 +15,7 @@ const jsonString = (obj) =>
13
15
  )
14
16
  : value,
15
17
  );
18
+ const jsonParse = JSON.parse;
16
19
  const isInstanceOf = (thing, cls) => thing instanceof cls;
17
20
  const isUndefined = (thing) => thing == void 0;
18
21
  const ifNotUndefined = (value, then, otherwise) =>
@@ -32,8 +35,23 @@ const createCustomPersister = (
32
35
  let loadSave = 0;
33
36
  let loads = 0;
34
37
  let saves = 0;
35
- let listening = false;
38
+ let running = 0;
39
+ let listening = 0;
40
+ let action;
36
41
  let listeningHandle;
42
+ const scheduledActions = [];
43
+ const run = async () => {
44
+ /* istanbul ignore else */
45
+ if (!running) {
46
+ running = 1;
47
+ while (!isUndefined((action = arrayShift(scheduledActions)))) {
48
+ try {
49
+ await action();
50
+ } catch {}
51
+ }
52
+ running = 0;
53
+ }
54
+ };
37
55
  const loadLock = async (actions) => {
38
56
  /* istanbul ignore else */
39
57
  if (loadSave != 2) {
@@ -46,20 +64,20 @@ const createCustomPersister = (
46
64
  }
47
65
  };
48
66
  const persister = {
49
- load: async (initialTables = {}, initialValues = {}) => {
67
+ load: async (initialTables, initialValues) => {
50
68
  await loadLock(async () => {
51
- let content;
52
69
  try {
53
- content = await getPersisted();
54
- } catch {}
55
- store.setContent(content ?? [initialTables, initialValues]);
70
+ store.setContent(await getPersisted());
71
+ } catch {
72
+ store.setContent([initialTables, initialValues]);
73
+ }
56
74
  });
57
75
  return persister;
58
76
  },
59
77
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
60
78
  persister.stopAutoLoad();
61
79
  await persister.load(initialTables, initialValues);
62
- listening = true;
80
+ listening = 1;
63
81
  listeningHandle = addPersisterListener(
64
82
  async (getContent, getTransactionChanges) => {
65
83
  await loadLock(async () => {
@@ -79,27 +97,33 @@ const createCustomPersister = (
79
97
  if (listening) {
80
98
  delPersisterListener(listeningHandle);
81
99
  listeningHandle = void 0;
82
- listening = false;
100
+ listening = 0;
83
101
  }
84
102
  return persister;
85
103
  },
86
104
  save: async (getTransactionChanges) => {
87
- /* istanbul ignore else */
88
- if (loadSave != 1) {
89
- loadSave = 2;
90
- {
91
- saves++;
105
+ await persister.schedule(async () => {
106
+ /* istanbul ignore else */
107
+ if (loadSave != 1) {
108
+ loadSave = 2;
109
+ {
110
+ saves++;
111
+ }
112
+ try {
113
+ await setPersisted(store.getContent, getTransactionChanges);
114
+ } catch {}
115
+ loadSave = 0;
92
116
  }
93
- await setPersisted(store.getContent, getTransactionChanges);
94
- loadSave = 0;
95
- }
117
+ });
96
118
  return persister;
97
119
  },
98
120
  startAutoSave: async () => {
99
121
  await persister.stopAutoSave().save();
100
122
  listenerId = store.addDidFinishTransactionListener(
101
- (_store, getTransactionChanges) =>
102
- persister.save(getTransactionChanges),
123
+ (_store, getTransactionChanges) => {
124
+ const transactionChanges = getTransactionChanges();
125
+ persister.save(() => transactionChanges);
126
+ },
103
127
  );
104
128
  return persister;
105
129
  },
@@ -107,6 +131,11 @@ const createCustomPersister = (
107
131
  ifNotUndefined(listenerId, store.delListener);
108
132
  return persister;
109
133
  },
134
+ schedule: async (...actions) => {
135
+ arrayPush(scheduledActions, ...actions);
136
+ await run();
137
+ return persister;
138
+ },
110
139
  getStore: () => store,
111
140
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
112
141
  getStats: () => ({loads, saves}),
@@ -117,13 +146,13 @@ const createCustomPersister = (
117
146
  const STORAGE = 'storage';
118
147
  const WINDOW = globalThis.window;
119
148
  const getStoragePersister = (store, storageName, storage) => {
120
- const getPersisted = async () => JSON.parse(storage.getItem(storageName));
149
+ const getPersisted = async () => jsonParse(storage.getItem(storageName));
121
150
  const setPersisted = async (getContent) =>
122
151
  storage.setItem(storageName, jsonString(getContent()));
123
152
  const addPersisterListener = (listener) => {
124
153
  const storeListener = (event) => {
125
154
  if (event.storageArea === storage && event.key === storageName) {
126
- listener(() => JSON.parse(event.newValue));
155
+ listener(() => jsonParse(event.newValue));
127
156
  }
128
157
  };
129
158
  WINDOW.addEventListener(STORAGE, storeListener);