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
@@ -50,9 +50,7 @@ const arrayShift = (array) => array.shift();
50
50
  const object = Object;
51
51
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
52
52
  const objEntries = object.entries;
53
- const objIds = object.keys;
54
53
  const objFrozen = object.isFrozen;
55
- const objFreeze = object.freeze;
56
54
  const isObject = (obj) =>
57
55
  !isUndefined(obj) &&
58
56
  ifNotUndefined(
@@ -63,6 +61,8 @@ const isObject = (obj) =>
63
61
  /* istanbul ignore next */
64
62
  () => true,
65
63
  );
64
+ const objIds = object.keys;
65
+ const objFreeze = object.freeze;
66
66
  const objHas = (obj, id) => id in obj;
67
67
  const objDel = (obj, id) => {
68
68
  delete obj[id];
@@ -72,6 +72,23 @@ const objToArray = (obj, cb) =>
72
72
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
73
73
  const objSize = (obj) => size(objIds(obj));
74
74
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
75
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
76
+ if (
77
+ isUndefined(obj) ||
78
+ !isObject(obj) ||
79
+ (!emptyIsValid && objIsEmpty(obj)) ||
80
+ objFrozen(obj)
81
+ ) {
82
+ onInvalidObj?.();
83
+ return false;
84
+ }
85
+ objToArray(obj, (child, id) => {
86
+ if (!validateChild(child, id)) {
87
+ objDel(obj, id);
88
+ }
89
+ });
90
+ return emptyIsValid ? true : !objIsEmpty(obj);
91
+ };
75
92
 
76
93
  const collSizeN = (collSizer) => (coll) =>
77
94
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -108,24 +125,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
108
125
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
109
126
  return map;
110
127
  };
111
- const mapToObj = (map, mapValue, excludeValue) => {
128
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
112
129
  const obj = {};
113
- collForEach(map, (value, id) => {
114
- const mappedValue = mapValue ? mapValue(value, id) : value;
115
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
130
+ collForEach(map, (mapValue, id) => {
131
+ if (!excludeMapValue?.(mapValue, id)) {
132
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
133
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
134
+ }
116
135
  });
117
136
  return obj;
118
137
  };
119
- const mapToObj2 = (map, mapValue, excludeValue) =>
138
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
120
139
  mapToObj(
121
140
  map,
122
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
141
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
142
+ collIsEmpty,
123
143
  objIsEmpty,
124
144
  );
125
- const mapToObj3 = (map, mapValue, excludeValue) =>
145
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
126
146
  mapToObj(
127
147
  map,
128
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
148
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
149
+ collIsEmpty,
129
150
  objIsEmpty,
130
151
  );
131
152
  const mapClone = (map, mapValue) => {
@@ -278,18 +299,6 @@ const jsonParse = JSON.parse;
278
299
  const defaultSorter = (sortKey1, sortKey2) =>
279
300
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
280
301
 
281
- const validate = (obj, validateChild, onInvalidObj) => {
282
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
283
- onInvalidObj?.();
284
- return false;
285
- }
286
- objToArray(obj, (child, id2) => {
287
- if (!validateChild(child, id2)) {
288
- objDel(obj, id2);
289
- }
290
- });
291
- return !objIsEmpty(obj);
292
- };
293
302
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
294
303
  mapSet(
295
304
  changedIds,
@@ -349,13 +358,13 @@ const createStore = () => {
349
358
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
350
359
  getListenerFunctions(() => store);
351
360
  const validateTablesSchema = (tableSchema) =>
352
- validate(tableSchema, (tableSchema2) =>
353
- validate(tableSchema2, validateCellOrValueSchema),
361
+ objValidate(tableSchema, (tableSchema2) =>
362
+ objValidate(tableSchema2, validateCellOrValueSchema),
354
363
  );
355
364
  const validateValuesSchema = (valuesSchema) =>
356
- validate(valuesSchema, validateCellOrValueSchema);
365
+ objValidate(valuesSchema, validateCellOrValueSchema);
357
366
  const validateCellOrValueSchema = (schema) => {
358
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
367
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
359
368
  return false;
360
369
  }
361
370
  const type = schema[TYPE];
@@ -368,18 +377,18 @@ const createStore = () => {
368
377
  return true;
369
378
  };
370
379
  const validateTables = (tables) =>
371
- validate(tables, validateTable, cellInvalid);
380
+ objValidate(tables, validateTable, cellInvalid);
372
381
  const validateTable = (table, tableId) =>
373
382
  (!hasTablesSchema ||
374
383
  collHas(tablesSchemaMap, tableId) ||
375
384
  cellInvalid(tableId)) &&
376
- validate(
385
+ objValidate(
377
386
  table,
378
387
  (row, rowId) => validateRow(tableId, rowId, row),
379
388
  () => cellInvalid(tableId),
380
389
  );
381
390
  const validateRow = (tableId, rowId, row, skipDefaults) =>
382
- validate(
391
+ objValidate(
383
392
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
384
393
  (cell, cellId) =>
385
394
  ifNotUndefined(
@@ -406,7 +415,7 @@ const createStore = () => {
406
415
  ? cellInvalid(tableId, rowId, cellId, cell)
407
416
  : cell;
408
417
  const validateValues = (values, skipDefaults) =>
409
- validate(
418
+ objValidate(
410
419
  skipDefaults ? values : addDefaultsToValues(values),
411
420
  (value, valueId) =>
412
421
  ifNotUndefined(
@@ -1249,17 +1258,20 @@ const createStore = () => {
1249
1258
  : mapToObj(
1250
1259
  row,
1251
1260
  ([, newCell]) => newCell,
1252
- (_, changedCell) => pairIsEqual(changedCell),
1261
+ (changedCell) => pairIsEqual(changedCell),
1253
1262
  ),
1263
+ collIsEmpty,
1254
1264
  objIsEmpty,
1255
1265
  ),
1266
+ collIsEmpty,
1256
1267
  objIsEmpty,
1257
1268
  ),
1258
1269
  mapToObj(
1259
1270
  changedValues,
1260
1271
  ([, newValue]) => newValue,
1261
- (_, changedValue) => pairIsEqual(changedValue),
1272
+ (changedValue) => pairIsEqual(changedValue),
1262
1273
  ),
1274
+ 1,
1263
1275
  ];
1264
1276
  const getTransactionLog = () => [
1265
1277
  !collIsEmpty(changedCells),
@@ -0,0 +1,502 @@
1
+ const getTypeOf = (thing) => typeof thing;
2
+ const EMPTY_STRING = '';
3
+ const STRING = getTypeOf(EMPTY_STRING);
4
+ const strCharCodeAt = (str, position) => str.charCodeAt(position);
5
+
6
+ const promise = Promise;
7
+ const mathMax = Math.max;
8
+ const isUndefined = (thing) => thing == void 0;
9
+ const ifNotUndefined = (value, then, otherwise) =>
10
+ isUndefined(value) ? otherwise?.() : then(value);
11
+ const isString = (thing) => getTypeOf(thing) == STRING;
12
+ const size = (arrayOrString) => arrayOrString.length;
13
+ const promiseNew = (resolver) => new promise(resolver);
14
+
15
+ const arrayForEach = (array, cb) => array.forEach(cb);
16
+ const arrayPush = (array, ...values) => array.push(...values);
17
+ const arrayShift = (array) => array.shift();
18
+
19
+ const object = Object;
20
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
21
+ const isObject = (obj) =>
22
+ !isUndefined(obj) &&
23
+ ifNotUndefined(
24
+ getPrototypeOf(obj),
25
+ (objPrototype) =>
26
+ objPrototype == object.prototype ||
27
+ isUndefined(getPrototypeOf(objPrototype)),
28
+ /* istanbul ignore next */
29
+ () => true,
30
+ );
31
+ const objIds = object.keys;
32
+ const objFreeze = object.freeze;
33
+ const objSize = (obj) => size(objIds(obj));
34
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
35
+
36
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
37
+ const collForEach = (coll, cb) => coll?.forEach(cb);
38
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
39
+
40
+ const mapNew = (entries) => new Map(entries);
41
+ const mapGet = (map, key) => map?.get(key);
42
+ const mapForEach = (map, cb) =>
43
+ collForEach(map, (value, key) => cb(key, value));
44
+ const mapSet = (map, key, value) =>
45
+ isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
46
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
47
+ if (!collHas(map, key)) {
48
+ mapSet(map, key, getDefaultValue());
49
+ } else {
50
+ hadExistingValue?.(mapGet(map, key));
51
+ }
52
+ return mapGet(map, key);
53
+ };
54
+
55
+ const scheduleRunning = mapNew();
56
+ const scheduleActions = mapNew();
57
+ const getStoreFunctions = (supportsMergeableStore, store) =>
58
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
59
+ ? [
60
+ 0,
61
+ store.getContent,
62
+ store.getTransactionChanges,
63
+ ([changedTables, changedValues]) =>
64
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
65
+ ]
66
+ : [
67
+ 1,
68
+ store.getMergeableContent,
69
+ store.getTransactionMergeableChanges,
70
+ ([, [[, changedTables], [, changedValues]]]) =>
71
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
72
+ ];
73
+ const createCustomPersister = (
74
+ store,
75
+ getPersisted,
76
+ setPersisted,
77
+ addPersisterListener,
78
+ delPersisterListener,
79
+ onIgnoredError,
80
+ supportsMergeableStore,
81
+ extra = {},
82
+ scheduleId = [],
83
+ ) => {
84
+ let loadSave = 0;
85
+ let loads = 0;
86
+ let saves = 0;
87
+ let action;
88
+ let autoLoadHandle;
89
+ let autoSaveListenerId;
90
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
91
+ mapEnsure(scheduleActions, scheduleId, () => []);
92
+ const [isMergeableStore, getContent, getChanges, hasChanges] =
93
+ getStoreFunctions(supportsMergeableStore, store);
94
+ const run = async () => {
95
+ /* istanbul ignore else */
96
+ if (!mapGet(scheduleRunning, scheduleId)) {
97
+ mapSet(scheduleRunning, scheduleId, 1);
98
+ while (
99
+ !isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
100
+ ) {
101
+ try {
102
+ await action();
103
+ } catch (error) {
104
+ /* istanbul ignore next */
105
+ onIgnoredError?.(error);
106
+ }
107
+ }
108
+ mapSet(scheduleRunning, scheduleId, 0);
109
+ }
110
+ };
111
+ const loadLock = async (actions) => {
112
+ /* istanbul ignore else */
113
+ if (loadSave != 2) {
114
+ loadSave = 1;
115
+ {
116
+ loads++;
117
+ }
118
+ await persister.schedule(async () => {
119
+ await actions();
120
+ loadSave = 0;
121
+ });
122
+ }
123
+ return persister;
124
+ };
125
+ const setContentOrChanges = (contentOrChanges) => {
126
+ (isMergeableStore && isString(contentOrChanges?.[0])
127
+ ? contentOrChanges?.[1][2] === 1
128
+ ? store.applyMergeableChanges
129
+ : store.setMergeableContent
130
+ : contentOrChanges?.[2] === 1
131
+ ? store.applyChanges
132
+ : store.setContent)(contentOrChanges);
133
+ };
134
+ const persister = {
135
+ load: async (initialTables, initialValues) =>
136
+ await loadLock(async () => {
137
+ try {
138
+ setContentOrChanges(await getPersisted());
139
+ } catch (error) {
140
+ onIgnoredError?.(error);
141
+ store.setContent([initialTables, initialValues]);
142
+ }
143
+ }),
144
+ startAutoLoad: async (initialTables = {}, initialValues = {}) => {
145
+ await persister.stopAutoLoad().load(initialTables, initialValues);
146
+ autoLoadHandle = addPersisterListener(
147
+ async (getContent2, getChanges2) => {
148
+ const changes = getChanges2?.();
149
+ await loadLock(async () => {
150
+ try {
151
+ setContentOrChanges(
152
+ changes ?? getContent2?.() ?? (await getPersisted()),
153
+ );
154
+ } catch (error) {
155
+ onIgnoredError?.(error);
156
+ }
157
+ });
158
+ },
159
+ );
160
+ return persister;
161
+ },
162
+ stopAutoLoad: () => {
163
+ if (autoLoadHandle) {
164
+ delPersisterListener(autoLoadHandle);
165
+ autoLoadHandle = void 0;
166
+ }
167
+ return persister;
168
+ },
169
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
170
+ save: async (getChanges2) => {
171
+ /* istanbul ignore else */
172
+ if (loadSave != 1) {
173
+ loadSave = 2;
174
+ {
175
+ saves++;
176
+ }
177
+ await persister.schedule(async () => {
178
+ try {
179
+ await setPersisted(getContent, getChanges2);
180
+ } catch (error) {
181
+ /* istanbul ignore next */
182
+ onIgnoredError?.(error);
183
+ }
184
+ loadSave = 0;
185
+ });
186
+ }
187
+ return persister;
188
+ },
189
+ startAutoSave: async () => {
190
+ await persister.stopAutoSave().save();
191
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
192
+ const changes = getChanges();
193
+ if (hasChanges(changes)) {
194
+ persister.save(() => changes);
195
+ }
196
+ });
197
+ return persister;
198
+ },
199
+ stopAutoSave: () => {
200
+ ifNotUndefined(autoSaveListenerId, store.delListener);
201
+ autoSaveListenerId = void 0;
202
+ return persister;
203
+ },
204
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
205
+ schedule: async (...actions) => {
206
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
207
+ await run();
208
+ return persister;
209
+ },
210
+ getStore: () => store,
211
+ destroy: () => persister.stopAutoLoad().stopAutoSave(),
212
+ getStats: () => ({loads, saves}),
213
+ ...extra,
214
+ };
215
+ return objFreeze(persister);
216
+ };
217
+
218
+ const textEncoder = new globalThis.TextEncoder();
219
+ const getHash = (value) => {
220
+ let hash = 2166136261;
221
+ arrayForEach(textEncoder.encode(value), (char) => {
222
+ hash ^= char;
223
+ hash +=
224
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
225
+ });
226
+ return hash >>> 0;
227
+ };
228
+
229
+ const MASK6 = 63;
230
+ const SHIFT36 = 2 ** 36;
231
+ const SHIFT30 = 2 ** 30;
232
+ const SHIFT24 = 2 ** 24;
233
+ const SHIFT18 = 2 ** 18;
234
+ const SHIFT12 = 2 ** 12;
235
+ const SHIFT6 = 2 ** 6;
236
+ const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
237
+ const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
238
+ const encodeHlc = (logicalTime42, counter24, clientHash30) =>
239
+ toB64(logicalTime42 / SHIFT36) +
240
+ toB64(logicalTime42 / SHIFT30) +
241
+ toB64(logicalTime42 / SHIFT24) +
242
+ toB64(logicalTime42 / SHIFT18) +
243
+ toB64(logicalTime42 / SHIFT12) +
244
+ toB64(logicalTime42 / SHIFT6) +
245
+ toB64(logicalTime42) +
246
+ toB64(counter24 / SHIFT18) +
247
+ toB64(counter24 / SHIFT12) +
248
+ toB64(counter24 / SHIFT6) +
249
+ toB64(counter24) +
250
+ toB64(clientHash30 / SHIFT24) +
251
+ toB64(clientHash30 / SHIFT18) +
252
+ toB64(clientHash30 / SHIFT12) +
253
+ toB64(clientHash30 / SHIFT6) +
254
+ toB64(clientHash30);
255
+ const decodeHlc = (hlc16) => [
256
+ fromB64(hlc16, 0) * SHIFT36 +
257
+ fromB64(hlc16, 1) * SHIFT30 +
258
+ fromB64(hlc16, 2) * SHIFT24 +
259
+ fromB64(hlc16, 3) * SHIFT18 +
260
+ fromB64(hlc16, 4) * SHIFT12 +
261
+ fromB64(hlc16, 5) * SHIFT6 +
262
+ fromB64(hlc16, 6),
263
+ fromB64(hlc16, 7) * SHIFT18 +
264
+ fromB64(hlc16, 8) * SHIFT12 +
265
+ fromB64(hlc16, 9) * SHIFT6 +
266
+ fromB64(hlc16, 10),
267
+ fromB64(hlc16, 11) * SHIFT24 +
268
+ fromB64(hlc16, 12) * SHIFT18 +
269
+ fromB64(hlc16, 13) * SHIFT12 +
270
+ fromB64(hlc16, 14) * SHIFT6 +
271
+ fromB64(hlc16, 15),
272
+ ];
273
+ const getHlcFunctions = (uniqueId) => {
274
+ let logicalTime = 0;
275
+ let lastCounter = -1;
276
+ const uniqueIdHash = getHash(uniqueId);
277
+ const getHlc = () => {
278
+ seenHlc();
279
+ return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
280
+ };
281
+ const seenHlc = (hlc) => {
282
+ const previousLogicalTime = logicalTime;
283
+ const [remoteLogicalTime, remoteCounter] =
284
+ isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
285
+ logicalTime = mathMax(
286
+ previousLogicalTime,
287
+ remoteLogicalTime,
288
+ globalThis.HLC_TIME ?? Date.now(),
289
+ );
290
+ lastCounter =
291
+ logicalTime == previousLogicalTime
292
+ ? logicalTime == remoteLogicalTime
293
+ ? mathMax(lastCounter, remoteCounter)
294
+ : lastCounter
295
+ : logicalTime == remoteLogicalTime
296
+ ? remoteCounter
297
+ : -1;
298
+ };
299
+ return [getHlc, seenHlc];
300
+ };
301
+
302
+ const RESPONSE = 0;
303
+ const CONTENT_HASHES = 1;
304
+ const GET_CONTENT_HASHES = 2;
305
+ const GET_TABLE_IDS_DIFF = 3;
306
+ const GET_ROW_IDS_DIFF = 4;
307
+ const GET_TABLES_CHANGES = 5;
308
+ const GET_VALUES_CHANGES = 6;
309
+ const createCustomSynchronizer = (
310
+ store,
311
+ send,
312
+ onReceive,
313
+ destroy,
314
+ requestTimeoutSeconds = 1,
315
+ onIgnoredError,
316
+ ) => {
317
+ let persisterListener;
318
+ let sends = 0;
319
+ let receives = 0;
320
+ const [getHlc] = getHlcFunctions(store.getId());
321
+ const pendingRequests = mapNew();
322
+ onReceive((fromClientId, requestId, messageType, messageBody) => {
323
+ {
324
+ receives++;
325
+ }
326
+ if (messageType == RESPONSE) {
327
+ ifNotUndefined(
328
+ mapGet(pendingRequests, requestId),
329
+ ([toClientId, handleResponse]) =>
330
+ isUndefined(toClientId) || toClientId == fromClientId
331
+ ? handleResponse(messageBody, fromClientId)
332
+ : /* istanbul ignore next */
333
+ 0,
334
+ );
335
+ } else if (messageType == CONTENT_HASHES && persister.isAutoLoading()) {
336
+ getChangesFromOtherStore(fromClientId, messageBody).then((changes) =>
337
+ persisterListener?.(void 0, () => changes),
338
+ );
339
+ } else {
340
+ ifNotUndefined(
341
+ messageType == GET_CONTENT_HASHES && persister.isAutoSaving()
342
+ ? store.getMergeableContentHashes()
343
+ : messageType == GET_TABLE_IDS_DIFF
344
+ ? store.getMergeableTableIdsDiff(messageBody)
345
+ : messageType == GET_ROW_IDS_DIFF
346
+ ? store.getMergeableRowIdsDiff(messageBody)
347
+ : messageType == GET_TABLES_CHANGES
348
+ ? store.getMergeableTablesChanges(messageBody)
349
+ : messageType == GET_VALUES_CHANGES
350
+ ? store.getMergeableValuesChanges(messageBody)
351
+ : void 0,
352
+ (response) => {
353
+ {
354
+ sends++;
355
+ }
356
+ send(fromClientId, requestId, RESPONSE, response);
357
+ },
358
+ );
359
+ }
360
+ });
361
+ const request = async (toClientId, messageType, messageBody = EMPTY_STRING) =>
362
+ promiseNew((resolve, reject) => {
363
+ const requestId = getHlc();
364
+ const timeout = setTimeout(() => {
365
+ collDel(pendingRequests, requestId);
366
+ reject(
367
+ `No response from ${toClientId ?? 'anyone'} to '${messageType}'`,
368
+ );
369
+ }, requestTimeoutSeconds * 1e3);
370
+ mapSet(pendingRequests, requestId, [
371
+ toClientId,
372
+ (response, fromClientId) => {
373
+ clearTimeout(timeout);
374
+ collDel(pendingRequests, requestId);
375
+ resolve([response, fromClientId]);
376
+ },
377
+ ]);
378
+ {
379
+ sends++;
380
+ }
381
+ send(toClientId, requestId, messageType, messageBody);
382
+ });
383
+ const getChangesFromOtherStore = async (
384
+ otherClientId = null,
385
+ otherContentHashes,
386
+ ) => {
387
+ if (isUndefined(otherContentHashes)) {
388
+ [otherContentHashes, otherClientId] = await request(
389
+ otherClientId,
390
+ GET_CONTENT_HASHES,
391
+ );
392
+ }
393
+ const [otherContentTime, [otherTablesHash, otherValuesHash]] =
394
+ otherContentHashes;
395
+ const [, [tablesHash, valuesHash]] = store.getMergeableContentHashes();
396
+ const changes = [EMPTY_STRING, [[EMPTY_STRING, {}], [EMPTY_STRING, {}], 1]];
397
+ if (tablesHash != otherTablesHash) {
398
+ changes[0] = otherContentTime;
399
+ changes[1][0] = (
400
+ await request(
401
+ otherClientId,
402
+ GET_TABLES_CHANGES,
403
+ store.getMergeableCellHashes(
404
+ (
405
+ await request(
406
+ otherClientId,
407
+ GET_ROW_IDS_DIFF,
408
+ store.getMergeableRowHashes(
409
+ (
410
+ await request(
411
+ otherClientId,
412
+ GET_TABLE_IDS_DIFF,
413
+ store.getMergeableTableHashes(),
414
+ )
415
+ )[0],
416
+ ),
417
+ )
418
+ )[0],
419
+ ),
420
+ )
421
+ )[0];
422
+ }
423
+ if (valuesHash != otherValuesHash) {
424
+ changes[0] = otherContentTime;
425
+ changes[1][1] = (
426
+ await request(
427
+ otherClientId,
428
+ GET_VALUES_CHANGES,
429
+ store.getMergeableValuesHashes(),
430
+ )
431
+ )[0];
432
+ }
433
+ return changes;
434
+ };
435
+ const getPersisted = async () => {
436
+ const changes = await getChangesFromOtherStore();
437
+ return changes[0] != EMPTY_STRING ? changes : void 0;
438
+ };
439
+ const setPersisted = async () => {
440
+ {
441
+ sends++;
442
+ }
443
+ send(null, null, CONTENT_HASHES, store.getMergeableContentHashes());
444
+ };
445
+ const addPersisterListener = (listener) => (persisterListener = listener);
446
+ const delPersisterListener = () => (persisterListener = void 0);
447
+ const persister = createCustomPersister(
448
+ store,
449
+ getPersisted,
450
+ setPersisted,
451
+ addPersisterListener,
452
+ delPersisterListener,
453
+ onIgnoredError,
454
+ true,
455
+ {
456
+ startSync: async () =>
457
+ await (await persister.startAutoLoad()).startAutoSave(),
458
+ stopSync: () => persister.stopAutoLoad().stopAutoSave(),
459
+ destroy: () => {
460
+ destroy();
461
+ return persister.stopSync();
462
+ },
463
+ getSynchronizerStats: () => ({sends, receives}),
464
+ },
465
+ );
466
+ return persister;
467
+ };
468
+
469
+ const clients = mapNew();
470
+ const createLocalSynchronizer = (store, onIgnoredError) => {
471
+ const clientId = '' + Math.random();
472
+ const onReceive = (receive) => {
473
+ mapSet(clients, clientId, receive);
474
+ };
475
+ const send = (toClientId, requestId, messageType, messageBody) => {
476
+ isUndefined(toClientId)
477
+ ? mapForEach(clients, (otherClientId, receive) =>
478
+ otherClientId != clientId
479
+ ? receive(clientId, requestId, messageType, messageBody)
480
+ : 0,
481
+ )
482
+ : mapGet(clients, toClientId)?.(
483
+ clientId,
484
+ requestId,
485
+ messageType,
486
+ messageBody,
487
+ );
488
+ };
489
+ const destroy = () => {
490
+ collDel(clients, clientId);
491
+ };
492
+ return createCustomSynchronizer(
493
+ store,
494
+ send,
495
+ onReceive,
496
+ destroy,
497
+ 1e-3,
498
+ onIgnoredError,
499
+ );
500
+ };
501
+
502
+ export {createLocalSynchronizer};