@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
@@ -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().reverse()
21
20
 
22
21
  // drop root
23
22
  orderedEventSequenceNumberStrs.pop()
@@ -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
  }
@@ -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
 
@@ -1,19 +1,17 @@
1
1
  import { notYetImplemented } from '@livestore/utils'
2
-
3
2
  import type {
4
3
  EventDefFactInput,
5
4
  EventDefFacts,
6
5
  EventDefFactsGroup,
7
6
  EventDefFactsSnapshot,
8
7
  FactsCallback,
9
- } from '../../schema/EventDef.ts'
10
- import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
11
- import { graphologyDag } from './graphology_.ts'
8
+ } from '../../schema/EventDef/mod.ts'
9
+ import type * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
12
10
  import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.ts'
13
11
 
14
12
  export const factsSnapshotForEvents = (
15
13
  events: HistoryDagNode[],
16
- endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber,
14
+ endEventSequenceNumber: EventSequenceNumber.Client.Composite,
17
15
  ): EventDefFactsSnapshot => {
18
16
  const facts = new Map<string, any>()
19
17
 
@@ -30,11 +28,11 @@ export const factsSnapshotForEvents = (
30
28
 
31
29
  export const factsSnapshotForDag = (
32
30
  dag: HistoryDag,
33
- endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber | undefined,
31
+ endEventSequenceNumber: EventSequenceNumber.Client.Composite | undefined,
34
32
  ): EventDefFactsSnapshot => {
35
33
  const facts = new Map<string, any>()
36
34
 
37
- const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag)
35
+ const orderedEventSequenceNumberStrs = dag.topologicalNodeIds()
38
36
 
39
37
  for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
40
38
  const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
@@ -227,8 +225,8 @@ export const getFactsGroupForEventArgs = ({
227
225
  }
228
226
 
229
227
  export const compareEventSequenceNumbers = (
230
- a: EventSequenceNumber.EventSequenceNumber,
231
- b: EventSequenceNumber.EventSequenceNumber,
228
+ a: EventSequenceNumber.Client.Composite,
229
+ b: EventSequenceNumber.Client.Composite,
232
230
  ) => {
233
231
  if (a.global !== b.global) {
234
232
  return a.global - b.global
@@ -1,33 +1,14 @@
1
- import type { EventDefFactsGroup } from '../../schema/EventDef.ts'
2
- import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
3
- import { graphology } from './graphology_.ts'
1
+ import { shouldNeverHappen } from '@livestore/utils'
2
+ import { Graph } from '@livestore/utils/effect'
3
+ import type { EventDefFactsGroup } from '../../schema/EventDef/mod.ts'
4
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
4
5
 
5
6
  export const connectionTypeOptions = ['parent', 'facts'] as const
6
7
  export type ConnectionType = (typeof connectionTypeOptions)[number]
7
8
 
8
- /**
9
- * Eventlog represented as a multi-DAG including edges for
10
- * - total-order (parent) relationships
11
- * - dependency (requires/reads facts) relationships
12
- */
13
- export type HistoryDag = graphology.IGraph<HistoryDagNode, { type: ConnectionType }>
14
-
15
- export const emptyHistoryDag = (): HistoryDag =>
16
- new graphology.Graph({
17
- allowSelfLoops: false,
18
- multi: true,
19
- type: 'directed',
20
- })
21
-
22
- // TODO consider making `ROOT_ID` parent to itself
23
- export const rootParentNum = EventSequenceNumber.make({
24
- global: EventSequenceNumber.ROOT.global - 1,
25
- client: EventSequenceNumber.clientDefault,
26
- })
27
-
28
9
  export type HistoryDagNode = {
29
- seqNum: EventSequenceNumber.EventSequenceNumber
30
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
10
+ seqNum: EventSequenceNumber.Client.Composite
11
+ parentSeqNum: EventSequenceNumber.Client.Composite
31
12
  name: string
32
13
  args: any
33
14
  /** Facts are being used for conflict detection and history compaction */
@@ -37,8 +18,278 @@ export type HistoryDagNode = {
37
18
  sessionId: string | undefined
38
19
  }
39
20
 
21
+ type HistoryDagEdgeAttributes = { type: ConnectionType }
22
+
23
+ type HistoryDagEdgeEntry = {
24
+ edge: Graph.EdgeIndex
25
+ source: string
26
+ target: string
27
+ attributes: HistoryDagEdgeAttributes
28
+ }
29
+
30
+ type HistoryDagOptions = {
31
+ allowSelfLoops: boolean
32
+ }
33
+
34
+ const defaultOptions: HistoryDagOptions = {
35
+ allowSelfLoops: false,
36
+ }
37
+
38
+ const cloneFactsGroup = (factsGroup: EventDefFactsGroup): EventDefFactsGroup => ({
39
+ depRead: new Map(factsGroup.depRead),
40
+ depRequire: new Map(factsGroup.depRequire),
41
+ modifySet: new Map(factsGroup.modifySet),
42
+ modifyUnset: new Map(factsGroup.modifyUnset),
43
+ })
44
+
45
+ const cloneHistoryDagNode = (node: HistoryDagNode): HistoryDagNode => ({
46
+ ...node,
47
+ // Copy the event sequence numbers to avoid accidental aliasing
48
+ parentSeqNum: { ...node.parentSeqNum },
49
+ seqNum: { ...node.seqNum },
50
+ // Facts are represented via maps which should not be shared across DAG copies
51
+ factsGroup: cloneFactsGroup(node.factsGroup),
52
+ })
53
+
54
+ /**
55
+ * Mutable DAG wrapper that retains the previous string-based node ids API
56
+ * while delegating storage and algorithms to Effect's graph module.
57
+ */
58
+ export class HistoryDag {
59
+ private readonly options: HistoryDagOptions
60
+ private readonly idToIndex: Map<string, Graph.NodeIndex>
61
+ private readonly indexToId: Map<Graph.NodeIndex, string>
62
+ private readonly graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
63
+
64
+ private constructor({
65
+ graph,
66
+ idToIndex,
67
+ indexToId,
68
+ options,
69
+ }: {
70
+ graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
71
+ idToIndex?: Map<string, Graph.NodeIndex>
72
+ indexToId?: Map<Graph.NodeIndex, string>
73
+ options?: Partial<HistoryDagOptions>
74
+ }) {
75
+ this.graph = graph
76
+ this.options = { ...defaultOptions, ...options }
77
+ this.idToIndex = idToIndex ? new Map(idToIndex) : new Map()
78
+ this.indexToId = indexToId ? new Map(indexToId) : new Map()
79
+ }
80
+
81
+ static create(options?: Partial<HistoryDagOptions>): HistoryDag {
82
+ const graph = Graph.beginMutation(Graph.directed<HistoryDagNode, HistoryDagEdgeAttributes>())
83
+ return options ? new HistoryDag({ graph, options }) : new HistoryDag({ graph })
84
+ }
85
+
86
+ copy(): HistoryDag {
87
+ const clone = HistoryDag.create(this.options)
88
+
89
+ for (const [id, index] of this.idToIndex) {
90
+ const node = this.graph.nodes.get(index) ?? shouldNeverHappen(`HistoryDag.copy missing node for ${id}`)
91
+ clone.addNode(id, cloneHistoryDagNode(node))
92
+ }
93
+
94
+ for (const edge of this.graph.edges.values()) {
95
+ const sourceId = this.indexToId.get(edge.source) ?? shouldNeverHappen('HistoryDag.copy missing source id')
96
+ const targetId = this.indexToId.get(edge.target) ?? shouldNeverHappen('HistoryDag.copy missing target id')
97
+ clone.addEdge(sourceId, targetId, { ...edge.data })
98
+ }
99
+
100
+ return clone
101
+ }
102
+
103
+ topologicalNodeIds(): Array<string> {
104
+ const walker = Graph.topo(this.graph)
105
+ const indices = Array.from(Graph.indices(walker))
106
+ return indices.map((index) => this.indexToId.get(index) ?? shouldNeverHappen(`Missing node id for index ${index}`))
107
+ }
108
+
109
+ addNode(id: string, attributes: HistoryDagNode): void {
110
+ if (this.idToIndex.has(id)) {
111
+ shouldNeverHappen(`HistoryDag node ${id} already exists`)
112
+ }
113
+
114
+ const nodeIndex = Graph.addNode(this.graph, attributes)
115
+ this.idToIndex.set(id, nodeIndex)
116
+ this.indexToId.set(nodeIndex, id)
117
+ }
118
+
119
+ hasNode(id: string): boolean {
120
+ return this.idToIndex.has(id)
121
+ }
122
+
123
+ getNodeAttributes(id: string): HistoryDagNode {
124
+ const index = this.idToIndex.get(id)
125
+ if (index === undefined) {
126
+ return shouldNeverHappen(`HistoryDag node ${id} not found`)
127
+ }
128
+
129
+ const node = this.graph.nodes.get(index)
130
+ return node ?? shouldNeverHappen(`HistoryDag node data missing for ${id}`)
131
+ }
132
+
133
+ nodes(): IterableIterator<string> {
134
+ return this.idToIndex.keys()
135
+ }
136
+
137
+ nodeEntries(): IterableIterator<{ key: string; attributes: HistoryDagNode }> {
138
+ return function* (this: HistoryDag) {
139
+ for (const [id, index] of this.idToIndex) {
140
+ const attributes = this.graph.nodes.get(index) ?? shouldNeverHappen(`HistoryDag node data missing for ${id}`)
141
+ yield { key: id, attributes }
142
+ }
143
+ }.call(this)
144
+ }
145
+
146
+ addEdge(sourceId: string, targetId: string, attributes: HistoryDagEdgeAttributes): Graph.EdgeIndex {
147
+ if (this.options.allowSelfLoops === false && sourceId === targetId) {
148
+ return shouldNeverHappen('HistoryDag self-loops are disabled')
149
+ }
150
+
151
+ const sourceIndex = this.idToIndex.get(sourceId)
152
+ const targetIndex = this.idToIndex.get(targetId)
153
+
154
+ if (sourceIndex === undefined || targetIndex === undefined) {
155
+ return shouldNeverHappen(`HistoryDag edge references unknown nodes: ${sourceId} -> ${targetId}`)
156
+ }
157
+
158
+ return Graph.addEdge(this.graph, sourceIndex, targetIndex, attributes)
159
+ }
160
+
161
+ edges(sourceId: string, targetId: string): Array<Graph.EdgeIndex> {
162
+ const sourceIndex = this.idToIndex.get(sourceId)
163
+ const targetIndex = this.idToIndex.get(targetId)
164
+
165
+ if (sourceIndex === undefined || targetIndex === undefined) {
166
+ return []
167
+ }
168
+
169
+ const adjacency = this.graph.adjacency.get(sourceIndex)
170
+ if (adjacency === undefined) {
171
+ return []
172
+ }
173
+
174
+ return adjacency.filter((edgeIndex) => {
175
+ const edge = this.graph.edges.get(edgeIndex)
176
+ return edge !== undefined && edge.target === targetIndex
177
+ })
178
+ }
179
+
180
+ inEdges(id: string): Array<Graph.EdgeIndex> {
181
+ const index = this.idToIndex.get(id)
182
+ if (index === undefined) {
183
+ return []
184
+ }
185
+ const incoming = this.graph.reverseAdjacency.get(index)
186
+ return incoming ? [...incoming] : []
187
+ }
188
+
189
+ outboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
190
+ const index = this.idToIndex.get(id)
191
+ if (index === undefined) {
192
+ return []
193
+ }
194
+
195
+ const adjacency = this.graph.adjacency.get(index)
196
+ if (adjacency === undefined) {
197
+ return []
198
+ }
199
+
200
+ return adjacency
201
+ .map((edgeIndex) => this.edgeEntry(edgeIndex))
202
+ .filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
203
+ }
204
+
205
+ inboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
206
+ const index = this.idToIndex.get(id)
207
+ if (index === undefined) {
208
+ return []
209
+ }
210
+
211
+ const adjacency = this.graph.reverseAdjacency.get(index)
212
+ if (adjacency === undefined) {
213
+ return []
214
+ }
215
+
216
+ return adjacency
217
+ .map((edgeIndex) => this.edgeEntry(edgeIndex))
218
+ .filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
219
+ }
220
+
221
+ getEdgeAttributes(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeAttributes {
222
+ const edge = this.graph.edges.get(edgeIndex)
223
+ return edge?.data ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} not found`)
224
+ }
225
+
226
+ getEdgeAttribute<TKey extends keyof HistoryDagEdgeAttributes>(
227
+ edgeIndex: Graph.EdgeIndex,
228
+ key: TKey,
229
+ ): HistoryDagEdgeAttributes[TKey] {
230
+ const attributes = this.getEdgeAttributes(edgeIndex)
231
+ return attributes[key]
232
+ }
233
+
234
+ source(edgeIndex: Graph.EdgeIndex): string {
235
+ const edge = this.graph.edges.get(edgeIndex)
236
+ const sourceId = edge !== undefined ? this.indexToId.get(edge.source) : undefined
237
+ return sourceId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing source`)
238
+ }
239
+
240
+ target(edgeIndex: Graph.EdgeIndex): string {
241
+ const edge = this.graph.edges.get(edgeIndex)
242
+ const targetId = edge !== undefined ? this.indexToId.get(edge.target) : undefined
243
+ return targetId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing target`)
244
+ }
245
+
246
+ dropNode(id: string): void {
247
+ const index = this.idToIndex.get(id)
248
+ if (index === undefined) {
249
+ return
250
+ }
251
+
252
+ Graph.removeNode(this.graph, index)
253
+ this.idToIndex.delete(id)
254
+ this.indexToId.delete(index)
255
+ }
256
+
257
+ get size(): number {
258
+ return this.idToIndex.size
259
+ }
260
+
261
+ private edgeEntry(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeEntry | undefined {
262
+ const edge = this.graph.edges.get(edgeIndex)
263
+ if (edge === undefined) {
264
+ return undefined
265
+ }
266
+
267
+ const source = this.indexToId.get(edge.source)
268
+ const target = this.indexToId.get(edge.target)
269
+
270
+ if (source === undefined || target === undefined) {
271
+ return undefined
272
+ }
273
+
274
+ return {
275
+ edge: edgeIndex,
276
+ source,
277
+ target,
278
+ attributes: edge.data,
279
+ }
280
+ }
281
+ }
282
+
283
+ export const emptyHistoryDag = (): HistoryDag => HistoryDag.create({ allowSelfLoops: false })
284
+
285
+ // TODO consider making `ROOT_ID` parent to itself
286
+ export const rootParentNum = EventSequenceNumber.Client.Composite.make({
287
+ global: EventSequenceNumber.Client.ROOT.global - 1,
288
+ client: EventSequenceNumber.Client.DEFAULT,
289
+ })
290
+
40
291
  export const rootEventNode: HistoryDagNode = {
41
- seqNum: EventSequenceNumber.ROOT,
292
+ seqNum: EventSequenceNumber.Client.ROOT,
42
293
  parentSeqNum: rootParentNum,
43
294
  // unused below
44
295
  name: '__Root__',
@@ -1,4 +1,4 @@
1
- import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
1
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
2
2
  import { factsToString, validateFacts } from './facts.ts'
3
3
  import { emptyHistoryDag, type HistoryDagNode, rootParentNum } from './history-dag-common.ts'
4
4
 
@@ -18,13 +18,19 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
18
18
 
19
19
  const dag = emptyHistoryDag()
20
20
 
21
- dagNodes.forEach((node) => dag.addNode(EventSequenceNumber.toString(node.seqNum), node))
21
+ dagNodes.forEach((node) => {
22
+ dag.addNode(EventSequenceNumber.Client.toString(node.seqNum), node)
23
+ })
22
24
 
23
25
  dagNodes.forEach((node) => {
24
- if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
25
- dag.addEdge(EventSequenceNumber.toString(node.parentSeqNum), EventSequenceNumber.toString(node.seqNum), {
26
- type: 'parent',
27
- })
26
+ if (EventSequenceNumber.Client.toString(node.parentSeqNum) !== EventSequenceNumber.Client.toString(rootParentNum)) {
27
+ dag.addEdge(
28
+ EventSequenceNumber.Client.toString(node.parentSeqNum),
29
+ EventSequenceNumber.Client.toString(node.seqNum),
30
+ {
31
+ type: 'parent',
32
+ },
33
+ )
28
34
  }
29
35
  })
30
36
 
@@ -33,9 +39,9 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
33
39
  for (const factKey of factKeys) {
34
40
  // Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
35
41
  const depNode = (() => {
36
- let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
42
+ let currentSeqNumStr = EventSequenceNumber.Client.toString(node.seqNum)
37
43
 
38
- while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
44
+ while (currentSeqNumStr !== EventSequenceNumber.Client.toString(rootParentNum)) {
39
45
  const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
40
46
  if (!parentEdge) return null
41
47
 
@@ -53,8 +59,8 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
53
59
  })()
54
60
 
55
61
  if (depNode) {
56
- const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
57
- const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
62
+ const depNodeIdStr = EventSequenceNumber.Client.toString(depNode.seqNum)
63
+ const nodeIdStr = EventSequenceNumber.Client.toString(node.seqNum)
58
64
  if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
59
65
  dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
60
66
  }
@@ -1,6 +1,6 @@
1
- import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef.ts'
2
- import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
3
- import type * as LiveStoreEvent from '../../schema/LiveStoreEvent.ts'
1
+ import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef/mod.ts'
2
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
3
+ import type * as LiveStoreEvent from '../../schema/LiveStoreEvent/mod.ts'
4
4
  import {
5
5
  applyFactGroups,
6
6
  type FactValidationResult,
@@ -19,13 +19,13 @@ export type RebaseInput = {
19
19
  newRemoteEvents: RebaseEventWithConflict[]
20
20
  pendingLocalEvents: RebaseEventWithConflict[]
21
21
  validate: (args: {
22
- rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
22
+ rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
23
23
  eventDefs: Record<string, EventDef.Any>
24
24
  }) => FactValidationResult
25
25
  }
26
26
 
27
27
  export type RebaseOutput = {
28
- rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
28
+ rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
29
29
  }
30
30
 
31
31
  export type RebaseFn = (input: RebaseInput) => RebaseOutput
@@ -53,7 +53,7 @@ export const rebaseEvents = ({
53
53
  currentFactsSnapshot: EventDefFactsSnapshot
54
54
  clientId: string
55
55
  sessionId: string
56
- }): ReadonlyArray<LiveStoreEvent.AnyDecoded> => {
56
+ }): ReadonlyArray<LiveStoreEvent.Client.Decoded> => {
57
57
  const initialSnapshot = new Map(currentFactsSnapshot)
58
58
  applyFactGroups(
59
59
  newRemoteEvents.map((event) => event.factsGroup),
@@ -94,18 +94,18 @@ export const rebaseEvents = ({
94
94
  return rebasedLocalEvents.map(
95
95
  (event, index) =>
96
96
  ({
97
- seqNum: EventSequenceNumber.make({
97
+ seqNum: EventSequenceNumber.Client.Composite.make({
98
98
  global: headGlobalId + index + 1,
99
- client: EventSequenceNumber.clientDefault,
99
+ client: EventSequenceNumber.Client.DEFAULT,
100
100
  }),
101
- parentSeqNum: EventSequenceNumber.make({
101
+ parentSeqNum: EventSequenceNumber.Client.Composite.make({
102
102
  global: headGlobalId + index,
103
- client: EventSequenceNumber.clientDefault,
103
+ client: EventSequenceNumber.Client.DEFAULT,
104
104
  }),
105
105
  name: event.name,
106
106
  args: event.args,
107
107
  clientId,
108
108
  sessionId,
109
- }) satisfies LiveStoreEvent.AnyDecoded,
109
+ }) satisfies LiveStoreEvent.Client.Decoded,
110
110
  )
111
111
  }
@@ -1,16 +1,16 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
- import type { EventDef } from '../../../schema/EventDef.ts'
4
- import { defineEvent, defineFacts } from '../../../schema/EventDef.ts'
5
- import * as EventSequenceNumber from '../../../schema/EventSequenceNumber.ts'
3
+ import type { EventDef } from '../../../schema/EventDef/mod.ts'
4
+ import { defineEvent, defineFacts } from '../../../schema/EventDef/mod.ts'
5
+ import * as EventSequenceNumber from '../../../schema/EventSequenceNumber/mod.ts'
6
6
  import { factsSnapshotForDag, getFactsGroupForEventArgs } from '../facts.ts'
7
7
  import { historyDagFromNodes } from '../history-dag.ts'
8
8
  import type { HistoryDagNode } from '../history-dag-common.ts'
9
9
  import { rootEventNode } from '../history-dag-common.ts'
10
10
 
11
11
  export const printEvent = ({ seqNum, parentSeqNum, factsGroup, ...rest }: HistoryDagNode) => ({
12
- seqNum: EventSequenceNumber.toString(seqNum),
13
- parentSeqNum: EventSequenceNumber.toString(parentSeqNum),
12
+ seqNum: EventSequenceNumber.Client.toString(seqNum),
13
+ parentSeqNum: EventSequenceNumber.Client.toString(parentSeqNum),
14
14
  ...rest,
15
15
  facts: factsGroup,
16
16
  })
@@ -140,11 +140,11 @@ export const toEventNodes = (
140
140
  ): HistoryDagNode[] => {
141
141
  const nodesAcc: HistoryDagNode[] = [rootEventNode]
142
142
 
143
- let currentEventSequenceNumber: EventSequenceNumber.EventSequenceNumber = EventSequenceNumber.ROOT
143
+ let currentEventSequenceNumber: EventSequenceNumber.Client.Composite = EventSequenceNumber.Client.ROOT
144
144
 
145
145
  const eventNodes = partialEvents.map((partialEvent) => {
146
146
  const eventDef = eventDefs[partialEvent.name]!
147
- const eventNum = EventSequenceNumber.nextPair({
147
+ const eventNum = EventSequenceNumber.Client.nextPair({
148
148
  seqNum: currentEventSequenceNumber,
149
149
  isClient: eventDef.options.clientOnly,
150
150
  }).seqNum
@@ -219,18 +219,18 @@ export const toEventNodes = (
219
219
  return eventNodes
220
220
  }
221
221
 
222
- const getParentNum = (eventNum: EventSequenceNumber.EventSequenceNumber): EventSequenceNumber.EventSequenceNumber => {
222
+ const getParentNum = (eventNum: EventSequenceNumber.Client.Composite): EventSequenceNumber.Client.Composite => {
223
223
  const globalParentNum = eventNum.global
224
224
  const clientParentNum = eventNum.client - 1
225
225
 
226
226
  if (clientParentNum < 0) {
227
- return EventSequenceNumber.make({
227
+ return EventSequenceNumber.Client.Composite.make({
228
228
  global: globalParentNum - 1,
229
- client: EventSequenceNumber.clientDefault,
229
+ client: EventSequenceNumber.Client.DEFAULT,
230
230
  })
231
231
  }
232
232
 
233
- return EventSequenceNumber.make({
233
+ return EventSequenceNumber.Client.Composite.make({
234
234
  global: globalParentNum,
235
235
  client: clientParentNum,
236
236
  })
@@ -0,0 +1,22 @@
1
+ import { Effect, KeyValueStore, Option } from '@livestore/utils/effect'
2
+ import { UnknownError } from '../errors.ts'
3
+
4
+ export const makeBackendIdHelper = Effect.gen(function* () {
5
+ const kv = yield* KeyValueStore.KeyValueStore
6
+
7
+ const backendIdKey = `backendId`
8
+ const backendIdRef = { current: yield* kv.get(backendIdKey).pipe(UnknownError.mapToUnknownError) }
9
+
10
+ const setBackendId = (backendId: string) =>
11
+ Effect.gen(function* () {
12
+ if (backendIdRef.current._tag === 'None' || backendIdRef.current.value !== backendId) {
13
+ backendIdRef.current = Option.some(backendId)
14
+ yield* kv.set(backendIdKey, backendId)
15
+ }
16
+ }).pipe(UnknownError.mapToUnknownError)
17
+
18
+ return {
19
+ lazySet: setBackendId,
20
+ get: () => backendIdRef.current,
21
+ }
22
+ })