tinybase 8.6.0-beta.0 → 9.0.0-beta.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 (253) hide show
  1. package/@types/_internal/queries/with-schemas/index.d.ts +1 -2
  2. package/@types/_internal/ui/with-schemas/index.d.ts +8 -16
  3. package/@types/mergeable-store/index.d.ts +4 -4
  4. package/@types/mergeable-store/with-schemas/index.d.ts +41 -17
  5. package/@types/persisters/index.d.ts +34 -13
  6. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -8
  7. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +10 -10
  8. package/@types/persisters/with-schemas/index.d.ts +72 -30
  9. package/@types/queries/index.d.ts +5 -7
  10. package/@types/queries/with-schemas/index.d.ts +9 -15
  11. package/@types/store/index.d.ts +1 -2
  12. package/@types/store/with-schemas/index.d.ts +19 -29
  13. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +9 -3
  14. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +10 -3
  15. package/@types/synchronizers/synchronizer-ws-server/index.d.ts +15 -2
  16. package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +17 -2
  17. package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +51 -0
  18. package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +51 -0
  19. package/@types/ui-react/with-schemas/index.d.ts +3 -6
  20. package/@types/ui-react-dom/with-schemas/index.d.ts +6 -12
  21. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +3 -4
  22. package/@types/ui-solid/with-schemas/index.d.ts +4 -8
  23. package/@types/ui-solid-dom/with-schemas/index.d.ts +6 -12
  24. package/@types/ui-svelte-dom/with-schemas/index.d.ts +6 -12
  25. package/index.js +67 -25
  26. package/indexes/index.js +6 -8
  27. package/indexes/with-schemas/index.js +6 -8
  28. package/mergeable-store/index.js +46 -6
  29. package/mergeable-store/with-schemas/index.js +46 -6
  30. package/metrics/index.js +6 -8
  31. package/metrics/with-schemas/index.js +6 -8
  32. package/min/index.js +1 -1
  33. package/min/index.js.gz +0 -0
  34. package/min/mergeable-store/index.js +1 -1
  35. package/min/mergeable-store/index.js.gz +0 -0
  36. package/min/mergeable-store/with-schemas/index.js +1 -1
  37. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  38. package/min/omni/index.js +1 -1
  39. package/min/omni/index.js.gz +0 -0
  40. package/min/omni/with-schemas/index.js +1 -1
  41. package/min/omni/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/index.js +1 -1
  43. package/min/persisters/index.js.gz +0 -0
  44. package/min/persisters/persister-automerge/index.js +1 -1
  45. package/min/persisters/persister-automerge/index.js.gz +0 -0
  46. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  47. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  48. package/min/persisters/persister-browser/index.js +1 -1
  49. package/min/persisters/persister-browser/index.js.gz +0 -0
  50. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  51. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  52. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  53. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  54. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  55. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  57. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  58. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  59. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  60. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  61. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  62. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  63. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  64. package/min/persisters/persister-electric-sql/index.js +1 -1
  65. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  66. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  67. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  68. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  69. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  70. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  71. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  72. package/min/persisters/persister-file/index.js +1 -1
  73. package/min/persisters/persister-file/index.js.gz +0 -0
  74. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  75. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  76. package/min/persisters/persister-indexed-db/index.js +1 -1
  77. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  78. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  79. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  80. package/min/persisters/persister-libsql/index.js +1 -1
  81. package/min/persisters/persister-libsql/index.js.gz +0 -0
  82. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  83. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  84. package/min/persisters/persister-partykit-client/index.js +1 -1
  85. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  86. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-pglite/index.js +1 -1
  89. package/min/persisters/persister-pglite/index.js.gz +0 -0
  90. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-postgres/index.js +1 -1
  93. package/min/persisters/persister-postgres/index.js.gz +0 -0
  94. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-powersync/index.js +1 -1
  97. package/min/persisters/persister-powersync/index.js.gz +0 -0
  98. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  101. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  102. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  105. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  106. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-remote/index.js +1 -1
  109. package/min/persisters/persister-remote/index.js.gz +0 -0
  110. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  113. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  117. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  118. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/persister-sqlite3/index.js +1 -1
  121. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  123. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  124. package/min/persisters/persister-yjs/index.js +1 -1
  125. package/min/persisters/persister-yjs/index.js.gz +0 -0
  126. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  127. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  128. package/min/persisters/with-schemas/index.js +1 -1
  129. package/min/persisters/with-schemas/index.js.gz +0 -0
  130. package/min/queries/index.js +1 -1
  131. package/min/queries/index.js.gz +0 -0
  132. package/min/queries/with-schemas/index.js +1 -1
  133. package/min/queries/with-schemas/index.js.gz +0 -0
  134. package/min/store/index.js +1 -1
  135. package/min/store/index.js.gz +0 -0
  136. package/min/store/with-schemas/index.js +1 -1
  137. package/min/store/with-schemas/index.js.gz +0 -0
  138. package/min/synchronizers/index.js +1 -1
  139. package/min/synchronizers/index.js.gz +0 -0
  140. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  141. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  142. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  143. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-local/index.js +1 -1
  145. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  149. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  153. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  155. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  157. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  159. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  160. package/min/synchronizers/with-schemas/index.js +1 -1
  161. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  162. package/min/ui-react-inspector/index.js +1 -1
  163. package/min/ui-react-inspector/index.js.gz +0 -0
  164. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  165. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  166. package/min/ui-solid-inspector/index.js +1 -1
  167. package/min/ui-solid-inspector/index.js.gz +0 -0
  168. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  169. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  170. package/min/ui-svelte-inspector/index.js +1 -1
  171. package/min/ui-svelte-inspector/index.js.gz +0 -0
  172. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  173. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  174. package/min/with-schemas/index.js +1 -1
  175. package/min/with-schemas/index.js.gz +0 -0
  176. package/omni/index.js +364 -155
  177. package/omni/with-schemas/index.js +364 -155
  178. package/package.json +8 -8
  179. package/persisters/index.js +133 -40
  180. package/persisters/persister-automerge/index.js +4 -3
  181. package/persisters/persister-automerge/with-schemas/index.js +4 -3
  182. package/persisters/persister-browser/index.js +4 -3
  183. package/persisters/persister-browser/with-schemas/index.js +4 -3
  184. package/persisters/persister-cr-sqlite-wasm/index.js +133 -40
  185. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +133 -40
  186. package/persisters/persister-durable-object-sql-storage/index.js +275 -113
  187. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +275 -113
  188. package/persisters/persister-durable-object-storage/index.js +4 -3
  189. package/persisters/persister-durable-object-storage/with-schemas/index.js +4 -3
  190. package/persisters/persister-electric-sql/index.js +133 -40
  191. package/persisters/persister-electric-sql/with-schemas/index.js +133 -40
  192. package/persisters/persister-expo-sqlite/index.js +133 -40
  193. package/persisters/persister-expo-sqlite/with-schemas/index.js +133 -40
  194. package/persisters/persister-file/index.js +4 -3
  195. package/persisters/persister-file/with-schemas/index.js +4 -3
  196. package/persisters/persister-indexed-db/index.js +4 -3
  197. package/persisters/persister-indexed-db/with-schemas/index.js +4 -3
  198. package/persisters/persister-libsql/index.js +133 -40
  199. package/persisters/persister-libsql/with-schemas/index.js +133 -40
  200. package/persisters/persister-partykit-client/index.js +4 -3
  201. package/persisters/persister-partykit-client/with-schemas/index.js +4 -3
  202. package/persisters/persister-pglite/index.js +134 -40
  203. package/persisters/persister-pglite/with-schemas/index.js +134 -40
  204. package/persisters/persister-postgres/index.js +134 -40
  205. package/persisters/persister-postgres/with-schemas/index.js +134 -40
  206. package/persisters/persister-powersync/index.js +186 -120
  207. package/persisters/persister-powersync/with-schemas/index.js +186 -120
  208. package/persisters/persister-react-native-mmkv/index.js +4 -3
  209. package/persisters/persister-react-native-mmkv/with-schemas/index.js +4 -3
  210. package/persisters/persister-react-native-sqlite/index.js +133 -40
  211. package/persisters/persister-react-native-sqlite/with-schemas/index.js +133 -40
  212. package/persisters/persister-remote/index.js +4 -3
  213. package/persisters/persister-remote/with-schemas/index.js +4 -3
  214. package/persisters/persister-sqlite-bun/index.js +133 -40
  215. package/persisters/persister-sqlite-bun/with-schemas/index.js +133 -40
  216. package/persisters/persister-sqlite-wasm/index.js +133 -40
  217. package/persisters/persister-sqlite-wasm/with-schemas/index.js +133 -40
  218. package/persisters/persister-sqlite3/index.js +133 -40
  219. package/persisters/persister-sqlite3/with-schemas/index.js +133 -40
  220. package/persisters/persister-yjs/index.js +4 -3
  221. package/persisters/persister-yjs/with-schemas/index.js +4 -3
  222. package/persisters/with-schemas/index.js +133 -40
  223. package/queries/index.js +21 -19
  224. package/queries/with-schemas/index.js +21 -19
  225. package/readme.md +14 -14
  226. package/relationships/index.js +6 -8
  227. package/relationships/with-schemas/index.js +6 -8
  228. package/releases.md +72 -57
  229. package/store/index.js +33 -2
  230. package/store/with-schemas/index.js +33 -2
  231. package/synchronizers/index.js +4 -3
  232. package/synchronizers/synchronizer-broadcast-channel/index.js +4 -3
  233. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +4 -3
  234. package/synchronizers/synchronizer-local/index.js +4 -3
  235. package/synchronizers/synchronizer-local/with-schemas/index.js +4 -3
  236. package/synchronizers/synchronizer-ws-client/index.js +120 -45
  237. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +120 -45
  238. package/synchronizers/synchronizer-ws-server/index.js +116 -36
  239. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +116 -36
  240. package/synchronizers/synchronizer-ws-server-durable-object/index.js +125 -41
  241. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +125 -41
  242. package/synchronizers/with-schemas/index.js +4 -3
  243. package/ui-react-inspector/index.js +36 -5
  244. package/ui-react-inspector/with-schemas/index.js +36 -5
  245. package/ui-solid-inspector/index.js +36 -5
  246. package/ui-solid-inspector/with-schemas/index.js +36 -5
  247. package/ui-svelte/index.js +1 -1
  248. package/ui-svelte/with-schemas/index.js +1 -1
  249. package/ui-svelte-dom/index.js +2 -2
  250. package/ui-svelte-dom/with-schemas/index.js +2 -2
  251. package/ui-svelte-inspector/index.js +38 -7
  252. package/ui-svelte-inspector/with-schemas/index.js +38 -7
  253. package/with-schemas/index.js +67 -25
package/store/index.js CHANGED
@@ -386,8 +386,10 @@ const createStore = () => {
386
386
  const changedRowIds = mapNew();
387
387
  const changedCellIds = mapNew();
388
388
  const changedCells = mapNew();
389
+ const defaultedCells = mapNew();
389
390
  const changedValueIds = mapNew();
390
391
  const changedValues = mapNew();
392
+ const defaultedValues = setNew();
391
393
  const invalidCells = mapNew();
392
394
  const invalidValues = mapNew();
393
395
  const tablesSchemaMap = mapNew();
@@ -561,6 +563,16 @@ const createStore = () => {
561
563
  collForEach(rowDefaulted, (cell, cellId) => {
562
564
  if (!objHas(row, cellId)) {
563
565
  row[cellId] = cell;
566
+ ifNotUndefined(rowId, (rowId2) =>
567
+ setAdd(
568
+ mapEnsure(
569
+ mapEnsure(defaultedCells, tableId, mapNew),
570
+ rowId2,
571
+ setNew,
572
+ ),
573
+ cellId,
574
+ ),
575
+ );
564
576
  }
565
577
  });
566
578
  collForEach(rowNonDefaulted, (cellId) => {
@@ -577,6 +589,7 @@ const createStore = () => {
577
589
  collForEach(valuesDefaulted, (value, valueId) => {
578
590
  if (!objHas(values, valueId)) {
579
591
  values[valueId] = value;
592
+ setAdd(defaultedValues, valueId);
580
593
  }
581
594
  });
582
595
  collForEach(valuesNonDefaulted, (valueId) => {
@@ -980,18 +993,34 @@ const createStore = () => {
980
993
  );
981
994
  };
982
995
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
996
+ const defaulted =
997
+ collHas(mapGet(mapGet(defaultedCells, tableId), rowId), cellId) &&
998
+ isUndefined(oldCell)
999
+ ? 1
1000
+ : 0;
983
1001
  mapEnsure(
984
1002
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
985
1003
  cellId,
986
1004
  () => [oldCell, 0],
987
1005
  )[1] = newCell;
988
- internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1006
+ internalListeners[3]?.(
1007
+ tableId,
1008
+ rowId,
1009
+ cellId,
1010
+ newCell,
1011
+ mutating,
1012
+ defaulted,
1013
+ );
1014
+ collDel(mapGet(mapGet(defaultedCells, tableId), rowId), cellId);
989
1015
  };
990
1016
  const valueIdsChanged = (valueId, addedOrRemoved) =>
991
1017
  idsChanged(changedValueIds, valueId, addedOrRemoved);
992
1018
  const valueChanged = (valueId, oldValue, newValue) => {
1019
+ const defaulted =
1020
+ collHas(defaultedValues, valueId) && isUndefined(oldValue) ? 1 : 0;
993
1021
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
994
- internalListeners[4]?.(valueId, newValue, mutating);
1022
+ internalListeners[4]?.(valueId, newValue, mutating, defaulted);
1023
+ collDel(defaultedValues, valueId);
995
1024
  };
996
1025
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
997
1026
  arrayPush(
@@ -1779,9 +1808,11 @@ const createStore = () => {
1779
1808
  changedRowIds,
1780
1809
  changedCellIds,
1781
1810
  changedCells,
1811
+ defaultedCells,
1782
1812
  invalidCells,
1783
1813
  changedValueIds,
1784
1814
  changedValues,
1815
+ defaultedValues,
1785
1816
  invalidValues,
1786
1817
  ],
1787
1818
  collClear,
@@ -386,8 +386,10 @@ const createStore = () => {
386
386
  const changedRowIds = mapNew();
387
387
  const changedCellIds = mapNew();
388
388
  const changedCells = mapNew();
389
+ const defaultedCells = mapNew();
389
390
  const changedValueIds = mapNew();
390
391
  const changedValues = mapNew();
392
+ const defaultedValues = setNew();
391
393
  const invalidCells = mapNew();
392
394
  const invalidValues = mapNew();
393
395
  const tablesSchemaMap = mapNew();
@@ -561,6 +563,16 @@ const createStore = () => {
561
563
  collForEach(rowDefaulted, (cell, cellId) => {
562
564
  if (!objHas(row, cellId)) {
563
565
  row[cellId] = cell;
566
+ ifNotUndefined(rowId, (rowId2) =>
567
+ setAdd(
568
+ mapEnsure(
569
+ mapEnsure(defaultedCells, tableId, mapNew),
570
+ rowId2,
571
+ setNew,
572
+ ),
573
+ cellId,
574
+ ),
575
+ );
564
576
  }
565
577
  });
566
578
  collForEach(rowNonDefaulted, (cellId) => {
@@ -577,6 +589,7 @@ const createStore = () => {
577
589
  collForEach(valuesDefaulted, (value, valueId) => {
578
590
  if (!objHas(values, valueId)) {
579
591
  values[valueId] = value;
592
+ setAdd(defaultedValues, valueId);
580
593
  }
581
594
  });
582
595
  collForEach(valuesNonDefaulted, (valueId) => {
@@ -980,18 +993,34 @@ const createStore = () => {
980
993
  );
981
994
  };
982
995
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
996
+ const defaulted =
997
+ collHas(mapGet(mapGet(defaultedCells, tableId), rowId), cellId) &&
998
+ isUndefined(oldCell)
999
+ ? 1
1000
+ : 0;
983
1001
  mapEnsure(
984
1002
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
985
1003
  cellId,
986
1004
  () => [oldCell, 0],
987
1005
  )[1] = newCell;
988
- internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1006
+ internalListeners[3]?.(
1007
+ tableId,
1008
+ rowId,
1009
+ cellId,
1010
+ newCell,
1011
+ mutating,
1012
+ defaulted,
1013
+ );
1014
+ collDel(mapGet(mapGet(defaultedCells, tableId), rowId), cellId);
989
1015
  };
990
1016
  const valueIdsChanged = (valueId, addedOrRemoved) =>
991
1017
  idsChanged(changedValueIds, valueId, addedOrRemoved);
992
1018
  const valueChanged = (valueId, oldValue, newValue) => {
1019
+ const defaulted =
1020
+ collHas(defaultedValues, valueId) && isUndefined(oldValue) ? 1 : 0;
993
1021
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
994
- internalListeners[4]?.(valueId, newValue, mutating);
1022
+ internalListeners[4]?.(valueId, newValue, mutating, defaulted);
1023
+ collDel(defaultedValues, valueId);
995
1024
  };
996
1025
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
997
1026
  arrayPush(
@@ -1779,9 +1808,11 @@ const createStore = () => {
1779
1808
  changedRowIds,
1780
1809
  changedCellIds,
1781
1810
  changedCells,
1811
+ defaultedCells,
1782
1812
  invalidCells,
1783
1813
  changedValueIds,
1784
1814
  changedValues,
1815
+ defaultedValues,
1785
1816
  invalidValues,
1786
1817
  ],
1787
1818
  collClear,
@@ -331,13 +331,14 @@ const createCustomPersister = (
331
331
  const content = await getPersisted();
332
332
  if (isArray(content)) {
333
333
  setContentOrChanges(content);
334
- } else if (initialContent) {
334
+ } else if (isUndefined(content) && initialContent) {
335
335
  setDefaultContent(initialContent);
336
- } else {
336
+ } else if (!isUndefined(content)) {
337
337
  errorNew(`Content is not an array: ${content}`);
338
338
  }
339
339
  },
340
- () => {
340
+ (error) => {
341
+ onIgnoredError?.(error);
341
342
  if (initialContent) {
342
343
  setDefaultContent(initialContent);
343
344
  }
@@ -331,13 +331,14 @@ const createCustomPersister = (
331
331
  const content = await getPersisted();
332
332
  if (isArray(content)) {
333
333
  setContentOrChanges(content);
334
- } else if (initialContent) {
334
+ } else if (isUndefined(content) && initialContent) {
335
335
  setDefaultContent(initialContent);
336
- } else {
336
+ } else if (!isUndefined(content)) {
337
337
  errorNew(`Content is not an array: ${content}`);
338
338
  }
339
339
  },
340
- () => {
340
+ (error) => {
341
+ onIgnoredError?.(error);
341
342
  if (initialContent) {
342
343
  setDefaultContent(initialContent);
343
344
  }
@@ -331,13 +331,14 @@ const createCustomPersister = (
331
331
  const content = await getPersisted();
332
332
  if (isArray(content)) {
333
333
  setContentOrChanges(content);
334
- } else if (initialContent) {
334
+ } else if (isUndefined(content) && initialContent) {
335
335
  setDefaultContent(initialContent);
336
- } else {
336
+ } else if (!isUndefined(content)) {
337
337
  errorNew(`Content is not an array: ${content}`);
338
338
  }
339
339
  },
340
- () => {
340
+ (error) => {
341
+ onIgnoredError?.(error);
341
342
  if (initialContent) {
342
343
  setDefaultContent(initialContent);
343
344
  }
@@ -333,13 +333,14 @@ const createCustomPersister = (
333
333
  const content = await getPersisted();
334
334
  if (isArray(content)) {
335
335
  setContentOrChanges(content);
336
- } else if (initialContent) {
336
+ } else if (isUndefined(content) && initialContent) {
337
337
  setDefaultContent(initialContent);
338
- } else {
338
+ } else if (!isUndefined(content)) {
339
339
  errorNew(`Content is not an array: ${content}`);
340
340
  }
341
341
  },
342
- () => {
342
+ (error) => {
343
+ onIgnoredError?.(error);
343
344
  if (initialContent) {
344
345
  setDefaultContent(initialContent);
345
346
  }
@@ -333,13 +333,14 @@ const createCustomPersister = (
333
333
  const content = await getPersisted();
334
334
  if (isArray(content)) {
335
335
  setContentOrChanges(content);
336
- } else if (initialContent) {
336
+ } else if (isUndefined(content) && initialContent) {
337
337
  setDefaultContent(initialContent);
338
- } else {
338
+ } else if (!isUndefined(content)) {
339
339
  errorNew(`Content is not an array: ${content}`);
340
340
  }
341
341
  },
342
- () => {
342
+ (error) => {
343
+ onIgnoredError?.(error);
343
344
  if (initialContent) {
344
345
  setDefaultContent(initialContent);
345
346
  }
@@ -5,6 +5,7 @@ const OPEN = 'open';
5
5
  const MESSAGE = 'message';
6
6
  const ERROR = 'error';
7
7
  const UNDEFINED = '\uFFFC';
8
+ const strMatch = (str, regex) => str?.match(regex);
8
9
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
9
10
  str.split(separator, limit);
10
11
 
@@ -19,6 +20,7 @@ const GLOBAL = globalThis;
19
20
  const THOUSAND = 1e3;
20
21
  const startTimeout = (callback, sec = 0) =>
21
22
  setTimeout(callback, sec * THOUSAND);
23
+ const stopTimeout = clearTimeout;
22
24
  const mathFloor = math.floor;
23
25
  const mathRandom = math.random;
24
26
  const isNullish = (thing) => thing == null;
@@ -44,12 +46,19 @@ const tryCatch = async (action, then1, then2) => {
44
46
  };
45
47
 
46
48
  const arrayForEach = (array, cb) => array.forEach(cb);
49
+ const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
47
50
  const arrayMap = (array, cb) => array.map(cb);
48
51
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
49
52
  const arrayClear = (array, to) => array.splice(0, to);
50
53
  const arrayPush = (array, ...values) => array.push(...values);
51
54
  const arrayShift = (array) => array.shift();
52
55
 
56
+ const collSize = (coll) => coll?.size ?? 0;
57
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
58
+ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
59
+ const collForEach = (coll, cb) => coll?.forEach(cb);
60
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
61
+
53
62
  const object = Object;
54
63
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
55
64
  const objEntries = object.entries;
@@ -83,44 +92,6 @@ const objEnsure = (obj, id, getDefaultValue) => {
83
92
  return obj[id];
84
93
  };
85
94
 
86
- const jsonString = JSON.stringify;
87
- const jsonParse = JSON.parse;
88
- const jsonStringWithUndefined = (obj) =>
89
- jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
90
- const jsonParseWithUndefined = (str) =>
91
- // JSON.parse reviver removes properties with undefined values
92
- replaceUndefinedString(jsonParse(str));
93
- const replaceUndefinedString = (obj) =>
94
- obj === UNDEFINED
95
- ? void 0
96
- : isArray(obj)
97
- ? arrayMap(obj, replaceUndefinedString)
98
- : isObject(obj)
99
- ? objMap(obj, replaceUndefinedString)
100
- : obj;
101
-
102
- const MESSAGE_SEPARATOR = '\n';
103
- const ifPayloadValid = (payload, then) => {
104
- const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
105
- if (splitAt !== -1) {
106
- then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
107
- }
108
- };
109
- const receivePayload = (payload, receive) =>
110
- ifPayloadValid(payload, (fromClientId, remainder) =>
111
- receive(fromClientId, ...jsonParseWithUndefined(remainder)),
112
- );
113
- const createPayload = (toClientId, ...args) =>
114
- createRawPayload(toClientId ?? EMPTY_STRING, jsonStringWithUndefined(args));
115
- const createRawPayload = (clientId, remainder) =>
116
- clientId + MESSAGE_SEPARATOR + remainder;
117
-
118
- const collSize = (coll) => coll?.size ?? 0;
119
- const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
120
- const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
121
- const collForEach = (coll, cb) => coll?.forEach(cb);
122
- const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
123
-
124
95
  const map = Map;
125
96
  const mapNew = (entries) => new map(entries);
126
97
  const mapGet = (map2, key) => map2?.get(key);
@@ -172,6 +143,103 @@ const getUniqueId = (length = 16) =>
172
143
  EMPTY_STRING,
173
144
  );
174
145
 
146
+ const jsonString = JSON.stringify;
147
+ const jsonParse = JSON.parse;
148
+ const jsonStringWithUndefined = (obj) =>
149
+ jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
150
+ const jsonParseWithUndefined = (str) =>
151
+ // JSON.parse reviver removes properties with undefined values
152
+ replaceUndefinedString(jsonParse(str));
153
+ const replaceUndefinedString = (obj) =>
154
+ obj === UNDEFINED
155
+ ? void 0
156
+ : isArray(obj)
157
+ ? arrayMap(obj, replaceUndefinedString)
158
+ : isObject(obj)
159
+ ? objMap(obj, replaceUndefinedString)
160
+ : obj;
161
+
162
+ const MESSAGE_SEPARATOR = '\n';
163
+ const FRAGMENT = /^(.+)\n(\d+)\n(\d+)\n([\s\S]*)$/;
164
+ const ifPayloadValid = (payload, then) => {
165
+ const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
166
+ if (splitAt !== -1) {
167
+ then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
168
+ }
169
+ };
170
+ const receivePayloadRemainder = (fromClientId, remainder, receive) =>
171
+ receive(fromClientId, ...jsonParseWithUndefined(remainder));
172
+ const createPayloadReceiver = (receive, fragmentTimeoutSeconds = 1) => {
173
+ const buffer = mapNew();
174
+ const setPendingTimeout = (bufferKey) =>
175
+ startTimeout(() => collDel(buffer, bufferKey), fragmentTimeoutSeconds);
176
+ const delPending = (bufferKey, pending) => {
177
+ stopTimeout(pending[3]);
178
+ collDel(buffer, bufferKey);
179
+ };
180
+ return (payload) =>
181
+ ifPayloadValid(payload, (fromClientId, remainder) => {
182
+ const [, messageId, indexStr, totalStr, fragment] =
183
+ strMatch(remainder, FRAGMENT) ?? [];
184
+ if (messageId) {
185
+ const index = parseInt(indexStr);
186
+ const total = parseInt(totalStr);
187
+ if (total > 0 && index >= 0 && index < total) {
188
+ const bufferKey = fromClientId + MESSAGE_SEPARATOR + messageId;
189
+ const pending = mapEnsure(buffer, bufferKey, () => [
190
+ [],
191
+ total,
192
+ total,
193
+ setPendingTimeout(bufferKey),
194
+ ]);
195
+ const [fragments] = pending;
196
+ if (total == pending[2] && isUndefined(fragments[index])) {
197
+ stopTimeout(pending[3]);
198
+ pending[3] = setPendingTimeout(bufferKey);
199
+ fragments[index] = fragment;
200
+ pending[1]--;
201
+ }
202
+ if (pending[1] == 0) {
203
+ delPending(bufferKey, pending);
204
+ receivePayloadRemainder(
205
+ fromClientId,
206
+ arrayJoin(fragments),
207
+ receive,
208
+ );
209
+ }
210
+ }
211
+ } else {
212
+ receivePayloadRemainder(fromClientId, remainder, receive);
213
+ }
214
+ });
215
+ };
216
+ const createRawPayload = (clientId, remainder) =>
217
+ clientId + MESSAGE_SEPARATOR + remainder;
218
+ const createPayloads = (toClientId, requestId, message, body, fragmentSize) => {
219
+ const clientId = toClientId ?? EMPTY_STRING;
220
+ const remainder = jsonStringWithUndefined([requestId, message, body]);
221
+ const maxFragmentSize = mathFloor(fragmentSize ?? 0);
222
+ if (
223
+ isUndefined(fragmentSize) ||
224
+ maxFragmentSize < 1 ||
225
+ size(remainder) <= maxFragmentSize
226
+ ) {
227
+ return [createRawPayload(clientId, remainder)];
228
+ }
229
+ const fragments = strMatch(
230
+ remainder,
231
+ new RegExp(`.{1,${maxFragmentSize}}`, 'g'),
232
+ );
233
+ const total = size(fragments ?? []);
234
+ const messageId = getUniqueId();
235
+ return arrayMap(fragments ?? [], (fragment, index) =>
236
+ createRawPayload(
237
+ clientId,
238
+ arrayJoin([messageId, index, total, fragment], MESSAGE_SEPARATOR),
239
+ ),
240
+ );
241
+ };
242
+
175
243
  const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
176
244
  const getLatestHlc = (hlc1, hlc2) =>
177
245
  /* istanbul ignore next */
@@ -373,13 +441,14 @@ const createCustomPersister = (
373
441
  const content = await getPersisted();
374
442
  if (isArray(content)) {
375
443
  setContentOrChanges(content);
376
- } else if (initialContent) {
444
+ } else if (isUndefined(content) && initialContent) {
377
445
  setDefaultContent(initialContent);
378
- } else {
446
+ } else if (!isUndefined(content)) {
379
447
  errorNew(`Content is not an array: ${content}`);
380
448
  }
381
449
  },
382
- () => {
450
+ (error) => {
451
+ onIgnoredError?.(error);
383
452
  if (initialContent) {
384
453
  setDefaultContent(initialContent);
385
454
  }
@@ -745,17 +814,23 @@ const createWsSynchronizer = async (
745
814
  onSend,
746
815
  onReceive,
747
816
  onIgnoredError,
817
+ fragmentSize,
748
818
  ) => {
749
819
  const addEventListener = (event, handler) => {
750
820
  webSocket.addEventListener(event, handler);
751
821
  return () => webSocket.removeEventListener(event, handler);
752
822
  };
753
- const registerReceive = (receive) =>
754
- addEventListener(MESSAGE, ({data}) =>
755
- receivePayload(data.toString(UTF8), receive),
823
+ const registerReceive = (receive) => {
824
+ const receivePayload = createPayloadReceiver(
825
+ receive,
826
+ requestTimeoutSeconds,
756
827
  );
828
+ addEventListener(MESSAGE, ({data}) => receivePayload(data.toString(UTF8)));
829
+ };
757
830
  const send = (toClientId, ...args) =>
758
- webSocket.send(createPayload(toClientId, ...args));
831
+ arrayForEach(createPayloads(toClientId, ...args, fragmentSize), (payload) =>
832
+ webSocket.send(payload),
833
+ );
759
834
  const destroy = () => {
760
835
  webSocket.close();
761
836
  };