@livestore/common 0.4.0-dev.2 → 0.4.0-dev.20

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 (449) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +17 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/adapter-types.d.ts +14 -6
  6. package/dist/adapter-types.d.ts.map +1 -1
  7. package/dist/adapter-types.js.map +1 -1
  8. package/dist/debug-info.d.ts.map +1 -1
  9. package/dist/debug-info.js +33 -6
  10. package/dist/debug-info.js.map +1 -1
  11. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  12. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.js +2 -2
  14. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  15. package/dist/devtools/devtools-messages-common.d.ts +7 -14
  16. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-common.js +1 -6
  18. package/dist/devtools/devtools-messages-common.js.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.d.ts +36 -29
  20. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  21. package/dist/devtools/devtools-messages-leader.js +8 -8
  22. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  23. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  24. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  25. package/dist/devtools/devtools-sessioninfo.js +7 -4
  26. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  27. package/dist/devtools/mod.d.ts +13 -2
  28. package/dist/devtools/mod.d.ts.map +1 -1
  29. package/dist/devtools/mod.js +10 -3
  30. package/dist/devtools/mod.js.map +1 -1
  31. package/dist/errors.d.ts +52 -10
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +25 -6
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/LeaderSyncProcessor.d.ts +8 -4
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.js +156 -73
  42. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  43. package/dist/leader-thread/eventlog.d.ts +15 -21
  44. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  45. package/dist/leader-thread/eventlog.js +18 -18
  46. package/dist/leader-thread/eventlog.js.map +1 -1
  47. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  48. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-worker-devtools.js +30 -42
  50. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  51. package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
  52. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  53. package/dist/leader-thread/make-leader-thread-layer.js +79 -27
  54. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  56. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  57. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  58. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  59. package/dist/leader-thread/materialize-event.d.ts +3 -3
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +25 -11
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/recreate-db.d.ts +2 -3
  64. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  65. package/dist/leader-thread/recreate-db.js +5 -5
  66. package/dist/leader-thread/recreate-db.js.map +1 -1
  67. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  68. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  69. package/dist/leader-thread/shutdown-channel.js +2 -2
  70. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  71. package/dist/leader-thread/types.d.ts +21 -19
  72. package/dist/leader-thread/types.d.ts.map +1 -1
  73. package/dist/leader-thread/types.js.map +1 -1
  74. package/dist/logging.d.ts +40 -0
  75. package/dist/logging.d.ts.map +1 -0
  76. package/dist/logging.js +33 -0
  77. package/dist/logging.js.map +1 -0
  78. package/dist/make-client-session.d.ts +5 -3
  79. package/dist/make-client-session.d.ts.map +1 -1
  80. package/dist/make-client-session.js +5 -2
  81. package/dist/make-client-session.js.map +1 -1
  82. package/dist/materializer-helper.d.ts +6 -6
  83. package/dist/materializer-helper.d.ts.map +1 -1
  84. package/dist/materializer-helper.js +20 -4
  85. package/dist/materializer-helper.js.map +1 -1
  86. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  87. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  88. package/dist/rematerialize-from-eventlog.js +29 -20
  89. package/dist/rematerialize-from-eventlog.js.map +1 -1
  90. package/dist/schema/EventDef/define.d.ts +147 -0
  91. package/dist/schema/EventDef/define.d.ts.map +1 -0
  92. package/dist/schema/EventDef/define.js +139 -0
  93. package/dist/schema/EventDef/define.js.map +1 -0
  94. package/dist/schema/EventDef/event-def.d.ts +106 -0
  95. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  96. package/dist/schema/EventDef/event-def.js +2 -0
  97. package/dist/schema/EventDef/event-def.js.map +1 -0
  98. package/dist/schema/EventDef/facts.d.ts +118 -0
  99. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  100. package/dist/schema/EventDef/facts.js +53 -0
  101. package/dist/schema/EventDef/facts.js.map +1 -0
  102. package/dist/schema/EventDef/materializer.d.ts +155 -0
  103. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  104. package/dist/schema/EventDef/materializer.js +83 -0
  105. package/dist/schema/EventDef/materializer.js.map +1 -0
  106. package/dist/schema/EventDef/mod.d.ts +5 -0
  107. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  108. package/dist/schema/EventDef/mod.js +5 -0
  109. package/dist/schema/EventDef/mod.js.map +1 -0
  110. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  111. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  112. package/dist/schema/EventSequenceNumber/client.js +193 -0
  113. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  114. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  115. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  116. package/dist/schema/EventSequenceNumber/global.js +14 -0
  117. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  118. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  119. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  120. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  121. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  122. package/dist/schema/EventSequenceNumber.test.js +43 -43
  123. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  124. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
  125. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  126. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
  127. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  128. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  129. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  130. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  131. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  132. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  133. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  134. package/dist/schema/LiveStoreEvent/global.js +31 -0
  135. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  136. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  137. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  138. package/dist/schema/LiveStoreEvent/input.js +26 -0
  139. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  140. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  141. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  142. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  143. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  144. package/dist/schema/events.d.ts +1 -1
  145. package/dist/schema/events.d.ts.map +1 -1
  146. package/dist/schema/events.js +1 -1
  147. package/dist/schema/events.js.map +1 -1
  148. package/dist/schema/mod.d.ts +6 -4
  149. package/dist/schema/mod.d.ts.map +1 -1
  150. package/dist/schema/mod.js +5 -4
  151. package/dist/schema/mod.js.map +1 -1
  152. package/dist/schema/schema.d.ts +16 -1
  153. package/dist/schema/schema.d.ts.map +1 -1
  154. package/dist/schema/schema.js +27 -2
  155. package/dist/schema/schema.js.map +1 -1
  156. package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
  157. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  158. package/dist/schema/state/sqlite/client-document-def.js +97 -6
  159. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  160. package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
  161. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  162. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  163. package/dist/schema/state/sqlite/column-annotations.js +14 -6
  164. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  165. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  166. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  167. package/dist/schema/state/sqlite/column-def.js +69 -22
  168. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  169. package/dist/schema/state/sqlite/column-def.test.js +46 -7
  170. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  171. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  172. package/dist/schema/state/sqlite/column-spec.js +30 -12
  173. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  174. package/dist/schema/state/sqlite/column-spec.test.js +23 -14
  175. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  176. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
  177. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  178. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
  179. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  180. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  181. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  182. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  183. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  184. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  185. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
  186. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  187. package/dist/schema/state/sqlite/mod.d.ts +3 -3
  188. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  189. package/dist/schema/state/sqlite/mod.js +3 -3
  190. package/dist/schema/state/sqlite/mod.js.map +1 -1
  191. package/dist/schema/state/sqlite/query-builder/api.d.ts +17 -10
  192. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  193. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  194. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
  195. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  196. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  197. package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
  198. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  199. package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
  200. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  201. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  202. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  203. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  204. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  205. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  206. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  207. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  208. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  209. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
  210. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  211. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  212. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  213. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  214. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  215. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  216. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  217. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  218. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  219. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  220. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  221. package/dist/schema/state/sqlite/table-def.d.ts +4 -4
  222. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  223. package/dist/schema/state/sqlite/table-def.js +2 -2
  224. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  225. package/dist/schema/state/sqlite/table-def.test.js +80 -0
  226. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  227. package/dist/schema/unknown-events.d.ts +47 -0
  228. package/dist/schema/unknown-events.d.ts.map +1 -0
  229. package/dist/schema/unknown-events.js +69 -0
  230. package/dist/schema/unknown-events.js.map +1 -0
  231. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  232. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  233. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  234. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  235. package/dist/schema-management/migrations.d.ts +32 -2
  236. package/dist/schema-management/migrations.d.ts.map +1 -1
  237. package/dist/schema-management/migrations.js +37 -5
  238. package/dist/schema-management/migrations.js.map +1 -1
  239. package/dist/schema-management/validate-schema.d.ts +3 -3
  240. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  241. package/dist/schema-management/validate-schema.js +2 -2
  242. package/dist/schema-management/validate-schema.js.map +1 -1
  243. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  244. package/dist/sql-queries/sql-queries.js +11 -1
  245. package/dist/sql-queries/sql-queries.js.map +1 -1
  246. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  247. package/dist/sql-queries/sql-query-builder.js +2 -1
  248. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  249. package/dist/sqlite-types.d.ts +3 -3
  250. package/dist/sqlite-types.d.ts.map +1 -1
  251. package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
  252. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  253. package/dist/sync/ClientSessionSyncProcessor.js +45 -42
  254. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  255. package/dist/sync/errors.d.ts +66 -0
  256. package/dist/sync/errors.d.ts.map +1 -0
  257. package/dist/sync/errors.js +36 -0
  258. package/dist/sync/errors.js.map +1 -0
  259. package/dist/sync/index.d.ts +3 -0
  260. package/dist/sync/index.d.ts.map +1 -1
  261. package/dist/sync/index.js +3 -0
  262. package/dist/sync/index.js.map +1 -1
  263. package/dist/sync/mock-sync-backend.d.ts +23 -0
  264. package/dist/sync/mock-sync-backend.d.ts.map +1 -0
  265. package/dist/sync/mock-sync-backend.js +114 -0
  266. package/dist/sync/mock-sync-backend.js.map +1 -0
  267. package/dist/sync/next/compact-events.d.ts.map +1 -1
  268. package/dist/sync/next/compact-events.js +6 -7
  269. package/dist/sync/next/compact-events.js.map +1 -1
  270. package/dist/sync/next/facts.d.ts +5 -5
  271. package/dist/sync/next/facts.d.ts.map +1 -1
  272. package/dist/sync/next/facts.js +1 -2
  273. package/dist/sync/next/facts.js.map +1 -1
  274. package/dist/sync/next/history-dag-common.d.ts +54 -15
  275. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  276. package/dist/sync/next/history-dag-common.js +198 -9
  277. package/dist/sync/next/history-dag-common.js.map +1 -1
  278. package/dist/sync/next/history-dag.d.ts.map +1 -1
  279. package/dist/sync/next/history-dag.js +10 -8
  280. package/dist/sync/next/history-dag.js.map +1 -1
  281. package/dist/sync/next/rebase-events.d.ts +5 -5
  282. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  283. package/dist/sync/next/rebase-events.js +5 -5
  284. package/dist/sync/next/rebase-events.js.map +1 -1
  285. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  286. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  287. package/dist/sync/next/test/event-fixtures.js +9 -9
  288. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  289. package/dist/sync/sync-backend-kv.d.ts +7 -0
  290. package/dist/sync/sync-backend-kv.d.ts.map +1 -0
  291. package/dist/sync/sync-backend-kv.js +18 -0
  292. package/dist/sync/sync-backend-kv.js.map +1 -0
  293. package/dist/sync/sync-backend.d.ts +105 -0
  294. package/dist/sync/sync-backend.d.ts.map +1 -0
  295. package/dist/sync/sync-backend.js +61 -0
  296. package/dist/sync/sync-backend.js.map +1 -0
  297. package/dist/sync/sync.d.ts +9 -86
  298. package/dist/sync/sync.d.ts.map +1 -1
  299. package/dist/sync/sync.js +2 -27
  300. package/dist/sync/sync.js.map +1 -1
  301. package/dist/sync/syncstate.d.ts +57 -44
  302. package/dist/sync/syncstate.d.ts.map +1 -1
  303. package/dist/sync/syncstate.js +50 -45
  304. package/dist/sync/syncstate.js.map +1 -1
  305. package/dist/sync/syncstate.test.js +83 -46
  306. package/dist/sync/syncstate.test.js.map +1 -1
  307. package/dist/sync/transport-chunking.d.ts +36 -0
  308. package/dist/sync/transport-chunking.d.ts.map +1 -0
  309. package/dist/sync/transport-chunking.js +56 -0
  310. package/dist/sync/transport-chunking.js.map +1 -0
  311. package/dist/sync/validate-push-payload.d.ts +2 -2
  312. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  313. package/dist/sync/validate-push-payload.js +6 -6
  314. package/dist/sync/validate-push-payload.js.map +1 -1
  315. package/dist/testing/event-factory.d.ts +68 -0
  316. package/dist/testing/event-factory.d.ts.map +1 -0
  317. package/dist/testing/event-factory.js +78 -0
  318. package/dist/testing/event-factory.js.map +1 -0
  319. package/dist/testing/mod.d.ts +2 -0
  320. package/dist/testing/mod.d.ts.map +1 -0
  321. package/dist/testing/mod.js +2 -0
  322. package/dist/testing/mod.js.map +1 -0
  323. package/dist/version.d.ts +16 -6
  324. package/dist/version.d.ts.map +1 -1
  325. package/dist/version.js +16 -6
  326. package/dist/version.js.map +1 -1
  327. package/package.json +7 -8
  328. package/src/ClientSessionLeaderThreadProxy.ts +17 -12
  329. package/src/adapter-types.ts +18 -6
  330. package/src/debug-info.ts +37 -6
  331. package/src/devtools/devtools-messages-client-session.ts +2 -2
  332. package/src/devtools/devtools-messages-common.ts +1 -8
  333. package/src/devtools/devtools-messages-leader.ts +8 -8
  334. package/src/devtools/devtools-sessioninfo.ts +8 -5
  335. package/src/devtools/mod.ts +11 -2
  336. package/src/errors.ts +38 -11
  337. package/src/index.ts +2 -1
  338. package/src/leader-thread/LeaderSyncProcessor.ts +242 -103
  339. package/src/leader-thread/eventlog.ts +33 -34
  340. package/src/leader-thread/leader-worker-devtools.ts +50 -54
  341. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  342. package/src/leader-thread/make-leader-thread-layer.ts +156 -37
  343. package/src/leader-thread/materialize-event.ts +37 -12
  344. package/src/leader-thread/recreate-db.ts +15 -7
  345. package/src/leader-thread/shutdown-channel.ts +16 -2
  346. package/src/leader-thread/types.ts +21 -19
  347. package/src/logging.ts +62 -0
  348. package/src/make-client-session.ts +9 -3
  349. package/src/materializer-helper.ts +27 -10
  350. package/src/rematerialize-from-eventlog.ts +37 -27
  351. package/src/schema/EventDef/define.ts +201 -0
  352. package/src/schema/EventDef/event-def.ts +120 -0
  353. package/src/schema/EventDef/facts.ts +135 -0
  354. package/src/schema/EventDef/materializer.ts +172 -0
  355. package/src/schema/EventDef/mod.ts +4 -0
  356. package/src/schema/EventSequenceNumber/client.ts +257 -0
  357. package/src/schema/EventSequenceNumber/global.ts +19 -0
  358. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  359. package/src/schema/EventSequenceNumber.test.ts +70 -52
  360. package/src/schema/LiveStoreEvent/client.ts +221 -0
  361. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  362. package/src/schema/LiveStoreEvent/global.ts +45 -0
  363. package/src/schema/LiveStoreEvent/input.ts +63 -0
  364. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  365. package/src/schema/events.ts +1 -1
  366. package/src/schema/mod.ts +6 -4
  367. package/src/schema/schema.ts +39 -3
  368. package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
  369. package/src/schema/state/sqlite/client-document-def.ts +120 -8
  370. package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
  371. package/src/schema/state/sqlite/column-annotations.ts +16 -6
  372. package/src/schema/state/sqlite/column-def.test.ts +60 -7
  373. package/src/schema/state/sqlite/column-def.ts +88 -21
  374. package/src/schema/state/sqlite/column-spec.test.ts +29 -16
  375. package/src/schema/state/sqlite/column-spec.ts +36 -11
  376. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
  377. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  378. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +2 -1
  379. package/src/schema/state/sqlite/mod.ts +4 -3
  380. package/src/schema/state/sqlite/query-builder/api.ts +19 -10
  381. package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
  382. package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
  383. package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
  384. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  385. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  386. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  387. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  388. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  389. package/src/schema/state/sqlite/table-def.test.ts +101 -0
  390. package/src/schema/state/sqlite/table-def.ts +9 -8
  391. package/src/schema/unknown-events.ts +131 -0
  392. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
  393. package/src/schema-management/migrations.ts +41 -8
  394. package/src/schema-management/validate-schema.ts +3 -3
  395. package/src/sql-queries/sql-queries.ts +9 -1
  396. package/src/sql-queries/sql-query-builder.ts +2 -1
  397. package/src/sqlite-types.ts +3 -3
  398. package/src/sync/ClientSessionSyncProcessor.ts +69 -62
  399. package/src/sync/errors.ts +38 -0
  400. package/src/sync/index.ts +3 -0
  401. package/src/sync/mock-sync-backend.ts +184 -0
  402. package/src/sync/next/compact-events.ts +6 -7
  403. package/src/sync/next/facts.ts +7 -9
  404. package/src/sync/next/history-dag-common.ts +277 -26
  405. package/src/sync/next/history-dag.ts +16 -10
  406. package/src/sync/next/rebase-events.ts +11 -11
  407. package/src/sync/next/test/event-fixtures.ts +11 -11
  408. package/src/sync/sync-backend-kv.ts +22 -0
  409. package/src/sync/sync-backend.ts +185 -0
  410. package/src/sync/sync.ts +9 -91
  411. package/src/sync/syncstate.test.ts +96 -52
  412. package/src/sync/syncstate.ts +69 -58
  413. package/src/sync/transport-chunking.ts +90 -0
  414. package/src/sync/validate-push-payload.ts +8 -9
  415. package/src/testing/event-factory.ts +131 -0
  416. package/src/testing/mod.ts +1 -0
  417. package/src/version.ts +16 -6
  418. package/dist/schema/EventDef.d.ts +0 -123
  419. package/dist/schema/EventDef.d.ts.map +0 -1
  420. package/dist/schema/EventDef.js +0 -46
  421. package/dist/schema/EventDef.js.map +0 -1
  422. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  423. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  424. package/dist/schema/EventSequenceNumber.js +0 -139
  425. package/dist/schema/EventSequenceNumber.js.map +0 -1
  426. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  427. package/dist/schema/LiveStoreEvent.js.map +0 -1
  428. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  429. package/dist/schema/state/sqlite/system-tables.js +0 -79
  430. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  431. package/dist/schema-management/migrations.test.d.ts +0 -2
  432. package/dist/schema-management/migrations.test.d.ts.map +0 -1
  433. package/dist/schema-management/migrations.test.js +0 -52
  434. package/dist/schema-management/migrations.test.js.map +0 -1
  435. package/dist/sync/next/graphology.d.ts +0 -8
  436. package/dist/sync/next/graphology.d.ts.map +0 -1
  437. package/dist/sync/next/graphology.js +0 -30
  438. package/dist/sync/next/graphology.js.map +0 -1
  439. package/dist/sync/next/graphology_.d.ts +0 -3
  440. package/dist/sync/next/graphology_.d.ts.map +0 -1
  441. package/dist/sync/next/graphology_.js +0 -3
  442. package/dist/sync/next/graphology_.js.map +0 -1
  443. package/src/schema/EventDef.ts +0 -219
  444. package/src/schema/EventSequenceNumber.ts +0 -199
  445. package/src/schema/LiveStoreEvent.ts +0 -287
  446. package/src/schema/state/sqlite/system-tables.ts +0 -104
  447. package/src/sync/next/ambient.d.ts +0 -3
  448. package/src/sync/next/graphology.ts +0 -41
  449. package/src/sync/next/graphology_.ts +0 -2
@@ -2,15 +2,15 @@ import { LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
2
  import { Effect, Option, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import type { SqliteDb } from '../adapter-types.ts'
5
- import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
6
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
5
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
6
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
7
7
  import {
8
8
  EVENTLOG_META_TABLE,
9
9
  eventlogMetaTable,
10
10
  eventlogSystemTables,
11
11
  SYNC_STATUS_TABLE,
12
- sessionChangesetMetaTable,
13
- } from '../schema/state/sqlite/system-tables.ts'
12
+ } from '../schema/state/sqlite/system-tables/eventlog-tables.ts'
13
+ import { sessionChangesetMetaTable } from '../schema/state/sqlite/system-tables/state-tables.ts'
14
14
  import { migrateTable } from '../schema-management/migrations.ts'
15
15
  import { insertRow, updateRows } from '../sql-queries/sql-queries.ts'
16
16
  import type { PreparedBindValues } from '../util.ts'
@@ -34,7 +34,7 @@ export const initEventlogDb = (dbEventlog: SqliteDb) =>
34
34
  yield* execSql(
35
35
  dbEventlog,
36
36
  sql`INSERT INTO ${SYNC_STATUS_TABLE} (head)
37
- SELECT ${EventSequenceNumber.ROOT.global}
37
+ SELECT ${EventSequenceNumber.Client.ROOT.global}
38
38
  WHERE NOT EXISTS (SELECT 1 FROM ${SYNC_STATUS_TABLE})`,
39
39
  {},
40
40
  )
@@ -51,8 +51,8 @@ export const getEventsSince = ({
51
51
  }: {
52
52
  dbEventlog: SqliteDb
53
53
  dbState: SqliteDb
54
- since: EventSequenceNumber.EventSequenceNumber
55
- }): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
54
+ since: EventSequenceNumber.Client.Composite
55
+ }): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
56
56
  const pendingEvents = dbEventlog.select(eventlogMetaTable.where('seqNumGlobal', '>=', since.global))
57
57
 
58
58
  const sessionChangesetRowsDecoded = dbState.select(
@@ -66,7 +66,7 @@ export const getEventsSince = ({
66
66
  readModelEvent.seqNumGlobal === eventlogEvent.seqNumGlobal &&
67
67
  readModelEvent.seqNumClient === eventlogEvent.seqNumClient,
68
68
  )
69
- return LiveStoreEvent.EncodedWithMeta.make({
69
+ return LiveStoreEvent.Client.EncodedWithMeta.make({
70
70
  name: eventlogEvent.name,
71
71
  args: eventlogEvent.argsJson,
72
72
  seqNum: {
@@ -96,14 +96,14 @@ export const getEventsSince = ({
96
96
  },
97
97
  })
98
98
  })
99
- .filter((_) => EventSequenceNumber.compare(_.seqNum, since) > 0)
100
- .sort((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
99
+ .filter((_) => EventSequenceNumber.Client.compare(_.seqNum, since) > 0)
100
+ .sort((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
101
101
  }
102
102
 
103
- export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.EventSequenceNumber => {
103
+ export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Client.Composite => {
104
104
  const res = dbEventlog.select<{
105
- seqNumGlobal: EventSequenceNumber.GlobalEventSequenceNumber
106
- seqNumClient: EventSequenceNumber.ClientEventSequenceNumber
105
+ seqNumGlobal: EventSequenceNumber.Global.Type
106
+ seqNumClient: EventSequenceNumber.Client.Type
107
107
  seqNumRebaseGeneration: number
108
108
  }>(
109
109
  sql`select seqNumGlobal, seqNumClient, seqNumRebaseGeneration from ${EVENTLOG_META_TABLE} order by seqNumGlobal DESC, seqNumClient DESC limit 1`,
@@ -111,20 +111,27 @@ export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.E
111
111
 
112
112
  return res
113
113
  ? { global: res.seqNumGlobal, client: res.seqNumClient, rebaseGeneration: res.seqNumRebaseGeneration }
114
- : EventSequenceNumber.ROOT
114
+ : EventSequenceNumber.Client.ROOT
115
115
  }
116
116
 
117
- export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.GlobalEventSequenceNumber =>
118
- dbEventlog.select<{ head: EventSequenceNumber.GlobalEventSequenceNumber }>(
119
- sql`select head from ${SYNC_STATUS_TABLE}`,
120
- )[0]?.head ?? EventSequenceNumber.ROOT.global
117
+ export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Global.Type =>
118
+ dbEventlog.select<{ head: EventSequenceNumber.Global.Type }>(sql`select head from ${SYNC_STATUS_TABLE}`)[0]?.head ??
119
+ EventSequenceNumber.Client.ROOT.global
121
120
 
122
121
  // TODO use prepared statements
123
- export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.EventSequenceNumber) =>
122
+ export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.Client.Composite) =>
124
123
  dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET head = ${head.global}`)
125
124
 
125
+ export const getBackendIdFromDb = (dbEventlog: SqliteDb): Option.Option<string> =>
126
+ Option.fromNullable(
127
+ dbEventlog.select<{ backendId: string | null }>(sql`select backendId from ${SYNC_STATUS_TABLE}`)[0]?.backendId,
128
+ )
129
+
130
+ export const updateBackendId = (dbEventlog: SqliteDb, backendId: string) =>
131
+ dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET backendId = '${backendId}'`)
132
+
126
133
  export const insertIntoEventlog = (
127
- eventEncoded: LiveStoreEvent.EncodedWithMeta,
134
+ eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
128
135
  dbEventlog: SqliteDb,
129
136
  eventDefSchemaHash: number,
130
137
  clientId: string,
@@ -132,7 +139,7 @@ export const insertIntoEventlog = (
132
139
  ) =>
133
140
  Effect.gen(function* () {
134
141
  // Check history consistency during LS_DEV
135
- if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.ROOT.global) {
142
+ if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.Client.ROOT.global) {
136
143
  const parentEventExists =
137
144
  dbEventlog.select<{ count: number }>(
138
145
  `SELECT COUNT(*) as count FROM ${EVENTLOG_META_TABLE} WHERE seqNumGlobal = ? AND seqNumClient = ?`,
@@ -141,7 +148,7 @@ export const insertIntoEventlog = (
141
148
 
142
149
  if (parentEventExists === false) {
143
150
  shouldNeverHappen(
144
- `Parent mutation ${eventEncoded.parentSeqNum.global},${eventEncoded.parentSeqNum.client} does not exist`,
151
+ `Parent event ${eventEncoded.parentSeqNum.global},${eventEncoded.parentSeqNum.client} does not exist in eventlog`,
145
152
  )
146
153
  }
147
154
  }
@@ -172,7 +179,7 @@ export const insertIntoEventlog = (
172
179
  dbEventlog.debug.head = eventEncoded.seqNum
173
180
  })
174
181
 
175
- export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>) =>
182
+ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>) =>
176
183
  Effect.gen(function* () {
177
184
  const { dbEventlog } = yield* LeaderThreadCtx
178
185
 
@@ -192,15 +199,11 @@ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWi
192
199
  }
193
200
  })
194
201
 
195
- export const getSyncBackendCursorInfo = ({
196
- remoteHead,
197
- }: {
198
- remoteHead: EventSequenceNumber.GlobalEventSequenceNumber
199
- }) =>
202
+ export const getSyncBackendCursorInfo = ({ remoteHead }: { remoteHead: EventSequenceNumber.Global.Type }) =>
200
203
  Effect.gen(function* () {
201
204
  const { dbEventlog } = yield* LeaderThreadCtx
202
205
 
203
- if (remoteHead === EventSequenceNumber.ROOT.global) return Option.none()
206
+ if (remoteHead === EventSequenceNumber.Client.ROOT.global) return Option.none()
204
207
 
205
208
  const EventlogQuerySchema = Schema.Struct({
206
209
  syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
@@ -213,11 +216,7 @@ export const getSyncBackendCursorInfo = ({
213
216
  ).pipe(Effect.andThen(Schema.decode(EventlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie)
214
217
 
215
218
  return Option.some({
216
- cursor: {
217
- global: remoteHead,
218
- client: EventSequenceNumber.clientDefault,
219
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
220
- },
219
+ eventSequenceNumber: remoteHead,
221
220
  metadata: syncMetadataOption,
222
221
  }) satisfies InitialSyncInfo
223
222
  }).pipe(Effect.withSpan('@livestore/common:eventlog:getSyncBackendCursorInfo', { attributes: { remoteHead } }))
@@ -1,7 +1,7 @@
1
1
  import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
2
  import { nanoid } from '@livestore/utils/nanoid'
3
3
 
4
- import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnexpectedError } from '../index.ts'
4
+ import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnknownError } from '../index.ts'
5
5
  import { SystemTables } from '../schema/mod.ts'
6
6
  import type { DevtoolsOptions, PersistenceInfoPair } from './types.ts'
7
7
  import { LeaderThreadCtx } from './types.ts'
@@ -135,72 +135,64 @@ const listenToDevtools = ({
135
135
  case 'LSD.Leader.LoadDatabaseFile.Request': {
136
136
  const { data } = decodedEvent
137
137
 
138
- let tableNames: Set<string>
139
-
140
- try {
141
- const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
142
- tmpDb.import(data)
143
- const tableNameResults = tmpDb.select<{ name: string }>(
144
- `select name from sqlite_master where type = 'table'`,
145
- )
146
-
147
- tableNames = new Set(tableNameResults.map((_) => _.name))
148
-
149
- tmpDb.close()
150
- } catch (cause) {
151
- yield* Effect.logError(`Error importing database file`, cause)
152
- yield* sendMessage(
153
- Devtools.Leader.LoadDatabaseFile.Error.make({
154
- ...reqPayload,
155
- cause: { _tag: 'unexpected-error', cause },
156
- }),
138
+ const handleLoadDb = Effect.gen(function* () {
139
+ const tableNames = yield* Effect.acquireRelease(makeSqliteDb({ _tag: 'in-memory' }), (db) =>
140
+ Effect.sync(() => db.close()),
141
+ ).pipe(
142
+ Effect.flatMap((db) =>
143
+ Effect.try(() => {
144
+ db.import(data)
145
+ const rows = db.select<{ name: string }>(`select name from sqlite_master where type = 'table'`)
146
+ return new Set(rows.map((r) => r.name))
147
+ }),
148
+ ),
157
149
  )
158
150
 
159
- return
160
- }
161
-
162
- try {
163
151
  if (tableNames.has(SystemTables.EVENTLOG_META_TABLE)) {
164
152
  // Is eventlog db
165
153
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
166
-
167
- dbEventlog.import(data)
168
-
169
- dbState.destroy()
154
+ yield* Effect.try(() => void dbEventlog.import(data))
155
+ yield* Effect.try(() => void dbState.destroy())
170
156
  } else if (
171
157
  tableNames.has(SystemTables.SCHEMA_META_TABLE) &&
172
158
  tableNames.has(SystemTables.SCHEMA_EVENT_DEFS_META_TABLE)
173
159
  ) {
174
160
  // Is state db
175
161
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
162
+ yield* Effect.try(() => void dbState.import(data))
163
+ yield* Effect.try(() => void dbEventlog.destroy())
164
+ } else {
165
+ return yield* Effect.fail({ _tag: 'unsupported-database' } as const)
166
+ }
176
167
 
177
- dbState.import(data)
168
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }))
169
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' }))
170
+ })
178
171
 
179
- dbEventlog.destroy()
180
- } else {
181
- yield* sendMessage(
172
+ yield* handleLoadDb.pipe(
173
+ Effect.catchTag('unsupported-database', () =>
174
+ sendMessage(
182
175
  Devtools.Leader.LoadDatabaseFile.Error.make({
183
176
  ...reqPayload,
184
- cause: { _tag: 'unsupported-database' },
177
+ cause: { _tag: 'unsupported-database' as const },
185
178
  }),
186
- )
187
- return
188
- }
189
-
190
- yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }))
191
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void
179
+ ),
180
+ ),
181
+ Effect.catchAll((cause) =>
182
+ Effect.logWarning('Error importing database file', cause).pipe(
183
+ Effect.zipRight(
184
+ sendMessage(
185
+ Devtools.Leader.LoadDatabaseFile.Error.make({
186
+ ...reqPayload,
187
+ cause: { _tag: 'unknown-error' as const, cause },
188
+ }),
189
+ ),
190
+ ),
191
+ ),
192
+ ),
193
+ )
192
194
 
193
- return
194
- } catch (cause) {
195
- yield* Effect.logError(`Error importing database file`, cause)
196
- yield* sendMessage(
197
- Devtools.Leader.LoadDatabaseFile.Error.make({
198
- ...reqPayload,
199
- cause: { _tag: 'unexpected-error', cause },
200
- }),
201
- )
202
- return
203
- }
195
+ return
204
196
  }
205
197
  case 'LSD.Leader.ResetAllData.Request': {
206
198
  const { mode } = decodedEvent
@@ -215,7 +207,7 @@ const listenToDevtools = ({
215
207
 
216
208
  yield* sendMessage(Devtools.Leader.ResetAllData.Success.make({ ...reqPayload }))
217
209
 
218
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' })) ?? Effect.void
210
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' }))
219
211
 
220
212
  return
221
213
  }
@@ -262,7 +254,7 @@ const listenToDevtools = ({
262
254
 
263
255
  if (syncBackend !== undefined) {
264
256
  // TODO consider piggybacking on the existing leader-thread sync-pulling
265
- yield* syncBackend.pull(Option.none()).pipe(
257
+ yield* syncBackend.pull(Option.none(), { live: true }).pipe(
266
258
  Stream.map((_) => _.batch),
267
259
  Stream.flattenIterables,
268
260
  Stream.tap(({ eventEncoded, metadata }) =>
@@ -319,7 +311,11 @@ const listenToDevtools = ({
319
311
  Stream.tap(([isConnected, { latchClosed }]) =>
320
312
  sendMessage(
321
313
  Devtools.Leader.NetworkStatusRes.make({
322
- networkStatus: { isConnected, timestampMs: Date.now(), latchClosed },
314
+ networkStatus: {
315
+ isConnected,
316
+ timestampMs: Date.now(),
317
+ devtools: { latchClosed },
318
+ },
323
319
  subscriptionId,
324
320
  ...reqPayload,
325
321
  requestId: nanoid(10),
@@ -395,7 +391,7 @@ const listenToDevtools = ({
395
391
  }
396
392
  }).pipe(Effect.withSpan(`@livestore/common:leader-thread:onDevtoolsMessage:${decodedEvent._tag}`)),
397
393
  ),
398
- UnexpectedError.mapToUnexpectedErrorStream,
394
+ UnknownError.mapToUnknownErrorStream,
399
395
  Stream.runDrain,
400
396
  )
401
397
  })
@@ -0,0 +1,44 @@
1
+ import { Effect, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
3
+
4
+ import { makeMockSyncBackend } from '../sync/mock-sync-backend.ts'
5
+ import type { SyncBackend } from '../sync/sync.ts'
6
+ import { makeNetworkStatusSubscribable } from './make-leader-thread-layer.ts'
7
+ import type { DevtoolsContext } from './types.ts'
8
+
9
+ Vitest.describe('makeNetworkStatusSubscribable', () => {
10
+ Vitest.scopedLive('tracks sync backend connectivity and devtools latch state', () =>
11
+ Effect.gen(function* () {
12
+ const mockBackend = yield* makeMockSyncBackend({ startConnected: false })
13
+ const syncBackend = yield* mockBackend.makeSyncBackend
14
+ const latchStateRef = yield* SubscriptionRef.make<{ latchClosed: boolean }>({ latchClosed: false })
15
+
16
+ const devtoolsContext: DevtoolsContext = {
17
+ enabled: true,
18
+ syncBackendLatch: yield* Effect.makeLatch(true),
19
+ syncBackendLatchState: latchStateRef,
20
+ }
21
+
22
+ const networkStatus = yield* makeNetworkStatusSubscribable({ syncBackend, devtoolsContext })
23
+
24
+ const initial = yield* networkStatus
25
+ Vitest.expect(initial.isConnected).toBe(false)
26
+ Vitest.expect(initial.devtools.latchClosed).toBe(false)
27
+
28
+ const waitFor = (predicate: (status: SyncBackend.NetworkStatus) => boolean) =>
29
+ networkStatus.changes.pipe(Stream.filter(predicate), Stream.runHead, Effect.flatten)
30
+
31
+ const onlineFiber = yield* waitFor((status) => status.isConnected).pipe(Effect.forkScoped)
32
+ yield* mockBackend.connect
33
+ const online = yield* onlineFiber
34
+ Vitest.expect(online.isConnected).toBe(true)
35
+ Vitest.expect(online.timestampMs).toBeGreaterThan(initial.timestampMs)
36
+
37
+ const latchedFiber = yield* waitFor((status) => status.devtools.latchClosed).pipe(Effect.forkScoped)
38
+ yield* SubscriptionRef.set(latchStateRef, { latchClosed: true })
39
+ const latched = yield* latchedFiber
40
+ Vitest.expect(latched.devtools.latchClosed).toBe(true)
41
+ Vitest.expect(latched.timestampMs).toBeGreaterThanOrEqual(online.timestampMs)
42
+ }),
43
+ )
44
+ })