@livestore/common 0.4.0-dev.8 → 0.4.0

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 (518) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  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 +37 -7
  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.d.ts.map +1 -1
  17. package/dist/debug-info.js +33 -6
  18. package/dist/debug-info.js.map +1 -1
  19. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  20. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  21. package/dist/devtools/devtools-compatibility.test.js +15 -0
  22. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  23. package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
  24. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  25. package/dist/devtools/devtools-messages-client-session.js +22 -5
  26. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  27. package/dist/devtools/devtools-messages-common.d.ts +11 -14
  28. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages-common.js +7 -9
  30. package/dist/devtools/devtools-messages-common.js.map +1 -1
  31. package/dist/devtools/devtools-messages-leader.d.ts +65 -30
  32. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  33. package/dist/devtools/devtools-messages-leader.js +29 -11
  34. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  35. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  36. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  37. package/dist/devtools/devtools-sessioninfo.js +7 -4
  38. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  39. package/dist/devtools/mod.d.ts +13 -2
  40. package/dist/devtools/mod.d.ts.map +1 -1
  41. package/dist/devtools/mod.js +10 -3
  42. package/dist/devtools/mod.js.map +1 -1
  43. package/dist/errors.d.ts +48 -18
  44. package/dist/errors.d.ts.map +1 -1
  45. package/dist/errors.js +20 -12
  46. package/dist/errors.js.map +1 -1
  47. package/dist/index.d.ts +4 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/leader-thread/LeaderSyncProcessor.d.ts +53 -6
  52. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  53. package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
  54. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  55. package/dist/leader-thread/RejectedPushError.d.ts +107 -0
  56. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  57. package/dist/leader-thread/RejectedPushError.js +78 -0
  58. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  59. package/dist/leader-thread/connection.js +1 -1
  60. package/dist/leader-thread/connection.js.map +1 -1
  61. package/dist/leader-thread/eventlog.d.ts +19 -14
  62. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  63. package/dist/leader-thread/eventlog.js +78 -18
  64. package/dist/leader-thread/eventlog.js.map +1 -1
  65. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  66. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  67. package/dist/leader-thread/leader-worker-devtools.js +90 -58
  68. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  69. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
  70. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  71. package/dist/leader-thread/make-leader-thread-layer.js +49 -17
  72. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  73. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  74. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  75. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  76. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  77. package/dist/leader-thread/materialize-event.d.ts +1 -1
  78. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  79. package/dist/leader-thread/materialize-event.js +28 -9
  80. package/dist/leader-thread/materialize-event.js.map +1 -1
  81. package/dist/leader-thread/mod.d.ts +1 -0
  82. package/dist/leader-thread/mod.d.ts.map +1 -1
  83. package/dist/leader-thread/mod.js +1 -0
  84. package/dist/leader-thread/mod.js.map +1 -1
  85. package/dist/leader-thread/recreate-db.d.ts +2 -2
  86. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  87. package/dist/leader-thread/recreate-db.js +6 -6
  88. package/dist/leader-thread/recreate-db.js.map +1 -1
  89. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  90. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  91. package/dist/leader-thread/shutdown-channel.js +2 -2
  92. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  93. package/dist/leader-thread/stream-events.d.ts +56 -0
  94. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  95. package/dist/leader-thread/stream-events.js +167 -0
  96. package/dist/leader-thread/stream-events.js.map +1 -0
  97. package/dist/leader-thread/types.d.ts +95 -17
  98. package/dist/leader-thread/types.d.ts.map +1 -1
  99. package/dist/leader-thread/types.js +13 -0
  100. package/dist/leader-thread/types.js.map +1 -1
  101. package/dist/logging.d.ts +40 -0
  102. package/dist/logging.d.ts.map +1 -0
  103. package/dist/logging.js +33 -0
  104. package/dist/logging.js.map +1 -0
  105. package/dist/make-client-session.d.ts +5 -3
  106. package/dist/make-client-session.d.ts.map +1 -1
  107. package/dist/make-client-session.js +7 -4
  108. package/dist/make-client-session.js.map +1 -1
  109. package/dist/materializer-helper.d.ts +6 -6
  110. package/dist/materializer-helper.d.ts.map +1 -1
  111. package/dist/materializer-helper.js +18 -8
  112. package/dist/materializer-helper.js.map +1 -1
  113. package/dist/otel.d.ts +2 -1
  114. package/dist/otel.d.ts.map +1 -1
  115. package/dist/otel.js +7 -2
  116. package/dist/otel.js.map +1 -1
  117. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  118. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  119. package/dist/rematerialize-from-eventlog.js +40 -29
  120. package/dist/rematerialize-from-eventlog.js.map +1 -1
  121. package/dist/schema/EventDef/define.d.ts +161 -0
  122. package/dist/schema/EventDef/define.d.ts.map +1 -0
  123. package/dist/schema/EventDef/define.js +140 -0
  124. package/dist/schema/EventDef/define.js.map +1 -0
  125. package/dist/schema/EventDef/deprecated.d.ts +99 -0
  126. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  127. package/dist/schema/EventDef/deprecated.js +144 -0
  128. package/dist/schema/EventDef/deprecated.js.map +1 -0
  129. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  130. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  131. package/dist/schema/EventDef/deprecated.test.js +95 -0
  132. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  133. package/dist/schema/EventDef/event-def.d.ts +110 -0
  134. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  135. package/dist/schema/EventDef/event-def.js +2 -0
  136. package/dist/schema/EventDef/event-def.js.map +1 -0
  137. package/dist/schema/EventDef/facts.d.ts +118 -0
  138. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  139. package/dist/schema/EventDef/facts.js +53 -0
  140. package/dist/schema/EventDef/facts.js.map +1 -0
  141. package/dist/schema/EventDef/materializer.d.ts +155 -0
  142. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  143. package/dist/schema/EventDef/materializer.js +83 -0
  144. package/dist/schema/EventDef/materializer.js.map +1 -0
  145. package/dist/schema/EventDef/mod.d.ts +6 -0
  146. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  147. package/dist/schema/EventDef/mod.js +6 -0
  148. package/dist/schema/EventDef/mod.js.map +1 -0
  149. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  150. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  151. package/dist/schema/EventSequenceNumber/client.js +193 -0
  152. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  153. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  154. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  155. package/dist/schema/EventSequenceNumber/global.js +14 -0
  156. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  157. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  158. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  159. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  160. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  161. package/dist/schema/EventSequenceNumber.test.js +44 -44
  162. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  163. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
  164. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  165. package/dist/schema/LiveStoreEvent/client.js +176 -0
  166. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  167. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  168. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  169. package/dist/schema/LiveStoreEvent/client.test.js +111 -0
  170. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  171. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  172. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  173. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  174. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  175. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  176. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  177. package/dist/schema/LiveStoreEvent/global.js +31 -0
  178. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  179. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  180. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  181. package/dist/schema/LiveStoreEvent/input.js +26 -0
  182. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  183. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  184. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  185. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  186. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  187. package/dist/schema/events.d.ts +1 -1
  188. package/dist/schema/events.d.ts.map +1 -1
  189. package/dist/schema/events.js +1 -1
  190. package/dist/schema/events.js.map +1 -1
  191. package/dist/schema/mod.d.ts +6 -4
  192. package/dist/schema/mod.d.ts.map +1 -1
  193. package/dist/schema/mod.js +5 -4
  194. package/dist/schema/mod.js.map +1 -1
  195. package/dist/schema/schema.d.ts +16 -1
  196. package/dist/schema/schema.d.ts.map +1 -1
  197. package/dist/schema/schema.js +32 -4
  198. package/dist/schema/schema.js.map +1 -1
  199. package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
  200. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  201. package/dist/schema/state/sqlite/client-document-def.js +36 -15
  202. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  203. package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
  204. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  205. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/column-annotations.js +1 -1
  207. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  208. package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
  209. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  210. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  211. package/dist/schema/state/sqlite/column-def.js +96 -47
  212. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  213. package/dist/schema/state/sqlite/column-def.test.js +51 -12
  214. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  215. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/column-spec.js +30 -12
  217. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  218. package/dist/schema/state/sqlite/column-spec.test.js +24 -15
  219. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  220. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
  221. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  222. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +16 -10
  223. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  224. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +15 -4
  225. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  226. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  227. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +1 -1
  229. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  231. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  232. package/dist/schema/state/sqlite/mod.d.ts +2 -2
  233. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/mod.js +5 -7
  235. package/dist/schema/state/sqlite/mod.js.map +1 -1
  236. package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
  237. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/query-builder/astToSql.js +99 -22
  240. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  241. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  242. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  243. package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
  244. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  245. package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
  246. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  247. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  248. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  250. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  251. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  252. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  253. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  254. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  255. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
  256. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  257. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  258. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  259. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  260. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  261. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  262. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  263. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  264. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  265. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  266. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  267. package/dist/schema/state/sqlite/table-def.d.ts +5 -3
  268. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/table-def.js +1 -1
  270. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  271. package/dist/schema/state/sqlite/table-def.test.js +92 -3
  272. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  273. package/dist/schema/unknown-events.d.ts +47 -0
  274. package/dist/schema/unknown-events.d.ts.map +1 -0
  275. package/dist/schema/unknown-events.js +69 -0
  276. package/dist/schema/unknown-events.js.map +1 -0
  277. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  278. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  279. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  280. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  281. package/dist/schema-management/common.js +2 -2
  282. package/dist/schema-management/common.js.map +1 -1
  283. package/dist/schema-management/migrations.d.ts +32 -2
  284. package/dist/schema-management/migrations.d.ts.map +1 -1
  285. package/dist/schema-management/migrations.js +38 -6
  286. package/dist/schema-management/migrations.js.map +1 -1
  287. package/dist/schema-management/validate-schema.d.ts +3 -3
  288. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  289. package/dist/schema-management/validate-schema.js +2 -2
  290. package/dist/schema-management/validate-schema.js.map +1 -1
  291. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  292. package/dist/sql-queries/sql-queries.js +18 -6
  293. package/dist/sql-queries/sql-queries.js.map +1 -1
  294. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  295. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  296. package/dist/sqlite-db-helper.js +3 -3
  297. package/dist/sqlite-db-helper.js.map +1 -1
  298. package/dist/sqlite-types.d.ts +5 -5
  299. package/dist/sqlite-types.d.ts.map +1 -1
  300. package/dist/sqlite-types.js.map +1 -1
  301. package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
  302. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  303. package/dist/sync/ClientSessionSyncProcessor.js +99 -114
  304. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  305. package/dist/sync/errors.d.ts +0 -33
  306. package/dist/sync/errors.d.ts.map +1 -1
  307. package/dist/sync/errors.js +5 -22
  308. package/dist/sync/errors.js.map +1 -1
  309. package/dist/sync/index.d.ts +2 -0
  310. package/dist/sync/index.d.ts.map +1 -1
  311. package/dist/sync/index.js +2 -0
  312. package/dist/sync/index.js.map +1 -1
  313. package/dist/sync/mock-sync-backend.d.ts +10 -8
  314. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  315. package/dist/sync/mock-sync-backend.js +71 -69
  316. package/dist/sync/mock-sync-backend.js.map +1 -1
  317. package/dist/sync/next/compact-events.d.ts.map +1 -1
  318. package/dist/sync/next/compact-events.js +11 -12
  319. package/dist/sync/next/compact-events.js.map +1 -1
  320. package/dist/sync/next/facts.d.ts +5 -5
  321. package/dist/sync/next/facts.d.ts.map +1 -1
  322. package/dist/sync/next/facts.js +7 -8
  323. package/dist/sync/next/facts.js.map +1 -1
  324. package/dist/sync/next/history-dag-common.d.ts +54 -15
  325. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  326. package/dist/sync/next/history-dag-common.js +198 -9
  327. package/dist/sync/next/history-dag-common.js.map +1 -1
  328. package/dist/sync/next/history-dag.d.ts.map +1 -1
  329. package/dist/sync/next/history-dag.js +11 -11
  330. package/dist/sync/next/history-dag.js.map +1 -1
  331. package/dist/sync/next/rebase-events.d.ts +5 -5
  332. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  333. package/dist/sync/next/rebase-events.js +6 -6
  334. package/dist/sync/next/rebase-events.js.map +1 -1
  335. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  336. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  337. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  338. package/dist/sync/next/test/compact-events.test.js +2 -2
  339. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  340. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  341. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  342. package/dist/sync/next/test/event-fixtures.js +11 -11
  343. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  344. package/dist/sync/sync-backend-kv.d.ts +3 -3
  345. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  346. package/dist/sync/sync-backend-kv.js +3 -3
  347. package/dist/sync/sync-backend-kv.js.map +1 -1
  348. package/dist/sync/sync-backend.d.ts +33 -13
  349. package/dist/sync/sync-backend.d.ts.map +1 -1
  350. package/dist/sync/sync-backend.js +38 -1
  351. package/dist/sync/sync-backend.js.map +1 -1
  352. package/dist/sync/sync.d.ts +23 -2
  353. package/dist/sync/sync.d.ts.map +1 -1
  354. package/dist/sync/syncstate.d.ts +55 -55
  355. package/dist/sync/syncstate.d.ts.map +1 -1
  356. package/dist/sync/syncstate.js +80 -98
  357. package/dist/sync/syncstate.js.map +1 -1
  358. package/dist/sync/syncstate.test.js +221 -132
  359. package/dist/sync/syncstate.test.js.map +1 -1
  360. package/dist/sync/transport-chunking.d.ts +36 -0
  361. package/dist/sync/transport-chunking.d.ts.map +1 -0
  362. package/dist/sync/transport-chunking.js +56 -0
  363. package/dist/sync/transport-chunking.js.map +1 -0
  364. package/dist/sync/validate-push-payload.d.ts +2 -2
  365. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  366. package/dist/sync/validate-push-payload.js +4 -6
  367. package/dist/sync/validate-push-payload.js.map +1 -1
  368. package/dist/testing/event-factory.d.ts +68 -0
  369. package/dist/testing/event-factory.d.ts.map +1 -0
  370. package/dist/testing/event-factory.js +78 -0
  371. package/dist/testing/event-factory.js.map +1 -0
  372. package/dist/testing/mod.d.ts +2 -0
  373. package/dist/testing/mod.d.ts.map +1 -0
  374. package/dist/testing/mod.js +2 -0
  375. package/dist/testing/mod.js.map +1 -0
  376. package/dist/util.js +2 -2
  377. package/dist/util.js.map +1 -1
  378. package/dist/version.d.ts +24 -5
  379. package/dist/version.d.ts.map +1 -1
  380. package/dist/version.js +25 -8
  381. package/dist/version.js.map +1 -1
  382. package/package.json +69 -16
  383. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  384. package/src/WorkerTransportError.ts +12 -0
  385. package/src/adapter-types.ts +50 -7
  386. package/src/bounded-collections.ts +6 -5
  387. package/src/debug-info.ts +37 -6
  388. package/src/devtools/devtools-compatibility.test.ts +18 -0
  389. package/src/devtools/devtools-messages-client-session.ts +22 -4
  390. package/src/devtools/devtools-messages-common.ts +7 -12
  391. package/src/devtools/devtools-messages-leader.ts +29 -10
  392. package/src/devtools/devtools-sessioninfo.ts +8 -5
  393. package/src/devtools/mod.ts +11 -2
  394. package/src/errors.ts +32 -24
  395. package/src/index.ts +4 -1
  396. package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
  397. package/src/leader-thread/RejectedPushError.ts +106 -0
  398. package/src/leader-thread/connection.ts +1 -1
  399. package/src/leader-thread/eventlog.ts +112 -39
  400. package/src/leader-thread/leader-worker-devtools.ts +201 -120
  401. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  402. package/src/leader-thread/make-leader-thread-layer.ts +125 -40
  403. package/src/leader-thread/materialize-event.ts +40 -10
  404. package/src/leader-thread/mod.ts +1 -0
  405. package/src/leader-thread/recreate-db.ts +7 -7
  406. package/src/leader-thread/shutdown-channel.ts +4 -8
  407. package/src/leader-thread/stream-events.ts +206 -0
  408. package/src/leader-thread/types.ts +68 -18
  409. package/src/logging.ts +62 -0
  410. package/src/make-client-session.ts +11 -5
  411. package/src/materializer-helper.ts +27 -16
  412. package/src/otel.ts +13 -2
  413. package/src/rematerialize-from-eventlog.ts +61 -51
  414. package/src/schema/EventDef/define.ts +217 -0
  415. package/src/schema/EventDef/deprecated.test.ts +129 -0
  416. package/src/schema/EventDef/deprecated.ts +175 -0
  417. package/src/schema/EventDef/event-def.ts +125 -0
  418. package/src/schema/EventDef/facts.ts +135 -0
  419. package/src/schema/EventDef/materializer.ts +172 -0
  420. package/src/schema/EventDef/mod.ts +5 -0
  421. package/src/schema/EventSequenceNumber/client.ts +257 -0
  422. package/src/schema/EventSequenceNumber/global.ts +19 -0
  423. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  424. package/src/schema/EventSequenceNumber.test.ts +72 -53
  425. package/src/schema/LiveStoreEvent/client.test.ts +129 -0
  426. package/src/schema/LiveStoreEvent/client.ts +235 -0
  427. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  428. package/src/schema/LiveStoreEvent/global.ts +45 -0
  429. package/src/schema/LiveStoreEvent/input.ts +63 -0
  430. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  431. package/src/schema/events.ts +1 -1
  432. package/src/schema/mod.ts +6 -4
  433. package/src/schema/schema.ts +46 -5
  434. package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
  435. package/src/schema/state/sqlite/client-document-def.ts +47 -34
  436. package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
  437. package/src/schema/state/sqlite/column-annotations.ts +2 -1
  438. package/src/schema/state/sqlite/column-def.test.ts +66 -12
  439. package/src/schema/state/sqlite/column-def.ts +119 -47
  440. package/src/schema/state/sqlite/column-spec.test.ts +32 -17
  441. package/src/schema/state/sqlite/column-spec.ts +37 -11
  442. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
  443. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
  444. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
  445. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
  446. package/src/schema/state/sqlite/mod.ts +7 -8
  447. package/src/schema/state/sqlite/query-builder/api.ts +55 -17
  448. package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
  449. package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
  450. package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
  451. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  452. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  453. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  454. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  455. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  456. package/src/schema/state/sqlite/table-def.test.ts +114 -3
  457. package/src/schema/state/sqlite/table-def.ts +16 -22
  458. package/src/schema/unknown-events.ts +131 -0
  459. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  460. package/src/schema-management/common.ts +2 -2
  461. package/src/schema-management/migrations.ts +42 -9
  462. package/src/schema-management/validate-schema.ts +3 -3
  463. package/src/sql-queries/sql-queries.ts +18 -6
  464. package/src/sql-queries/sql-query-builder.ts +1 -0
  465. package/src/sqlite-db-helper.ts +3 -3
  466. package/src/sqlite-types.ts +6 -5
  467. package/src/sync/ClientSessionSyncProcessor.ts +152 -142
  468. package/src/sync/errors.ts +12 -24
  469. package/src/sync/index.ts +2 -0
  470. package/src/sync/mock-sync-backend.ts +146 -104
  471. package/src/sync/next/compact-events.ts +10 -11
  472. package/src/sync/next/facts.ts +13 -14
  473. package/src/sync/next/history-dag-common.ts +280 -26
  474. package/src/sync/next/history-dag.ts +17 -13
  475. package/src/sync/next/rebase-events.ts +12 -12
  476. package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
  477. package/src/sync/next/test/compact-events.test.ts +4 -3
  478. package/src/sync/next/test/event-fixtures.ts +13 -13
  479. package/src/sync/sync-backend-kv.ts +4 -3
  480. package/src/sync/sync-backend.ts +66 -17
  481. package/src/sync/sync.ts +24 -2
  482. package/src/sync/syncstate.test.ts +583 -419
  483. package/src/sync/syncstate.ts +127 -122
  484. package/src/sync/transport-chunking.ts +90 -0
  485. package/src/sync/validate-push-payload.ts +6 -8
  486. package/src/testing/event-factory.ts +131 -0
  487. package/src/testing/mod.ts +1 -0
  488. package/src/util.ts +2 -2
  489. package/src/version.ts +33 -8
  490. package/dist/schema/EventDef.d.ts +0 -126
  491. package/dist/schema/EventDef.d.ts.map +0 -1
  492. package/dist/schema/EventDef.js +0 -46
  493. package/dist/schema/EventDef.js.map +0 -1
  494. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  495. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  496. package/dist/schema/EventSequenceNumber.js +0 -139
  497. package/dist/schema/EventSequenceNumber.js.map +0 -1
  498. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  499. package/dist/schema/LiveStoreEvent.js +0 -147
  500. package/dist/schema/LiveStoreEvent.js.map +0 -1
  501. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  502. package/dist/schema/state/sqlite/system-tables.js +0 -81
  503. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  504. package/dist/sync/next/graphology.d.ts +0 -8
  505. package/dist/sync/next/graphology.d.ts.map +0 -1
  506. package/dist/sync/next/graphology.js +0 -30
  507. package/dist/sync/next/graphology.js.map +0 -1
  508. package/dist/sync/next/graphology_.d.ts +0 -3
  509. package/dist/sync/next/graphology_.d.ts.map +0 -1
  510. package/dist/sync/next/graphology_.js +0 -3
  511. package/dist/sync/next/graphology_.js.map +0 -1
  512. package/src/schema/EventDef.ts +0 -222
  513. package/src/schema/EventSequenceNumber.ts +0 -199
  514. package/src/schema/LiveStoreEvent.ts +0 -286
  515. package/src/schema/state/sqlite/system-tables.ts +0 -106
  516. package/src/sync/next/ambient.d.ts +0 -3
  517. package/src/sync/next/graphology.ts +0 -41
  518. package/src/sync/next/graphology_.ts +0 -2
@@ -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,20 +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, type MaterializeError, UnexpectedError } from '../adapter-types.ts'
19
- import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
20
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
21
- import { getEventDef, type LiveStoreSchema } from '../schema/mod.ts'
16
+ import type { ClientSession } from '../adapter-types.ts'
17
+ import type { MaterializeError } from '../errors.ts'
18
+ import { isRejectedPushError } from '../leader-thread/RejectedPushError.ts'
19
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
20
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
21
+ import type { LiveStoreSchema } from '../schema/mod.ts'
22
22
  import * as SyncState from './syncstate.ts'
23
23
 
24
+ /** Serialize value to JSON string for trace attributes */
25
+ const jsonStringify = Schema.encodeSync(Schema.parseJson())
26
+
24
27
  /**
25
28
  * Rebase behaviour:
26
29
  * - We continously pull events from the leader and apply them to the local store.
@@ -36,22 +39,19 @@ import * as SyncState from './syncstate.ts'
36
39
  * - The leader sync processor pulls regular LiveStore events, while the session sync processor pulls SyncState.PayloadUpstream items
37
40
  * - The session sync processor has no downstream nodes.
38
41
  */
39
- export const makeClientSessionSyncProcessor = ({
42
+ export const makeClientSessionSyncProcessor = Effect.fn('makeClientSessionSyncProcessor')(function* ({
40
43
  schema,
41
44
  clientSession,
42
- runtime,
43
45
  materializeEvent,
44
46
  rollback,
45
47
  refreshTables,
46
- span,
47
48
  params,
48
49
  confirmUnsavedChanges,
49
50
  }: {
50
51
  schema: LiveStoreSchema
51
52
  clientSession: ClientSession
52
- runtime: Runtime.Runtime<Scope.Scope>
53
53
  materializeEvent: (
54
- eventDecoded: LiveStoreEvent.AnyDecoded,
54
+ eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
55
55
  options: { withChangeset: boolean; materializerHashLeader: Option.Option<number> },
56
56
  ) => Effect.Effect<
57
57
  {
@@ -66,7 +66,6 @@ export const makeClientSessionSyncProcessor = ({
66
66
  >
67
67
  rollback: (changeset: Uint8Array<ArrayBuffer>) => void
68
68
  refreshTables: (tables: Set<string>) => void
69
- span: otel.Span
70
69
  params: {
71
70
  leaderPushBatchSize: number
72
71
  simulation?: ClientSessionSyncProcessorSimulationParams
@@ -76,8 +75,8 @@ export const makeClientSessionSyncProcessor = ({
76
75
  * If true, registers a beforeunload event listener to confirm unsaved changes.
77
76
  */
78
77
  confirmUnsavedChanges: boolean
79
- }): ClientSessionSyncProcessor => {
80
- const eventSchema = LiveStoreEvent.makeEventDefSchemaMemo(schema)
78
+ }): Effect.fn.Return<ClientSessionSyncProcessor> {
79
+ const eventSchema = LiveStoreEvent.Client.makeSchemaMemo(schema)
81
80
 
82
81
  const simSleep = <TKey extends keyof ClientSessionSyncProcessorSimulationParams>(
83
82
  key: TKey,
@@ -95,98 +94,19 @@ export const makeClientSessionSyncProcessor = ({
95
94
  }
96
95
 
97
96
  /** Only used for debugging / observability / testing, it's not relied upon for correctness of the sync processor. */
98
- const syncStateUpdateQueue = Queue.unbounded<SyncState.SyncState>().pipe(Effect.runSync)
99
- const isClientEvent = (eventEncoded: LiveStoreEvent.EncodedWithMeta) =>
100
- getEventDef(schema, eventEncoded.name).eventDef.options.clientOnly
97
+ const syncStateUpdateQueue = yield* Queue.unbounded<SyncState.SyncState>()
98
+ const isClientEvent = (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) =>
99
+ schema.eventsDefsMap.get(eventEncoded.name)?.options.clientOnly ?? false
101
100
 
102
101
  /** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
103
- const leaderPushQueue = BucketQueue.make<LiveStoreEvent.EncodedWithMeta>().pipe(Effect.runSync)
104
-
105
- const push: ClientSessionSyncProcessor['push'] = Effect.fn('client-session-sync-processor:push')(function* (batch) {
106
- // TODO validate batch
107
-
108
- let baseEventSequenceNumber = syncStateRef.current.localHead
109
- const encodedEventDefs = batch.map(({ name, args }) => {
110
- const eventDef = getEventDef(schema, name)
111
- const nextNumPair = EventSequenceNumber.nextPair({
112
- seqNum: baseEventSequenceNumber,
113
- isClient: eventDef.eventDef.options.clientOnly,
114
- })
115
- baseEventSequenceNumber = nextNumPair.seqNum
116
- return new LiveStoreEvent.EncodedWithMeta(
117
- Schema.encodeUnknownSync(eventSchema)({
118
- name,
119
- args,
120
- ...nextNumPair,
121
- clientId: clientSession.clientId,
122
- sessionId: clientSession.sessionId,
123
- }),
124
- )
125
- })
126
-
127
- const mergeResult = SyncState.merge({
128
- syncState: syncStateRef.current,
129
- payload: { _tag: 'local-push', newEvents: encodedEventDefs },
130
- isClientEvent,
131
- isEqualEvent: LiveStoreEvent.isEqualEncoded,
132
- })
133
-
134
- yield* Effect.annotateCurrentSpan({
135
- batchSize: encodedEventDefs.length,
136
- mergeResultTag: mergeResult._tag,
137
- eventCounts: encodedEventDefs.reduce<Record<string, number>>((acc, event) => {
138
- acc[event.name] = (acc[event.name] ?? 0) + 1
139
- return acc
140
- }, {}),
141
- ...(TRACE_VERBOSE && { mergeResult: JSON.stringify(mergeResult) }),
142
- })
143
-
144
- if (mergeResult._tag === 'unexpected-error') {
145
- return shouldNeverHappen('Unexpected error in client-session-sync-processor', mergeResult.message)
146
- }
147
-
148
- if (mergeResult._tag !== 'advance') {
149
- return shouldNeverHappen(`Expected advance, got ${mergeResult._tag}`)
150
- }
151
-
152
- syncStateRef.current = mergeResult.newSyncState
153
- yield* syncStateUpdateQueue.offer(mergeResult.newSyncState)
154
-
155
- // Materialize events to state
156
- const writeTables = new Set<string>()
157
- for (const event of mergeResult.newEvents) {
158
- // TODO avoid encoding and decoding here again
159
- const decodedEventDef = Schema.decodeSync(eventSchema)(event)
160
- const {
161
- writeTables: newWriteTables,
162
- sessionChangeset,
163
- materializerHash,
164
- } = yield* materializeEvent(decodedEventDef, {
165
- withChangeset: true,
166
- materializerHashLeader: Option.none(),
167
- })
168
- for (const table of newWriteTables) {
169
- writeTables.add(table)
170
- }
171
- event.meta.sessionChangeset = sessionChangeset
172
- event.meta.materializerHashSession = materializerHash
173
- }
174
-
175
- // Trigger push to leader
176
- // console.debug('pushToLeader', encodedEventDefs.length, ...encodedEventDefs.map((_) => _.toJSON()))
177
- yield* BucketQueue.offerAll(leaderPushQueue, encodedEventDefs)
178
-
179
- return { writeTables }
180
- })
181
-
182
- const debugInfo = {
183
- rebaseCount: 0,
184
- advanceCount: 0,
185
- rejectCount: 0,
186
- }
187
-
188
- const boot: ClientSessionSyncProcessor['boot'] = Effect.gen(function* () {
189
- 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
+ ) {
190
110
  const onBeforeUnload = (event: BeforeUnloadEvent) => {
191
111
  if (syncStateRef.current.pending.length > 0) {
192
112
  // Trigger the default browser dialog
@@ -205,12 +125,17 @@ export const makeClientSessionSyncProcessor = ({
205
125
  const backgroundLeaderPushing = Effect.gen(function* () {
206
126
  const batch = yield* BucketQueue.takeBetween(leaderPushQueue, 1, params.leaderPushBatchSize)
207
127
  yield* clientSession.leaderThread.events.push(batch).pipe(
208
- Effect.catchTag('LeaderAheadError', () => {
128
+ Effect.catchIf(isRejectedPushError, () => {
209
129
  debugInfo.rejectCount++
210
130
  return BucketQueue.clear(leaderPushQueue)
211
131
  }),
212
132
  )
213
- }).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
+ )
214
139
 
215
140
  yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
216
141
 
@@ -222,48 +147,47 @@ export const makeClientSessionSyncProcessor = ({
222
147
  Effect.gen(function* () {
223
148
  // yield* Effect.logDebug('ClientSessionSyncProcessor:pull', payload)
224
149
 
225
- if (clientSession.devtools.enabled) {
150
+ if (clientSession.devtools.enabled === true) {
226
151
  yield* clientSession.devtools.pullLatch.await
227
152
  }
228
153
 
229
- const mergeResult = SyncState.merge({
154
+ const mergeResult = yield* SyncState.merge({
230
155
  syncState: syncStateRef.current,
231
156
  payload,
232
157
  isClientEvent,
233
- isEqualEvent: LiveStoreEvent.isEqualEncoded,
234
- })
235
-
236
- if (mergeResult._tag === 'unexpected-error') {
237
- return yield* new UnexpectedError({ cause: mergeResult.message })
238
- } else if (mergeResult._tag === 'reject') {
239
- return shouldNeverHappen('Unexpected reject in client-session-sync-processor', mergeResult)
240
- }
158
+ isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
159
+ }).pipe(
160
+ Effect.filterOrDieMessage(
161
+ (r) => r._tag !== 'reject',
162
+ 'Unexpected reject in client-session-sync-processor',
163
+ ),
164
+ )
241
165
 
242
166
  syncStateRef.current = mergeResult.newSyncState
243
167
 
244
168
  if (mergeResult._tag === 'rebase') {
245
- span.addEvent('merge:pull:rebase', {
169
+ yield* Effect.spanEvent('merge:pull:rebase', {
246
170
  payloadTag: payload._tag,
247
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
171
+ ...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
248
172
  newEventsCount: mergeResult.newEvents.length,
249
173
  rollbackCount: mergeResult.rollbackEvents.length,
250
- res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
174
+ ...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
251
175
  })
252
176
 
253
177
  debugInfo.rebaseCount++
254
178
 
255
- 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')
256
180
 
257
181
  yield* FiberHandle.clear(leaderPushingFiberHandle)
258
182
 
259
- 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')
260
184
 
261
185
  // Reset the leader push queue since we're rebasing and will push again
262
186
  yield* BucketQueue.clear(leaderPushQueue)
263
187
 
264
- if (SIMULATION_ENABLED) yield* simSleep('pull', '3_before_rebase_rollback')
188
+ if (SIMULATION_ENABLED === true) yield* simSleep('pull', '3_before_rebase_rollback')
265
189
 
266
- if (LS_DEV) {
190
+ if (LS_DEV === true) {
267
191
  yield* Effect.logDebug(
268
192
  'merge:pull:rebase: rollback',
269
193
  mergeResult.rollbackEvents.length,
@@ -279,19 +203,19 @@ export const makeClientSessionSyncProcessor = ({
279
203
  }
280
204
  }
281
205
 
282
- 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')
283
207
 
284
208
  yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newSyncState.pending)
285
209
 
286
- 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')
287
211
 
288
212
  yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
289
213
  } else {
290
- span.addEvent('merge:pull:advance', {
214
+ yield* Effect.spanEvent('merge:pull:advance', {
291
215
  payloadTag: payload._tag,
292
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
216
+ ...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
293
217
  newEventsCount: mergeResult.newEvents.length,
294
- res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
218
+ ...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
295
219
  })
296
220
 
297
221
  debugInfo.advanceCount++
@@ -305,13 +229,11 @@ export const makeClientSessionSyncProcessor = ({
305
229
 
306
230
  const writeTables = new Set<string>()
307
231
  for (const event of mergeResult.newEvents) {
308
- // TODO apply changeset if available (will require tracking of write tables as well)
309
- const decodedEventDef = Schema.decodeSync(eventSchema)(event)
310
232
  const {
311
233
  writeTables: newWriteTables,
312
234
  sessionChangeset,
313
235
  materializerHash,
314
- } = yield* materializeEvent(decodedEventDef, {
236
+ } = yield* materializeEvent(event, {
315
237
  withChangeset: true,
316
238
  materializerHashLeader: event.meta.materializerHashLeader,
317
239
  })
@@ -339,17 +261,99 @@ export const makeClientSessionSyncProcessor = ({
339
261
  Effect.tapCauseLogPretty,
340
262
  Effect.forkScoped,
341
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
+ )
342
290
  })
343
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 }
312
+ })
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
+
344
350
  return {
345
- push,
346
351
  boot,
352
+ encodeEvents,
353
+ materializeEvents,
354
+ push,
347
355
  syncState: Subscribable.make({
348
- get: Effect.gen(function* () {
349
- const syncState = syncStateRef.current
350
- if (syncStateRef === undefined) return shouldNeverHappen('Not initialized')
351
- return syncState
352
- }),
356
+ get: Effect.sync(() => syncStateRef.current),
353
357
  changes: Stream.fromQueue(syncStateUpdateQueue),
354
358
  }),
355
359
  debug: {
@@ -364,17 +368,23 @@ export const makeClientSessionSyncProcessor = ({
364
368
  'pushQueueItems',
365
369
  pushQueueItems.map((_) => _.toJSON()),
366
370
  )
367
- }).pipe(Effect.provide(runtime), Effect.runSync),
371
+ }).pipe(Effect.runSync),
368
372
  debugInfo: () => debugInfo,
369
373
  },
370
374
  } satisfies ClientSessionSyncProcessor
371
- }
375
+ })
372
376
 
373
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>>
374
382
  push: (
375
- batch: ReadonlyArray<LiveStoreEvent.PartialAnyDecoded>,
383
+ events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
384
+ ) => Effect.Effect<void>
385
+ materializeEvents: (
386
+ events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
376
387
  ) => Effect.Effect<{ writeTables: Set<string> }, MaterializeError>
377
- boot: Effect.Effect<void, UnexpectedError, Scope.Scope>
378
388
  /**
379
389
  * Only used for debugging / observability.
380
390
  */
@@ -1,38 +1,26 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
- import { UnexpectedError } 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', {
18
- minimumExpectedNum: EventSequenceNumber.GlobalEventSequenceNumber,
19
- providedNum: EventSequenceNumber.GlobalEventSequenceNumber,
20
- }) {}
21
-
22
- export class InvalidPushError extends Schema.TaggedError<InvalidPushError>()('InvalidPushError', {
23
- cause: Schema.Union(UnexpectedError, ServerAheadError, BackendIdMismatchError),
21
+ export class ServerAheadError extends Schema.TaggedError<ServerAheadError>(
22
+ '~@livestore/common/ServerAheadError',
23
+ )('ServerAheadError', {
24
+ minimumExpectedNum: EventSequenceNumber.Global.Schema,
25
+ providedNum: EventSequenceNumber.Global.Schema,
24
26
  }) {}
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.EventSequenceNumber,
32
- providedNum: EventSequenceNumber.EventSequenceNumber,
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
package/src/sync/index.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './ClientSessionSyncProcessor.ts'
2
2
  export * from './mock-sync-backend.ts'
3
3
  export * from './sync.ts'
4
+ export { NetworkStatus } from './sync-backend.ts'
5
+ export * from './transport-chunking.ts'
4
6
  export * from './validate-push-payload.ts'