@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
1
  /// <reference lib="dom" />
2
- import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils'
2
+ import { LS_DEV, TRACE_VERBOSE } from '@livestore/utils'
3
3
  import {
4
4
  BucketQueue,
5
5
  Effect,
@@ -7,21 +7,23 @@ import {
7
7
  FiberHandle,
8
8
  Option,
9
9
  Queue,
10
- type Runtime,
11
10
  Schema,
12
11
  type Scope,
13
12
  Stream,
14
13
  Subscribable,
15
14
  } from '@livestore/utils/effect'
16
- import type * as otel from '@opentelemetry/api'
17
15
 
18
- import { type ClientSession, UnknownError } from '../adapter-types.ts'
16
+ import type { ClientSession } from '../adapter-types.ts'
19
17
  import type { MaterializeError } from '../errors.ts'
18
+ import { isRejectedPushError } from '../leader-thread/RejectedPushError.ts'
20
19
  import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
21
20
  import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
22
21
  import type { LiveStoreSchema } from '../schema/mod.ts'
23
22
  import * as SyncState from './syncstate.ts'
24
23
 
24
+ /** Serialize value to JSON string for trace attributes */
25
+ const jsonStringify = Schema.encodeSync(Schema.parseJson())
26
+
25
27
  /**
26
28
  * Rebase behaviour:
27
29
  * - We continously pull events from the leader and apply them to the local store.
@@ -37,20 +39,17 @@ import * as SyncState from './syncstate.ts'
37
39
  * - The leader sync processor pulls regular LiveStore events, while the session sync processor pulls SyncState.PayloadUpstream items
38
40
  * - The session sync processor has no downstream nodes.
39
41
  */
40
- export const makeClientSessionSyncProcessor = ({
42
+ export const makeClientSessionSyncProcessor = Effect.fn('makeClientSessionSyncProcessor')(function* ({
41
43
  schema,
42
44
  clientSession,
43
- runtime,
44
45
  materializeEvent,
45
46
  rollback,
46
47
  refreshTables,
47
- span,
48
48
  params,
49
49
  confirmUnsavedChanges,
50
50
  }: {
51
51
  schema: LiveStoreSchema
52
52
  clientSession: ClientSession
53
- runtime: Runtime.Runtime<Scope.Scope>
54
53
  materializeEvent: (
55
54
  eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
56
55
  options: { withChangeset: boolean; materializerHashLeader: Option.Option<number> },
@@ -67,7 +66,6 @@ export const makeClientSessionSyncProcessor = ({
67
66
  >
68
67
  rollback: (changeset: Uint8Array<ArrayBuffer>) => void
69
68
  refreshTables: (tables: Set<string>) => void
70
- span: otel.Span
71
69
  params: {
72
70
  leaderPushBatchSize: number
73
71
  simulation?: ClientSessionSyncProcessorSimulationParams
@@ -77,7 +75,7 @@ export const makeClientSessionSyncProcessor = ({
77
75
  * If true, registers a beforeunload event listener to confirm unsaved changes.
78
76
  */
79
77
  confirmUnsavedChanges: boolean
80
- }): ClientSessionSyncProcessor => {
78
+ }): Effect.fn.Return<ClientSessionSyncProcessor> {
81
79
  const eventSchema = LiveStoreEvent.Client.makeSchemaMemo(schema)
82
80
 
83
81
  const simSleep = <TKey extends keyof ClientSessionSyncProcessorSimulationParams>(
@@ -96,100 +94,19 @@ export const makeClientSessionSyncProcessor = ({
96
94
  }
97
95
 
98
96
  /** Only used for debugging / observability / testing, it's not relied upon for correctness of the sync processor. */
99
- const syncStateUpdateQueue = Queue.unbounded<SyncState.SyncState>().pipe(Effect.runSync)
97
+ const syncStateUpdateQueue = yield* Queue.unbounded<SyncState.SyncState>()
100
98
  const isClientEvent = (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) =>
101
99
  schema.eventsDefsMap.get(eventEncoded.name)?.options.clientOnly ?? false
102
100
 
103
101
  /** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
104
- const leaderPushQueue = BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>().pipe(Effect.runSync)
105
-
106
- const push: ClientSessionSyncProcessor['push'] = Effect.fn('client-session-sync-processor:push')(function* (batch) {
107
- // TODO validate batch
108
-
109
- let baseEventSequenceNumber = syncStateRef.current.localHead
110
- const encodedEventDefs = batch.map(({ name, args }) => {
111
- const eventDef = schema.eventsDefsMap.get(name)
112
- if (eventDef === undefined) {
113
- return shouldNeverHappen(`No event definition found for \`${name}\`.`)
114
- }
115
- const nextNumPair = EventSequenceNumber.Client.nextPair({
116
- seqNum: baseEventSequenceNumber,
117
- isClient: eventDef.options.clientOnly,
118
- rebaseGeneration: baseEventSequenceNumber.rebaseGeneration,
119
- })
120
- baseEventSequenceNumber = nextNumPair.seqNum
121
- return new LiveStoreEvent.Client.EncodedWithMeta(
122
- Schema.encodeUnknownSync(eventSchema)({
123
- name,
124
- args,
125
- ...nextNumPair,
126
- clientId: clientSession.clientId,
127
- sessionId: clientSession.sessionId,
128
- }),
129
- )
130
- })
131
-
132
- const mergeResult = SyncState.merge({
133
- syncState: syncStateRef.current,
134
- payload: { _tag: 'local-push', newEvents: encodedEventDefs },
135
- isClientEvent,
136
- isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
137
- })
138
-
139
- yield* Effect.annotateCurrentSpan({
140
- batchSize: encodedEventDefs.length,
141
- mergeResultTag: mergeResult._tag,
142
- eventCounts: encodedEventDefs.reduce<Record<string, number>>((acc, event) => {
143
- acc[event.name] = (acc[event.name] ?? 0) + 1
144
- return acc
145
- }, {}),
146
- ...(TRACE_VERBOSE && { mergeResult: JSON.stringify(mergeResult) }),
147
- })
148
-
149
- if (mergeResult._tag === 'unknown-error') {
150
- return shouldNeverHappen('Unknown error in client-session-sync-processor', mergeResult.message)
151
- }
152
-
153
- if (mergeResult._tag !== 'advance') {
154
- return shouldNeverHappen(`Expected advance, got ${mergeResult._tag}`)
155
- }
156
-
157
- syncStateRef.current = mergeResult.newSyncState
158
- yield* syncStateUpdateQueue.offer(mergeResult.newSyncState)
159
-
160
- // Materialize events to state
161
- const writeTables = new Set<string>()
162
- for (const event of mergeResult.newEvents) {
163
- const {
164
- writeTables: newWriteTables,
165
- sessionChangeset,
166
- materializerHash,
167
- } = yield* materializeEvent(event, {
168
- withChangeset: true,
169
- materializerHashLeader: Option.none(),
170
- })
171
- for (const table of newWriteTables) {
172
- writeTables.add(table)
173
- }
174
- event.meta.sessionChangeset = sessionChangeset
175
- event.meta.materializerHashSession = materializerHash
176
- }
177
-
178
- // Trigger push to leader
179
- // console.debug('pushToLeader', encodedEventDefs.length, ...encodedEventDefs.map((_) => _.toJSON()))
180
- yield* BucketQueue.offerAll(leaderPushQueue, encodedEventDefs)
181
-
182
- return { writeTables }
183
- })
184
-
185
- const debugInfo = {
186
- rebaseCount: 0,
187
- advanceCount: 0,
188
- rejectCount: 0,
189
- }
190
-
191
- const boot: ClientSessionSyncProcessor['boot'] = Effect.gen(function* () {
192
- if (confirmUnsavedChanges && typeof window !== 'undefined' && typeof window.addEventListener === 'function') {
102
+ const leaderPushQueue = yield* BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>()
103
+
104
+ const boot: ClientSessionSyncProcessor['boot'] = Effect.fn('client-session-sync-processor:boot')(function* () {
105
+ if (
106
+ confirmUnsavedChanges === true &&
107
+ typeof window !== 'undefined' &&
108
+ typeof window.addEventListener === 'function'
109
+ ) {
193
110
  const onBeforeUnload = (event: BeforeUnloadEvent) => {
194
111
  if (syncStateRef.current.pending.length > 0) {
195
112
  // Trigger the default browser dialog
@@ -208,12 +125,17 @@ export const makeClientSessionSyncProcessor = ({
208
125
  const backgroundLeaderPushing = Effect.gen(function* () {
209
126
  const batch = yield* BucketQueue.takeBetween(leaderPushQueue, 1, params.leaderPushBatchSize)
210
127
  yield* clientSession.leaderThread.events.push(batch).pipe(
211
- Effect.catchTag('LeaderAheadError', () => {
128
+ Effect.catchIf(isRejectedPushError, () => {
212
129
  debugInfo.rejectCount++
213
130
  return BucketQueue.clear(leaderPushQueue)
214
131
  }),
215
132
  )
216
- }).pipe(Effect.forever, Effect.interruptible, Effect.tapCauseLogPretty)
133
+ }).pipe(
134
+ Effect.forever,
135
+ Effect.interruptible,
136
+ Effect.tapCauseLogPretty,
137
+ Effect.catchAllCause((cause) => clientSession.shutdown(Exit.failCause(cause))),
138
+ )
217
139
 
218
140
  yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
219
141
 
@@ -225,48 +147,47 @@ export const makeClientSessionSyncProcessor = ({
225
147
  Effect.gen(function* () {
226
148
  // yield* Effect.logDebug('ClientSessionSyncProcessor:pull', payload)
227
149
 
228
- if (clientSession.devtools.enabled) {
150
+ if (clientSession.devtools.enabled === true) {
229
151
  yield* clientSession.devtools.pullLatch.await
230
152
  }
231
153
 
232
- const mergeResult = SyncState.merge({
154
+ const mergeResult = yield* SyncState.merge({
233
155
  syncState: syncStateRef.current,
234
156
  payload,
235
157
  isClientEvent,
236
158
  isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
237
- })
238
-
239
- if (mergeResult._tag === 'unknown-error') {
240
- return yield* new UnknownError({ cause: mergeResult.message })
241
- } else if (mergeResult._tag === 'reject') {
242
- return shouldNeverHappen('Unexpected reject in client-session-sync-processor', mergeResult)
243
- }
159
+ }).pipe(
160
+ Effect.filterOrDieMessage(
161
+ (r) => r._tag !== 'reject',
162
+ 'Unexpected reject in client-session-sync-processor',
163
+ ),
164
+ )
244
165
 
245
166
  syncStateRef.current = mergeResult.newSyncState
246
167
 
247
168
  if (mergeResult._tag === 'rebase') {
248
- span.addEvent('merge:pull:rebase', {
169
+ yield* Effect.spanEvent('merge:pull:rebase', {
249
170
  payloadTag: payload._tag,
250
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
171
+ ...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
251
172
  newEventsCount: mergeResult.newEvents.length,
252
173
  rollbackCount: mergeResult.rollbackEvents.length,
253
- res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
174
+ ...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
254
175
  })
255
176
 
256
177
  debugInfo.rebaseCount++
257
178
 
258
- if (SIMULATION_ENABLED) yield* simSleep('pull', '1_before_leader_push_fiber_interrupt')
179
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '1_before_leader_push_fiber_interrupt')
259
180
 
260
181
  yield* FiberHandle.clear(leaderPushingFiberHandle)
261
182
 
262
- if (SIMULATION_ENABLED) yield* simSleep('pull', '2_before_leader_push_queue_clear')
183
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '2_before_leader_push_queue_clear')
263
184
 
264
185
  // Reset the leader push queue since we're rebasing and will push again
265
186
  yield* BucketQueue.clear(leaderPushQueue)
266
187
 
267
- if (SIMULATION_ENABLED) yield* simSleep('pull', '3_before_rebase_rollback')
188
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '3_before_rebase_rollback')
268
189
 
269
- if (LS_DEV) {
190
+ if (LS_DEV === true) {
270
191
  yield* Effect.logDebug(
271
192
  'merge:pull:rebase: rollback',
272
193
  mergeResult.rollbackEvents.length,
@@ -282,19 +203,19 @@ export const makeClientSessionSyncProcessor = ({
282
203
  }
283
204
  }
284
205
 
285
- if (SIMULATION_ENABLED) yield* simSleep('pull', '4_before_leader_push_queue_offer')
206
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '4_before_leader_push_queue_offer')
286
207
 
287
208
  yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newSyncState.pending)
288
209
 
289
- if (SIMULATION_ENABLED) yield* simSleep('pull', '5_before_leader_push_fiber_run')
210
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '5_before_leader_push_fiber_run')
290
211
 
291
212
  yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
292
213
  } else {
293
- span.addEvent('merge:pull:advance', {
214
+ yield* Effect.spanEvent('merge:pull:advance', {
294
215
  payloadTag: payload._tag,
295
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
216
+ ...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
296
217
  newEventsCount: mergeResult.newEvents.length,
297
- res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
218
+ ...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
298
219
  })
299
220
 
300
221
  debugInfo.advanceCount++
@@ -340,17 +261,99 @@ export const makeClientSessionSyncProcessor = ({
340
261
  Effect.tapCauseLogPretty,
341
262
  Effect.forkScoped,
342
263
  )
264
+ })()
265
+
266
+ const encodeEvents: ClientSessionSyncProcessor['encodeEvents'] = Effect.fn('client-session-sync-processor:encode-events')(function* (
267
+ events,
268
+ ) {
269
+ let baseEventSequenceNumber = syncStateRef.current.localHead
270
+ return yield* Effect.forEach(events, ({ name, args }) =>
271
+ Effect.gen(function* () {
272
+ const eventDef = yield* Effect.fromNullable(schema.eventsDefsMap.get(name)).pipe(Effect.orDieDebugger)
273
+ const nextNumPair = EventSequenceNumber.Client.nextPair({
274
+ seqNum: baseEventSequenceNumber,
275
+ isClient: eventDef.options.clientOnly,
276
+ rebaseGeneration: baseEventSequenceNumber.rebaseGeneration,
277
+ })
278
+ baseEventSequenceNumber = nextNumPair.seqNum
279
+ return new LiveStoreEvent.Client.EncodedWithMeta(
280
+ Schema.encodeUnknownSync(eventSchema)({
281
+ name,
282
+ args,
283
+ ...nextNumPair,
284
+ clientId: clientSession.clientId,
285
+ sessionId: clientSession.sessionId,
286
+ }),
287
+ )
288
+ }),
289
+ )
290
+ })
291
+
292
+ const materializeEvents: ClientSessionSyncProcessor['materializeEvents'] = Effect.fn('client-session-sync-processor:materialize-events')(function* (
293
+ events,
294
+ ) {
295
+ const writeTables = new Set<string>()
296
+ for (const event of events) {
297
+ const {
298
+ writeTables: newWriteTables,
299
+ sessionChangeset,
300
+ materializerHash,
301
+ } = yield* materializeEvent(event, {
302
+ withChangeset: true,
303
+ materializerHashLeader: Option.none(),
304
+ })
305
+ for (const table of newWriteTables) {
306
+ writeTables.add(table)
307
+ }
308
+ event.meta.sessionChangeset = sessionChangeset
309
+ event.meta.materializerHashSession = materializerHash
310
+ }
311
+ return { writeTables }
343
312
  })
344
313
 
314
+ const push: ClientSessionSyncProcessor['push'] = Effect.fn('client-session-sync-processor:push')(function* (
315
+ encodedEvents,
316
+ ) {
317
+ const mergeResult = yield* SyncState.merge({
318
+ syncState: syncStateRef.current,
319
+ payload: { _tag: 'local-push', newEvents: encodedEvents },
320
+ isClientEvent,
321
+ isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
322
+ }).pipe(
323
+ Effect.filterOrDieMessage(
324
+ (r) => r._tag === 'advance',
325
+ 'Expected advance from local-push merge',
326
+ ),
327
+ )
328
+
329
+ yield* Effect.annotateCurrentSpan({
330
+ batchSize: encodedEvents.length,
331
+ mergeResultTag: mergeResult._tag,
332
+ eventCounts: encodedEvents.reduce<Record<string, number>>((acc, event) => {
333
+ acc[event.name] = (acc[event.name] ?? 0) + 1
334
+ return acc
335
+ }, {}),
336
+ ...(TRACE_VERBOSE === true ? { mergeResult: jsonStringify(mergeResult) } : {}),
337
+ })
338
+
339
+ syncStateRef.current = mergeResult.newSyncState
340
+ yield* syncStateUpdateQueue.offer(mergeResult.newSyncState)
341
+ yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newEvents)
342
+ })
343
+
344
+ const debugInfo = {
345
+ rebaseCount: 0,
346
+ advanceCount: 0,
347
+ rejectCount: 0,
348
+ }
349
+
345
350
  return {
346
- push,
347
351
  boot,
352
+ encodeEvents,
353
+ materializeEvents,
354
+ push,
348
355
  syncState: Subscribable.make({
349
- get: Effect.gen(function* () {
350
- const syncState = syncStateRef.current
351
- if (syncStateRef === undefined) return shouldNeverHappen('Not initialized')
352
- return syncState
353
- }),
356
+ get: Effect.sync(() => syncStateRef.current),
354
357
  changes: Stream.fromQueue(syncStateUpdateQueue),
355
358
  }),
356
359
  debug: {
@@ -365,17 +368,23 @@ export const makeClientSessionSyncProcessor = ({
365
368
  'pushQueueItems',
366
369
  pushQueueItems.map((_) => _.toJSON()),
367
370
  )
368
- }).pipe(Effect.provide(runtime), Effect.runSync),
371
+ }).pipe(Effect.runSync),
369
372
  debugInfo: () => debugInfo,
370
373
  },
371
374
  } satisfies ClientSessionSyncProcessor
372
- }
375
+ })
373
376
 
374
377
  export interface ClientSessionSyncProcessor {
378
+ boot: Effect.Effect<void, never, Scope.Scope>
379
+ encodeEvents: (
380
+ events: ReadonlyArray<LiveStoreEvent.Input.Decoded>,
381
+ ) => Effect.Effect<ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>>
375
382
  push: (
376
- batch: ReadonlyArray<LiveStoreEvent.Input.Decoded>,
383
+ events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
384
+ ) => Effect.Effect<void>
385
+ materializeEvents: (
386
+ events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
377
387
  ) => Effect.Effect<{ writeTables: Set<string> }, MaterializeError>
378
- boot: Effect.Effect<void, UnknownError, Scope.Scope>
379
388
  /**
380
389
  * Only used for debugging / observability.
381
390
  */
@@ -1,38 +1,26 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
- import { UnknownError } from '../errors.ts'
2
+
3
3
  import { EventSequenceNumber } from '../schema/mod.ts'
4
4
 
5
- export class IsOfflineError extends Schema.TaggedError<IsOfflineError>()('IsOfflineError', {
5
+ export class IsOfflineError extends Schema.TaggedError<IsOfflineError>(
6
+ '~@livestore/common/IsOfflineError',
7
+ )('IsOfflineError', {
6
8
  cause: Schema.Defect,
7
9
  }) {}
8
10
 
9
11
  /** Unique ID generated by the backend when its created. Used to check whether the backend identity has changed. */
10
12
  export const BackendId = Schema.String.annotations({ title: '@livestore/sync-cf:BackendId' })
11
13
 
12
- export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>()('BackendIdMismatchError', {
14
+ export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>(
15
+ '~@livestore/common/BackendIdMismatchError',
16
+ )('BackendIdMismatchError', {
13
17
  expected: BackendId,
14
18
  received: BackendId,
15
19
  }) {}
16
20
 
17
- export class ServerAheadError extends Schema.TaggedError<ServerAheadError>()('ServerAheadError', {
21
+ export class ServerAheadError extends Schema.TaggedError<ServerAheadError>(
22
+ '~@livestore/common/ServerAheadError',
23
+ )('ServerAheadError', {
18
24
  minimumExpectedNum: EventSequenceNumber.Global.Schema,
19
25
  providedNum: EventSequenceNumber.Global.Schema,
20
26
  }) {}
21
-
22
- export class InvalidPushError extends Schema.TaggedError<InvalidPushError>()('InvalidPushError', {
23
- cause: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
24
- }) {}
25
-
26
- export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('InvalidPullError', {
27
- cause: Schema.Defect,
28
- }) {}
29
-
30
- export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>()('LeaderAheadError', {
31
- minimumExpectedNum: EventSequenceNumber.Client.Composite,
32
- providedNum: EventSequenceNumber.Client.Composite,
33
- /** Generation number the client session should use for subsequent pushes */
34
- // nextGeneration: Schema.Number,
35
- }) {}
36
-
37
- export const SyncError = Schema.Union(InvalidPushError, InvalidPullError)
38
- export type SyncError = typeof SyncError.Type