tinybase 4.0.0-beta.4 → 4.0.0-beta.5

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} +57 -30
  54. package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +48 -19
  55. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
  56. package/lib/debug/{persister-file.js → persisters/persister-file.js} +50 -24
  57. package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +47 -18
  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} +48 -19
  61. package/lib/debug/persisters.js +46 -17
  62. package/lib/debug/store.js +77 -27
  63. package/lib/debug/tinybase.js +120 -43
  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 +38 -21
  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,9 +1,11 @@
1
- import {readFile, writeFile} from 'fs/promises';
2
1
  import {watch} from 'fs';
2
+ import {readFile, writeFile} from 'fs/promises';
3
3
 
4
4
  const UTF8 = 'utf8';
5
5
 
6
6
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
7
+ const arrayPush = (array, ...values) => array.push(...values);
8
+ const arrayShift = (array) => array.shift();
7
9
 
8
10
  const jsonString = (obj) =>
9
11
  JSON.stringify(obj, (_key, value) =>
@@ -18,6 +20,7 @@ const jsonString = (obj) =>
18
20
  )
19
21
  : value,
20
22
  );
23
+ const jsonParse = JSON.parse;
21
24
  const isInstanceOf = (thing, cls) => thing instanceof cls;
22
25
  const isUndefined = (thing) => thing == void 0;
23
26
  const ifNotUndefined = (value, then, otherwise) =>
@@ -37,8 +40,23 @@ const createCustomPersister = (
37
40
  let loadSave = 0;
38
41
  let loads = 0;
39
42
  let saves = 0;
40
- let listening = false;
43
+ let running = 0;
44
+ let listening = 0;
45
+ let action;
41
46
  let listeningHandle;
47
+ const scheduledActions = [];
48
+ const run = async () => {
49
+ /* istanbul ignore else */
50
+ if (!running) {
51
+ running = 1;
52
+ while (!isUndefined((action = arrayShift(scheduledActions)))) {
53
+ try {
54
+ await action();
55
+ } catch {}
56
+ }
57
+ running = 0;
58
+ }
59
+ };
42
60
  const loadLock = async (actions) => {
43
61
  /* istanbul ignore else */
44
62
  if (loadSave != 2) {
@@ -53,18 +71,18 @@ const createCustomPersister = (
53
71
  const persister = {
54
72
  load: async (initialTables = {}, initialValues = {}) => {
55
73
  await loadLock(async () => {
56
- let content;
57
74
  try {
58
- content = await getPersisted();
59
- } catch {}
60
- store.setContent(content ?? [initialTables, initialValues]);
75
+ store.setContent(await getPersisted());
76
+ } catch {
77
+ store.setContent([initialTables, initialValues]);
78
+ }
61
79
  });
62
80
  return persister;
63
81
  },
64
82
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
65
83
  persister.stopAutoLoad();
66
84
  await persister.load(initialTables, initialValues);
67
- listening = true;
85
+ listening = 1;
68
86
  listeningHandle = addPersisterListener(
69
87
  async (getContent, getTransactionChanges) => {
70
88
  await loadLock(async () => {
@@ -84,27 +102,33 @@ const createCustomPersister = (
84
102
  if (listening) {
85
103
  delPersisterListener(listeningHandle);
86
104
  listeningHandle = void 0;
87
- listening = false;
105
+ listening = 0;
88
106
  }
89
107
  return persister;
90
108
  },
91
109
  save: async (getTransactionChanges) => {
92
- /* istanbul ignore else */
93
- if (loadSave != 1) {
94
- loadSave = 2;
95
- {
96
- saves++;
110
+ await persister.schedule(async () => {
111
+ /* istanbul ignore else */
112
+ if (loadSave != 1) {
113
+ loadSave = 2;
114
+ {
115
+ saves++;
116
+ }
117
+ try {
118
+ await setPersisted(store.getContent, getTransactionChanges);
119
+ } catch {}
120
+ loadSave = 0;
97
121
  }
98
- await setPersisted(store.getContent, getTransactionChanges);
99
- loadSave = 0;
100
- }
122
+ });
101
123
  return persister;
102
124
  },
103
125
  startAutoSave: async () => {
104
126
  await persister.stopAutoSave().save();
105
127
  listenerId = store.addDidFinishTransactionListener(
106
- (_store, getTransactionChanges) =>
107
- persister.save(getTransactionChanges),
128
+ (_store, getTransactionChanges) => {
129
+ const transactionChanges = getTransactionChanges();
130
+ persister.save(() => transactionChanges);
131
+ },
108
132
  );
109
133
  return persister;
110
134
  },
@@ -112,6 +136,11 @@ const createCustomPersister = (
112
136
  ifNotUndefined(listenerId, store.delListener);
113
137
  return persister;
114
138
  },
139
+ schedule: async (...actions) => {
140
+ arrayPush(scheduledActions, ...actions);
141
+ await run();
142
+ return persister;
143
+ },
115
144
  getStore: () => store,
116
145
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
117
146
  getStats: () => ({loads, saves}),
@@ -120,12 +149,9 @@ const createCustomPersister = (
120
149
  };
121
150
 
122
151
  const createFilePersister = (store, filePath) => {
123
- const getPersisted = async () => JSON.parse(await readFile(filePath, UTF8));
124
- const setPersisted = async (getContent) => {
125
- try {
126
- await writeFile(filePath, jsonString(getContent()), UTF8);
127
- } catch {}
128
- };
152
+ const getPersisted = async () => jsonParse(await readFile(filePath, UTF8));
153
+ const setPersisted = async (getContent) =>
154
+ await writeFile(filePath, jsonString(getContent()), UTF8);
129
155
  const addPersisterListener = (listener) => watch(filePath, () => listener());
130
156
  const delPersisterListener = (watcher) => watcher?.close();
131
157
  return createCustomPersister(
@@ -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) {
@@ -48,18 +66,18 @@ const createCustomPersister = (
48
66
  const persister = {
49
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}),
@@ -125,7 +154,7 @@ const createRemotePersister = (
125
154
  const getPersisted = async () => {
126
155
  const response = await fetch(loadUrl);
127
156
  lastEtag = getETag(response);
128
- return JSON.parse(await response.text());
157
+ return jsonParse(await response.text());
129
158
  };
130
159
  const setPersisted = async (getContent) =>
131
160
  await fetch(saveUrl, {