@livestore/common 0.3.0-dev.8 → 0.3.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 (480) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +120 -64
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +39 -8
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts.map +1 -1
  11. package/dist/debug-info.d.ts +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +97 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -580
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -174
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +36 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +55 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +33 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +7 -9
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -9
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +45 -30
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  45. package/dist/leader-thread/LeaderSyncProcessor.js +484 -321
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  47. package/dist/leader-thread/connection.d.ts +34 -6
  48. package/dist/leader-thread/connection.d.ts.map +1 -1
  49. package/dist/leader-thread/connection.js +22 -7
  50. package/dist/leader-thread/connection.js.map +1 -1
  51. package/dist/leader-thread/eventlog.d.ts +27 -0
  52. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  53. package/dist/leader-thread/eventlog.js +119 -0
  54. package/dist/leader-thread/eventlog.js.map +1 -0
  55. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  56. package/dist/leader-thread/leader-worker-devtools.js +155 -80
  57. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  58. package/dist/leader-thread/make-leader-thread-layer.d.ts +22 -9
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  60. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  61. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  62. package/dist/leader-thread/materialize-event.d.ts +16 -0
  63. package/dist/leader-thread/materialize-event.d.ts.map +1 -0
  64. package/dist/leader-thread/materialize-event.js +109 -0
  65. package/dist/leader-thread/materialize-event.js.map +1 -0
  66. package/dist/leader-thread/mod.d.ts +1 -1
  67. package/dist/leader-thread/mod.d.ts.map +1 -1
  68. package/dist/leader-thread/mod.js +1 -1
  69. package/dist/leader-thread/mod.js.map +1 -1
  70. package/dist/leader-thread/recreate-db.d.ts +4 -2
  71. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  72. package/dist/leader-thread/recreate-db.js +28 -32
  73. package/dist/leader-thread/recreate-db.js.map +1 -1
  74. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  75. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  76. package/dist/leader-thread/shutdown-channel.js +2 -4
  77. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  78. package/dist/leader-thread/types.d.ts +85 -38
  79. package/dist/leader-thread/types.d.ts.map +1 -1
  80. package/dist/leader-thread/types.js +1 -3
  81. package/dist/leader-thread/types.js.map +1 -1
  82. package/dist/make-client-session.d.ts +23 -0
  83. package/dist/make-client-session.d.ts.map +1 -0
  84. package/dist/make-client-session.js +57 -0
  85. package/dist/make-client-session.js.map +1 -0
  86. package/dist/materializer-helper.d.ts +23 -0
  87. package/dist/materializer-helper.d.ts.map +1 -0
  88. package/dist/materializer-helper.js +86 -0
  89. package/dist/materializer-helper.js.map +1 -0
  90. package/dist/otel.d.ts +2 -0
  91. package/dist/otel.d.ts.map +1 -1
  92. package/dist/otel.js +5 -0
  93. package/dist/otel.js.map +1 -1
  94. package/dist/rematerialize-from-eventlog.d.ts +14 -0
  95. package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
  96. package/dist/rematerialize-from-eventlog.js +64 -0
  97. package/dist/rematerialize-from-eventlog.js.map +1 -0
  98. package/dist/schema/EventDef.d.ts +146 -0
  99. package/dist/schema/EventDef.d.ts.map +1 -0
  100. package/dist/schema/EventDef.js +58 -0
  101. package/dist/schema/EventDef.js.map +1 -0
  102. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  103. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  104. package/dist/schema/EventSequenceNumber.js +82 -0
  105. package/dist/schema/EventSequenceNumber.js.map +1 -0
  106. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  107. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  108. package/dist/schema/EventSequenceNumber.test.js +11 -0
  109. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  110. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  111. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  112. package/dist/schema/LiveStoreEvent.js +117 -0
  113. package/dist/schema/LiveStoreEvent.js.map +1 -0
  114. package/dist/schema/events.d.ts +2 -0
  115. package/dist/schema/events.d.ts.map +1 -0
  116. package/dist/schema/events.js +2 -0
  117. package/dist/schema/events.js.map +1 -0
  118. package/dist/schema/mod.d.ts +8 -6
  119. package/dist/schema/mod.d.ts.map +1 -1
  120. package/dist/schema/mod.js +8 -6
  121. package/dist/schema/mod.js.map +1 -1
  122. package/dist/schema/schema.d.ts +50 -32
  123. package/dist/schema/schema.d.ts.map +1 -1
  124. package/dist/schema/schema.js +36 -43
  125. package/dist/schema/schema.js.map +1 -1
  126. package/dist/schema/state/mod.d.ts +3 -0
  127. package/dist/schema/state/mod.d.ts.map +1 -0
  128. package/dist/schema/state/mod.js +3 -0
  129. package/dist/schema/state/mod.js.map +1 -0
  130. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  131. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  132. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  133. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  134. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  135. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  136. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  137. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  138. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  139. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  140. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  141. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  142. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  143. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  144. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  145. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  146. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  147. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  148. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  149. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  150. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  151. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  152. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  153. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  154. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  155. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  156. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  157. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  158. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  159. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  160. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  161. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  162. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  163. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  164. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  165. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  166. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  167. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  168. package/dist/schema/state/sqlite/mod.js +41 -0
  169. package/dist/schema/state/sqlite/mod.js.map +1 -0
  170. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  171. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  172. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  173. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  174. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  175. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  176. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  177. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  178. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  179. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  180. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  181. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  182. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  183. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  184. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  185. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  186. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  187. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  188. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  189. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  190. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  191. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  192. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  193. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  194. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  195. package/dist/schema/state/sqlite/system-tables.js +88 -0
  196. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  197. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  198. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  199. package/dist/schema/state/sqlite/table-def.js +36 -0
  200. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  201. package/dist/schema-management/common.d.ts +7 -7
  202. package/dist/schema-management/common.d.ts.map +1 -1
  203. package/dist/schema-management/common.js.map +1 -1
  204. package/dist/schema-management/migrations.d.ts +6 -6
  205. package/dist/schema-management/migrations.d.ts.map +1 -1
  206. package/dist/schema-management/migrations.js +27 -18
  207. package/dist/schema-management/migrations.js.map +1 -1
  208. package/dist/schema-management/validate-schema.d.ts +8 -0
  209. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  210. package/dist/schema-management/validate-schema.js +39 -0
  211. package/dist/schema-management/validate-schema.js.map +1 -0
  212. package/dist/sql-queries/misc.d.ts.map +1 -1
  213. package/dist/sql-queries/sql-queries.d.ts +1 -1
  214. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  215. package/dist/sql-queries/sql-queries.js.map +1 -1
  216. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  217. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  218. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  219. package/dist/sql-queries/types.d.ts +2 -1
  220. package/dist/sql-queries/types.d.ts.map +1 -1
  221. package/dist/sql-queries/types.js.map +1 -1
  222. package/dist/sync/ClientSessionSyncProcessor.d.ts +40 -19
  223. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  224. package/dist/sync/ClientSessionSyncProcessor.js +150 -72
  225. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  226. package/dist/sync/next/compact-events.d.ts.map +1 -1
  227. package/dist/sync/next/compact-events.js +38 -35
  228. package/dist/sync/next/compact-events.js.map +1 -1
  229. package/dist/sync/next/facts.d.ts +21 -21
  230. package/dist/sync/next/facts.d.ts.map +1 -1
  231. package/dist/sync/next/facts.js +11 -11
  232. package/dist/sync/next/facts.js.map +1 -1
  233. package/dist/sync/next/history-dag-common.d.ts +9 -7
  234. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  235. package/dist/sync/next/history-dag-common.js +10 -5
  236. package/dist/sync/next/history-dag-common.js.map +1 -1
  237. package/dist/sync/next/history-dag.d.ts +0 -2
  238. package/dist/sync/next/history-dag.d.ts.map +1 -1
  239. package/dist/sync/next/history-dag.js +16 -14
  240. package/dist/sync/next/history-dag.js.map +1 -1
  241. package/dist/sync/next/rebase-events.d.ts +10 -8
  242. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  243. package/dist/sync/next/rebase-events.js +18 -10
  244. package/dist/sync/next/rebase-events.js.map +1 -1
  245. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  246. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  247. package/dist/sync/next/test/compact-events.test.js +77 -77
  248. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  249. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +35 -25
  250. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  251. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
  252. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  253. package/dist/sync/next/test/mod.d.ts +1 -1
  254. package/dist/sync/next/test/mod.d.ts.map +1 -1
  255. package/dist/sync/next/test/mod.js +1 -1
  256. package/dist/sync/next/test/mod.js.map +1 -1
  257. package/dist/sync/sync.d.ts +46 -21
  258. package/dist/sync/sync.d.ts.map +1 -1
  259. package/dist/sync/sync.js +10 -6
  260. package/dist/sync/sync.js.map +1 -1
  261. package/dist/sync/syncstate.d.ts +213 -82
  262. package/dist/sync/syncstate.d.ts.map +1 -1
  263. package/dist/sync/syncstate.js +337 -139
  264. package/dist/sync/syncstate.js.map +1 -1
  265. package/dist/sync/syncstate.test.js +309 -286
  266. package/dist/sync/syncstate.test.js.map +1 -1
  267. package/dist/sync/validate-push-payload.d.ts +2 -2
  268. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  269. package/dist/sync/validate-push-payload.js +4 -4
  270. package/dist/sync/validate-push-payload.js.map +1 -1
  271. package/dist/util.d.ts +2 -2
  272. package/dist/util.d.ts.map +1 -1
  273. package/dist/version.d.ts +2 -2
  274. package/dist/version.d.ts.map +1 -1
  275. package/dist/version.js +2 -2
  276. package/dist/version.js.map +1 -1
  277. package/package.json +10 -4
  278. package/src/__tests__/fixture.ts +36 -15
  279. package/src/adapter-types.ts +107 -68
  280. package/src/debug-info.ts +1 -0
  281. package/src/devtools/devtools-messages-client-session.ts +142 -0
  282. package/src/devtools/devtools-messages-common.ts +115 -0
  283. package/src/devtools/devtools-messages-leader.ts +191 -0
  284. package/src/devtools/devtools-messages.ts +3 -246
  285. package/src/devtools/devtools-sessioninfo.ts +101 -0
  286. package/src/devtools/mod.ts +59 -0
  287. package/src/index.ts +7 -9
  288. package/src/leader-thread/LeaderSyncProcessor.ts +738 -477
  289. package/src/leader-thread/connection.ts +54 -9
  290. package/src/leader-thread/eventlog.ts +199 -0
  291. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  292. package/src/leader-thread/make-leader-thread-layer.ts +121 -72
  293. package/src/leader-thread/materialize-event.ts +173 -0
  294. package/src/leader-thread/mod.ts +1 -1
  295. package/src/leader-thread/recreate-db.ts +33 -38
  296. package/src/leader-thread/shutdown-channel.ts +2 -4
  297. package/src/leader-thread/types.ts +94 -48
  298. package/src/make-client-session.ts +136 -0
  299. package/src/materializer-helper.ts +138 -0
  300. package/src/otel.ts +8 -0
  301. package/src/rematerialize-from-eventlog.ts +117 -0
  302. package/src/schema/EventDef.ts +227 -0
  303. package/src/schema/EventSequenceNumber.test.ts +12 -0
  304. package/src/schema/EventSequenceNumber.ts +121 -0
  305. package/src/schema/LiveStoreEvent.ts +240 -0
  306. package/src/schema/events.ts +1 -0
  307. package/src/schema/mod.ts +8 -6
  308. package/src/schema/schema.ts +88 -84
  309. package/src/schema/state/mod.ts +2 -0
  310. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  311. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  312. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  313. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  314. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  315. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  317. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  318. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  319. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  320. package/src/schema/state/sqlite/mod.ts +73 -0
  321. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  322. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  323. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  324. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  325. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  326. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  327. package/src/schema/state/sqlite/system-tables.ts +117 -0
  328. package/src/schema/state/sqlite/table-def.ts +197 -0
  329. package/src/schema-management/common.ts +7 -7
  330. package/src/schema-management/migrations.ts +37 -31
  331. package/src/schema-management/validate-schema.ts +61 -0
  332. package/src/sql-queries/sql-queries.ts +1 -1
  333. package/src/sql-queries/sql-query-builder.ts +1 -2
  334. package/src/sql-queries/types.ts +3 -1
  335. package/src/sync/ClientSessionSyncProcessor.ts +220 -94
  336. package/src/sync/next/compact-events.ts +38 -35
  337. package/src/sync/next/facts.ts +43 -41
  338. package/src/sync/next/history-dag-common.ts +17 -10
  339. package/src/sync/next/history-dag.ts +16 -17
  340. package/src/sync/next/rebase-events.ts +29 -17
  341. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  342. package/src/sync/next/test/compact-events.test.ts +79 -79
  343. package/src/sync/next/test/event-fixtures.ts +226 -0
  344. package/src/sync/next/test/mod.ts +1 -1
  345. package/src/sync/sync.ts +46 -21
  346. package/src/sync/syncstate.test.ts +346 -320
  347. package/src/sync/syncstate.ts +422 -230
  348. package/src/sync/validate-push-payload.ts +6 -6
  349. package/src/version.ts +2 -2
  350. package/dist/derived-mutations.d.ts +0 -109
  351. package/dist/derived-mutations.d.ts.map +0 -1
  352. package/dist/derived-mutations.js +0 -54
  353. package/dist/derived-mutations.js.map +0 -1
  354. package/dist/derived-mutations.test.d.ts +0 -2
  355. package/dist/derived-mutations.test.d.ts.map +0 -1
  356. package/dist/derived-mutations.test.js +0 -93
  357. package/dist/derived-mutations.test.js.map +0 -1
  358. package/dist/devtools/devtools-bridge.d.ts +0 -13
  359. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  360. package/dist/devtools/devtools-bridge.js +0 -2
  361. package/dist/devtools/devtools-bridge.js.map +0 -1
  362. package/dist/devtools/devtools-window-message.d.ts +0 -29
  363. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  364. package/dist/devtools/devtools-window-message.js +0 -33
  365. package/dist/devtools/devtools-window-message.js.map +0 -1
  366. package/dist/devtools/index.d.ts +0 -42
  367. package/dist/devtools/index.d.ts.map +0 -1
  368. package/dist/devtools/index.js +0 -48
  369. package/dist/devtools/index.js.map +0 -1
  370. package/dist/init-singleton-tables.d.ts +0 -4
  371. package/dist/init-singleton-tables.d.ts.map +0 -1
  372. package/dist/init-singleton-tables.js +0 -16
  373. package/dist/init-singleton-tables.js.map +0 -1
  374. package/dist/leader-thread/apply-mutation.d.ts +0 -11
  375. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  376. package/dist/leader-thread/apply-mutation.js +0 -107
  377. package/dist/leader-thread/apply-mutation.js.map +0 -1
  378. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  379. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  380. package/dist/leader-thread/leader-sync-processor.js +0 -430
  381. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  382. package/dist/leader-thread/mutationlog.d.ts +0 -10
  383. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  384. package/dist/leader-thread/mutationlog.js +0 -28
  385. package/dist/leader-thread/mutationlog.js.map +0 -1
  386. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  387. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  388. package/dist/leader-thread/pull-queue-set.js +0 -39
  389. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  390. package/dist/mutation.d.ts +0 -20
  391. package/dist/mutation.d.ts.map +0 -1
  392. package/dist/mutation.js +0 -57
  393. package/dist/mutation.js.map +0 -1
  394. package/dist/query-builder/api.d.ts +0 -190
  395. package/dist/query-builder/api.d.ts.map +0 -1
  396. package/dist/query-builder/api.js +0 -8
  397. package/dist/query-builder/api.js.map +0 -1
  398. package/dist/query-builder/impl.d.ts +0 -12
  399. package/dist/query-builder/impl.d.ts.map +0 -1
  400. package/dist/query-builder/impl.js +0 -244
  401. package/dist/query-builder/impl.js.map +0 -1
  402. package/dist/query-builder/impl.test.d.ts +0 -2
  403. package/dist/query-builder/impl.test.d.ts.map +0 -1
  404. package/dist/query-builder/impl.test.js +0 -212
  405. package/dist/query-builder/impl.test.js.map +0 -1
  406. package/dist/query-builder/mod.d.ts.map +0 -1
  407. package/dist/query-builder/mod.js.map +0 -1
  408. package/dist/query-info.d.ts +0 -38
  409. package/dist/query-info.d.ts.map +0 -1
  410. package/dist/query-info.js +0 -7
  411. package/dist/query-info.js.map +0 -1
  412. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  413. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  414. package/dist/rehydrate-from-mutationlog.js +0 -66
  415. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  416. package/dist/schema/EventId.d.ts +0 -39
  417. package/dist/schema/EventId.d.ts.map +0 -1
  418. package/dist/schema/EventId.js +0 -38
  419. package/dist/schema/EventId.js.map +0 -1
  420. package/dist/schema/EventId.test.d.ts +0 -2
  421. package/dist/schema/EventId.test.d.ts.map +0 -1
  422. package/dist/schema/EventId.test.js +0 -11
  423. package/dist/schema/EventId.test.js.map +0 -1
  424. package/dist/schema/MutationEvent.d.ts +0 -166
  425. package/dist/schema/MutationEvent.d.ts.map +0 -1
  426. package/dist/schema/MutationEvent.js +0 -72
  427. package/dist/schema/MutationEvent.js.map +0 -1
  428. package/dist/schema/MutationEvent.test.d.ts +0 -2
  429. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  430. package/dist/schema/MutationEvent.test.js +0 -2
  431. package/dist/schema/MutationEvent.test.js.map +0 -1
  432. package/dist/schema/mutations.d.ts +0 -107
  433. package/dist/schema/mutations.d.ts.map +0 -1
  434. package/dist/schema/mutations.js +0 -42
  435. package/dist/schema/mutations.js.map +0 -1
  436. package/dist/schema/schema-helpers.d.ts.map +0 -1
  437. package/dist/schema/schema-helpers.js.map +0 -1
  438. package/dist/schema/system-tables.d.ts +0 -399
  439. package/dist/schema/system-tables.d.ts.map +0 -1
  440. package/dist/schema/system-tables.js +0 -59
  441. package/dist/schema/system-tables.js.map +0 -1
  442. package/dist/schema/table-def.d.ts +0 -156
  443. package/dist/schema/table-def.d.ts.map +0 -1
  444. package/dist/schema/table-def.js +0 -79
  445. package/dist/schema/table-def.js.map +0 -1
  446. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  447. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  448. package/dist/schema-management/validate-mutation-defs.js +0 -39
  449. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  450. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  451. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  452. package/dist/sync/client-session-sync-processor.js +0 -131
  453. package/dist/sync/client-session-sync-processor.js.map +0 -1
  454. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  455. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  456. package/src/derived-mutations.test.ts +0 -101
  457. package/src/derived-mutations.ts +0 -170
  458. package/src/devtools/devtools-bridge.ts +0 -14
  459. package/src/devtools/devtools-window-message.ts +0 -27
  460. package/src/devtools/index.ts +0 -48
  461. package/src/init-singleton-tables.ts +0 -24
  462. package/src/leader-thread/apply-mutation.ts +0 -161
  463. package/src/leader-thread/mutationlog.ts +0 -46
  464. package/src/leader-thread/pull-queue-set.ts +0 -58
  465. package/src/mutation.ts +0 -91
  466. package/src/query-builder/api.ts +0 -289
  467. package/src/query-builder/impl.test.ts +0 -239
  468. package/src/query-builder/impl.ts +0 -285
  469. package/src/query-info.ts +0 -78
  470. package/src/rehydrate-from-mutationlog.ts +0 -119
  471. package/src/schema/EventId.test.ts +0 -12
  472. package/src/schema/EventId.ts +0 -60
  473. package/src/schema/MutationEvent.ts +0 -181
  474. package/src/schema/mutations.ts +0 -192
  475. package/src/schema/system-tables.ts +0 -105
  476. package/src/schema/table-def.ts +0 -343
  477. package/src/schema-management/validate-mutation-defs.ts +0 -63
  478. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  479. package/tsconfig.json +0 -11
  480. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,24 +1,24 @@
1
1
  import { notYetImplemented } from '@livestore/utils'
2
2
 
3
- import type * as EventId from '../../schema/EventId.js'
4
3
  import type {
4
+ EventDefFactInput,
5
+ EventDefFacts,
6
+ EventDefFactsGroup,
7
+ EventDefFactsSnapshot,
5
8
  FactsCallback,
6
- MutationEventFactInput,
7
- MutationEventFacts,
8
- MutationEventFactsGroup,
9
- MutationEventFactsSnapshot,
10
- } from '../../schema/mutations.js'
9
+ } from '../../schema/EventDef.js'
10
+ import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
11
11
  import { graphologyDag } from './graphology_.js'
12
12
  import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.js'
13
13
 
14
14
  export const factsSnapshotForEvents = (
15
15
  events: HistoryDagNode[],
16
- endEventId: EventId.EventId,
17
- ): MutationEventFactsSnapshot => {
16
+ endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber,
17
+ ): EventDefFactsSnapshot => {
18
18
  const facts = new Map<string, any>()
19
19
 
20
20
  for (const event of events) {
21
- if (compareEventIds(event.id, endEventId) > 0) {
21
+ if (compareEventSequenceNumbers(event.seqNum, endEventSequenceNumber) > 0) {
22
22
  return facts
23
23
  }
24
24
 
@@ -30,15 +30,15 @@ export const factsSnapshotForEvents = (
30
30
 
31
31
  export const factsSnapshotForDag = (
32
32
  dag: HistoryDag,
33
- endEventId: EventId.EventId | undefined,
34
- ): MutationEventFactsSnapshot => {
33
+ endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber | undefined,
34
+ ): EventDefFactsSnapshot => {
35
35
  const facts = new Map<string, any>()
36
36
 
37
- const orderedEventIdStrs = graphologyDag.topologicalSort(dag)
37
+ const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag)
38
38
 
39
- for (let i = 0; i < orderedEventIdStrs.length; i++) {
40
- const event = dag.getNodeAttributes(orderedEventIdStrs[i]!)
41
- if (endEventId !== undefined && compareEventIds(event.id, endEventId) > 0) {
39
+ for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
40
+ const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
41
+ if (endEventSequenceNumber !== undefined && compareEventSequenceNumbers(event.seqNum, endEventSequenceNumber) > 0) {
42
42
  return facts
43
43
  }
44
44
 
@@ -56,20 +56,20 @@ export type FactValidationResult =
56
56
  success: false
57
57
  /** Index of the item that caused the validation to fail */
58
58
  index: number
59
- requiredFacts: MutationEventFacts
59
+ requiredFacts: EventDefFacts
60
60
  mismatch: {
61
- existing: MutationEventFacts
62
- required: MutationEventFacts
61
+ existing: EventDefFacts
62
+ required: EventDefFacts
63
63
  }
64
- currentSnapshot: MutationEventFacts
64
+ currentSnapshot: EventDefFacts
65
65
  }
66
66
 
67
67
  export const validateFacts = ({
68
68
  factGroups,
69
69
  initialSnapshot,
70
70
  }: {
71
- factGroups: MutationEventFactsGroup[]
72
- initialSnapshot: MutationEventFactsSnapshot
71
+ factGroups: EventDefFactsGroup[]
72
+ initialSnapshot: EventDefFactsSnapshot
73
73
  }): FactValidationResult => {
74
74
  const currentSnapshot = new Map(initialSnapshot)
75
75
 
@@ -102,13 +102,13 @@ export const validateFacts = ({
102
102
  }
103
103
  }
104
104
 
105
- export const applyFactGroups = (factGroups: MutationEventFactsGroup[], snapshot: MutationEventFactsSnapshot) => {
105
+ export const applyFactGroups = (factGroups: EventDefFactsGroup[], snapshot: EventDefFactsSnapshot) => {
106
106
  for (const factGroup of factGroups) {
107
107
  applyFactGroup(factGroup, snapshot)
108
108
  }
109
109
  }
110
110
 
111
- export const applyFactGroup = (factGroup: MutationEventFactsGroup, snapshot: MutationEventFactsSnapshot) => {
111
+ export const applyFactGroup = (factGroup: EventDefFactsGroup, snapshot: EventDefFactsSnapshot) => {
112
112
  for (const [key, value] of factGroup.modifySet) {
113
113
  snapshot.set(key, value)
114
114
  }
@@ -119,7 +119,7 @@ export const applyFactGroup = (factGroup: MutationEventFactsGroup, snapshot: Mut
119
119
  }
120
120
 
121
121
  /** Check if setA is a subset of setB */
122
- const isSubSetMapByValue = (setA: MutationEventFacts, setB: MutationEventFacts) => {
122
+ const isSubSetMapByValue = (setA: EventDefFacts, setB: EventDefFacts) => {
123
123
  for (const [key, value] of setA) {
124
124
  if (setB.get(key) !== value) {
125
125
  return false
@@ -129,7 +129,7 @@ const isSubSetMapByValue = (setA: MutationEventFacts, setB: MutationEventFacts)
129
129
  }
130
130
 
131
131
  /** Check if setA is a subset of setB */
132
- const isSubSetMapByKey = (setA: MutationEventFacts, setB: MutationEventFacts) => {
132
+ const isSubSetMapByKey = (setA: EventDefFacts, setB: EventDefFacts) => {
133
133
  for (const [key, _value] of setA) {
134
134
  if (!setB.has(key)) {
135
135
  return false
@@ -139,17 +139,16 @@ const isSubSetMapByKey = (setA: MutationEventFacts, setB: MutationEventFacts) =>
139
139
  }
140
140
 
141
141
  /** Check if groupA depends on groupB */
142
- export const dependsOn = (groupA: MutationEventFactsGroup, groupB: MutationEventFactsGroup): boolean =>
142
+ export const dependsOn = (groupA: EventDefFactsGroup, groupB: EventDefFactsGroup): boolean =>
143
143
  factsIntersect(groupA.depRead, groupB.modifySet) ||
144
144
  factsIntersect(groupA.depRead, groupB.modifyUnset) ||
145
145
  factsIntersect(groupA.depRequire, groupB.modifySet) ||
146
146
  factsIntersect(groupA.depRequire, groupB.modifyUnset)
147
147
 
148
- export const replacesFacts = (groupA: MutationEventFactsGroup, groupB: MutationEventFactsGroup): boolean => {
149
- const replaces = (a: MutationEventFacts, b: MutationEventFacts) => a.size > 0 && b.size > 0 && isSameMapByKey(a, b)
148
+ export const replacesFacts = (groupA: EventDefFactsGroup, groupB: EventDefFactsGroup): boolean => {
149
+ const replaces = (a: EventDefFacts, b: EventDefFacts) => a.size > 0 && b.size > 0 && isSameMapByKey(a, b)
150
150
 
151
- const noFactsOrSame = (a: MutationEventFacts, b: MutationEventFacts) =>
152
- a.size === 0 || b.size === 0 || isSameMapByKey(a, b)
151
+ const noFactsOrSame = (a: EventDefFacts, b: EventDefFacts) => a.size === 0 || b.size === 0 || isSameMapByKey(a, b)
153
152
 
154
153
  return (
155
154
  (replaces(groupA.modifySet, groupB.modifySet) && noFactsOrSame(groupA.modifyUnset, groupB.modifyUnset)) ||
@@ -159,16 +158,16 @@ export const replacesFacts = (groupA: MutationEventFactsGroup, groupB: MutationE
159
158
  )
160
159
  }
161
160
 
162
- export const isSameMapByKey = (set: MutationEventFacts, otherSet: MutationEventFacts) =>
161
+ export const isSameMapByKey = (set: EventDefFacts, otherSet: EventDefFacts) =>
163
162
  set.size === otherSet.size && isSubSetMapByKey(set, otherSet)
164
163
 
165
- export const factsToString = (facts: MutationEventFacts) => {
164
+ export const factsToString = (facts: EventDefFacts) => {
166
165
  return Array.from(facts)
167
166
  .map(([key, value]) => (value === EMPTY_FACT_VALUE ? key : `${key}=${value}`))
168
167
  .join(', ')
169
168
  }
170
169
 
171
- export const factsIntersect = (setA: MutationEventFacts, setB: MutationEventFacts): boolean => {
170
+ export const factsIntersect = (setA: EventDefFacts, setB: EventDefFacts): boolean => {
172
171
  for (const [key, _value] of setA) {
173
172
  if (setB.has(key)) {
174
173
  return true
@@ -177,16 +176,16 @@ export const factsIntersect = (setA: MutationEventFacts, setB: MutationEventFact
177
176
  return false
178
177
  }
179
178
 
180
- export const getFactsGroupForMutationArgs = ({
179
+ export const getFactsGroupForEventArgs = ({
181
180
  factsCallback,
182
181
  args,
183
182
  currentFacts,
184
183
  }: {
185
184
  factsCallback: FactsCallback<any> | undefined
186
185
  args: any
187
- currentFacts: MutationEventFactsSnapshot
188
- }): MutationEventFactsGroup => {
189
- const depRead: MutationEventFactsSnapshot = new Map<string, any>()
186
+ currentFacts: EventDefFactsSnapshot
187
+ }): EventDefFactsGroup => {
188
+ const depRead: EventDefFactsSnapshot = new Map<string, any>()
190
189
  const factsSnapshotProxy = new Proxy(currentFacts, {
191
190
  get: (target, prop) => {
192
191
  if (prop === 'has') {
@@ -201,12 +200,12 @@ export const getFactsGroupForMutationArgs = ({
201
200
  }
202
201
  }
203
202
 
204
- notYetImplemented(`getFactsGroupForMutationArgs: ${prop.toString()} is not yet implemented`)
203
+ notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
205
204
  },
206
205
  })
207
206
 
208
207
  const factsRes = factsCallback?.(args, factsSnapshotProxy)
209
- const iterableToMap = (iterable: Iterable<MutationEventFactInput>) => {
208
+ const iterableToMap = (iterable: Iterable<EventDefFactInput>) => {
210
209
  const map = new Map()
211
210
  for (const item of iterable) {
212
211
  if (typeof item === 'string') {
@@ -227,9 +226,12 @@ export const getFactsGroupForMutationArgs = ({
227
226
  return facts
228
227
  }
229
228
 
230
- export const compareEventIds = (a: EventId.EventId, b: EventId.EventId) => {
229
+ export const compareEventSequenceNumbers = (
230
+ a: EventSequenceNumber.EventSequenceNumber,
231
+ b: EventSequenceNumber.EventSequenceNumber,
232
+ ) => {
231
233
  if (a.global !== b.global) {
232
234
  return a.global - b.global
233
235
  }
234
- return a.local - b.local
236
+ return a.client - b.client
235
237
  }
@@ -1,5 +1,5 @@
1
- import * as EventId from '../../schema/EventId.js'
2
- import type { MutationEventFactsGroup } from '../../schema/mutations.js'
1
+ import type { EventDefFactsGroup } from '../../schema/EventDef.js'
2
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
3
3
  import { graphology } from './graphology_.js'
4
4
 
5
5
  export const connectionTypeOptions = ['parent', 'facts'] as const
@@ -20,25 +20,32 @@ export const emptyHistoryDag = (): HistoryDag =>
20
20
  })
21
21
 
22
22
  // TODO consider making `ROOT_ID` parent to itself
23
- export const rootParentId = EventId.make({ global: EventId.ROOT.global - 1, local: EventId.localDefault })
23
+ export const rootParentNum = EventSequenceNumber.make({
24
+ global: EventSequenceNumber.ROOT.global - 1,
25
+ client: EventSequenceNumber.clientDefault,
26
+ })
24
27
 
25
28
  export type HistoryDagNode = {
26
- id: EventId.EventId
27
- parentId: EventId.EventId
28
- mutation: string
29
+ seqNum: EventSequenceNumber.EventSequenceNumber
30
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber
31
+ name: string
29
32
  args: any
30
33
  /** Facts are being used for conflict detection and history compaction */
31
- factsGroup: MutationEventFactsGroup
34
+ factsGroup: EventDefFactsGroup
32
35
  meta?: any
36
+ clientId: string
37
+ sessionId: string | undefined
33
38
  }
34
39
 
35
40
  export const rootEventNode: HistoryDagNode = {
36
- id: EventId.ROOT,
37
- parentId: rootParentId,
41
+ seqNum: EventSequenceNumber.ROOT,
42
+ parentSeqNum: rootParentNum,
38
43
  // unused below
39
- mutation: '__Root__',
44
+ name: '__Root__',
40
45
  args: {},
41
46
  factsGroup: { modifySet: new Map(), modifyUnset: new Map(), depRequire: new Map(), depRead: new Map() },
47
+ clientId: 'root',
48
+ sessionId: undefined,
42
49
  }
43
50
 
44
51
  export const EMPTY_FACT_VALUE = Symbol('EMPTY_FACT_VALUE')
@@ -1,9 +1,6 @@
1
- import type * as EventId from '../../schema/EventId.js'
1
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
2
2
  import { factsToString, validateFacts } from './facts.js'
3
- import { emptyHistoryDag, type HistoryDagNode, rootParentId } from './history-dag-common.js'
4
-
5
- export const eventIdToString = (eventId: EventId.EventId) =>
6
- eventId.local === 0 ? eventId.global.toString() : `${eventId.global}.${eventId.local}`
3
+ import { emptyHistoryDag, type HistoryDagNode, rootParentNum } from './history-dag-common.js'
7
4
 
8
5
  export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skipFactsCheck: boolean }) => {
9
6
  if (options?.skipFactsCheck !== true) {
@@ -14,18 +11,20 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
14
11
 
15
12
  if (validationResult.success === false) {
16
13
  throw new Error(
17
- `Mutation ${dagNodes[validationResult.index]!.mutation} requires facts that have not been set yet.\nRequires: ${factsToString(validationResult.requiredFacts)}\nFacts Snapshot: ${factsToString(validationResult.currentSnapshot)}`,
14
+ `Event ${dagNodes[validationResult.index]!.name} requires facts that have not been set yet.\nRequires: ${factsToString(validationResult.requiredFacts)}\nFacts Snapshot: ${factsToString(validationResult.currentSnapshot)}`,
18
15
  )
19
16
  }
20
17
  }
21
18
 
22
19
  const dag = emptyHistoryDag()
23
20
 
24
- dagNodes.forEach((node) => dag.addNode(eventIdToString(node.id), node))
21
+ dagNodes.forEach((node) => dag.addNode(EventSequenceNumber.toString(node.seqNum), node))
25
22
 
26
23
  dagNodes.forEach((node) => {
27
- if (eventIdToString(node.parentId) !== eventIdToString(rootParentId)) {
28
- dag.addEdge(eventIdToString(node.parentId), eventIdToString(node.id), { type: 'parent' })
24
+ if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
25
+ dag.addEdge(EventSequenceNumber.toString(node.parentSeqNum), EventSequenceNumber.toString(node.seqNum), {
26
+ type: 'parent',
27
+ })
29
28
  }
30
29
  })
31
30
 
@@ -34,28 +33,28 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
34
33
  for (const factKey of factKeys) {
35
34
  // Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
36
35
  const depNode = (() => {
37
- let currentIdStr = eventIdToString(node.id)
36
+ let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
38
37
 
39
- while (currentIdStr !== eventIdToString(rootParentId)) {
40
- const parentEdge = dag.inEdges(currentIdStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
38
+ while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
39
+ const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
41
40
  if (!parentEdge) return null
42
41
 
43
- const parentIdStr = dag.source(parentEdge)
44
- const parentNode = dag.getNodeAttributes(parentIdStr)
42
+ const parentSeqNumStr = dag.source(parentEdge)
43
+ const parentNode = dag.getNodeAttributes(parentSeqNumStr)
45
44
 
46
45
  if (parentNode.factsGroup.modifySet.has(factKey) || parentNode.factsGroup.modifyUnset.has(factKey)) {
47
46
  return parentNode
48
47
  }
49
48
 
50
- currentIdStr = parentIdStr
49
+ currentSeqNumStr = parentSeqNumStr
51
50
  }
52
51
 
53
52
  return null
54
53
  })()
55
54
 
56
55
  if (depNode) {
57
- const depNodeIdStr = eventIdToString(depNode.id)
58
- const nodeIdStr = eventIdToString(node.id)
56
+ const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
57
+ const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
59
58
  if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
60
59
  dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
61
60
  }
@@ -1,11 +1,11 @@
1
- import * as EventId from '../../schema/EventId.js'
2
- import type * as MutationEvent from '../../schema/MutationEvent.js'
3
- import type { MutationDef, MutationEventFactsSnapshot } from '../../schema/mutations.js'
1
+ import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef.js'
2
+ import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
3
+ import type * as LiveStoreEvent from '../../schema/LiveStoreEvent.js'
4
4
  import {
5
5
  applyFactGroups,
6
6
  factsIntersect,
7
7
  type FactValidationResult,
8
- getFactsGroupForMutationArgs,
8
+ getFactsGroupForEventArgs,
9
9
  validateFacts,
10
10
  } from './facts.js'
11
11
  import type { HistoryDagNode } from './history-dag-common.js'
@@ -19,13 +19,13 @@ export type RebaseInput = {
19
19
  newRemoteEvents: RebaseEventWithConflict[]
20
20
  pendingLocalEvents: RebaseEventWithConflict[]
21
21
  validate: (args: {
22
- rebasedLocalEvents: MutationEvent.PartialAnyDecoded[]
23
- mutationDefs: Record<string, MutationDef.Any>
22
+ rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
23
+ eventDefs: Record<string, EventDef.Any>
24
24
  }) => FactValidationResult
25
25
  }
26
26
 
27
27
  export type RebaseOutput = {
28
- rebasedLocalEvents: MutationEvent.PartialAnyDecoded[]
28
+ rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
29
29
  }
30
30
 
31
31
  export type RebaseFn = (input: RebaseInput) => RebaseOutput
@@ -43,12 +43,16 @@ export const rebaseEvents = ({
43
43
  pendingLocalEvents,
44
44
  newRemoteEvents,
45
45
  currentFactsSnapshot,
46
+ clientId,
47
+ sessionId,
46
48
  }: {
47
49
  pendingLocalEvents: HistoryDagNode[]
48
50
  newRemoteEvents: HistoryDagNode[]
49
51
  rebaseFn: RebaseFn
50
- currentFactsSnapshot: MutationEventFactsSnapshot
51
- }): ReadonlyArray<MutationEvent.AnyDecoded> => {
52
+ currentFactsSnapshot: EventDefFactsSnapshot
53
+ clientId: string
54
+ sessionId: string
55
+ }): ReadonlyArray<LiveStoreEvent.AnyDecoded> => {
52
56
  const initialSnapshot = new Map(currentFactsSnapshot)
53
57
  applyFactGroups(
54
58
  newRemoteEvents.map((event) => event.factsGroup),
@@ -72,11 +76,11 @@ export const rebaseEvents = ({
72
76
  factsIntersect(pending.factsGroup.modifySet, remote.factsGroup.modifySet),
73
77
  ),
74
78
  })),
75
- validate: ({ rebasedLocalEvents, mutationDefs }) =>
79
+ validate: ({ rebasedLocalEvents, eventDefs }) =>
76
80
  validateFacts({
77
81
  factGroups: rebasedLocalEvents.map((event) =>
78
- getFactsGroupForMutationArgs({
79
- factsCallback: mutationDefs[event.mutation]!.options.facts,
82
+ getFactsGroupForEventArgs({
83
+ factsCallback: eventDefs[event.name]!.options.facts,
80
84
  args: event.args,
81
85
  currentFacts: new Map(),
82
86
  }),
@@ -84,15 +88,23 @@ export const rebaseEvents = ({
84
88
  initialSnapshot,
85
89
  }),
86
90
  })
87
- const headGlobalId = newRemoteEvents.at(-1)!.id.global
91
+ const headGlobalId = newRemoteEvents.at(-1)!.seqNum.global
88
92
 
89
93
  return rebasedLocalEvents.map(
90
94
  (event, index) =>
91
95
  ({
92
- id: EventId.make({ global: headGlobalId + index + 1, local: EventId.localDefault }),
93
- parentId: EventId.make({ global: headGlobalId + index, local: EventId.localDefault }),
94
- mutation: event.mutation,
96
+ seqNum: EventSequenceNumber.make({
97
+ global: headGlobalId + index + 1,
98
+ client: EventSequenceNumber.clientDefault,
99
+ }),
100
+ parentSeqNum: EventSequenceNumber.make({
101
+ global: headGlobalId + index,
102
+ client: EventSequenceNumber.clientDefault,
103
+ }),
104
+ name: event.name,
95
105
  args: event.args,
96
- }) satisfies MutationEvent.AnyDecoded,
106
+ clientId,
107
+ sessionId,
108
+ }) satisfies LiveStoreEvent.AnyDecoded,
97
109
  )
98
110
  }
@@ -1,21 +1,21 @@
1
- import { defineMutation } from '@livestore/common/schema'
1
+ import { defineEvent } from '@livestore/common/schema'
2
2
  import { Schema } from '@livestore/utils/effect'
3
3
  import { describe, expect, it } from 'vitest'
4
4
 
5
5
  import { compactEvents } from '../compact-events.js'
6
6
  import { historyDagFromNodes } from '../history-dag.js'
7
7
  import { customSerializer } from './compact-events.test.js'
8
- import { toEventNodes } from './mutation-fixtures.js'
8
+ import { printEvent, toEventNodes } from './event-fixtures.js'
9
9
 
10
10
  expect.addSnapshotSerializer(customSerializer)
11
11
 
12
12
  const compact = (events: any[]) => {
13
- const dag = historyDagFromNodes(toEventNodes(events, mutations))
13
+ const dag = historyDagFromNodes(toEventNodes(events, eventDefs, 'client-id', 'session-id'))
14
14
  const compacted = compactEvents(dag)
15
15
 
16
16
  return Array.from(compacted.dag.nodeEntries())
17
17
  .map((_) => _.attributes)
18
- .map(({ factsGroup, ...rest }) => ({ ...rest, facts: factsGroup }))
18
+ .map(printEvent)
19
19
  .slice(1)
20
20
  }
21
21
 
@@ -23,98 +23,98 @@ const facts = {
23
23
  multiplyByZero: `multiplyByZero`,
24
24
  }
25
25
 
26
- const mutations = {
27
- add: defineMutation('add', Schema.Struct({ value: Schema.Number }), 'UPDATE values SET value = value + $value', {}),
28
- multiply: defineMutation(
29
- 'multiply',
30
- Schema.Struct({ value: Schema.Number }),
31
- 'UPDATE values SET value = value * $value',
32
- {
33
- facts: ({ value }, currentFacts) => ({
34
- modify: {
35
- set: value === 0 || currentFacts.has(facts.multiplyByZero) ? [facts.multiplyByZero] : [],
36
- unset: value === 0 ? [] : [facts.multiplyByZero],
37
- },
38
- }),
39
- },
40
- ),
26
+ const eventDefs = {
27
+ add: defineEvent({
28
+ name: 'add',
29
+ schema: Schema.Struct({ value: Schema.Number }),
30
+ }),
31
+ multiply: defineEvent({
32
+ name: 'multiply',
33
+ schema: Schema.Struct({ value: Schema.Number }),
34
+ facts: ({ value }, currentFacts) => ({
35
+ modify: {
36
+ set: value === 0 || currentFacts.has(facts.multiplyByZero) ? [facts.multiplyByZero] : [],
37
+ unset: value === 0 ? [] : [facts.multiplyByZero],
38
+ },
39
+ }),
40
+ }),
41
41
  // TODO divide by zero
42
42
  }
43
43
 
44
44
  describe('compactEvents calculator', () => {
45
45
  it('1 + 1', () => {
46
46
  const expected = compact([
47
- mutations.add({ value: 1 }), // 0
48
- mutations.add({ value: 1 }), // 1
47
+ eventDefs.add({ value: 1 }), // 0
48
+ eventDefs.add({ value: 1 }), // 1
49
49
  ])
50
50
 
51
51
  expect(expected).toMatchInlineSnapshot(`
52
52
  [
53
- { id: 0, parentId: -1, mutation: "add", args: { value: 1 }, facts: "" }
54
- { id: 1, parentId: 0, mutation: "add", args: { value: 1 }, facts: "" }
53
+ { seqNum: "e1", parentSeqNum: "e0", name: "add", args: { value: 1 }, clientId: "client-id", sessionId: "session-id", facts: "" }
54
+ { seqNum: "e2", parentSeqNum: "e1", name: "add", args: { value: 1 }, clientId: "client-id", sessionId: "session-id", facts: "" }
55
55
  ]
56
56
  `)
57
57
  })
58
58
 
59
59
  it('2 * 2', () => {
60
60
  const expected = compact([
61
- mutations.multiply({ value: 2 }), // 0
62
- mutations.multiply({ value: 2 }), // 1
61
+ eventDefs.multiply({ value: 2 }), // 0
62
+ eventDefs.multiply({ value: 2 }), // 1
63
63
  ])
64
64
 
65
65
  expect(expected).toMatchInlineSnapshot(`
66
66
  [
67
- { id: 0, parentId: -1, mutation: "multiply", args: { value: 2 }, facts: "?multiplyByZero -multiplyByZero" }
68
- { id: 1, parentId: 0, mutation: "multiply", args: { value: 2 }, facts: "?multiplyByZero -multiplyByZero" }
67
+ { seqNum: "e1", parentSeqNum: "e0", name: "multiply", args: { value: 2 }, clientId: "client-id", sessionId: "session-id", facts: "?multiplyByZero -multiplyByZero" }
68
+ { seqNum: "e2", parentSeqNum: "e1", name: "multiply", args: { value: 2 }, clientId: "client-id", sessionId: "session-id", facts: "?multiplyByZero -multiplyByZero" }
69
69
  ]
70
70
  `)
71
71
  })
72
72
 
73
73
  it('2 * 2 * 0', () => {
74
74
  const expected = compact([
75
- mutations.multiply({ value: 2 }), // 0
76
- mutations.multiply({ value: 2 }), // 1
77
- mutations.multiply({ value: 0 }), // 2
75
+ eventDefs.multiply({ value: 2 }), // 0
76
+ eventDefs.multiply({ value: 2 }), // 1
77
+ eventDefs.multiply({ value: 0 }), // 2
78
78
  ])
79
79
 
80
80
  expect(expected).toMatchInlineSnapshot(`
81
81
  [
82
- { id: 2, parentId: -1, mutation: "multiply", args: { value: 0 }, facts: "+multiplyByZero" }
82
+ { seqNum: "e3", parentSeqNum: "e0", name: "multiply", args: { value: 0 }, clientId: "client-id", sessionId: "session-id", facts: "+multiplyByZero" }
83
83
  ]
84
84
  `)
85
85
  })
86
86
 
87
87
  it('2 * 2 * 0 + 1', () => {
88
88
  const expected = compact([
89
- mutations.multiply({ value: 2 }), // 0
90
- mutations.multiply({ value: 2 }), // 1
91
- mutations.multiply({ value: 0 }), // 2
92
- mutations.add({ value: 1 }), // 3
89
+ eventDefs.multiply({ value: 2 }), // 0
90
+ eventDefs.multiply({ value: 2 }), // 1
91
+ eventDefs.multiply({ value: 0 }), // 2
92
+ eventDefs.add({ value: 1 }), // 3
93
93
  ])
94
94
 
95
95
  expect(expected).toMatchInlineSnapshot(`
96
96
  [
97
- { id: 2, parentId: -1, mutation: "multiply", args: { value: 0 }, facts: "+multiplyByZero" }
98
- { id: 3, parentId: 2, mutation: "add", args: { value: 1 }, facts: "" }
97
+ { seqNum: "e3", parentSeqNum: "e0", name: "multiply", args: { value: 0 }, clientId: "client-id", sessionId: "session-id", facts: "+multiplyByZero" }
98
+ { seqNum: "e4", parentSeqNum: "e3", name: "add", args: { value: 1 }, clientId: "client-id", sessionId: "session-id", facts: "" }
99
99
  ]
100
100
  `)
101
101
  })
102
102
 
103
103
  it('1 + 2 * 0 * 2 + 1', () => {
104
104
  const expected = compact([
105
- mutations.add({ value: 1 }), // 0
106
- mutations.multiply({ value: 2 }), // 1
107
- mutations.multiply({ value: 0 }), // 2
108
- mutations.multiply({ value: 2 }), // 3
109
- mutations.add({ value: 1 }), // 4
105
+ eventDefs.add({ value: 1 }), // 0
106
+ eventDefs.multiply({ value: 2 }), // 1
107
+ eventDefs.multiply({ value: 0 }), // 2
108
+ eventDefs.multiply({ value: 2 }), // 3
109
+ eventDefs.add({ value: 1 }), // 4
110
110
  ])
111
111
 
112
112
  expect(expected).toMatchInlineSnapshot(`
113
113
  [
114
- { id: 0, parentId: -1, mutation: "add", args: { value: 1 }, facts: "" }
115
- { id: 2, parentId: 0, mutation: "multiply", args: { value: 0 }, facts: "+multiplyByZero" }
116
- { id: 3, parentId: 2, mutation: "multiply", args: { value: 2 }, facts: "?multiplyByZero +multiplyByZero -multiplyByZero" }
117
- { id: 4, parentId: 3, mutation: "add", args: { value: 1 }, facts: "" }
114
+ { seqNum: "e1", parentSeqNum: "e0", name: "add", args: { value: 1 }, clientId: "client-id", sessionId: "session-id", facts: "" }
115
+ { seqNum: "e3", parentSeqNum: "e1", name: "multiply", args: { value: 0 }, clientId: "client-id", sessionId: "session-id", facts: "+multiplyByZero" }
116
+ { seqNum: "e4", parentSeqNum: "e3", name: "multiply", args: { value: 2 }, clientId: "client-id", sessionId: "session-id", facts: "?multiplyByZero +multiplyByZero -multiplyByZero" }
117
+ { seqNum: "e5", parentSeqNum: "e4", name: "add", args: { value: 1 }, clientId: "client-id", sessionId: "session-id", facts: "" }
118
118
  ]
119
119
  `)
120
120
  })