tinybase 5.0.0-beta.5 → 5.0.0-beta.7

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 (398) hide show
  1. package/lib/cjs/mergeable-store.cjs +1 -1
  2. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  4. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  6. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  8. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  10. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  12. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  14. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-file.cjs +1 -1
  16. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  18. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-libsql.cjs +1 -1
  20. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  24. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  26. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  30. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  32. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  33. package/lib/cjs/persisters.cjs +1 -1
  34. package/lib/cjs/persisters.cjs.gz +0 -0
  35. package/lib/cjs/store.cjs +1 -1
  36. package/lib/cjs/store.cjs.gz +0 -0
  37. package/lib/cjs/synchronizers/synchronizer-local.cjs +1 -0
  38. package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
  39. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
  40. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  41. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
  42. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  43. package/lib/cjs/synchronizers.cjs +1 -0
  44. package/lib/cjs/synchronizers.cjs.gz +0 -0
  45. package/lib/cjs/tinybase.cjs +1 -1
  46. package/lib/cjs/tinybase.cjs.gz +0 -0
  47. package/lib/cjs/tools.cjs +1 -1
  48. package/lib/cjs/tools.cjs.gz +0 -0
  49. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  50. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  51. package/lib/cjs/ui-react.cjs +1 -1
  52. package/lib/cjs/ui-react.cjs.gz +0 -0
  53. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  54. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  76. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters.cjs +1 -1
  86. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  87. package/lib/cjs-es6/store.cjs +1 -1
  88. package/lib/cjs-es6/store.cjs.gz +0 -0
  89. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs +1 -0
  90. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
  91. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
  92. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  93. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
  94. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  95. package/lib/cjs-es6/synchronizers.cjs +1 -0
  96. package/lib/cjs-es6/synchronizers.cjs.gz +0 -0
  97. package/lib/cjs-es6/tinybase.cjs +1 -1
  98. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  99. package/lib/cjs-es6/tools.cjs +1 -1
  100. package/lib/cjs-es6/tools.cjs.gz +0 -0
  101. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  102. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  103. package/lib/cjs-es6/ui-react.cjs +1 -1
  104. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  105. package/lib/debug/mergeable-store.js +287 -130
  106. package/lib/debug/persisters/persister-automerge.js +39 -46
  107. package/lib/debug/persisters/persister-browser.js +39 -46
  108. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +64 -60
  109. package/lib/debug/persisters/persister-electric-sql.js +64 -60
  110. package/lib/debug/persisters/persister-expo-sqlite-next.js +64 -60
  111. package/lib/debug/persisters/persister-expo-sqlite.js +64 -60
  112. package/lib/debug/persisters/persister-file.js +39 -46
  113. package/lib/debug/persisters/persister-indexed-db.js +39 -46
  114. package/lib/debug/persisters/persister-libsql.js +64 -60
  115. package/lib/debug/persisters/persister-partykit-client.js +39 -46
  116. package/lib/debug/persisters/persister-powersync.js +917 -0
  117. package/lib/debug/persisters/persister-remote.js +39 -46
  118. package/lib/debug/persisters/persister-sqlite-wasm.js +64 -60
  119. package/lib/debug/persisters/persister-sqlite3.js +64 -60
  120. package/lib/debug/persisters/persister-yjs.js +41 -48
  121. package/lib/debug/persisters.js +38 -45
  122. package/lib/debug/store.js +44 -32
  123. package/lib/debug/synchronizers/synchronizer-local.js +502 -0
  124. package/lib/debug/synchronizers/synchronizer-ws-client.js +525 -0
  125. package/lib/debug/synchronizers/synchronizer-ws-server.js +57 -0
  126. package/lib/debug/synchronizers.js +466 -0
  127. package/lib/debug/tinybase.js +569 -250
  128. package/lib/debug/tools.js +2 -2
  129. package/lib/debug/ui-react-dom.js +81 -76
  130. package/lib/debug/ui-react.js +1 -1
  131. package/lib/es6/mergeable-store.js +1 -1
  132. package/lib/es6/mergeable-store.js.gz +0 -0
  133. package/lib/es6/persisters/persister-automerge.js +1 -1
  134. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  135. package/lib/es6/persisters/persister-browser.js +1 -1
  136. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  137. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  138. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  139. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  140. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  141. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  142. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  143. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  144. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  145. package/lib/es6/persisters/persister-file.js +1 -1
  146. package/lib/es6/persisters/persister-file.js.gz +0 -0
  147. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  148. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  149. package/lib/es6/persisters/persister-libsql.js +1 -1
  150. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  151. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  152. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  153. package/lib/es6/persisters/persister-powersync.js +1 -0
  154. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  155. package/lib/es6/persisters/persister-remote.js +1 -1
  156. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  157. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  158. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  159. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  160. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  161. package/lib/es6/persisters/persister-yjs.js +1 -1
  162. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  163. package/lib/es6/persisters.js +1 -1
  164. package/lib/es6/persisters.js.gz +0 -0
  165. package/lib/es6/store.js +1 -1
  166. package/lib/es6/store.js.gz +0 -0
  167. package/lib/es6/synchronizers/synchronizer-local.js +1 -0
  168. package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
  169. package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
  170. package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  171. package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
  172. package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  173. package/lib/es6/synchronizers.js +1 -0
  174. package/lib/es6/synchronizers.js.gz +0 -0
  175. package/lib/es6/tinybase.js +1 -1
  176. package/lib/es6/tinybase.js.gz +0 -0
  177. package/lib/es6/tools.js +1 -1
  178. package/lib/es6/tools.js.gz +0 -0
  179. package/lib/es6/ui-react-dom-debug.js +1 -1
  180. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  181. package/lib/es6/ui-react.js +1 -1
  182. package/lib/es6/ui-react.js.gz +0 -0
  183. package/lib/mergeable-store.js +1 -1
  184. package/lib/mergeable-store.js.gz +0 -0
  185. package/lib/persisters/persister-automerge.js +1 -1
  186. package/lib/persisters/persister-automerge.js.gz +0 -0
  187. package/lib/persisters/persister-browser.js +1 -1
  188. package/lib/persisters/persister-browser.js.gz +0 -0
  189. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  190. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  191. package/lib/persisters/persister-electric-sql.js +1 -1
  192. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  193. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  194. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  195. package/lib/persisters/persister-expo-sqlite.js +1 -1
  196. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  197. package/lib/persisters/persister-file.js +1 -1
  198. package/lib/persisters/persister-file.js.gz +0 -0
  199. package/lib/persisters/persister-indexed-db.js +1 -1
  200. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  201. package/lib/persisters/persister-libsql.js +1 -1
  202. package/lib/persisters/persister-libsql.js.gz +0 -0
  203. package/lib/persisters/persister-partykit-client.js +1 -1
  204. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  205. package/lib/persisters/persister-powersync.js +1 -0
  206. package/lib/persisters/persister-powersync.js.gz +0 -0
  207. package/lib/persisters/persister-remote.js +1 -1
  208. package/lib/persisters/persister-remote.js.gz +0 -0
  209. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  210. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  211. package/lib/persisters/persister-sqlite3.js +1 -1
  212. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  213. package/lib/persisters/persister-yjs.js +1 -1
  214. package/lib/persisters/persister-yjs.js.gz +0 -0
  215. package/lib/persisters.js +1 -1
  216. package/lib/persisters.js.gz +0 -0
  217. package/lib/store.js +1 -1
  218. package/lib/store.js.gz +0 -0
  219. package/lib/synchronizers/synchronizer-local.js +1 -0
  220. package/lib/synchronizers/synchronizer-local.js.gz +0 -0
  221. package/lib/synchronizers/synchronizer-ws-client.js +1 -0
  222. package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
  223. package/lib/synchronizers/synchronizer-ws-server.js +1 -0
  224. package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
  225. package/lib/synchronizers.js +1 -0
  226. package/lib/synchronizers.js.gz +0 -0
  227. package/lib/tinybase.js +1 -1
  228. package/lib/tinybase.js.gz +0 -0
  229. package/lib/tools.js +1 -1
  230. package/lib/tools.js.gz +0 -0
  231. package/lib/types/checkpoints.d.ts +2 -2
  232. package/lib/types/indexes.d.ts +2 -2
  233. package/lib/types/mergeable-store.d.ts +121 -59
  234. package/lib/types/metrics.d.ts +2 -2
  235. package/lib/types/persisters/persister-automerge.d.ts +3 -0
  236. package/lib/types/persisters/persister-browser.d.ts +9 -2
  237. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
  238. package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
  239. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
  240. package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
  241. package/lib/types/persisters/persister-file.d.ts +5 -1
  242. package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
  243. package/lib/types/persisters/persister-libsql.d.ts +3 -0
  244. package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
  245. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  246. package/lib/types/persisters/persister-remote.d.ts +3 -0
  247. package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
  248. package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
  249. package/lib/types/persisters/persister-yjs.d.ts +5 -2
  250. package/lib/types/persisters.d.ts +68 -19
  251. package/lib/types/queries.d.ts +2 -2
  252. package/lib/types/relationships.d.ts +2 -2
  253. package/lib/types/store.d.ts +36 -3
  254. package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
  255. package/lib/types/synchronizers/synchronizer-ws-client.d.ts +30 -0
  256. package/lib/types/synchronizers/synchronizer-ws-server.d.ts +24 -0
  257. package/lib/types/synchronizers.d.ts +131 -0
  258. package/lib/types/tinybase.d.ts +10 -9
  259. package/lib/types/tools.d.ts +2 -2
  260. package/lib/types/ui-react.d.ts +8 -8
  261. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  262. package/lib/types/with-schemas/indexes.d.ts +2 -2
  263. package/lib/types/with-schemas/mergeable-store.d.ts +185 -87
  264. package/lib/types/with-schemas/metrics.d.ts +2 -2
  265. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
  266. package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
  267. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
  268. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
  269. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
  270. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
  271. package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
  272. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
  273. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +4 -1
  274. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
  275. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  276. package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
  277. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
  278. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
  279. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
  280. package/lib/types/with-schemas/persisters.d.ts +90 -62
  281. package/lib/types/with-schemas/queries.d.ts +3 -3
  282. package/lib/types/with-schemas/relationships.d.ts +2 -2
  283. package/lib/types/with-schemas/store.d.ts +100 -3
  284. package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
  285. package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +32 -0
  286. package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +24 -0
  287. package/lib/types/with-schemas/synchronizers.d.ts +146 -0
  288. package/lib/types/with-schemas/tinybase.d.ts +9 -9
  289. package/lib/types/with-schemas/tools.d.ts +2 -2
  290. package/lib/types/with-schemas/ui-react.d.ts +8 -8
  291. package/lib/ui-react.js +1 -1
  292. package/lib/ui-react.js.gz +0 -0
  293. package/lib/umd/mergeable-store.js +1 -1
  294. package/lib/umd/mergeable-store.js.gz +0 -0
  295. package/lib/umd/persisters/persister-automerge.js +1 -1
  296. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  297. package/lib/umd/persisters/persister-browser.js +1 -1
  298. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  299. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  300. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  301. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  302. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  303. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  304. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  305. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  306. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  307. package/lib/umd/persisters/persister-file.js +1 -1
  308. package/lib/umd/persisters/persister-file.js.gz +0 -0
  309. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  310. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  311. package/lib/umd/persisters/persister-libsql.js +1 -1
  312. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  313. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  314. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  315. package/lib/umd/persisters/persister-powersync.js +1 -0
  316. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  317. package/lib/umd/persisters/persister-remote.js +1 -1
  318. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  319. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  320. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  321. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  322. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  323. package/lib/umd/persisters/persister-yjs.js +1 -1
  324. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  325. package/lib/umd/persisters.js +1 -1
  326. package/lib/umd/persisters.js.gz +0 -0
  327. package/lib/umd/store.js +1 -1
  328. package/lib/umd/store.js.gz +0 -0
  329. package/lib/umd/synchronizers/synchronizer-local.js +1 -0
  330. package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
  331. package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
  332. package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
  333. package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
  334. package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
  335. package/lib/umd/synchronizers.js +1 -0
  336. package/lib/umd/synchronizers.js.gz +0 -0
  337. package/lib/umd/tinybase.js +1 -1
  338. package/lib/umd/tinybase.js.gz +0 -0
  339. package/lib/umd/tools.js +1 -1
  340. package/lib/umd/tools.js.gz +0 -0
  341. package/lib/umd/ui-react-dom-debug.js +1 -1
  342. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  343. package/lib/umd/ui-react.js +1 -1
  344. package/lib/umd/ui-react.js.gz +0 -0
  345. package/lib/umd-es6/mergeable-store.js +1 -1
  346. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  347. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  348. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  349. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  350. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  351. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  352. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  353. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  354. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  355. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  356. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  357. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  358. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  359. package/lib/umd-es6/persisters/persister-file.js +1 -1
  360. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  361. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  362. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  363. package/lib/umd-es6/persisters/persister-libsql.js +1 -1
  364. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  365. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  366. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  367. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  368. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  369. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  370. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  371. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  372. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  373. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  374. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  375. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  376. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  377. package/lib/umd-es6/persisters.js +1 -1
  378. package/lib/umd-es6/persisters.js.gz +0 -0
  379. package/lib/umd-es6/store.js +1 -1
  380. package/lib/umd-es6/store.js.gz +0 -0
  381. package/lib/umd-es6/synchronizers/synchronizer-local.js +1 -0
  382. package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
  383. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
  384. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  385. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
  386. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  387. package/lib/umd-es6/synchronizers.js +1 -0
  388. package/lib/umd-es6/synchronizers.js.gz +0 -0
  389. package/lib/umd-es6/tinybase.js +1 -1
  390. package/lib/umd-es6/tinybase.js.gz +0 -0
  391. package/lib/umd-es6/tools.js +1 -1
  392. package/lib/umd-es6/tools.js.gz +0 -0
  393. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  394. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  395. package/lib/umd-es6/ui-react.js +1 -1
  396. package/lib/umd-es6/ui-react.js.gz +0 -0
  397. package/package.json +37 -26
  398. package/readme.md +2 -2
@@ -33,6 +33,7 @@ const strStartsWith = (str, prefix) => str.startsWith(prefix);
33
33
  const strEndsWith = (str, suffix) => str.endsWith(suffix);
34
34
  const strCharCodeAt = (str, position) => str.charCodeAt(position);
35
35
 
36
+ const promise = Promise;
36
37
  const mathMax = Math.max;
37
38
  const mathMin = Math.min;
38
39
  const isFiniteNumber = isFinite;
@@ -48,6 +49,7 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
48
49
  const size = (arrayOrString) => arrayOrString.length;
49
50
  const test = (regex, subject) => regex.test(subject);
50
51
  const getUndefined = () => void 0;
52
+ const promiseNew = (resolver) => new promise(resolver);
51
53
 
52
54
  const arrayHas = (array, value) => array.includes(value);
53
55
  const arrayEvery = (array, cb) => array.every(cb);
@@ -74,9 +76,7 @@ const arrayShift = (array) => array.shift();
74
76
  const object = Object;
75
77
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
76
78
  const objEntries = object.entries;
77
- const objIds = object.keys;
78
79
  const objFrozen = object.isFrozen;
79
- const objFreeze = object.freeze;
80
80
  const isObject = (obj) =>
81
81
  !isUndefined(obj) &&
82
82
  ifNotUndefined(
@@ -87,6 +87,8 @@ const isObject = (obj) =>
87
87
  /* istanbul ignore next */
88
88
  () => true,
89
89
  );
90
+ const objIds = object.keys;
91
+ const objFreeze = object.freeze;
90
92
  const objNew = (entries = []) => object.fromEntries(entries);
91
93
  const objHas = (obj, id) => id in obj;
92
94
  const objDel = (obj, id) => {
@@ -97,6 +99,8 @@ const objForEach = (obj, cb) =>
97
99
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
98
100
  const objToArray = (obj, cb) =>
99
101
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
102
+ const objMap = (obj, cb) =>
103
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
100
104
  const objSize = (obj) => size(objIds(obj));
101
105
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
102
106
  const objEnsure = (obj, id, getDefaultValue) => {
@@ -105,6 +109,23 @@ const objEnsure = (obj, id, getDefaultValue) => {
105
109
  }
106
110
  return obj[id];
107
111
  };
112
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
113
+ if (
114
+ isUndefined(obj) ||
115
+ !isObject(obj) ||
116
+ (!emptyIsValid && objIsEmpty(obj)) ||
117
+ objFrozen(obj)
118
+ ) {
119
+ onInvalidObj?.();
120
+ return false;
121
+ }
122
+ objToArray(obj, (child, id) => {
123
+ if (!validateChild(child, id)) {
124
+ objDel(obj, id);
125
+ }
126
+ });
127
+ return emptyIsValid ? true : !objIsEmpty(obj);
128
+ };
108
129
 
109
130
  const collSizeN = (collSizer) => (coll) =>
110
131
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -141,24 +162,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
141
162
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
142
163
  return map;
143
164
  };
144
- const mapToObj = (map, mapValue, excludeValue) => {
165
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
145
166
  const obj = {};
146
- collForEach(map, (value, id) => {
147
- const mappedValue = mapValue ? mapValue(value, id) : value;
148
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
167
+ collForEach(map, (mapValue, id) => {
168
+ if (!excludeMapValue?.(mapValue, id)) {
169
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
170
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
171
+ }
149
172
  });
150
173
  return obj;
151
174
  };
152
- const mapToObj2 = (map, mapValue, excludeValue) =>
175
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
153
176
  mapToObj(
154
177
  map,
155
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
178
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
179
+ collIsEmpty,
156
180
  objIsEmpty,
157
181
  );
158
- const mapToObj3 = (map, mapValue, excludeValue) =>
182
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
159
183
  mapToObj(
160
184
  map,
161
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
185
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
186
+ collIsEmpty,
162
187
  objIsEmpty,
163
188
  );
164
189
  const mapClone = (map, mapValue) => {
@@ -197,6 +222,8 @@ const getCellOrValueType = (cellOrValue) => {
197
222
  ? type
198
223
  : void 0;
199
224
  };
225
+ const isCellOrValueOrNull = (cellOrValue) =>
226
+ cellOrValue === null || !isUndefined(getCellOrValueType(cellOrValue));
200
227
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
201
228
  isUndefined(cell)
202
229
  ? store.delCell(tableId, rowId, cellId, true)
@@ -1093,7 +1120,6 @@ const createMetrics = getCreateFunction((store) => {
1093
1120
 
1094
1121
  const scheduleRunning = mapNew();
1095
1122
  const scheduleActions = mapNew();
1096
- const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
1097
1123
  const getStoreFunctions = (supportsMergeableStore, store) =>
1098
1124
  !supportsMergeableStore || isUndefined(store.getMergeableContent)
1099
1125
  ? [
@@ -1118,16 +1144,15 @@ const createCustomPersister = (
1118
1144
  delPersisterListener,
1119
1145
  onIgnoredError,
1120
1146
  supportsMergeableStore,
1121
- [getThing, thing] = [],
1147
+ extra = {},
1122
1148
  scheduleId = [],
1123
1149
  ) => {
1124
- let listenerId;
1125
1150
  let loadSave = 0;
1126
1151
  let loads = 0;
1127
1152
  let saves = 0;
1128
- let listening = 0;
1129
1153
  let action;
1130
- let listeningHandle;
1154
+ let autoLoadHandle;
1155
+ let autoSaveListenerId;
1131
1156
  mapEnsure(scheduleRunning, scheduleId, () => 0);
1132
1157
  mapEnsure(scheduleActions, scheduleId, () => []);
1133
1158
  const [isMergeableStore, getContent, getChanges, hasChanges] =
@@ -1163,55 +1188,51 @@ const createCustomPersister = (
1163
1188
  }
1164
1189
  return persister;
1165
1190
  };
1191
+ const setContentOrChanges = (contentOrChanges) => {
1192
+ (isMergeableStore && isString(contentOrChanges?.[0])
1193
+ ? contentOrChanges?.[1][2] === 1
1194
+ ? store.applyMergeableChanges
1195
+ : store.setMergeableContent
1196
+ : contentOrChanges?.[2] === 1
1197
+ ? store.applyChanges
1198
+ : store.setContent)(contentOrChanges);
1199
+ };
1166
1200
  const persister = {
1167
1201
  load: async (initialTables, initialValues) =>
1168
1202
  await loadLock(async () => {
1169
1203
  try {
1170
- const content = await getPersisted();
1171
- (isMergeableStore && isMergeable(content)
1172
- ? store.setMergeableContent
1173
- : store.setContent)(content);
1174
- } catch {
1204
+ setContentOrChanges(await getPersisted());
1205
+ } catch (error) {
1206
+ onIgnoredError?.(error);
1175
1207
  store.setContent([initialTables, initialValues]);
1176
1208
  }
1177
1209
  }),
1178
1210
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
1179
- persister.stopAutoLoad();
1180
- await persister.load(initialTables, initialValues);
1181
- listening = 1;
1182
- listeningHandle = addPersisterListener(
1211
+ await persister.stopAutoLoad().load(initialTables, initialValues);
1212
+ autoLoadHandle = addPersisterListener(
1183
1213
  async (getContent2, getChanges2) => {
1184
- if (getChanges2) {
1185
- const changes = getChanges2();
1186
- await loadLock(async () =>
1187
- (isMergeableStore && isMergeable(changes)
1188
- ? store.applyMergeableChanges
1189
- : store.applyChanges)(changes),
1190
- );
1191
- } else {
1192
- await loadLock(async () => {
1193
- try {
1194
- const content = getContent2?.() ?? (await getPersisted());
1195
- (isMergeableStore && isMergeable(content)
1196
- ? store.setMergeableContent
1197
- : store.setContent)(content);
1198
- } catch (error) {
1199
- onIgnoredError?.(error);
1200
- }
1201
- });
1202
- }
1214
+ const changes = getChanges2?.();
1215
+ await loadLock(async () => {
1216
+ try {
1217
+ setContentOrChanges(
1218
+ changes ?? getContent2?.() ?? (await getPersisted()),
1219
+ );
1220
+ } catch (error) {
1221
+ onIgnoredError?.(error);
1222
+ }
1223
+ });
1203
1224
  },
1204
1225
  );
1205
1226
  return persister;
1206
1227
  },
1207
1228
  stopAutoLoad: () => {
1208
- if (listening) {
1209
- delPersisterListener(listeningHandle);
1210
- listeningHandle = void 0;
1211
- listening = 0;
1229
+ if (autoLoadHandle) {
1230
+ delPersisterListener(autoLoadHandle);
1231
+ autoLoadHandle = void 0;
1212
1232
  }
1213
1233
  return persister;
1214
1234
  },
1235
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
1215
1236
  save: async (getChanges2) => {
1216
1237
  /* istanbul ignore else */
1217
1238
  if (loadSave != 1) {
@@ -1233,7 +1254,7 @@ const createCustomPersister = (
1233
1254
  },
1234
1255
  startAutoSave: async () => {
1235
1256
  await persister.stopAutoSave().save();
1236
- listenerId = store.addDidFinishTransactionListener(() => {
1257
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
1237
1258
  const changes = getChanges();
1238
1259
  if (hasChanges(changes)) {
1239
1260
  persister.save(() => changes);
@@ -1242,10 +1263,11 @@ const createCustomPersister = (
1242
1263
  return persister;
1243
1264
  },
1244
1265
  stopAutoSave: () => {
1245
- ifNotUndefined(listenerId, store.delListener);
1246
- listenerId = void 0;
1266
+ ifNotUndefined(autoSaveListenerId, store.delListener);
1267
+ autoSaveListenerId = void 0;
1247
1268
  return persister;
1248
1269
  },
1270
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
1249
1271
  schedule: async (...actions) => {
1250
1272
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
1251
1273
  await run();
@@ -1254,13 +1276,262 @@ const createCustomPersister = (
1254
1276
  getStore: () => store,
1255
1277
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
1256
1278
  getStats: () => ({loads, saves}),
1279
+ ...extra,
1257
1280
  };
1258
- if (getThing) {
1259
- persister[getThing] = () => thing;
1260
- }
1261
1281
  return objFreeze(persister);
1262
1282
  };
1263
1283
 
1284
+ const textEncoder = new globalThis.TextEncoder();
1285
+ const getHash = (value) => {
1286
+ let hash = 2166136261;
1287
+ arrayForEach(textEncoder.encode(value), (char) => {
1288
+ hash ^= char;
1289
+ hash +=
1290
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
1291
+ });
1292
+ return hash >>> 0;
1293
+ };
1294
+
1295
+ const MASK6 = 63;
1296
+ const SHIFT36 = 2 ** 36;
1297
+ const SHIFT30 = 2 ** 30;
1298
+ const SHIFT24 = 2 ** 24;
1299
+ const SHIFT18 = 2 ** 18;
1300
+ const SHIFT12 = 2 ** 12;
1301
+ const SHIFT6 = 2 ** 6;
1302
+ const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
1303
+ const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
1304
+ const encodeHlc = (logicalTime42, counter24, clientHash30) =>
1305
+ toB64(logicalTime42 / SHIFT36) +
1306
+ toB64(logicalTime42 / SHIFT30) +
1307
+ toB64(logicalTime42 / SHIFT24) +
1308
+ toB64(logicalTime42 / SHIFT18) +
1309
+ toB64(logicalTime42 / SHIFT12) +
1310
+ toB64(logicalTime42 / SHIFT6) +
1311
+ toB64(logicalTime42) +
1312
+ toB64(counter24 / SHIFT18) +
1313
+ toB64(counter24 / SHIFT12) +
1314
+ toB64(counter24 / SHIFT6) +
1315
+ toB64(counter24) +
1316
+ toB64(clientHash30 / SHIFT24) +
1317
+ toB64(clientHash30 / SHIFT18) +
1318
+ toB64(clientHash30 / SHIFT12) +
1319
+ toB64(clientHash30 / SHIFT6) +
1320
+ toB64(clientHash30);
1321
+ const decodeHlc = (hlc16) => [
1322
+ fromB64(hlc16, 0) * SHIFT36 +
1323
+ fromB64(hlc16, 1) * SHIFT30 +
1324
+ fromB64(hlc16, 2) * SHIFT24 +
1325
+ fromB64(hlc16, 3) * SHIFT18 +
1326
+ fromB64(hlc16, 4) * SHIFT12 +
1327
+ fromB64(hlc16, 5) * SHIFT6 +
1328
+ fromB64(hlc16, 6),
1329
+ fromB64(hlc16, 7) * SHIFT18 +
1330
+ fromB64(hlc16, 8) * SHIFT12 +
1331
+ fromB64(hlc16, 9) * SHIFT6 +
1332
+ fromB64(hlc16, 10),
1333
+ fromB64(hlc16, 11) * SHIFT24 +
1334
+ fromB64(hlc16, 12) * SHIFT18 +
1335
+ fromB64(hlc16, 13) * SHIFT12 +
1336
+ fromB64(hlc16, 14) * SHIFT6 +
1337
+ fromB64(hlc16, 15),
1338
+ ];
1339
+ const getHlcFunctions = (uniqueId) => {
1340
+ let logicalTime = 0;
1341
+ let lastCounter = -1;
1342
+ const uniqueIdHash = getHash(uniqueId);
1343
+ const getHlc = () => {
1344
+ seenHlc();
1345
+ return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
1346
+ };
1347
+ const seenHlc = (hlc) => {
1348
+ const previousLogicalTime = logicalTime;
1349
+ const [remoteLogicalTime, remoteCounter] =
1350
+ isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
1351
+ logicalTime = mathMax(
1352
+ previousLogicalTime,
1353
+ remoteLogicalTime,
1354
+ globalThis.HLC_TIME ?? Date.now(),
1355
+ );
1356
+ lastCounter =
1357
+ logicalTime == previousLogicalTime
1358
+ ? logicalTime == remoteLogicalTime
1359
+ ? mathMax(lastCounter, remoteCounter)
1360
+ : lastCounter
1361
+ : logicalTime == remoteLogicalTime
1362
+ ? remoteCounter
1363
+ : -1;
1364
+ };
1365
+ return [getHlc, seenHlc];
1366
+ };
1367
+
1368
+ const RESPONSE = 0;
1369
+ const CONTENT_HASHES = 1;
1370
+ const GET_CONTENT_HASHES = 2;
1371
+ const GET_TABLE_IDS_DIFF = 3;
1372
+ const GET_ROW_IDS_DIFF = 4;
1373
+ const GET_TABLES_CHANGES = 5;
1374
+ const GET_VALUES_CHANGES = 6;
1375
+ const createCustomSynchronizer = (
1376
+ store,
1377
+ send,
1378
+ onReceive,
1379
+ destroy,
1380
+ requestTimeoutSeconds = 1,
1381
+ onIgnoredError,
1382
+ ) => {
1383
+ let persisterListener;
1384
+ let sends = 0;
1385
+ let receives = 0;
1386
+ const [getHlc] = getHlcFunctions(store.getId());
1387
+ const pendingRequests = mapNew();
1388
+ onReceive((fromClientId, requestId, messageType, messageBody) => {
1389
+ {
1390
+ receives++;
1391
+ }
1392
+ if (messageType == RESPONSE) {
1393
+ ifNotUndefined(
1394
+ mapGet(pendingRequests, requestId),
1395
+ ([toClientId, handleResponse]) =>
1396
+ isUndefined(toClientId) || toClientId == fromClientId
1397
+ ? handleResponse(messageBody, fromClientId)
1398
+ : /* istanbul ignore next */
1399
+ 0,
1400
+ );
1401
+ } else if (messageType == CONTENT_HASHES && persister.isAutoLoading()) {
1402
+ getChangesFromOtherStore(fromClientId, messageBody).then((changes) =>
1403
+ persisterListener?.(void 0, () => changes),
1404
+ );
1405
+ } else {
1406
+ ifNotUndefined(
1407
+ messageType == GET_CONTENT_HASHES && persister.isAutoSaving()
1408
+ ? store.getMergeableContentHashes()
1409
+ : messageType == GET_TABLE_IDS_DIFF
1410
+ ? store.getMergeableTableIdsDiff(messageBody)
1411
+ : messageType == GET_ROW_IDS_DIFF
1412
+ ? store.getMergeableRowIdsDiff(messageBody)
1413
+ : messageType == GET_TABLES_CHANGES
1414
+ ? store.getMergeableTablesChanges(messageBody)
1415
+ : messageType == GET_VALUES_CHANGES
1416
+ ? store.getMergeableValuesChanges(messageBody)
1417
+ : void 0,
1418
+ (response) => {
1419
+ {
1420
+ sends++;
1421
+ }
1422
+ send(fromClientId, requestId, RESPONSE, response);
1423
+ },
1424
+ );
1425
+ }
1426
+ });
1427
+ const request = async (toClientId, messageType, messageBody = EMPTY_STRING) =>
1428
+ promiseNew((resolve, reject) => {
1429
+ const requestId = getHlc();
1430
+ const timeout = setTimeout(() => {
1431
+ collDel(pendingRequests, requestId);
1432
+ reject(
1433
+ `No response from ${toClientId ?? 'anyone'} to '${messageType}'`,
1434
+ );
1435
+ }, requestTimeoutSeconds * 1e3);
1436
+ mapSet(pendingRequests, requestId, [
1437
+ toClientId,
1438
+ (response, fromClientId) => {
1439
+ clearTimeout(timeout);
1440
+ collDel(pendingRequests, requestId);
1441
+ resolve([response, fromClientId]);
1442
+ },
1443
+ ]);
1444
+ {
1445
+ sends++;
1446
+ }
1447
+ send(toClientId, requestId, messageType, messageBody);
1448
+ });
1449
+ const getChangesFromOtherStore = async (
1450
+ otherClientId = null,
1451
+ otherContentHashes,
1452
+ ) => {
1453
+ if (isUndefined(otherContentHashes)) {
1454
+ [otherContentHashes, otherClientId] = await request(
1455
+ otherClientId,
1456
+ GET_CONTENT_HASHES,
1457
+ );
1458
+ }
1459
+ const [otherContentTime, [otherTablesHash, otherValuesHash]] =
1460
+ otherContentHashes;
1461
+ const [, [tablesHash, valuesHash]] = store.getMergeableContentHashes();
1462
+ const changes = [EMPTY_STRING, [[EMPTY_STRING, {}], [EMPTY_STRING, {}], 1]];
1463
+ if (tablesHash != otherTablesHash) {
1464
+ changes[0] = otherContentTime;
1465
+ changes[1][0] = (
1466
+ await request(
1467
+ otherClientId,
1468
+ GET_TABLES_CHANGES,
1469
+ store.getMergeableCellHashes(
1470
+ (
1471
+ await request(
1472
+ otherClientId,
1473
+ GET_ROW_IDS_DIFF,
1474
+ store.getMergeableRowHashes(
1475
+ (
1476
+ await request(
1477
+ otherClientId,
1478
+ GET_TABLE_IDS_DIFF,
1479
+ store.getMergeableTableHashes(),
1480
+ )
1481
+ )[0],
1482
+ ),
1483
+ )
1484
+ )[0],
1485
+ ),
1486
+ )
1487
+ )[0];
1488
+ }
1489
+ if (valuesHash != otherValuesHash) {
1490
+ changes[0] = otherContentTime;
1491
+ changes[1][1] = (
1492
+ await request(
1493
+ otherClientId,
1494
+ GET_VALUES_CHANGES,
1495
+ store.getMergeableValuesHashes(),
1496
+ )
1497
+ )[0];
1498
+ }
1499
+ return changes;
1500
+ };
1501
+ const getPersisted = async () => {
1502
+ const changes = await getChangesFromOtherStore();
1503
+ return changes[0] != EMPTY_STRING ? changes : void 0;
1504
+ };
1505
+ const setPersisted = async () => {
1506
+ {
1507
+ sends++;
1508
+ }
1509
+ send(null, null, CONTENT_HASHES, store.getMergeableContentHashes());
1510
+ };
1511
+ const addPersisterListener = (listener) => (persisterListener = listener);
1512
+ const delPersisterListener = () => (persisterListener = void 0);
1513
+ const persister = createCustomPersister(
1514
+ store,
1515
+ getPersisted,
1516
+ setPersisted,
1517
+ addPersisterListener,
1518
+ delPersisterListener,
1519
+ onIgnoredError,
1520
+ true,
1521
+ {
1522
+ startSync: async () =>
1523
+ await (await persister.startAutoLoad()).startAutoSave(),
1524
+ stopSync: () => persister.stopAutoLoad().stopAutoSave(),
1525
+ destroy: () => {
1526
+ destroy();
1527
+ return persister.stopSync();
1528
+ },
1529
+ getSynchronizerStats: () => ({sends, receives}),
1530
+ },
1531
+ );
1532
+ return persister;
1533
+ };
1534
+
1264
1535
  const createQueries = getCreateFunction((store) => {
1265
1536
  const createStore = store.createStore;
1266
1537
  const preStore = createStore();
@@ -1909,36 +2180,29 @@ const createRelationships = getCreateFunction((store) => {
1909
2180
  return objFreeze(relationships);
1910
2181
  });
1911
2182
 
1912
- const textEncoder = new globalThis.TextEncoder();
1913
- const getHash = (value) => {
1914
- let hash = 2166136261;
1915
- arrayForEach(textEncoder.encode(value), (char) => {
1916
- hash ^= char;
1917
- hash +=
1918
- (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
1919
- });
1920
- return hash >>> 0;
1921
- };
1922
-
1923
- const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
1924
- const stampNew = (time, thing) => [time, thing];
2183
+ const stampCloneWithHash = ([time, value, hash]) => [time, value, hash];
2184
+ const stampClone = ([time, value]) => [time, value];
2185
+ const getStampHash = (stamp) => stamp[2];
1925
2186
  const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
1926
- const updateHashStamp = (hashStamp, hash, time) => {
1927
- hashStamp[2] = hash >>> 0;
1928
- if (time > hashStamp[0]) {
1929
- hashStamp[0] = time;
2187
+ const stampUpdate = (stamp, hash, time) => {
2188
+ stamp[2] = hash >>> 0;
2189
+ if (time > stamp[0]) {
2190
+ stamp[0] = time;
1930
2191
  }
1931
2192
  };
1932
- const stampNewObj = (time) => stampNew(time, objNew());
1933
- const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
1934
- const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
1935
- const hashStampMap = ([time, value, hash], mapper) => [
1936
- time,
1937
- mapper(value, time),
1938
- hash,
1939
- ];
1940
- const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
1941
- hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
2193
+ const stampNewObj = (time) => [time, objNew()];
2194
+ const stampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
2195
+ const stampMapToObjWithHash = (
2196
+ [time, map, hash],
2197
+ mapper = stampCloneWithHash,
2198
+ ) => [time, mapToObj(map, mapper), hash];
2199
+ const stampValidate = (stamp, validateThing) =>
2200
+ isArray(stamp) &&
2201
+ size(stamp) == 3 &&
2202
+ isString(stamp[0]) &&
2203
+ validateThing(stamp[1]) &&
2204
+ getTypeOf(stamp[2]) == NUMBER &&
2205
+ isFiniteNumber(stamp[2]);
1942
2206
 
1943
2207
  const pairNew = (value) => [value, value];
1944
2208
  const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
@@ -1952,18 +2216,6 @@ const jsonString = (obj) =>
1952
2216
  );
1953
2217
  const jsonParse = JSON.parse;
1954
2218
 
1955
- const validate = (obj, validateChild, onInvalidObj) => {
1956
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
1957
- onInvalidObj?.();
1958
- return false;
1959
- }
1960
- objToArray(obj, (child, id2) => {
1961
- if (!validateChild(child, id2)) {
1962
- objDel(obj, id2);
1963
- }
1964
- });
1965
- return !objIsEmpty(obj);
1966
- };
1967
2219
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
1968
2220
  mapSet(
1969
2221
  changedIds,
@@ -2023,13 +2275,13 @@ const createStore = () => {
2023
2275
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
2024
2276
  getListenerFunctions(() => store);
2025
2277
  const validateTablesSchema = (tableSchema) =>
2026
- validate(tableSchema, (tableSchema2) =>
2027
- validate(tableSchema2, validateCellOrValueSchema),
2278
+ objValidate(tableSchema, (tableSchema2) =>
2279
+ objValidate(tableSchema2, validateCellOrValueSchema),
2028
2280
  );
2029
2281
  const validateValuesSchema = (valuesSchema) =>
2030
- validate(valuesSchema, validateCellOrValueSchema);
2282
+ objValidate(valuesSchema, validateCellOrValueSchema);
2031
2283
  const validateCellOrValueSchema = (schema) => {
2032
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
2284
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
2033
2285
  return false;
2034
2286
  }
2035
2287
  const type = schema[TYPE];
@@ -2042,18 +2294,18 @@ const createStore = () => {
2042
2294
  return true;
2043
2295
  };
2044
2296
  const validateTables = (tables) =>
2045
- validate(tables, validateTable, cellInvalid);
2297
+ objValidate(tables, validateTable, cellInvalid);
2046
2298
  const validateTable = (table, tableId) =>
2047
2299
  (!hasTablesSchema ||
2048
2300
  collHas(tablesSchemaMap, tableId) ||
2049
2301
  cellInvalid(tableId)) &&
2050
- validate(
2302
+ objValidate(
2051
2303
  table,
2052
2304
  (row, rowId) => validateRow(tableId, rowId, row),
2053
2305
  () => cellInvalid(tableId),
2054
2306
  );
2055
2307
  const validateRow = (tableId, rowId, row, skipDefaults) =>
2056
- validate(
2308
+ objValidate(
2057
2309
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
2058
2310
  (cell, cellId) =>
2059
2311
  ifNotUndefined(
@@ -2080,7 +2332,7 @@ const createStore = () => {
2080
2332
  ? cellInvalid(tableId, rowId, cellId, cell)
2081
2333
  : cell;
2082
2334
  const validateValues = (values, skipDefaults) =>
2083
- validate(
2335
+ objValidate(
2084
2336
  skipDefaults ? values : addDefaultsToValues(values),
2085
2337
  (value, valueId) =>
2086
2338
  ifNotUndefined(
@@ -2923,17 +3175,20 @@ const createStore = () => {
2923
3175
  : mapToObj(
2924
3176
  row,
2925
3177
  ([, newCell]) => newCell,
2926
- (_, changedCell) => pairIsEqual(changedCell),
3178
+ (changedCell) => pairIsEqual(changedCell),
2927
3179
  ),
3180
+ collIsEmpty,
2928
3181
  objIsEmpty,
2929
3182
  ),
3183
+ collIsEmpty,
2930
3184
  objIsEmpty,
2931
3185
  ),
2932
3186
  mapToObj(
2933
3187
  changedValues,
2934
3188
  ([, newValue]) => newValue,
2935
- (_, changedValue) => pairIsEqual(changedValue),
3189
+ (changedValue) => pairIsEqual(changedValue),
2936
3190
  ),
3191
+ 1,
2937
3192
  ];
2938
3193
  const getTransactionLog = () => [
2939
3194
  !collIsEmpty(changedCells),
@@ -3266,76 +3521,6 @@ const createStore = () => {
3266
3521
  return objFreeze(store);
3267
3522
  };
3268
3523
 
3269
- const MASK6 = 63;
3270
- const SHIFT36 = 2 ** 36;
3271
- const SHIFT30 = 2 ** 30;
3272
- const SHIFT24 = 2 ** 24;
3273
- const SHIFT18 = 2 ** 18;
3274
- const SHIFT12 = 2 ** 12;
3275
- const SHIFT6 = 2 ** 6;
3276
- const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
3277
- const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
3278
- const encodeHlc = (logicalTime42, counter24, clientHash30) =>
3279
- toB64(logicalTime42 / SHIFT36) +
3280
- toB64(logicalTime42 / SHIFT30) +
3281
- toB64(logicalTime42 / SHIFT24) +
3282
- toB64(logicalTime42 / SHIFT18) +
3283
- toB64(logicalTime42 / SHIFT12) +
3284
- toB64(logicalTime42 / SHIFT6) +
3285
- toB64(logicalTime42) +
3286
- toB64(counter24 / SHIFT18) +
3287
- toB64(counter24 / SHIFT12) +
3288
- toB64(counter24 / SHIFT6) +
3289
- toB64(counter24) +
3290
- toB64(clientHash30 / SHIFT24) +
3291
- toB64(clientHash30 / SHIFT18) +
3292
- toB64(clientHash30 / SHIFT12) +
3293
- toB64(clientHash30 / SHIFT6) +
3294
- toB64(clientHash30);
3295
- const decodeHlc = (hlc16) => [
3296
- fromB64(hlc16, 0) * SHIFT36 +
3297
- fromB64(hlc16, 1) * SHIFT30 +
3298
- fromB64(hlc16, 2) * SHIFT24 +
3299
- fromB64(hlc16, 3) * SHIFT18 +
3300
- fromB64(hlc16, 4) * SHIFT12 +
3301
- fromB64(hlc16, 5) * SHIFT6 +
3302
- fromB64(hlc16, 6),
3303
- fromB64(hlc16, 7) * SHIFT18 +
3304
- fromB64(hlc16, 8) * SHIFT12 +
3305
- fromB64(hlc16, 9) * SHIFT6 +
3306
- fromB64(hlc16, 10),
3307
- fromB64(hlc16, 11) * SHIFT24 +
3308
- fromB64(hlc16, 12) * SHIFT18 +
3309
- fromB64(hlc16, 13) * SHIFT12 +
3310
- fromB64(hlc16, 14) * SHIFT6 +
3311
- fromB64(hlc16, 15),
3312
- ];
3313
- const getHlcFunctions = (uniqueId) => {
3314
- let logicalTime = 0;
3315
- let lastCounter = -1;
3316
- const uniqueIdHash = getHash(uniqueId);
3317
- const getHlc = () => {
3318
- seenHlc();
3319
- return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
3320
- };
3321
- const seenHlc = (hlc) => {
3322
- const previousLogicalTime = logicalTime;
3323
- const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
3324
- ? [0, 0]
3325
- : decodeHlc(hlc);
3326
- logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
3327
- lastCounter =
3328
- logicalTime == previousLogicalTime
3329
- ? logicalTime == remoteLogicalTime
3330
- ? mathMax(lastCounter, remoteCounter)
3331
- : lastCounter
3332
- : logicalTime == remoteLogicalTime
3333
- ? remoteCounter
3334
- : -1;
3335
- };
3336
- return [getHlc, seenHlc];
3337
- };
3338
-
3339
3524
  const LISTENER_ARGS = {
3340
3525
  HasTable: 1,
3341
3526
  Table: 1,
@@ -3354,14 +3539,54 @@ const LISTENER_ARGS = {
3354
3539
  InvalidCell: 3,
3355
3540
  InvalidValue: 1,
3356
3541
  };
3357
- const newContentHsm = (time = EMPTY_STRING) => [
3542
+ const newContentStampMap = (time = EMPTY_STRING) => [
3358
3543
  time,
3359
- [hashStampNewMap(time), hashStampNewMap(time)],
3544
+ [stampNewMap(time), stampNewMap(time)],
3360
3545
  0,
3361
3546
  ];
3547
+ const validateMergeableContent = (mergeableContent) =>
3548
+ stampValidate(
3549
+ mergeableContent,
3550
+ (content) =>
3551
+ isArray(content) &&
3552
+ size(content) == 2 &&
3553
+ stampValidate(content[0], (tableStamps) =>
3554
+ objValidate(
3555
+ tableStamps,
3556
+ (tableStamp) =>
3557
+ stampValidate(tableStamp, (rowStamps) =>
3558
+ objValidate(
3559
+ rowStamps,
3560
+ (rowStamp) =>
3561
+ stampValidate(rowStamp, (cellStamps) =>
3562
+ objValidate(
3563
+ cellStamps,
3564
+ (cellStamp) =>
3565
+ stampValidate(cellStamp, isCellOrValueOrNull),
3566
+ void 0,
3567
+ 1,
3568
+ ),
3569
+ ),
3570
+ void 0,
3571
+ 1,
3572
+ ),
3573
+ ),
3574
+ void 0,
3575
+ 1,
3576
+ ),
3577
+ ) &&
3578
+ stampValidate(content[1], (values) =>
3579
+ objValidate(
3580
+ values,
3581
+ (value) => stampValidate(value, isCellOrValueOrNull),
3582
+ void 0,
3583
+ 1,
3584
+ ),
3585
+ ),
3586
+ );
3362
3587
  const createMergeableStore = (id) => {
3363
3588
  let listening = 1;
3364
- let contentHsm = newContentHsm();
3589
+ let contentStampMap = newContentStampMap();
3365
3590
  let transactionTime;
3366
3591
  let transactionMergeableChanges;
3367
3592
  const [getHlc, seenHlc] = getHlcFunctions(id);
@@ -3371,6 +3596,7 @@ const createMergeableStore = (id) => {
3371
3596
  listening = 0;
3372
3597
  actions();
3373
3598
  listening = wasListening;
3599
+ return mergeableStore;
3374
3600
  };
3375
3601
  const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
3376
3602
  const tablesChanges = {};
@@ -3380,8 +3606,8 @@ const createMergeableStore = (id) => {
3380
3606
  [[tablesTime, tablesObj, incomingTablesHash], values],
3381
3607
  incomingContentOrChangesHash,
3382
3608
  ] = contentOrChanges;
3383
- const [, [tablesHsm, valuesHsm]] = contentHsm;
3384
- const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
3609
+ const [, [tablesStampMap, valuesStampMap]] = contentStampMap;
3610
+ const [oldTablesTime, tableStampMaps, oldTablesHash] = tablesStampMap;
3385
3611
  if (tablesTime) {
3386
3612
  let tablesHash = hasHashes
3387
3613
  ? incomingTablesHash
@@ -3392,8 +3618,8 @@ const createMergeableStore = (id) => {
3392
3618
  objForEach(
3393
3619
  tablesObj,
3394
3620
  ([tableTime, rowsObj, incomingTableHash], tableId) => {
3395
- const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
3396
- const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
3621
+ const tableStampMap = mapEnsure(tableStampMaps, tableId, stampNewMap);
3622
+ const [oldTableTime, rowStampMaps, oldTableHash] = tableStampMap;
3397
3623
  let tableHash = hasHashes
3398
3624
  ? incomingTableHash
3399
3625
  : oldTableHash ^
@@ -3404,7 +3630,7 @@ const createMergeableStore = (id) => {
3404
3630
  objForEach(rowsObj, (row, rowId) => {
3405
3631
  const [oldRowHash, rowHash] = mergeCellsOrValues(
3406
3632
  row,
3407
- mapEnsure(rowHsms, rowId, hashStampNewMap),
3633
+ mapEnsure(rowStampMaps, rowId, stampNewMap),
3408
3634
  objEnsure(
3409
3635
  objEnsure(tablesChanges, tableId, objNew),
3410
3636
  rowId,
@@ -3417,26 +3643,33 @@ const createMergeableStore = (id) => {
3417
3643
  : (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
3418
3644
  hashIdAndHash(rowId, rowHash);
3419
3645
  });
3420
- updateHashStamp(tableHsm, tableHash, tableTime);
3646
+ stampUpdate(tableStampMap, tableHash, tableTime);
3421
3647
  tablesHash ^= hasHashes
3422
3648
  ? 0
3423
3649
  : (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
3424
- hashIdAndHash(tableId, tableHsm[2]);
3650
+ hashIdAndHash(tableId, tableStampMap[2]);
3425
3651
  },
3426
3652
  );
3427
- updateHashStamp(tablesHsm, tablesHash, tablesTime);
3653
+ stampUpdate(tablesStampMap, tablesHash, tablesTime);
3428
3654
  }
3429
- mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
3430
- updateHashStamp(
3431
- contentHsm,
3432
- hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
3655
+ mergeCellsOrValues(values, valuesStampMap, valuesChanges, hasHashes);
3656
+ stampUpdate(
3657
+ contentStampMap,
3658
+ hasHashes
3659
+ ? incomingContentOrChangesHash
3660
+ : tablesStampMap[2] ^ valuesStampMap[2],
3433
3661
  contentOrChangesTime,
3434
3662
  );
3435
- return [tablesChanges, valuesChanges];
3663
+ return [tablesChanges, valuesChanges, 1];
3436
3664
  };
3437
- const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
3665
+ const mergeCellsOrValues = (
3666
+ things,
3667
+ thingsStampMap,
3668
+ thingsChanges,
3669
+ hasHashes,
3670
+ ) => {
3438
3671
  const [thingsTime, thingsObj, incomingThingsHash] = things;
3439
- const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
3672
+ const [oldThingsTime, thingStampMaps, oldThingsHash] = thingsStampMap;
3440
3673
  if (thingsTime) {
3441
3674
  let thingsHash = hasHashes
3442
3675
  ? incomingThingsHash
@@ -3447,28 +3680,32 @@ const createMergeableStore = (id) => {
3447
3680
  objForEach(
3448
3681
  thingsObj,
3449
3682
  ([thingTime, thing, incomingThingHash], thingId) => {
3450
- const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
3451
- const [oldThingTime, , oldThingHash] = thingHsm;
3683
+ const thingStampMap = mapEnsure(thingStampMaps, thingId, () => [
3684
+ EMPTY_STRING,
3685
+ void 0,
3686
+ 0,
3687
+ ]);
3688
+ const [oldThingTime, , oldThingHash] = thingStampMap;
3452
3689
  if (thingTime > oldThingTime) {
3453
- updateHashStamp(
3454
- thingHsm,
3690
+ stampUpdate(
3691
+ thingStampMap,
3455
3692
  hasHashes
3456
3693
  ? incomingThingHash
3457
3694
  : getHash(jsonString(thing ?? null) + ':' + thingTime),
3458
3695
  thingTime,
3459
3696
  );
3460
- thingHsm[1] = thing;
3697
+ thingStampMap[1] = thing;
3461
3698
  thingsChanges[thingId] = thing;
3462
3699
  thingsHash ^= hasHashes
3463
3700
  ? 0
3464
3701
  : hashIdAndHash(thingId, oldThingHash) ^
3465
- hashIdAndHash(thingId, thingHsm[2]);
3702
+ hashIdAndHash(thingId, thingStampMap[2]);
3466
3703
  }
3467
3704
  },
3468
3705
  );
3469
- updateHashStamp(thingsHsm, thingsHash, thingsTime);
3706
+ stampUpdate(thingsStampMap, thingsHash, thingsTime);
3470
3707
  }
3471
- return [oldThingsHash, thingsHsm[2]];
3708
+ return [oldThingsHash, thingsStampMap[2]];
3472
3709
  };
3473
3710
  const preFinishTransaction = () => {
3474
3711
  if (listening) {
@@ -3478,26 +3715,118 @@ const createMergeableStore = (id) => {
3478
3715
  };
3479
3716
  const postFinishTransaction = () =>
3480
3717
  (transactionTime = transactionMergeableChanges = void 0);
3481
- const getMergeableContent = () =>
3482
- hashStampMap(contentHsm, ([tables, values]) => [
3483
- hashStampMapToObj(tables, (table) =>
3484
- hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
3718
+ const getId = () => id;
3719
+ const getMergeableContent = () => [
3720
+ contentStampMap[0],
3721
+ [
3722
+ stampMapToObjWithHash(contentStampMap[1][0], (tableStampMap) =>
3723
+ stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
3724
+ stampMapToObjWithHash(rowStampMap),
3725
+ ),
3485
3726
  ),
3486
- hashStampMapToObj(values),
3487
- ]);
3488
- const setMergeableContent = (mergeableContent) => {
3489
- disableListening(() =>
3490
- store.transaction(() => {
3491
- store.delTables().delValues();
3492
- contentHsm = newContentHsm();
3493
- }),
3727
+ stampMapToObjWithHash(contentStampMap[1][1]),
3728
+ ],
3729
+ contentStampMap[2],
3730
+ ];
3731
+ const getMergeableContentHashes = () => [
3732
+ contentStampMap[0],
3733
+ [contentStampMap[1][0][2], contentStampMap[1][1][2]],
3734
+ ];
3735
+ const getMergeableTableHashes = () =>
3736
+ mapToObj(contentStampMap[1][0][1], getStampHash);
3737
+ const getMergeableTableIdsDiff = (relativeTo) => {
3738
+ const tableIds = [];
3739
+ mapForEach(contentStampMap[1][0][1], (tableId, [, , hash]) => {
3740
+ if (hash !== relativeTo?.[tableId]) {
3741
+ arrayPush(tableIds, tableId);
3742
+ }
3743
+ });
3744
+ return tableIds;
3745
+ };
3746
+ const getMergeableRowHashes = (tablesDelta) =>
3747
+ objNew(
3748
+ arrayMap(tablesDelta, (tableId) => [
3749
+ tableId,
3750
+ mapToObj(mapGet(contentStampMap[1][0][1], tableId)?.[1], getStampHash),
3751
+ ]),
3494
3752
  );
3495
- seenHlc(mergeableContent[0]);
3496
- disableListening(() =>
3497
- store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
3753
+ const getMergeableRowIdsDiff = (relativeTo) =>
3754
+ objMap(relativeTo, (rowHashes, tableId) => {
3755
+ const rowIds = [];
3756
+ mapForEach(
3757
+ mapGet(contentStampMap[1][0][1], tableId)?.[1],
3758
+ (rowId, [, , hash]) => {
3759
+ if (hash !== rowHashes?.[rowId]) {
3760
+ arrayPush(rowIds, rowId);
3761
+ }
3762
+ },
3763
+ );
3764
+ return rowIds;
3765
+ });
3766
+ const getMergeableCellHashes = (tableDelta) =>
3767
+ objMap(tableDelta, (rowIds, tableId) =>
3768
+ objNew(
3769
+ arrayMap(rowIds, (rowId) => [
3770
+ rowId,
3771
+ mapToObj(
3772
+ mapGet(mapGet(contentStampMap[1][0][1], tableId)?.[1], rowId)?.[1],
3773
+ getStampHash,
3774
+ ),
3775
+ ]),
3776
+ ),
3498
3777
  );
3499
- return mergeableStore;
3778
+ const getMergeableTablesChanges = (relativeTo) => {
3779
+ const [, [[tablesTime, tableStampMaps]]] = contentStampMap;
3780
+ const tables = {};
3781
+ objForEach(relativeTo, (rowCellHashes, tableId) =>
3782
+ ifNotUndefined(
3783
+ mapGet(tableStampMaps, tableId),
3784
+ ([tableTime, rowStampMaps]) => {
3785
+ const table = {};
3786
+ objForEach(rowCellHashes, (cellHashes, rowId) =>
3787
+ ifNotUndefined(
3788
+ mapGet(rowStampMaps, rowId),
3789
+ ([rowTime, cellStampMaps]) => {
3790
+ const row = mapToObj(
3791
+ cellStampMaps,
3792
+ stampClone,
3793
+ ([, , hash], cellId) => hash == cellHashes?.[cellId],
3794
+ );
3795
+ if (!objIsEmpty(row)) {
3796
+ table[rowId] = [rowTime, row];
3797
+ }
3798
+ },
3799
+ ),
3800
+ );
3801
+ if (!objIsEmpty(table)) {
3802
+ tables[tableId] = [tableTime, table];
3803
+ }
3804
+ },
3805
+ ),
3806
+ );
3807
+ return [tablesTime, tables];
3500
3808
  };
3809
+ const getMergeableValuesHashes = () =>
3810
+ mapToObj(contentStampMap[1][1][1], getStampHash);
3811
+ const getMergeableValuesChanges = (relativeTo) => [
3812
+ contentStampMap[1][1][0],
3813
+ mapToObj(
3814
+ contentStampMap[1][1][1],
3815
+ stampClone,
3816
+ ([, , hash], valueId) => hash == relativeTo?.[valueId],
3817
+ ),
3818
+ ];
3819
+ const setMergeableContent = (mergeableContent) =>
3820
+ disableListening(() =>
3821
+ validateMergeableContent(mergeableContent)
3822
+ ? store.transaction(() => {
3823
+ store.delTables().delValues();
3824
+ contentStampMap = newContentStampMap();
3825
+ seenHlc(mergeableContent[0]);
3826
+ store.applyChanges(mergeContentOrChanges(mergeableContent, 1));
3827
+ })
3828
+ : 0,
3829
+ );
3501
3830
  const getTransactionMergeableChanges = () => {
3502
3831
  if (isUndefined(transactionMergeableChanges)) {
3503
3832
  const [, , changedCells, , changedValues] = store.getTransactionLog();
@@ -3505,10 +3834,14 @@ const createMergeableStore = (id) => {
3505
3834
  !objIsEmpty(changedCells) || !objIsEmpty(changedValues)
3506
3835
  ? transactionTime ?? (transactionTime = getHlc())
3507
3836
  : EMPTY_STRING;
3508
- const mergeableChanges = stampNew(time, [
3509
- stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
3510
- stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
3511
- ]);
3837
+ const mergeableChanges = [
3838
+ time,
3839
+ [
3840
+ stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
3841
+ stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
3842
+ 1,
3843
+ ],
3844
+ ];
3512
3845
  const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
3513
3846
  objToArray(changedCells, (changedTable, tableId) => {
3514
3847
  const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
@@ -3516,60 +3849,45 @@ const createMergeableStore = (id) => {
3516
3849
  const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
3517
3850
  objToArray(
3518
3851
  changedRow,
3519
- ([, newCell], cellId) =>
3520
- (cellsObj[cellId] = stampNew(time, newCell)),
3852
+ ([, newCell], cellId) => (cellsObj[cellId] = [time, newCell]),
3521
3853
  );
3522
3854
  });
3523
3855
  });
3524
3856
  objToArray(
3525
3857
  changedValues,
3526
- ([, newValue], valueId) =>
3527
- (valuesObj[valueId] = stampNew(time, newValue)),
3858
+ ([, newValue], valueId) => (valuesObj[valueId] = [time, newValue]),
3528
3859
  );
3529
3860
  return mergeableChanges;
3530
3861
  }
3531
3862
  return transactionMergeableChanges;
3532
3863
  };
3533
- const applyMergeableChanges = (mergeableChanges) => {
3534
- seenHlc(mergeableChanges[0]);
3535
- disableListening(() =>
3536
- store.applyChanges(mergeContentOrChanges(mergeableChanges)),
3537
- );
3538
- return mergeableStore;
3539
- };
3864
+ const applyMergeableChanges = (mergeableChanges) =>
3865
+ disableListening(() => {
3866
+ seenHlc(mergeableChanges[0]);
3867
+ store.applyChanges(mergeContentOrChanges(mergeableChanges));
3868
+ });
3540
3869
  const merge = (mergeableStore2) => {
3541
3870
  const mergeableChanges = getMergeableContent();
3542
3871
  const mergeableChanges2 = mergeableStore2.getMergeableContent();
3543
3872
  mergeableStore2.applyMergeableChanges(mergeableChanges);
3544
3873
  return applyMergeableChanges(mergeableChanges2);
3545
3874
  };
3546
- const getContentHash = () => contentHsm[2];
3547
- const getTablesHash = () => contentHsm[1][0][2];
3548
- const getTableHash = (tableId) =>
3549
- mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
3550
- const getRowHash = (tableId, rowId) =>
3551
- mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
3552
- const getCellHash = (tableId, rowId, cellId) =>
3553
- mapGet(
3554
- mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
3555
- cellId,
3556
- )?.[2] ?? 0;
3557
- const getValuesHash = () => contentHsm[1][1][2];
3558
- const getValueHash = (valueId) =>
3559
- mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
3560
3875
  const mergeableStore = {
3876
+ getId,
3561
3877
  getMergeableContent,
3878
+ getMergeableContentHashes,
3879
+ getMergeableTableHashes,
3880
+ getMergeableTableIdsDiff,
3881
+ getMergeableRowHashes,
3882
+ getMergeableRowIdsDiff,
3883
+ getMergeableCellHashes,
3884
+ getMergeableTablesChanges,
3885
+ getMergeableValuesHashes,
3886
+ getMergeableValuesChanges,
3562
3887
  setMergeableContent,
3563
3888
  getTransactionMergeableChanges,
3564
3889
  applyMergeableChanges,
3565
3890
  merge,
3566
- getContentHash,
3567
- getTablesHash,
3568
- getTableHash,
3569
- getRowHash,
3570
- getCellHash,
3571
- getValuesHash,
3572
- getValueHash,
3573
3891
  };
3574
3892
  store.setInternalListeners(preFinishTransaction, postFinishTransaction);
3575
3893
  objToArray(
@@ -3601,6 +3919,7 @@ const createMergeableStore = (id) => {
3601
3919
  export {
3602
3920
  createCheckpoints,
3603
3921
  createCustomPersister,
3922
+ createCustomSynchronizer,
3604
3923
  createIndexes,
3605
3924
  createMergeableStore,
3606
3925
  createMetrics,