@livestore/common 0.4.0-dev.9 → 0.5.0-dev.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 (580) 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/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,38 +1,28 @@
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', {
6
- cause: Schema.Defect,
7
- }) {}
5
+ export class IsOfflineError extends Schema.TaggedError<IsOfflineError>('~@livestore/common/IsOfflineError')(
6
+ 'IsOfflineError',
7
+ {
8
+ cause: Schema.Defect(),
9
+ },
10
+ ) {}
8
11
 
9
12
  /** Unique ID generated by the backend when its created. Used to check whether the backend identity has changed. */
10
- export const BackendId = Schema.String.annotations({ title: '@livestore/sync-cf:BackendId' })
13
+ export const BackendId = Schema.String.annotate({ title: '@livestore/sync-cf:BackendId' })
11
14
 
12
- export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>()('BackendIdMismatchError', {
15
+ export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>(
16
+ '~@livestore/common/BackendIdMismatchError',
17
+ )('BackendIdMismatchError', {
13
18
  expected: BackendId,
14
19
  received: BackendId,
15
20
  }) {}
16
21
 
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),
24
- }) {}
25
-
26
- export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('InvalidPullError', {
27
- cause: Schema.Defect,
28
- }) {}
29
-
30
- export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>()('LeaderAheadError', {
31
- minimumExpectedNum: EventSequenceNumber.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
22
+ export class ServerAheadError extends Schema.TaggedError<ServerAheadError>('~@livestore/common/ServerAheadError')(
23
+ 'ServerAheadError',
24
+ {
25
+ minimumExpectedNum: EventSequenceNumber.Global.Schema,
26
+ providedNum: EventSequenceNumber.Global.Schema,
27
+ },
28
+ ) {}
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'
@@ -0,0 +1,78 @@
1
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
2
+ import { Effect, Fiber, Option, Stream } from '@livestore/utils/effect'
3
+
4
+ import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
5
+ import { makeMockSyncBackend } from './mock-sync-backend.ts'
6
+
7
+ Vitest.describe('makeMockSyncBackend', () => {
8
+ Vitest.live('broadcasts live events to every backend connection', () =>
9
+ Effect.gen(function* () {
10
+ const mockBackend = yield* makeMockSyncBackend({ startConnected: true })
11
+ const backendA = yield* mockBackend.makeSyncBackend
12
+ const backendB = yield* mockBackend.makeSyncBackend
13
+ const nextBatch = (backend: typeof backendA) =>
14
+ backend.pull(Option.none(), { live: true }).pipe(
15
+ Stream.filter((item) => item.batch.length > 0),
16
+ Stream.runFirstUnsafe,
17
+ )
18
+
19
+ const pullA = yield* nextBatch(backendA).pipe(Effect.forkScoped)
20
+ const pullB = yield* nextBatch(backendB).pipe(Effect.forkScoped)
21
+ const event = makeEvent(1)
22
+
23
+ yield* mockBackend.advance(event)
24
+
25
+ Vitest.expect((yield* Fiber.join(pullA)).batch.map((item) => item.eventEncoded)).toEqual([event])
26
+ Vitest.expect((yield* Fiber.join(pullB)).batch.map((item) => item.eventEncoded)).toEqual([event])
27
+ }),
28
+ )
29
+
30
+ Vitest.live('seeds a new backend connection with existing live events', () =>
31
+ Effect.gen(function* () {
32
+ const mockBackend = yield* makeMockSyncBackend({ startConnected: true })
33
+ const event = makeEvent(1)
34
+ yield* mockBackend.advance(event)
35
+
36
+ const backend = yield* mockBackend.makeSyncBackend
37
+ const item = yield* backend.pull(Option.none(), { live: true }).pipe(
38
+ Stream.filter((item) => item.batch.length > 0),
39
+ Stream.runFirstUnsafe,
40
+ )
41
+
42
+ Vitest.expect(item.batch.map((entry) => entry.eventEncoded)).toEqual([event])
43
+ }),
44
+ )
45
+
46
+ Vitest.live('filters seeded live events against the requested cursor', () =>
47
+ Effect.gen(function* () {
48
+ const mockBackend = yield* makeMockSyncBackend({ startConnected: true })
49
+ const existing = makeEvent(1)
50
+ const next = makeEvent(2)
51
+ yield* mockBackend.advance(existing)
52
+
53
+ const backend = yield* mockBackend.makeSyncBackend
54
+ const cursor = Option.some({
55
+ eventSequenceNumber: existing.seqNum,
56
+ metadata: Option.none(),
57
+ })
58
+ const pull = yield* backend.pull(cursor, { live: true }).pipe(
59
+ Stream.filter((item) => item.batch.length > 0),
60
+ Stream.runFirstUnsafe,
61
+ Effect.forkScoped,
62
+ )
63
+
64
+ yield* mockBackend.advance(next)
65
+
66
+ Vitest.expect((yield* Fiber.join(pull)).batch.map((entry) => entry.eventEncoded)).toEqual([next])
67
+ }),
68
+ )
69
+ })
70
+
71
+ const makeEvent = (seqNum: number): LiveStoreEvent.Global.Encoded => ({
72
+ name: 'v1.TestEvent',
73
+ args: { id: `event-${seqNum}` },
74
+ seqNum: EventSequenceNumber.Global.make(seqNum),
75
+ parentSeqNum: EventSequenceNumber.Global.make(seqNum - 1),
76
+ clientId: 'client-a',
77
+ sessionId: 'session-a',
78
+ })
@@ -1,21 +1,38 @@
1
- import type { Schema, Scope } from '@livestore/utils/effect'
2
- import { Effect, Mailbox, Option, Queue, Stream, SubscriptionRef } from '@livestore/utils/effect'
3
- import { UnexpectedError } from '../errors.ts'
1
+ import {
2
+ type Schema,
3
+ type Scope,
4
+ Effect,
5
+ Option,
6
+ Queue,
7
+ Ref,
8
+ Semaphore,
9
+ Stream,
10
+ SubscriptionRef,
11
+ } from '@livestore/utils/effect'
12
+
13
+ import { UnknownError } from '../errors.ts'
4
14
  import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
5
- import { InvalidPushError } from './errors.ts'
15
+ import type { BackendIdMismatchError, ServerAheadError } from './errors.ts'
6
16
  import * as SyncBackend from './sync-backend.ts'
7
17
  import { validatePushPayload } from './validate-push-payload.ts'
8
18
 
9
19
  export interface MockSyncBackend {
10
- pushedEvents: Stream.Stream<LiveStoreEvent.AnyEncodedGlobal>
20
+ pushedEvents: Stream.Stream<LiveStoreEvent.Global.Encoded>
11
21
  connect: Effect.Effect<void>
12
22
  disconnect: Effect.Effect<void>
13
- makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend, UnexpectedError, Scope.Scope>
14
- advance: (...batch: LiveStoreEvent.AnyEncodedGlobal[]) => Effect.Effect<void>
15
- /** Fail the next N push calls with an InvalidPushError (or custom error) */
23
+ makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend, UnknownError, Scope.Scope>
24
+ advance: (...batch: LiveStoreEvent.Global.Encoded[]) => Effect.Effect<void>
25
+ /** Fail the next N push calls with an UnknownError, ServerAheadError, BackendIdMismatchError, or custom error */
16
26
  failNextPushes: (
17
27
  count: number,
18
- error?: (batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>,
28
+ error?: (
29
+ batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>,
30
+ ) => Effect.Effect<never, UnknownError | ServerAheadError | BackendIdMismatchError>,
31
+ ) => Effect.Effect<void>
32
+ /** Fail the next N pull calls with an UnknownError, BackendIdMismatchError, or custom error */
33
+ failNextPulls: (
34
+ count: number,
35
+ error?: () => Effect.Effect<never, UnknownError | BackendIdMismatchError>,
19
36
  ) => Effect.Effect<void>
20
37
  }
21
38
 
@@ -29,109 +46,156 @@ export interface MockSyncBackendOptions {
29
46
 
30
47
  export const makeMockSyncBackend = (
31
48
  options?: MockSyncBackendOptions,
32
- ): Effect.Effect<MockSyncBackend, UnexpectedError, Scope.Scope> =>
49
+ ): Effect.Effect<MockSyncBackend, UnknownError, Scope.Scope> =>
33
50
  Effect.gen(function* () {
34
- const syncEventSequenceNumberRef = { current: EventSequenceNumber.ROOT.global }
35
- const syncPullQueue = yield* Queue.unbounded<LiveStoreEvent.AnyEncodedGlobal>()
36
- const pushedEventsQueue = yield* Mailbox.make<LiveStoreEvent.AnyEncodedGlobal>()
51
+ const span = yield* Effect.currentSpan.pipe(Effect.orDie)
52
+ const semaphore = yield* Semaphore.make(1)
53
+
54
+ // State refs
55
+ const syncHeadRef = yield* Ref.make(EventSequenceNumber.Client.ROOT.global)
56
+ const allEventsRef = yield* Ref.make<LiveStoreEvent.Global.Encoded[]>([])
37
57
  const syncIsConnectedRef = yield* SubscriptionRef.make(options?.startConnected ?? false)
38
- const allEventsRef: { current: LiveStoreEvent.AnyEncodedGlobal[] } = { current: [] }
39
58
 
40
- const span = yield* Effect.currentSpan.pipe(Effect.orDie)
59
+ // Queues for streaming
60
+ const syncPullQueues = new Set<Queue.Queue<LiveStoreEvent.Global.Encoded>>()
61
+ const pushedEventsQueue = yield* Queue.unbounded<LiveStoreEvent.Global.Encoded>()
62
+
63
+ yield* Effect.addFinalizer(() =>
64
+ Effect.gen(function* () {
65
+ for (const queue of syncPullQueues) yield* Queue.shutdown(queue)
66
+ syncPullQueues.clear()
67
+ }),
68
+ )
41
69
 
42
- const semaphore = yield* Effect.makeSemaphore(1)
70
+ // Failure simulation state
71
+ const failPushRef = yield* Ref.make<
72
+ FailureState<
73
+ UnknownError | ServerAheadError | BackendIdMismatchError,
74
+ [ReadonlyArray<LiveStoreEvent.Global.Encoded>]
75
+ >
76
+ >({ remaining: 0, error: undefined })
77
+ const failPullRef = yield* Ref.make<FailureState<UnknownError | BackendIdMismatchError, []>>({
78
+ remaining: 0,
79
+ error: undefined,
80
+ })
43
81
 
44
- // TODO improve the API and implementation of simulating errors
45
- const failCounterRef = yield* SubscriptionRef.make(0)
46
- const failEffectRef = yield* SubscriptionRef.make<
47
- ((batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>) | undefined
48
- >(undefined)
82
+ const nonLiveChunkSize = Math.max(1, options?.nonLiveChunkSize ?? 100)
83
+
84
+ /** Check and consume a simulated failure, returning the error effect if one should fire */
85
+ const checkFailure = <E, Args extends unknown[]>(
86
+ ref: Ref.Ref<FailureState<E, Args>>,
87
+ defaultError: E,
88
+ ...args: Args
89
+ ): Effect.Effect<void, E> =>
90
+ Ref.modify(ref, (state) => {
91
+ if (state.remaining <= 0) {
92
+ return [Option.none(), state] as const
93
+ }
94
+ const error = state.error?.(...args) ?? Effect.fail(defaultError)
95
+ return [Option.some(error), { ...state, remaining: state.remaining - 1 }] as const
96
+ }).pipe(
97
+ Effect.flatMap(
98
+ Option.match({
99
+ onNone: () => Effect.void,
100
+ onSome: (errorEffect) => errorEffect,
101
+ }),
102
+ ),
103
+ )
104
+
105
+ const pullNonLive = (cursor: Option.Option<{ eventSequenceNumber: EventSequenceNumber.Global.Type }>) =>
106
+ Effect.gen(function* () {
107
+ const lastSeen = cursorPosition(cursor)
108
+ const allEvents = yield* Ref.get(allEventsRef)
109
+ return chunkEvents(
110
+ allEvents.filter((event) => event.seqNum > lastSeen),
111
+ nonLiveChunkSize,
112
+ )
113
+ }).pipe(
114
+ Effect.map((chunks) =>
115
+ Stream.fromIterable(chunks).pipe(
116
+ Stream.map(({ events, remaining }) => ({
117
+ batch: events.map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
118
+ pageInfo: remaining > 0 ? SyncBackend.pageInfoMoreKnown(remaining) : SyncBackend.pageInfoNoMore,
119
+ })),
120
+ ),
121
+ ),
122
+ Stream.fromEffect,
123
+ Stream.flatten(),
124
+ )
49
125
 
50
126
  const makeSyncBackend = Effect.gen(function* () {
51
- const nonLiveChunkSize = Math.max(1, options?.nonLiveChunkSize ?? 100)
127
+ // Every backend connection needs its own live cursor. A shared queue would
128
+ // load-balance events across Clients instead of broadcasting the log.
129
+ const syncPullQueue = yield* Effect.acquireRelease(
130
+ Queue.unbounded<LiveStoreEvent.Global.Encoded>(),
131
+ Queue.shutdown,
132
+ )
133
+ yield* semaphore.withPermits(1)(
134
+ Effect.gen(function* () {
135
+ const existingEvents = yield* Ref.get(allEventsRef)
136
+ syncPullQueues.add(syncPullQueue)
137
+ yield* Queue.offerAll(syncPullQueue, existingEvents)
138
+ }),
139
+ )
140
+ yield* Effect.addFinalizer(() => Effect.sync(() => syncPullQueues.delete(syncPullQueue)))
141
+
142
+ const pullLive = (cursor: Option.Option<{ eventSequenceNumber: EventSequenceNumber.Global.Type }>) => {
143
+ const lastSeen = cursorPosition(cursor)
144
+ return Stream.concat(
145
+ Stream.make(SyncBackend.pullResItemEmpty()),
146
+ Stream.fromQueue(syncPullQueue).pipe(
147
+ Stream.chunks,
148
+ Stream.map((chunk) => ({
149
+ batch: [...chunk]
150
+ .filter((eventEncoded) => eventEncoded.seqNum > lastSeen)
151
+ .map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
152
+ pageInfo: SyncBackend.pageInfoNoMore,
153
+ })),
154
+ ),
155
+ )
156
+ }
52
157
 
53
158
  // TODO consider making offline state actively error pull/push.
54
159
  // Currently, offline only reflects in `isConnected`, while operations still succeed,
55
160
  // mirroring how some real providers behave during transient disconnects.
56
- return SyncBackend.of<Schema.JsonValue>({
161
+ return SyncBackend.of({
57
162
  isConnected: syncIsConnectedRef,
58
163
  connect: SubscriptionRef.set(syncIsConnectedRef, true),
59
164
  ping: Effect.void,
60
- pull: (cursor, options) =>
61
- (options?.live
62
- ? Stream.concat(
63
- Stream.make(SyncBackend.pullResItemEmpty()),
64
- Stream.fromQueue(syncPullQueue).pipe(
65
- Stream.chunks,
66
- Stream.map((chunk) => ({
67
- batch: [...chunk].map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
68
- pageInfo: SyncBackend.pageInfoNoMore,
69
- })),
70
- ),
71
- )
72
- : Stream.fromEffect(
73
- Effect.sync(() => {
74
- const lastSeen = cursor.pipe(
75
- Option.match({
76
- onNone: () => EventSequenceNumber.ROOT.global,
77
- onSome: (_) => _.eventSequenceNumber,
78
- }),
79
- )
80
- // All events with seqNum greater than lastSeen
81
- const slice = allEventsRef.current.filter((e) => e.seqNum > lastSeen)
82
- // Split into configured chunk size
83
- const chunks: { events: LiveStoreEvent.AnyEncodedGlobal[]; remaining: number }[] = []
84
- for (let i = 0; i < slice.length; i += nonLiveChunkSize) {
85
- const end = Math.min(i + nonLiveChunkSize, slice.length)
86
- const remaining = Math.max(slice.length - end, 0)
87
- chunks.push({ events: slice.slice(i, end), remaining })
88
- }
89
- if (chunks.length === 0) {
90
- chunks.push({ events: [], remaining: 0 })
91
- }
92
- return chunks
93
- }),
94
- ).pipe(
95
- Stream.flatMap((chunks) =>
96
- Stream.fromIterable(chunks).pipe(
97
- Stream.map(({ events, remaining }) => ({
98
- batch: events.map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
99
- pageInfo: remaining > 0 ? SyncBackend.pageInfoMoreKnown(remaining) : SyncBackend.pageInfoNoMore,
100
- })),
101
- ),
102
- ),
103
- )
104
- ).pipe(Stream.withSpan('MockSyncBackend:pull', { parent: span })),
165
+ pull: (cursor, pullOptions) =>
166
+ Stream.fromEffect(
167
+ checkFailure(
168
+ failPullRef,
169
+ new UnknownError({ cause: new Error('MockSyncBackend: simulated pull failure') }),
170
+ ),
171
+ ).pipe(
172
+ Stream.flatMap(() => (pullOptions?.live === true ? pullLive(cursor) : pullNonLive(cursor))),
173
+ Stream.withSpan('MockSyncBackend:pull', { parent: span }),
174
+ ),
105
175
  push: (batch) =>
106
176
  Effect.gen(function* () {
107
- yield* validatePushPayload(batch, syncEventSequenceNumberRef.current)
108
-
109
- const remaining = yield* SubscriptionRef.get(failCounterRef)
110
- if (remaining > 0) {
111
- const maybeFail = yield* SubscriptionRef.get(failEffectRef)
112
- // decrement counter first
113
- yield* SubscriptionRef.set(failCounterRef, remaining - 1)
114
- if (maybeFail) {
115
- return yield* maybeFail(batch)
116
- }
117
- return yield* new InvalidPushError({
118
- cause: new UnexpectedError({ cause: new Error('MockSyncBackend: simulated push failure') }),
119
- })
120
- }
177
+ const currentHead = yield* Ref.get(syncHeadRef)
178
+ yield* validatePushPayload(batch, currentHead)
121
179
 
122
- yield* Effect.sleep(10).pipe(Effect.withSpan('MockSyncBackend:push:sleep')) // Simulate network latency
180
+ yield* checkFailure(
181
+ failPushRef,
182
+ new UnknownError({ cause: new Error('MockSyncBackend: simulated push failure') }),
183
+ batch,
184
+ )
123
185
 
124
- yield* pushedEventsQueue.offerAll(batch)
125
- yield* syncPullQueue.offerAll(batch)
126
- allEventsRef.current = allEventsRef.current.concat(batch)
186
+ yield* Effect.sleep(10).pipe(Effect.withSpan('MockSyncBackend:push:sleep')) // Simulate network latency
127
187
 
128
- syncEventSequenceNumberRef.current = batch.at(-1)!.seqNum
188
+ yield* Queue.offerAll(pushedEventsQueue, batch)
189
+ yield* Effect.forEach(syncPullQueues, (queue) => Queue.offerAll(queue, batch), {
190
+ concurrency: 'unbounded',
191
+ discard: true,
192
+ })
193
+ yield* Ref.update(allEventsRef, (events) => events.concat(batch))
194
+ yield* Ref.set(syncHeadRef, batch.at(-1)!.seqNum)
129
195
  }).pipe(
130
196
  Effect.withSpan('MockSyncBackend:push', {
131
197
  parent: span,
132
- attributes: {
133
- nums: batch.map((_) => _.seqNum),
134
- },
198
+ attributes: { nums: batch.map((_) => _.seqNum) },
135
199
  }),
136
200
  semaphore.withPermits(1),
137
201
  ),
@@ -146,11 +210,14 @@ export const makeMockSyncBackend = (
146
210
  })
147
211
  })
148
212
 
149
- const advance = (...batch: LiveStoreEvent.AnyEncodedGlobal[]) =>
213
+ const advance = (...batch: LiveStoreEvent.Global.Encoded[]) =>
150
214
  Effect.gen(function* () {
151
- syncEventSequenceNumberRef.current = batch.at(-1)!.seqNum
152
- allEventsRef.current = allEventsRef.current.concat(batch)
153
- yield* syncPullQueue.offerAll(batch)
215
+ yield* Ref.set(syncHeadRef, batch.at(-1)!.seqNum)
216
+ yield* Ref.update(allEventsRef, (events) => events.concat(batch))
217
+ yield* Effect.forEach(syncPullQueues, (queue) => Queue.offerAll(queue, batch), {
218
+ concurrency: 'unbounded',
219
+ discard: true,
220
+ })
154
221
  }).pipe(
155
222
  Effect.withSpan('MockSyncBackend:advance', {
156
223
  parent: span,
@@ -159,26 +226,47 @@ export const makeMockSyncBackend = (
159
226
  semaphore.withPermits(1),
160
227
  )
161
228
 
162
- const connect = SubscriptionRef.set(syncIsConnectedRef, true)
163
- const disconnect = SubscriptionRef.set(syncIsConnectedRef, false)
164
-
165
229
  const failNextPushes = (
166
230
  count: number,
167
- error?: (batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>,
168
- ) =>
169
- Effect.gen(function* () {
170
- yield* SubscriptionRef.set(failCounterRef, count)
171
- yield* SubscriptionRef.set(failEffectRef, error)
172
- })
231
+ error?: (
232
+ batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>,
233
+ ) => Effect.Effect<never, UnknownError | ServerAheadError | BackendIdMismatchError>,
234
+ ) => Ref.set(failPushRef, { remaining: count, error })
235
+
236
+ const failNextPulls = (count: number, error?: () => Effect.Effect<never, UnknownError | BackendIdMismatchError>) =>
237
+ Ref.set(failPullRef, { remaining: count, error })
173
238
 
174
239
  return {
175
- syncEventSequenceNumberRef,
176
- syncPullQueue,
177
- pushedEvents: Mailbox.toStream(pushedEventsQueue),
178
- connect,
179
- disconnect,
240
+ pushedEvents: Stream.fromQueue(pushedEventsQueue),
241
+ connect: SubscriptionRef.set(syncIsConnectedRef, true),
242
+ disconnect: SubscriptionRef.set(syncIsConnectedRef, false),
180
243
  makeSyncBackend,
181
244
  advance,
182
245
  failNextPushes,
246
+ failNextPulls,
183
247
  }
184
248
  }).pipe(Effect.withSpanScoped('MockSyncBackend'))
249
+
250
+ /** Internal state for simulating failures */
251
+ interface FailureState<E, Args extends unknown[]> {
252
+ remaining: number
253
+ error: ((...args: Args) => Effect.Effect<never, E>) | undefined
254
+ }
255
+
256
+ const cursorPosition = (
257
+ cursor: Option.Option<{ eventSequenceNumber: EventSequenceNumber.Global.Type }>,
258
+ ): EventSequenceNumber.Global.Type =>
259
+ Option.match(cursor, {
260
+ onNone: () => EventSequenceNumber.Client.ROOT.global,
261
+ onSome: (_) => _.eventSequenceNumber,
262
+ })
263
+
264
+ const chunkEvents = (events: ReadonlyArray<LiveStoreEvent.Global.Encoded>, chunkSize: number) => {
265
+ const chunks: Array<{ events: ReadonlyArray<LiveStoreEvent.Global.Encoded>; remaining: number }> = []
266
+ for (let index = 0; index < events.length; index += chunkSize) {
267
+ const end = Math.min(index + chunkSize, events.length)
268
+ chunks.push({ events: events.slice(index, end), remaining: Math.max(events.length - end, 0) })
269
+ }
270
+ if (chunks.length === 0) chunks.push({ events: [], remaining: 0 })
271
+ return chunks
272
+ }
@@ -1,6 +1,5 @@
1
1
  import { EventSequenceNumber } from '../../schema/mod.ts'
2
2
  import { replacesFacts } from './facts.ts'
3
- import { graphologyDag } from './graphology_.ts'
4
3
  import type { HistoryDag } from './history-dag-common.ts'
5
4
  import { emptyHistoryDag } from './history-dag-common.ts'
6
5
 
@@ -17,7 +16,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
17
16
  const dag = inputDag.copy()
18
17
  const compactedEventCount = 0
19
18
 
20
- const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag).reverse()
19
+ const orderedEventSequenceNumberStrs = dag.topologicalNodeIds().toReversed()
21
20
 
22
21
  // drop root
23
22
  orderedEventSequenceNumberStrs.pop()
@@ -30,7 +29,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
30
29
  const subDagsForEvent = Array.from(makeSubDagsForEvent(dag, eventNumStr))
31
30
  for (const subDag of subDagsForEvent) {
32
31
  let shouldRetry = true
33
- while (shouldRetry) {
32
+ while (shouldRetry === true) {
34
33
  const subDagsInHistory = findSubDagsInHistory(dag, subDag, eventNumStr)
35
34
 
36
35
  // console.debug(
@@ -65,7 +64,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
65
64
  return { dag, compactedEventCount }
66
65
  }
67
66
 
68
- function* makeSubDagsForEvent(inputDag: HistoryDag, eventNumStr: string): Generator<HistoryDag> {
67
+ const makeSubDagsForEvent = function* (inputDag: HistoryDag, eventNumStr: string): Generator<HistoryDag> {
69
68
  /** Map from eventNumStr to array of eventNumStrs that are dependencies */
70
69
  let nextIterationEls: Map<string, string[]> = new Map([[eventNumStr, []]])
71
70
  let previousDag: HistoryDag | undefined
@@ -116,7 +115,7 @@ const findSubDagsInHistory = (
116
115
  const subDags: HistoryDag[] = []
117
116
  const allOutsideDependencies: string[][] = []
118
117
 
119
- for (const eventNumStr of graphologyDag.topologicalSort(inputDag)) {
118
+ for (const eventNumStr of inputDag.topologicalNodeIds()) {
120
119
  if (eventNumStr === upToExclEventSequenceNumberStr) {
121
120
  break
122
121
  }
@@ -132,7 +131,7 @@ const findSubDagsInHistory = (
132
131
  allOutsideDependencies.push(outsideDependencies)
133
132
  }
134
133
 
135
- if (outsideDependencies.length === 0 && dagReplacesDag(subDag, targetSubDag)) {
134
+ if (outsideDependencies.length === 0 && dagReplacesDag(subDag, targetSubDag) === true) {
136
135
  subDags.push(subDag)
137
136
  } else {
138
137
  break
@@ -172,7 +171,7 @@ const dagDependsOnDag = (dagA: HistoryDag, dagB: HistoryDag, inputDag: HistoryDa
172
171
  for (const edgeEntryA of inputDag.inboundEdgeEntries(nodeAIdStr)) {
173
172
  if (edgeEntryA.attributes.type === 'facts') {
174
173
  const depNodeIdStr = edgeEntryA.target
175
- if (dagB.hasNode(depNodeIdStr)) {
174
+ if (dagB.hasNode(depNodeIdStr) === true) {
176
175
  return true
177
176
  }
178
177
  }
@@ -189,8 +188,8 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
189
188
  }
190
189
 
191
190
  // TODO write tests that covers deterministic order when DAGs have branches
192
- const nodeEntriesA = graphologyDag.topologicalSort(dagA).map((nodeId) => dagA.getNodeAttributes(nodeId))
193
- const nodeEntriesB = graphologyDag.topologicalSort(dagB).map((nodeId) => dagB.getNodeAttributes(nodeId))
191
+ const nodeEntriesA = dagA.topologicalNodeIds().map((nodeId) => dagA.getNodeAttributes(nodeId))
192
+ const nodeEntriesB = dagB.topologicalNodeIds().map((nodeId) => dagB.getNodeAttributes(nodeId))
194
193
 
195
194
  for (let i = 0; i < nodeEntriesA.length; i++) {
196
195
  const nodeA = nodeEntriesA[i]!
@@ -207,14 +206,14 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
207
206
  const removeEvent = (dag: HistoryDag, eventNumStr: string) => {
208
207
  // console.debug('removing event', eventNumStr)
209
208
  const event = dag.getNodeAttributes(eventNumStr)
210
- const parentSeqNumStr = EventSequenceNumber.toString(event.parentSeqNum)
209
+ const parentSeqNumStr = EventSequenceNumber.Client.toString(event.parentSeqNum)
211
210
  const childEdges = dag.outboundEdgeEntries(eventNumStr)
212
211
 
213
212
  for (const childEdge of childEdges) {
214
213
  if (childEdge.attributes.type === 'parent') {
215
214
  const childEvent = dag.getNodeAttributes(childEdge.target)
216
215
  childEvent.parentSeqNum = { ...event.parentSeqNum }
217
- dag.addEdge(parentSeqNumStr, EventSequenceNumber.toString(childEvent.seqNum), { type: 'parent' })
216
+ dag.addEdge(parentSeqNumStr, EventSequenceNumber.Client.toString(childEvent.seqNum), { type: 'parent' })
218
217
  }
219
218
  }
220
219