@livestore/common 0.4.0-dev.21 → 0.4.0-dev.23

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 (344) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +16 -9
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/WorkerTransportError.d.ts +11 -0
  6. package/dist/WorkerTransportError.d.ts.map +1 -0
  7. package/dist/WorkerTransportError.js +11 -0
  8. package/dist/WorkerTransportError.js.map +1 -0
  9. package/dist/adapter-types.d.ts +26 -3
  10. package/dist/adapter-types.d.ts.map +1 -1
  11. package/dist/adapter-types.js +27 -1
  12. package/dist/adapter-types.js.map +1 -1
  13. package/dist/bounded-collections.d.ts.map +1 -1
  14. package/dist/bounded-collections.js +6 -4
  15. package/dist/bounded-collections.js.map +1 -1
  16. package/dist/debug-info.js +4 -4
  17. package/dist/debug-info.js.map +1 -1
  18. package/dist/devtools/devtools-messages-client-session.d.ts +42 -22
  19. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  20. package/dist/devtools/devtools-messages-client-session.js +12 -1
  21. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  22. package/dist/devtools/devtools-messages-common.d.ts +12 -6
  23. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  24. package/dist/devtools/devtools-messages-common.js +8 -3
  25. package/dist/devtools/devtools-messages-common.js.map +1 -1
  26. package/dist/devtools/devtools-messages-leader.d.ts +45 -25
  27. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  28. package/dist/devtools/devtools-messages-leader.js +12 -1
  29. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  30. package/dist/devtools/mod.js +1 -1
  31. package/dist/devtools/mod.js.map +1 -1
  32. package/dist/errors.d.ts +15 -15
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +11 -11
  35. package/dist/errors.js.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts +20 -6
  41. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  42. package/dist/leader-thread/LeaderSyncProcessor.js +283 -253
  43. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  44. package/dist/leader-thread/RejectedPushError.d.ts +107 -0
  45. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  46. package/dist/leader-thread/RejectedPushError.js +78 -0
  47. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  48. package/dist/leader-thread/connection.js +1 -1
  49. package/dist/leader-thread/connection.js.map +1 -1
  50. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  51. package/dist/leader-thread/eventlog.js +12 -11
  52. package/dist/leader-thread/eventlog.js.map +1 -1
  53. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  54. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  55. package/dist/leader-thread/leader-worker-devtools.js +34 -14
  56. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  57. package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -5
  58. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.js +12 -11
  60. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.test.js +1 -1
  62. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  63. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  64. package/dist/leader-thread/materialize-event.js +7 -4
  65. package/dist/leader-thread/materialize-event.js.map +1 -1
  66. package/dist/leader-thread/recreate-db.js +1 -1
  67. package/dist/leader-thread/recreate-db.js.map +1 -1
  68. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  69. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  70. package/dist/leader-thread/shutdown-channel.js +2 -2
  71. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  72. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  73. package/dist/leader-thread/stream-events.js +4 -3
  74. package/dist/leader-thread/stream-events.js.map +1 -1
  75. package/dist/leader-thread/types.d.ts +7 -6
  76. package/dist/leader-thread/types.d.ts.map +1 -1
  77. package/dist/leader-thread/types.js.map +1 -1
  78. package/dist/logging.js +4 -4
  79. package/dist/logging.js.map +1 -1
  80. package/dist/make-client-session.js +2 -2
  81. package/dist/make-client-session.js.map +1 -1
  82. package/dist/materializer-helper.js +6 -6
  83. package/dist/materializer-helper.js.map +1 -1
  84. package/dist/otel.d.ts +1 -1
  85. package/dist/otel.d.ts.map +1 -1
  86. package/dist/otel.js +2 -2
  87. package/dist/otel.js.map +1 -1
  88. package/dist/rematerialize-from-eventlog.d.ts +1 -1
  89. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  90. package/dist/rematerialize-from-eventlog.js +11 -9
  91. package/dist/rematerialize-from-eventlog.js.map +1 -1
  92. package/dist/schema/EventDef/define.d.ts +16 -2
  93. package/dist/schema/EventDef/define.d.ts.map +1 -1
  94. package/dist/schema/EventDef/define.js +5 -4
  95. package/dist/schema/EventDef/define.js.map +1 -1
  96. package/dist/schema/EventDef/deprecated.d.ts +99 -0
  97. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  98. package/dist/schema/EventDef/deprecated.js +144 -0
  99. package/dist/schema/EventDef/deprecated.js.map +1 -0
  100. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  101. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  102. package/dist/schema/EventDef/deprecated.test.js +95 -0
  103. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  104. package/dist/schema/EventDef/event-def.d.ts +4 -0
  105. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  106. package/dist/schema/EventDef/mod.d.ts +1 -0
  107. package/dist/schema/EventDef/mod.d.ts.map +1 -1
  108. package/dist/schema/EventDef/mod.js +1 -0
  109. package/dist/schema/EventDef/mod.js.map +1 -1
  110. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  111. package/dist/schema/EventSequenceNumber/client.js +11 -11
  112. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  113. package/dist/schema/EventSequenceNumber.test.js +1 -1
  114. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  115. package/dist/schema/LiveStoreEvent/client.d.ts +6 -6
  116. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  117. package/dist/schema/LiveStoreEvent/client.js +6 -3
  118. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  119. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  120. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  121. package/dist/schema/LiveStoreEvent/client.test.js +83 -0
  122. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  123. package/dist/schema/schema.d.ts.map +1 -1
  124. package/dist/schema/schema.js +7 -4
  125. package/dist/schema/schema.js.map +1 -1
  126. package/dist/schema/state/sqlite/client-document-def.d.ts +1 -0
  127. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  128. package/dist/schema/state/sqlite/client-document-def.js +34 -13
  129. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  130. package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
  131. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  132. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  133. package/dist/schema/state/sqlite/column-annotations.js +1 -1
  134. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  135. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  136. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  137. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  138. package/dist/schema/state/sqlite/column-def.js +36 -34
  139. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  140. package/dist/schema/state/sqlite/column-def.test.js +7 -6
  141. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  142. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  143. package/dist/schema/state/sqlite/column-spec.js +8 -8
  144. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  145. package/dist/schema/state/sqlite/column-spec.test.js +1 -1
  146. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  147. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
  148. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  149. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +2 -2
  150. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  151. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +11 -2
  152. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  153. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  154. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  155. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +1 -1
  156. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  157. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  158. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  159. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  160. package/dist/schema/state/sqlite/mod.js +3 -5
  161. package/dist/schema/state/sqlite/mod.js.map +1 -1
  162. package/dist/schema/state/sqlite/query-builder/api.d.ts +37 -13
  163. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  164. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  165. package/dist/schema/state/sqlite/query-builder/astToSql.js +77 -7
  166. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  167. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  168. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  169. package/dist/schema/state/sqlite/query-builder/impl.js +28 -14
  170. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  171. package/dist/schema/state/sqlite/query-builder/impl.test.js +112 -3
  172. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  173. package/dist/schema/state/sqlite/schema-helpers.js +2 -2
  174. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  175. package/dist/schema/state/sqlite/table-def.d.ts +5 -3
  176. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  177. package/dist/schema/state/sqlite/table-def.js +1 -1
  178. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  179. package/dist/schema/state/sqlite/table-def.test.js +57 -4
  180. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  181. package/dist/schema/unknown-events.d.ts +1 -1
  182. package/dist/schema/unknown-events.d.ts.map +1 -1
  183. package/dist/schema/unknown-events.js +1 -1
  184. package/dist/schema/unknown-events.js.map +1 -1
  185. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +1 -1
  186. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
  187. package/dist/schema-management/common.js +2 -2
  188. package/dist/schema-management/common.js.map +1 -1
  189. package/dist/schema-management/migrations.js +1 -1
  190. package/dist/schema-management/migrations.js.map +1 -1
  191. package/dist/sql-queries/sql-queries.js +8 -6
  192. package/dist/sql-queries/sql-queries.js.map +1 -1
  193. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  194. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  195. package/dist/sqlite-db-helper.js +3 -3
  196. package/dist/sqlite-db-helper.js.map +1 -1
  197. package/dist/sqlite-types.d.ts +2 -2
  198. package/dist/sqlite-types.d.ts.map +1 -1
  199. package/dist/sqlite-types.js.map +1 -1
  200. package/dist/sync/ClientSessionSyncProcessor.d.ts +8 -9
  201. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  202. package/dist/sync/ClientSessionSyncProcessor.js +93 -107
  203. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  204. package/dist/sync/errors.d.ts +0 -38
  205. package/dist/sync/errors.d.ts.map +1 -1
  206. package/dist/sync/errors.js +3 -20
  207. package/dist/sync/errors.js.map +1 -1
  208. package/dist/sync/mock-sync-backend.d.ts +5 -3
  209. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  210. package/dist/sync/mock-sync-backend.js +70 -68
  211. package/dist/sync/mock-sync-backend.js.map +1 -1
  212. package/dist/sync/next/compact-events.js +6 -6
  213. package/dist/sync/next/compact-events.js.map +1 -1
  214. package/dist/sync/next/facts.d.ts.map +1 -1
  215. package/dist/sync/next/facts.js +6 -6
  216. package/dist/sync/next/facts.js.map +1 -1
  217. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  218. package/dist/sync/next/history-dag-common.js +6 -6
  219. package/dist/sync/next/history-dag-common.js.map +1 -1
  220. package/dist/sync/next/history-dag.js +3 -3
  221. package/dist/sync/next/history-dag.js.map +1 -1
  222. package/dist/sync/next/rebase-events.js +1 -1
  223. package/dist/sync/next/rebase-events.js.map +1 -1
  224. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  225. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  226. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  227. package/dist/sync/next/test/compact-events.test.js +2 -2
  228. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  229. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  230. package/dist/sync/next/test/event-fixtures.js +2 -2
  231. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  232. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  233. package/dist/sync/sync-backend-kv.js.map +1 -1
  234. package/dist/sync/sync-backend.d.ts +3 -3
  235. package/dist/sync/sync-backend.d.ts.map +1 -1
  236. package/dist/sync/sync-backend.js +1 -1
  237. package/dist/sync/sync-backend.js.map +1 -1
  238. package/dist/sync/sync.d.ts +20 -0
  239. package/dist/sync/sync.d.ts.map +1 -1
  240. package/dist/sync/syncstate.d.ts +4 -17
  241. package/dist/sync/syncstate.d.ts.map +1 -1
  242. package/dist/sync/syncstate.js +51 -74
  243. package/dist/sync/syncstate.js.map +1 -1
  244. package/dist/sync/syncstate.test.js +112 -96
  245. package/dist/sync/syncstate.test.js.map +1 -1
  246. package/dist/sync/transport-chunking.js +3 -3
  247. package/dist/sync/transport-chunking.js.map +1 -1
  248. package/dist/sync/validate-push-payload.d.ts +2 -2
  249. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  250. package/dist/sync/validate-push-payload.js +4 -6
  251. package/dist/sync/validate-push-payload.js.map +1 -1
  252. package/dist/util.js +2 -2
  253. package/dist/util.js.map +1 -1
  254. package/dist/version.d.ts +7 -1
  255. package/dist/version.d.ts.map +1 -1
  256. package/dist/version.js +8 -4
  257. package/dist/version.js.map +1 -1
  258. package/package.json +66 -12
  259. package/src/ClientSessionLeaderThreadProxy.ts +16 -9
  260. package/src/WorkerTransportError.ts +12 -0
  261. package/src/adapter-types.ts +39 -3
  262. package/src/bounded-collections.ts +6 -5
  263. package/src/debug-info.ts +4 -4
  264. package/src/devtools/devtools-messages-client-session.ts +12 -0
  265. package/src/devtools/devtools-messages-common.ts +8 -4
  266. package/src/devtools/devtools-messages-leader.ts +12 -0
  267. package/src/devtools/mod.ts +1 -1
  268. package/src/errors.ts +18 -17
  269. package/src/index.ts +2 -0
  270. package/src/leader-thread/LeaderSyncProcessor.ts +417 -347
  271. package/src/leader-thread/RejectedPushError.ts +106 -0
  272. package/src/leader-thread/connection.ts +1 -1
  273. package/src/leader-thread/eventlog.ts +16 -14
  274. package/src/leader-thread/leader-worker-devtools.ts +107 -66
  275. package/src/leader-thread/make-leader-thread-layer.test.ts +1 -1
  276. package/src/leader-thread/make-leader-thread-layer.ts +41 -31
  277. package/src/leader-thread/materialize-event.ts +8 -4
  278. package/src/leader-thread/recreate-db.ts +1 -1
  279. package/src/leader-thread/shutdown-channel.ts +2 -6
  280. package/src/leader-thread/stream-events.ts +10 -5
  281. package/src/leader-thread/types.ts +7 -6
  282. package/src/logging.ts +4 -4
  283. package/src/make-client-session.ts +2 -2
  284. package/src/materializer-helper.ts +9 -9
  285. package/src/otel.ts +3 -2
  286. package/src/rematerialize-from-eventlog.ts +60 -60
  287. package/src/schema/EventDef/define.ts +22 -6
  288. package/src/schema/EventDef/deprecated.test.ts +129 -0
  289. package/src/schema/EventDef/deprecated.ts +175 -0
  290. package/src/schema/EventDef/event-def.ts +5 -0
  291. package/src/schema/EventDef/mod.ts +1 -0
  292. package/src/schema/EventSequenceNumber/client.ts +11 -11
  293. package/src/schema/EventSequenceNumber.test.ts +2 -1
  294. package/src/schema/LiveStoreEvent/client.test.ts +97 -0
  295. package/src/schema/LiveStoreEvent/client.ts +6 -3
  296. package/src/schema/schema.ts +9 -4
  297. package/src/schema/state/sqlite/client-document-def.test.ts +142 -3
  298. package/src/schema/state/sqlite/client-document-def.ts +37 -14
  299. package/src/schema/state/sqlite/column-annotations.test.ts +2 -1
  300. package/src/schema/state/sqlite/column-annotations.ts +2 -1
  301. package/src/schema/state/sqlite/column-def.test.ts +8 -6
  302. package/src/schema/state/sqlite/column-def.ts +41 -36
  303. package/src/schema/state/sqlite/column-spec.test.ts +3 -1
  304. package/src/schema/state/sqlite/column-spec.ts +9 -8
  305. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
  306. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
  307. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +13 -4
  308. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +3 -3
  309. package/src/schema/state/sqlite/mod.ts +4 -5
  310. package/src/schema/state/sqlite/query-builder/api.ts +37 -8
  311. package/src/schema/state/sqlite/query-builder/astToSql.ts +87 -7
  312. package/src/schema/state/sqlite/query-builder/impl.test.ts +145 -3
  313. package/src/schema/state/sqlite/query-builder/impl.ts +26 -12
  314. package/src/schema/state/sqlite/schema-helpers.ts +2 -2
  315. package/src/schema/state/sqlite/table-def.test.ts +67 -4
  316. package/src/schema/state/sqlite/table-def.ts +8 -15
  317. package/src/schema/unknown-events.ts +2 -2
  318. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +3 -1
  319. package/src/schema-management/common.ts +2 -2
  320. package/src/schema-management/migrations.ts +1 -1
  321. package/src/sql-queries/sql-queries.ts +10 -6
  322. package/src/sql-queries/sql-query-builder.ts +1 -0
  323. package/src/sqlite-db-helper.ts +3 -3
  324. package/src/sqlite-types.ts +3 -2
  325. package/src/sync/ClientSessionSyncProcessor.ts +142 -133
  326. package/src/sync/errors.ts +10 -22
  327. package/src/sync/mock-sync-backend.ts +139 -97
  328. package/src/sync/next/compact-events.ts +5 -5
  329. package/src/sync/next/facts.ts +7 -6
  330. package/src/sync/next/history-dag-common.ts +9 -6
  331. package/src/sync/next/history-dag.ts +3 -3
  332. package/src/sync/next/rebase-events.ts +1 -1
  333. package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
  334. package/src/sync/next/test/compact-events.test.ts +4 -3
  335. package/src/sync/next/test/event-fixtures.ts +2 -2
  336. package/src/sync/sync-backend-kv.ts +1 -0
  337. package/src/sync/sync-backend.ts +5 -4
  338. package/src/sync/sync.ts +21 -0
  339. package/src/sync/syncstate.test.ts +513 -435
  340. package/src/sync/syncstate.ts +80 -86
  341. package/src/sync/transport-chunking.ts +3 -3
  342. package/src/sync/validate-push-payload.ts +4 -6
  343. package/src/util.ts +2 -2
  344. package/src/version.ts +8 -4
@@ -1,5 +1,5 @@
1
- import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
- import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
1
+ import { casesHandled } from '@livestore/utils'
2
+ import { Effect, Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
5
5
  import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
@@ -159,16 +159,10 @@ export class MergeResultReject extends Schema.Class<MergeResultReject>('MergeRes
159
159
  }
160
160
  }
161
161
 
162
- export class MergeResultUnknownError extends Schema.Class<MergeResultUnknownError>('MergeResultUnknownError')({
163
- _tag: Schema.Literal('unknown-error'),
164
- message: Schema.String,
165
- }) {}
166
-
167
162
  export class MergeResult extends Schema.Union(
168
163
  MergeResultAdvance,
169
164
  MergeResultRebase,
170
165
  MergeResultReject,
171
- MergeResultUnknownError,
172
166
  ) {}
173
167
 
174
168
  export const payloadFromMergeResult = (
@@ -187,15 +181,6 @@ export const payloadFromMergeResult = (
187
181
  Match.exhaustive,
188
182
  )
189
183
 
190
- const unknownError = (message: string): MergeResultUnknownError => {
191
- if (LS_DEV) {
192
- // biome-ignore lint/suspicious/noDebugger: debug
193
- debugger
194
- }
195
-
196
- return MergeResultUnknownError.make({ _tag: 'unknown-error', message })
197
- }
198
-
199
184
  // TODO Idea: call merge recursively through hierarchy levels
200
185
  /*
201
186
  Idea: have a map that maps from `globalEventSequenceNumber` to Array<ClientEvents>
@@ -203,7 +188,7 @@ The same applies to even further hierarchy levels
203
188
 
204
189
  TODO: possibly even keep the client events in a separate table in the client leader
205
190
  */
206
- export const merge = ({
191
+ export const merge = Effect.fnUntraced(function* ({
207
192
  syncState,
208
193
  payload,
209
194
  isClientEvent,
@@ -216,9 +201,9 @@ export const merge = ({
216
201
  isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
217
202
  /** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
218
203
  ignoreClientEvents?: boolean
219
- }): typeof MergeResult.Type => {
220
- validateSyncState(syncState)
221
- validatePayload(payload)
204
+ }) {
205
+ yield* validateSyncState(syncState)
206
+ yield* validatePayload(payload)
222
207
 
223
208
  const mergeContext = MergeContext.make({ payload, syncState })
224
209
 
@@ -236,7 +221,7 @@ export const merge = ({
236
221
  isClientEvent,
237
222
  })
238
223
 
239
- return validateMergeResult(
224
+ return yield* validateMergeResult(
240
225
  MergeResultRebase.make({
241
226
  _tag: 'rebase',
242
227
  newSyncState: new SyncState({
@@ -251,10 +236,10 @@ export const merge = ({
251
236
  )
252
237
  }
253
238
 
254
- // #region upstream-advance
239
+ //#region upstream-advance
255
240
  case 'upstream-advance': {
256
241
  if (payload.newEvents.length === 0) {
257
- return validateMergeResult(
242
+ return yield* validateMergeResult(
258
243
  MergeResultAdvance.make({
259
244
  _tag: 'advance',
260
245
  newSyncState: new SyncState({
@@ -271,8 +256,11 @@ export const merge = ({
271
256
 
272
257
  // Validate that newEvents are sorted in ascending order by eventNum
273
258
  for (let i = 1; i < payload.newEvents.length; i++) {
274
- if (EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum)) {
275
- return unknownError(
259
+ if (
260
+ EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum) ===
261
+ true
262
+ ) {
263
+ return yield* Effect.dieDebugger(
276
264
  `Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
277
265
  )
278
266
  }
@@ -280,10 +268,10 @@ export const merge = ({
280
268
 
281
269
  // Validate that incoming events are larger than upstream head
282
270
  if (
283
- EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) ||
284
- EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum)
271
+ EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true ||
272
+ EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true
285
273
  ) {
286
- return unknownError(
274
+ return yield* Effect.dieDebugger(
287
275
  `Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.Client.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
288
276
  )
289
277
  }
@@ -316,20 +304,20 @@ export const merge = ({
316
304
  const [pendingMatching, pendingRemaining] = ReadonlyArray.splitWhere(
317
305
  syncState.pending,
318
306
  (pendingEvent, index) => {
319
- if (ignoreClientEvents && isClientEvent(pendingEvent)) {
307
+ if (ignoreClientEvents === true && isClientEvent(pendingEvent) === true) {
320
308
  clientIndexOffset++
321
309
  return false
322
310
  }
323
311
 
324
312
  const newEvent = payload.newEvents.at(index - clientIndexOffset)
325
- if (!newEvent) {
313
+ if (newEvent == null) {
326
314
  return true
327
315
  }
328
- return isEqualEvent(pendingEvent, newEvent) === false
316
+ return !isEqualEvent(pendingEvent, newEvent)
329
317
  },
330
318
  )
331
319
 
332
- return validateMergeResult(
320
+ return yield* validateMergeResult(
333
321
  MergeResultAdvance.make({
334
322
  _tag: 'advance',
335
323
  newSyncState: new SyncState({
@@ -359,7 +347,7 @@ export const merge = ({
359
347
  ignoreClientEvents,
360
348
  })
361
349
 
362
- return validateMergeResult(
350
+ return yield* validateMergeResult(
363
351
  MergeResultRebase.make({
364
352
  _tag: 'rebase',
365
353
  newSyncState: new SyncState({
@@ -374,12 +362,12 @@ export const merge = ({
374
362
  )
375
363
  }
376
364
  }
377
- // #endregion
365
+ //#endregion upstream-advance
378
366
 
379
367
  // This is the same as what's running in the sync backend
380
368
  case 'local-push': {
381
369
  if (payload.newEvents.length === 0) {
382
- return validateMergeResult(
370
+ return yield* validateMergeResult(
383
371
  MergeResultAdvance.make({
384
372
  _tag: 'advance',
385
373
  newSyncState: syncState,
@@ -391,15 +379,17 @@ export const merge = ({
391
379
  }
392
380
 
393
381
  const newEventsFirst = payload.newEvents.at(0)!
394
- const invalidEventSequenceNumber =
395
- EventSequenceNumber.Client.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false
382
+ const invalidEventSequenceNumber = !EventSequenceNumber.Client.isGreaterThan(
383
+ newEventsFirst.seqNum,
384
+ syncState.localHead,
385
+ )
396
386
 
397
- if (invalidEventSequenceNumber) {
387
+ if (invalidEventSequenceNumber === true) {
398
388
  const expectedMinimumId = EventSequenceNumber.Client.nextPair({
399
389
  seqNum: syncState.localHead,
400
390
  isClient: true,
401
391
  }).seqNum
402
- return validateMergeResult(
392
+ return yield* validateMergeResult(
403
393
  MergeResultReject.make({
404
394
  _tag: 'reject',
405
395
  expectedMinimumId,
@@ -407,14 +397,13 @@ export const merge = ({
407
397
  }),
408
398
  )
409
399
  } else {
410
- const nonClientEvents = ignoreClientEvents
411
- ? payload.newEvents.filter((event) => !isClientEvent(event))
412
- : payload.newEvents
400
+ const nonClientEvents =
401
+ ignoreClientEvents === true ? payload.newEvents.filter((event) => !isClientEvent(event)) : payload.newEvents
413
402
  const newPending = [...syncState.pending, ...nonClientEvents]
414
403
  const newLocalHead =
415
404
  newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead)
416
405
 
417
- return validateMergeResult(
406
+ return yield* validateMergeResult(
418
407
  MergeResultAdvance.make({
419
408
  _tag: 'advance',
420
409
  newSyncState: new SyncState({
@@ -430,11 +419,10 @@ export const merge = ({
430
419
  }
431
420
  }
432
421
 
433
- default: {
434
- casesHandled(payload)
435
- }
422
+ default:
423
+ return casesHandled(payload)
436
424
  }
437
- }
425
+ })
438
426
 
439
427
  /**
440
428
  * Gets the index relative to `existingEvents` where the divergence point is
@@ -453,7 +441,7 @@ export const findDivergencePoint = ({
453
441
  isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
454
442
  ignoreClientEvents: boolean
455
443
  }): number => {
456
- if (ignoreClientEvents) {
444
+ if (ignoreClientEvents === true) {
457
445
  const filteredExistingEvents = existingEvents.filter((event) => !isClientEvent(event))
458
446
  const divergencePointWithoutClientEvents = findDivergencePoint({
459
447
  existingEvents: filteredExistingEvents,
@@ -475,7 +463,7 @@ export const findDivergencePoint = ({
475
463
  return existingEvents.findIndex((existingEvent, index) => {
476
464
  const incomingEvent = incomingEvents[index]
477
465
  // return !incomingEvent || !isEqualEvent(existingEvent, incomingEvent)
478
- return incomingEvent && !isEqualEvent(existingEvent, incomingEvent)
466
+ return incomingEvent !== undefined && isEqualEvent(existingEvent, incomingEvent) === false
479
467
  })
480
468
  }
481
469
 
@@ -511,69 +499,75 @@ const rebaseEvents = ({
511
499
  */
512
500
  const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
513
501
 
514
- const validatePayload = (payload: typeof Payload.Type) => {
515
- for (let i = 1; i < payload.newEvents.length; i++) {
516
- if (
517
- EventSequenceNumber.Client.isGreaterThanOrEqual(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum)
518
- ) {
519
- return unknownError(
520
- `Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
521
- )
502
+ const validatePayload = (payload: typeof Payload.Type) =>
503
+ Effect.gen(function* () {
504
+ for (let i = 1; i < payload.newEvents.length; i++) {
505
+ if (
506
+ EventSequenceNumber.Client.isGreaterThanOrEqual(
507
+ payload.newEvents[i - 1]!.seqNum,
508
+ payload.newEvents[i]!.seqNum,
509
+ ) === true
510
+ ) {
511
+ return yield* Effect.dieDebugger(
512
+ `Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
513
+ )
514
+ }
522
515
  }
523
- }
524
- }
516
+ })
525
517
 
526
- const validateSyncState = (syncState: SyncState) => {
518
+ const validateSyncState = Effect.fnUntraced(function* (
519
+ syncState: SyncState,
520
+ ) {
527
521
  for (let i = 0; i < syncState.pending.length; i++) {
528
522
  const event = syncState.pending[i]!
529
523
  const nextEvent = syncState.pending[i + 1]
530
524
  if (nextEvent === undefined) break // Reached end of chain
531
525
 
532
- if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
533
- shouldNeverHappen(
526
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum) === true) {
527
+ return yield* Effect.dieDebugger(
534
528
  `Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
535
- {
536
- event,
537
- nextEvent,
538
- },
529
+ { event, nextEvent },
539
530
  )
540
531
  }
541
532
 
542
533
  // If the global id has increased, then the client id must be 0
543
534
  const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global
544
- if (globalIdHasIncreased) {
535
+ if (globalIdHasIncreased === true) {
545
536
  if (nextEvent.seqNum.client !== 0) {
546
- shouldNeverHappen(
537
+ return yield* Effect.dieDebugger(
547
538
  `New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`,
548
539
  syncState.pending,
549
- {
550
- event,
551
- nextEvent,
552
- },
540
+ { event, nextEvent },
553
541
  )
554
542
  }
555
543
  } else {
556
544
  // Otherwise, the parentSeqNum must be the same as the previous event's id
557
545
  if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
558
- shouldNeverHappen('Events must be linked in a continuous chain via the parentSeqNum', syncState.pending, {
559
- event,
560
- nextEvent,
561
- })
546
+ return yield* Effect.dieDebugger(
547
+ 'Events must be linked in a continuous chain via the parentSeqNum',
548
+ syncState.pending,
549
+ { event, nextEvent },
550
+ )
562
551
  }
563
552
  }
564
553
  }
565
- }
554
+ })
566
555
 
567
- const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
568
- if (mergeResult._tag === 'unknown-error' || mergeResult._tag === 'reject') return mergeResult
556
+ const validateMergeResult = Effect.fnUntraced(function* (
557
+ mergeResult: typeof MergeResult.Type,
558
+ ) {
559
+ if (mergeResult._tag === 'reject') return mergeResult
569
560
 
570
- validateSyncState(mergeResult.newSyncState)
561
+ yield* validateSyncState(mergeResult.newSyncState)
571
562
 
572
563
  // Ensure local head is always greater than or equal to upstream head
573
564
  if (
574
- EventSequenceNumber.Client.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)
565
+ EventSequenceNumber.Client.isGreaterThan(
566
+ mergeResult.newSyncState.upstreamHead,
567
+ mergeResult.newSyncState.localHead,
568
+ ) === true
575
569
  ) {
576
- shouldNeverHappen('Local head must be greater than or equal to upstream head', {
570
+ return yield* Effect.dieDebugger('Local head must be greater than or equal to upstream head', {
577
571
  localHead: mergeResult.newSyncState.localHead,
578
572
  upstreamHead: mergeResult.newSyncState.upstreamHead,
579
573
  })
@@ -586,7 +580,7 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
586
580
  mergeResult.mergeContext.syncState.localHead,
587
581
  ) === false
588
582
  ) {
589
- shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
583
+ return yield* Effect.dieDebugger('New local head must be greater than or equal to the previous local head', {
590
584
  localHead: mergeResult.newSyncState.localHead,
591
585
  previousLocalHead: mergeResult.mergeContext.syncState.localHead,
592
586
  })
@@ -599,11 +593,11 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
599
593
  mergeResult.mergeContext.syncState.upstreamHead,
600
594
  ) === false
601
595
  ) {
602
- shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
596
+ return yield* Effect.dieDebugger('New upstream head must be greater than or equal to the previous upstream head', {
603
597
  upstreamHead: mergeResult.newSyncState.upstreamHead,
604
598
  previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
605
599
  })
606
600
  }
607
601
 
608
602
  return mergeResult
609
- }
603
+ })
@@ -27,7 +27,7 @@ export interface ChunkingOptions<A> {
27
27
  * both item count and encoded byte size limits. Designed for transports with
28
28
  * strict frame caps (e.g. Cloudflare hibernated WebSockets).
29
29
  */
30
- export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>()('OversizeChunkItemError', {
30
+ export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>('~@livestore/common/OversizeChunkItemError')('OversizeChunkItemError', {
31
31
  size: Schema.Number,
32
32
  maxBytes: Schema.Number,
33
33
  }) {}
@@ -69,7 +69,7 @@ export const splitChunkBySize =
69
69
  current.push(item)
70
70
  const exceedsLimit = current.length > maxItems || computeSize(current) > maxBytes
71
71
 
72
- if (exceedsLimit) {
72
+ if (exceedsLimit === true) {
73
73
  // remove the item we just added and emit the previous chunk if it exists
74
74
  const last = current.pop()!
75
75
  flushCurrent()
@@ -77,7 +77,7 @@ export const splitChunkBySize =
77
77
  if (last !== undefined) {
78
78
  current = [last]
79
79
  const singleItemTooLarge = computeSize(current) > maxBytes
80
- if (singleItemTooLarge || current.length > maxItems) {
80
+ if (singleItemTooLarge === true || current.length > maxItems) {
81
81
  return yield* new OversizeChunkItemError({ size: computeSize([last]), maxBytes })
82
82
  }
83
83
  }
@@ -1,7 +1,7 @@
1
1
  import { Effect } from '@livestore/utils/effect'
2
2
 
3
3
  import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
4
- import { InvalidPushError, ServerAheadError } from './sync.ts'
4
+ import { ServerAheadError } from './sync.ts'
5
5
 
6
6
  // TODO proper batch validation
7
7
  export const validatePushPayload = (
@@ -10,11 +10,9 @@ export const validatePushPayload = (
10
10
  ) =>
11
11
  Effect.gen(function* () {
12
12
  if (batch[0]!.seqNum <= currentEventSequenceNumber) {
13
- return yield* InvalidPushError.make({
14
- cause: new ServerAheadError({
15
- minimumExpectedNum: EventSequenceNumber.Global.make(currentEventSequenceNumber + 1),
16
- providedNum: EventSequenceNumber.Global.make(batch[0]!.seqNum),
17
- }),
13
+ return yield* new ServerAheadError({
14
+ minimumExpectedNum: EventSequenceNumber.Global.make(currentEventSequenceNumber + 1),
15
+ providedNum: EventSequenceNumber.Global.make(batch[0]!.seqNum),
18
16
  })
19
17
  }
20
18
  })
package/src/util.ts CHANGED
@@ -47,11 +47,11 @@ export const sql = (template: TemplateStringsArray, ...args: unknown[]): string
47
47
  * TODO: Also make sure that the SQLite binding limit of 1000 is respected
48
48
  */
49
49
  export const prepareBindValues = (values: Bindable, statement: string): PreparedBindValues => {
50
- if (Array.isArray(values)) return values as any as PreparedBindValues
50
+ if (Array.isArray(values) === true) return values as any as PreparedBindValues
51
51
 
52
52
  const result: ParamsObject = {}
53
53
  for (const [key, value] of Object.entries(values)) {
54
- if (statement.includes(key)) {
54
+ if (statement.includes(key) === true) {
55
55
  result[`$${key}`] = value
56
56
  }
57
57
  }
package/src/version.ts CHANGED
@@ -1,8 +1,12 @@
1
- // TODO bring back when Expo and Playwright supports `with` imports
2
- // import packageJson from '../package.json' with { type: 'json' }
3
- // export const liveStoreVersion = packageJson.version
1
+ import pkg from '../package.json' with { type: 'json' }
4
2
 
5
- export const liveStoreVersion = '0.4.0-dev.21' as const
3
+ /**
4
+ * Current LiveStore version used for DevTools version compatibility checks.
5
+ *
6
+ * Can be overridden at runtime via `globalThis.__LIVESTORE_VERSION_OVERRIDE__` for testing purposes.
7
+ * This allows Playwright tests to simulate version mismatch scenarios without rebuilding.
8
+ */
9
+ export const liveStoreVersion: string = (globalThis as any).__LIVESTORE_VERSION_OVERRIDE__ ?? pkg.version
6
10
 
7
11
  /**
8
12
  * CRITICAL: Increment this version whenever you modify client-side EVENTLOG table schemas.