@livestore/common 0.3.0-dev.9 → 0.3.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. package/LICENSE +201 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/fixture.d.ts +83 -221
  4. package/dist/__tests__/fixture.d.ts.map +1 -1
  5. package/dist/__tests__/fixture.js +33 -11
  6. package/dist/__tests__/fixture.js.map +1 -1
  7. package/dist/adapter-types.d.ts +120 -64
  8. package/dist/adapter-types.d.ts.map +1 -1
  9. package/dist/adapter-types.js +39 -8
  10. package/dist/adapter-types.js.map +1 -1
  11. package/dist/bounded-collections.d.ts.map +1 -1
  12. package/dist/debug-info.d.ts +1 -1
  13. package/dist/debug-info.d.ts.map +1 -1
  14. package/dist/debug-info.js +1 -0
  15. package/dist/debug-info.js.map +1 -1
  16. package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
  17. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  18. package/dist/devtools/devtools-messages-client-session.js +97 -0
  19. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  20. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  21. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  22. package/dist/devtools/devtools-messages-common.js +60 -0
  23. package/dist/devtools/devtools-messages-common.js.map +1 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  25. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  26. package/dist/devtools/devtools-messages-leader.js +147 -0
  27. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  28. package/dist/devtools/devtools-messages.d.ts +3 -580
  29. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  30. package/dist/devtools/devtools-messages.js +3 -174
  31. package/dist/devtools/devtools-messages.js.map +1 -1
  32. package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
  33. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  34. package/dist/devtools/devtools-sessioninfo.js +36 -0
  35. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  36. package/dist/devtools/mod.d.ts +55 -0
  37. package/dist/devtools/mod.d.ts.map +1 -0
  38. package/dist/devtools/mod.js +33 -0
  39. package/dist/devtools/mod.js.map +1 -0
  40. package/dist/index.d.ts +7 -9
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -9
  43. package/dist/index.js.map +1 -1
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts +36 -11
  45. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  46. package/dist/leader-thread/LeaderSyncProcessor.js +426 -252
  47. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  48. package/dist/leader-thread/connection.d.ts +34 -6
  49. package/dist/leader-thread/connection.d.ts.map +1 -1
  50. package/dist/leader-thread/connection.js +22 -7
  51. package/dist/leader-thread/connection.js.map +1 -1
  52. package/dist/leader-thread/eventlog.d.ts +27 -0
  53. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  54. package/dist/leader-thread/eventlog.js +119 -0
  55. package/dist/leader-thread/eventlog.js.map +1 -0
  56. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  57. package/dist/leader-thread/leader-worker-devtools.js +155 -80
  58. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts +22 -9
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  62. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  63. package/dist/leader-thread/materialize-event.d.ts +16 -0
  64. package/dist/leader-thread/materialize-event.d.ts.map +1 -0
  65. package/dist/leader-thread/materialize-event.js +109 -0
  66. package/dist/leader-thread/materialize-event.js.map +1 -0
  67. package/dist/leader-thread/mod.d.ts +1 -1
  68. package/dist/leader-thread/mod.d.ts.map +1 -1
  69. package/dist/leader-thread/mod.js +1 -1
  70. package/dist/leader-thread/mod.js.map +1 -1
  71. package/dist/leader-thread/recreate-db.d.ts +4 -2
  72. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  73. package/dist/leader-thread/recreate-db.js +28 -32
  74. package/dist/leader-thread/recreate-db.js.map +1 -1
  75. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  76. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  77. package/dist/leader-thread/shutdown-channel.js +2 -4
  78. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  79. package/dist/leader-thread/types.d.ts +79 -38
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +1 -3
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/make-client-session.d.ts +23 -0
  84. package/dist/make-client-session.d.ts.map +1 -0
  85. package/dist/make-client-session.js +57 -0
  86. package/dist/make-client-session.js.map +1 -0
  87. package/dist/materializer-helper.d.ts +23 -0
  88. package/dist/materializer-helper.d.ts.map +1 -0
  89. package/dist/materializer-helper.js +86 -0
  90. package/dist/materializer-helper.js.map +1 -0
  91. package/dist/otel.d.ts +2 -0
  92. package/dist/otel.d.ts.map +1 -1
  93. package/dist/otel.js +5 -0
  94. package/dist/otel.js.map +1 -1
  95. package/dist/rematerialize-from-eventlog.d.ts +14 -0
  96. package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
  97. package/dist/rematerialize-from-eventlog.js +64 -0
  98. package/dist/rematerialize-from-eventlog.js.map +1 -0
  99. package/dist/schema/EventDef.d.ts +146 -0
  100. package/dist/schema/EventDef.d.ts.map +1 -0
  101. package/dist/schema/EventDef.js +58 -0
  102. package/dist/schema/EventDef.js.map +1 -0
  103. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  104. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  105. package/dist/schema/EventSequenceNumber.js +82 -0
  106. package/dist/schema/EventSequenceNumber.js.map +1 -0
  107. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  108. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  109. package/dist/schema/EventSequenceNumber.test.js +11 -0
  110. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  111. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  112. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  113. package/dist/schema/LiveStoreEvent.js +117 -0
  114. package/dist/schema/LiveStoreEvent.js.map +1 -0
  115. package/dist/schema/events.d.ts +2 -0
  116. package/dist/schema/events.d.ts.map +1 -0
  117. package/dist/schema/events.js +2 -0
  118. package/dist/schema/events.js.map +1 -0
  119. package/dist/schema/mod.d.ts +8 -6
  120. package/dist/schema/mod.d.ts.map +1 -1
  121. package/dist/schema/mod.js +8 -6
  122. package/dist/schema/mod.js.map +1 -1
  123. package/dist/schema/schema.d.ts +50 -32
  124. package/dist/schema/schema.d.ts.map +1 -1
  125. package/dist/schema/schema.js +36 -43
  126. package/dist/schema/schema.js.map +1 -1
  127. package/dist/schema/state/mod.d.ts +3 -0
  128. package/dist/schema/state/mod.d.ts.map +1 -0
  129. package/dist/schema/state/mod.js +3 -0
  130. package/dist/schema/state/mod.js.map +1 -0
  131. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  132. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  133. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  134. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  135. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  136. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  137. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  138. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  139. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  140. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  141. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  142. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  143. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  144. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  145. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  146. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  147. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  148. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  149. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  150. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  151. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  152. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  153. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  154. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  155. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  156. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  157. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  158. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  159. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  160. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  161. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  162. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  163. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  164. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  165. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  166. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  167. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  168. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  169. package/dist/schema/state/sqlite/mod.js +41 -0
  170. package/dist/schema/state/sqlite/mod.js.map +1 -0
  171. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  172. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  173. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  174. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  175. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  176. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  177. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  178. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  179. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  180. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  181. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  182. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  183. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  184. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  185. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  186. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  187. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  188. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  189. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  190. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  191. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  192. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  193. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  194. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  195. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  196. package/dist/schema/state/sqlite/system-tables.js +88 -0
  197. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  198. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  199. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  200. package/dist/schema/state/sqlite/table-def.js +36 -0
  201. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  202. package/dist/schema-management/common.d.ts +7 -7
  203. package/dist/schema-management/common.d.ts.map +1 -1
  204. package/dist/schema-management/common.js.map +1 -1
  205. package/dist/schema-management/migrations.d.ts +6 -6
  206. package/dist/schema-management/migrations.d.ts.map +1 -1
  207. package/dist/schema-management/migrations.js +27 -18
  208. package/dist/schema-management/migrations.js.map +1 -1
  209. package/dist/schema-management/validate-schema.d.ts +8 -0
  210. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  211. package/dist/schema-management/validate-schema.js +39 -0
  212. package/dist/schema-management/validate-schema.js.map +1 -0
  213. package/dist/sql-queries/misc.d.ts.map +1 -1
  214. package/dist/sql-queries/sql-queries.d.ts +1 -1
  215. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  216. package/dist/sql-queries/sql-queries.js.map +1 -1
  217. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  218. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  219. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  220. package/dist/sql-queries/types.d.ts +2 -1
  221. package/dist/sql-queries/types.d.ts.map +1 -1
  222. package/dist/sql-queries/types.js.map +1 -1
  223. package/dist/sync/ClientSessionSyncProcessor.d.ts +40 -19
  224. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  225. package/dist/sync/ClientSessionSyncProcessor.js +149 -73
  226. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  227. package/dist/sync/next/compact-events.d.ts.map +1 -1
  228. package/dist/sync/next/compact-events.js +38 -35
  229. package/dist/sync/next/compact-events.js.map +1 -1
  230. package/dist/sync/next/facts.d.ts +21 -21
  231. package/dist/sync/next/facts.d.ts.map +1 -1
  232. package/dist/sync/next/facts.js +11 -11
  233. package/dist/sync/next/facts.js.map +1 -1
  234. package/dist/sync/next/history-dag-common.d.ts +9 -7
  235. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  236. package/dist/sync/next/history-dag-common.js +10 -5
  237. package/dist/sync/next/history-dag-common.js.map +1 -1
  238. package/dist/sync/next/history-dag.d.ts +0 -2
  239. package/dist/sync/next/history-dag.d.ts.map +1 -1
  240. package/dist/sync/next/history-dag.js +16 -14
  241. package/dist/sync/next/history-dag.js.map +1 -1
  242. package/dist/sync/next/rebase-events.d.ts +10 -8
  243. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  244. package/dist/sync/next/rebase-events.js +18 -10
  245. package/dist/sync/next/rebase-events.js.map +1 -1
  246. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  247. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  248. package/dist/sync/next/test/compact-events.test.js +77 -77
  249. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  250. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +35 -25
  251. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  252. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +83 -38
  253. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  254. package/dist/sync/next/test/mod.d.ts +1 -1
  255. package/dist/sync/next/test/mod.d.ts.map +1 -1
  256. package/dist/sync/next/test/mod.js +1 -1
  257. package/dist/sync/next/test/mod.js.map +1 -1
  258. package/dist/sync/sync.d.ts +46 -21
  259. package/dist/sync/sync.d.ts.map +1 -1
  260. package/dist/sync/sync.js +10 -6
  261. package/dist/sync/sync.js.map +1 -1
  262. package/dist/sync/syncstate.d.ts +193 -84
  263. package/dist/sync/syncstate.d.ts.map +1 -1
  264. package/dist/sync/syncstate.js +305 -151
  265. package/dist/sync/syncstate.js.map +1 -1
  266. package/dist/sync/syncstate.test.js +267 -303
  267. package/dist/sync/syncstate.test.js.map +1 -1
  268. package/dist/sync/validate-push-payload.d.ts +2 -2
  269. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  270. package/dist/sync/validate-push-payload.js +4 -4
  271. package/dist/sync/validate-push-payload.js.map +1 -1
  272. package/dist/util.d.ts +2 -2
  273. package/dist/util.d.ts.map +1 -1
  274. package/dist/version.d.ts +3 -3
  275. package/dist/version.js +3 -3
  276. package/package.json +11 -4
  277. package/src/__tests__/fixture.ts +36 -15
  278. package/src/adapter-types.ts +107 -68
  279. package/src/debug-info.ts +1 -0
  280. package/src/devtools/devtools-messages-client-session.ts +142 -0
  281. package/src/devtools/devtools-messages-common.ts +115 -0
  282. package/src/devtools/devtools-messages-leader.ts +191 -0
  283. package/src/devtools/devtools-messages.ts +3 -246
  284. package/src/devtools/devtools-sessioninfo.ts +101 -0
  285. package/src/devtools/mod.ts +59 -0
  286. package/src/index.ts +7 -9
  287. package/src/leader-thread/LeaderSyncProcessor.ts +664 -394
  288. package/src/leader-thread/connection.ts +54 -9
  289. package/src/leader-thread/eventlog.ts +199 -0
  290. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  291. package/src/leader-thread/make-leader-thread-layer.ts +121 -72
  292. package/src/leader-thread/materialize-event.ts +173 -0
  293. package/src/leader-thread/mod.ts +1 -1
  294. package/src/leader-thread/recreate-db.ts +33 -38
  295. package/src/leader-thread/shutdown-channel.ts +2 -4
  296. package/src/leader-thread/types.ts +84 -46
  297. package/src/make-client-session.ts +136 -0
  298. package/src/materializer-helper.ts +138 -0
  299. package/src/otel.ts +8 -0
  300. package/src/rematerialize-from-eventlog.ts +117 -0
  301. package/src/schema/EventDef.ts +227 -0
  302. package/src/schema/EventSequenceNumber.test.ts +12 -0
  303. package/src/schema/EventSequenceNumber.ts +121 -0
  304. package/src/schema/LiveStoreEvent.ts +240 -0
  305. package/src/schema/events.ts +1 -0
  306. package/src/schema/mod.ts +8 -6
  307. package/src/schema/schema.ts +88 -84
  308. package/src/schema/state/mod.ts +2 -0
  309. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  310. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  311. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  312. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  313. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  314. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  315. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  317. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  318. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  319. package/src/schema/state/sqlite/mod.ts +73 -0
  320. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  321. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  322. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  323. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  324. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  325. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  326. package/src/schema/state/sqlite/system-tables.ts +117 -0
  327. package/src/schema/state/sqlite/table-def.ts +197 -0
  328. package/src/schema-management/common.ts +7 -7
  329. package/src/schema-management/migrations.ts +37 -31
  330. package/src/schema-management/validate-schema.ts +61 -0
  331. package/src/sql-queries/sql-queries.ts +1 -1
  332. package/src/sql-queries/sql-query-builder.ts +1 -2
  333. package/src/sql-queries/types.ts +3 -1
  334. package/src/sync/ClientSessionSyncProcessor.ts +218 -94
  335. package/src/sync/next/compact-events.ts +38 -35
  336. package/src/sync/next/facts.ts +43 -41
  337. package/src/sync/next/history-dag-common.ts +17 -10
  338. package/src/sync/next/history-dag.ts +16 -17
  339. package/src/sync/next/rebase-events.ts +29 -17
  340. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  341. package/src/sync/next/test/compact-events.test.ts +79 -79
  342. package/src/sync/next/test/event-fixtures.ts +228 -0
  343. package/src/sync/next/test/mod.ts +1 -1
  344. package/src/sync/sync.ts +46 -21
  345. package/src/sync/syncstate.test.ts +312 -345
  346. package/src/sync/syncstate.ts +414 -224
  347. package/src/sync/validate-push-payload.ts +6 -6
  348. package/src/version.ts +3 -3
  349. package/dist/derived-mutations.d.ts +0 -109
  350. package/dist/derived-mutations.d.ts.map +0 -1
  351. package/dist/derived-mutations.js +0 -54
  352. package/dist/derived-mutations.js.map +0 -1
  353. package/dist/derived-mutations.test.d.ts +0 -2
  354. package/dist/derived-mutations.test.d.ts.map +0 -1
  355. package/dist/derived-mutations.test.js +0 -93
  356. package/dist/derived-mutations.test.js.map +0 -1
  357. package/dist/devtools/devtools-bridge.d.ts +0 -13
  358. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  359. package/dist/devtools/devtools-bridge.js +0 -2
  360. package/dist/devtools/devtools-bridge.js.map +0 -1
  361. package/dist/devtools/devtools-window-message.d.ts +0 -29
  362. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  363. package/dist/devtools/devtools-window-message.js +0 -33
  364. package/dist/devtools/devtools-window-message.js.map +0 -1
  365. package/dist/devtools/index.d.ts +0 -42
  366. package/dist/devtools/index.d.ts.map +0 -1
  367. package/dist/devtools/index.js +0 -48
  368. package/dist/devtools/index.js.map +0 -1
  369. package/dist/init-singleton-tables.d.ts +0 -4
  370. package/dist/init-singleton-tables.d.ts.map +0 -1
  371. package/dist/init-singleton-tables.js +0 -16
  372. package/dist/init-singleton-tables.js.map +0 -1
  373. package/dist/leader-thread/apply-mutation.d.ts +0 -11
  374. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  375. package/dist/leader-thread/apply-mutation.js +0 -107
  376. package/dist/leader-thread/apply-mutation.js.map +0 -1
  377. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  378. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  379. package/dist/leader-thread/leader-sync-processor.js +0 -430
  380. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  381. package/dist/leader-thread/mutationlog.d.ts +0 -10
  382. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  383. package/dist/leader-thread/mutationlog.js +0 -28
  384. package/dist/leader-thread/mutationlog.js.map +0 -1
  385. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  386. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  387. package/dist/leader-thread/pull-queue-set.js +0 -39
  388. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  389. package/dist/mutation.d.ts +0 -20
  390. package/dist/mutation.d.ts.map +0 -1
  391. package/dist/mutation.js +0 -57
  392. package/dist/mutation.js.map +0 -1
  393. package/dist/query-builder/api.d.ts +0 -190
  394. package/dist/query-builder/api.d.ts.map +0 -1
  395. package/dist/query-builder/api.js +0 -8
  396. package/dist/query-builder/api.js.map +0 -1
  397. package/dist/query-builder/impl.d.ts +0 -12
  398. package/dist/query-builder/impl.d.ts.map +0 -1
  399. package/dist/query-builder/impl.js +0 -244
  400. package/dist/query-builder/impl.js.map +0 -1
  401. package/dist/query-builder/impl.test.d.ts +0 -2
  402. package/dist/query-builder/impl.test.d.ts.map +0 -1
  403. package/dist/query-builder/impl.test.js +0 -212
  404. package/dist/query-builder/impl.test.js.map +0 -1
  405. package/dist/query-builder/mod.d.ts.map +0 -1
  406. package/dist/query-builder/mod.js.map +0 -1
  407. package/dist/query-info.d.ts +0 -38
  408. package/dist/query-info.d.ts.map +0 -1
  409. package/dist/query-info.js +0 -7
  410. package/dist/query-info.js.map +0 -1
  411. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  412. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  413. package/dist/rehydrate-from-mutationlog.js +0 -66
  414. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  415. package/dist/schema/EventId.d.ts +0 -39
  416. package/dist/schema/EventId.d.ts.map +0 -1
  417. package/dist/schema/EventId.js +0 -38
  418. package/dist/schema/EventId.js.map +0 -1
  419. package/dist/schema/EventId.test.d.ts +0 -2
  420. package/dist/schema/EventId.test.d.ts.map +0 -1
  421. package/dist/schema/EventId.test.js +0 -11
  422. package/dist/schema/EventId.test.js.map +0 -1
  423. package/dist/schema/MutationEvent.d.ts +0 -167
  424. package/dist/schema/MutationEvent.d.ts.map +0 -1
  425. package/dist/schema/MutationEvent.js +0 -72
  426. package/dist/schema/MutationEvent.js.map +0 -1
  427. package/dist/schema/MutationEvent.test.d.ts +0 -2
  428. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  429. package/dist/schema/MutationEvent.test.js +0 -2
  430. package/dist/schema/MutationEvent.test.js.map +0 -1
  431. package/dist/schema/mutations.d.ts +0 -107
  432. package/dist/schema/mutations.d.ts.map +0 -1
  433. package/dist/schema/mutations.js +0 -42
  434. package/dist/schema/mutations.js.map +0 -1
  435. package/dist/schema/schema-helpers.d.ts.map +0 -1
  436. package/dist/schema/schema-helpers.js.map +0 -1
  437. package/dist/schema/system-tables.d.ts +0 -399
  438. package/dist/schema/system-tables.d.ts.map +0 -1
  439. package/dist/schema/system-tables.js +0 -59
  440. package/dist/schema/system-tables.js.map +0 -1
  441. package/dist/schema/table-def.d.ts +0 -156
  442. package/dist/schema/table-def.d.ts.map +0 -1
  443. package/dist/schema/table-def.js +0 -79
  444. package/dist/schema/table-def.js.map +0 -1
  445. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  446. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  447. package/dist/schema-management/validate-mutation-defs.js +0 -39
  448. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  449. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  450. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  451. package/dist/sync/client-session-sync-processor.js +0 -131
  452. package/dist/sync/client-session-sync-processor.js.map +0 -1
  453. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  454. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  455. package/src/derived-mutations.test.ts +0 -101
  456. package/src/derived-mutations.ts +0 -170
  457. package/src/devtools/devtools-bridge.ts +0 -14
  458. package/src/devtools/devtools-window-message.ts +0 -27
  459. package/src/devtools/index.ts +0 -48
  460. package/src/init-singleton-tables.ts +0 -24
  461. package/src/leader-thread/apply-mutation.ts +0 -161
  462. package/src/leader-thread/mutationlog.ts +0 -46
  463. package/src/leader-thread/pull-queue-set.ts +0 -58
  464. package/src/mutation.ts +0 -91
  465. package/src/query-builder/api.ts +0 -289
  466. package/src/query-builder/impl.test.ts +0 -239
  467. package/src/query-builder/impl.ts +0 -285
  468. package/src/query-info.ts +0 -78
  469. package/src/rehydrate-from-mutationlog.ts +0 -119
  470. package/src/schema/EventId.test.ts +0 -12
  471. package/src/schema/EventId.ts +0 -60
  472. package/src/schema/MutationEvent.ts +0 -185
  473. package/src/schema/mutations.ts +0 -192
  474. package/src/schema/system-tables.ts +0 -105
  475. package/src/schema/table-def.ts +0 -343
  476. package/src/schema-management/validate-mutation-defs.ts +0 -63
  477. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  478. package/tsconfig.json +0 -11
  479. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -0,0 +1,227 @@
1
+ import type { SingleOrReadonlyArray } from '@livestore/utils'
2
+ import { shouldNeverHappen } from '@livestore/utils'
3
+ import { Schema } from '@livestore/utils/effect'
4
+
5
+ import type { BindValues } from '../sql-queries/sql-queries.js'
6
+ import type { ParamsObject } from '../util.js'
7
+ import type { QueryBuilder } from './state/sqlite/query-builder/mod.js'
8
+
9
+ export type EventDefMap = {
10
+ map: Map<string | 'livestore.RawSql', EventDef.Any>
11
+ }
12
+ export type EventDefRecord = {
13
+ 'livestore.RawSql': RawSqlEvent
14
+ [name: string]: EventDef.Any
15
+ }
16
+
17
+ export type EventDef<TName extends string, TType, TEncoded = TType, TDerived extends boolean = false> = {
18
+ name: TName
19
+ schema: Schema.Schema<TType, TEncoded>
20
+ options: {
21
+ /**
22
+ * When set to true, the mutation won't be synced across clients but
23
+ */
24
+ clientOnly: boolean
25
+ /** Warning: This feature is not fully implemented yet */
26
+ facts: FactsCallback<TType> | undefined
27
+ derived: TDerived
28
+ }
29
+
30
+ /** Helper function to construct a partial mutation event */
31
+ (args: TType): {
32
+ name: TName
33
+ args: TType
34
+ }
35
+
36
+ readonly Event: {
37
+ name: TName
38
+ args: TType
39
+ }
40
+ }
41
+
42
+ export type FactsCallback<TTo> = (
43
+ args: TTo,
44
+ currentFacts: EventDefFacts,
45
+ ) => {
46
+ modify: {
47
+ set: Iterable<EventDefFactInput>
48
+ unset: Iterable<EventDefFactInput>
49
+ }
50
+ require: Iterable<EventDefFactInput>
51
+ }
52
+
53
+ export namespace EventDef {
54
+ export type Any = EventDef<string, any, any, boolean>
55
+
56
+ export type AnyWithoutFn = Pick<Any, 'name' | 'schema' | 'options'>
57
+ }
58
+
59
+ export type EventDefKey = string
60
+ export type EventDefFact = string
61
+ export type EventDefFacts = ReadonlyMap<string, any>
62
+
63
+ export type EventDefFactsGroup = {
64
+ modifySet: EventDefFacts
65
+ modifyUnset: EventDefFacts
66
+
67
+ /**
68
+ * Events on independent "dependency" branches are commutative which can facilitate more prioritized syncing
69
+ */
70
+ depRequire: EventDefFacts
71
+ depRead: EventDefFacts
72
+ }
73
+
74
+ export type EventDefFactsSnapshot = Map<string, any>
75
+
76
+ export type EventDefFactInput = string | readonly [string, any]
77
+
78
+ export const defineFacts = <
79
+ TRecord extends Record<string, EventDefFactInput | ((...args: any[]) => EventDefFactInput)>,
80
+ >(
81
+ record: TRecord,
82
+ ): TRecord => record
83
+
84
+ export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
85
+ // TODO actually implement this
86
+ // onError?: (error: any) => void
87
+ /** Warning: This feature is not fully implemented yet */
88
+ facts?: (
89
+ args: TTo,
90
+ currentFacts: EventDefFacts,
91
+ ) => {
92
+ modify?: {
93
+ set?: Iterable<EventDefFactInput>
94
+ unset?: Iterable<EventDefFactInput>
95
+ }
96
+ /**
97
+ * Two purposes: constrain history and constrain compaction
98
+ */
99
+ require?: Iterable<EventDefFactInput>
100
+ }
101
+ /**
102
+ * When set to true, the event won't be synced over the network
103
+ */
104
+ clientOnly?: boolean
105
+ derived?: TDerived
106
+ }
107
+
108
+ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
109
+ args: {
110
+ name: TName
111
+ schema: Schema.Schema<TType, TEncoded>
112
+ } & DefineEventOptions<TType, TDerived>,
113
+ ): EventDef<TName, TType, TEncoded, TDerived> => {
114
+ const { name, schema, ...options } = args
115
+
116
+ const makePartialEvent = (args: TType) => {
117
+ const res = Schema.validateEither(schema)(args)
118
+ if (res._tag === 'Left') {
119
+ shouldNeverHappen(`Invalid event args for event '${name}':`, res.left.message, '\n')
120
+ }
121
+ return { name: name, args }
122
+ }
123
+
124
+ Object.defineProperty(makePartialEvent, 'name', { value: name })
125
+ Object.defineProperty(makePartialEvent, 'schema', { value: schema })
126
+ Object.defineProperty(makePartialEvent, 'options', {
127
+ value: {
128
+ clientOnly: options?.clientOnly ?? false,
129
+ facts: options?.facts
130
+ ? (args, currentFacts) => {
131
+ const res = options.facts!(args, currentFacts)
132
+ return {
133
+ modify: {
134
+ set: res.modify?.set ? new Set(res.modify.set) : new Set(),
135
+ unset: res.modify?.unset ? new Set(res.modify.unset) : new Set(),
136
+ },
137
+ require: res.require ? new Set(res.require) : new Set(),
138
+ }
139
+ }
140
+ : undefined,
141
+ derived: options?.derived ?? false,
142
+ } satisfies EventDef.Any['options'],
143
+ })
144
+
145
+ return makePartialEvent as EventDef<TName, TType, TEncoded, TDerived>
146
+ }
147
+
148
+ export const synced = <TName extends string, TType, TEncoded = TType>(
149
+ args: {
150
+ name: TName
151
+ schema: Schema.Schema<TType, TEncoded>
152
+ } & Omit<DefineEventOptions<TType, false>, 'derived' | 'clientOnly'>,
153
+ ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
154
+
155
+ export const clientOnly = <TName extends string, TType, TEncoded = TType>(
156
+ args: {
157
+ name: TName
158
+ schema: Schema.Schema<TType, TEncoded>
159
+ } & Omit<DefineEventOptions<TType, false>, 'derived' | 'clientOnly'>,
160
+ ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })
161
+
162
+ export type MaterializerResult =
163
+ | {
164
+ sql: string
165
+ bindValues: BindValues
166
+ writeTables?: ReadonlySet<string>
167
+ }
168
+ | QueryBuilder.Any
169
+ | string
170
+
171
+ export type MaterializerContextQuery = {
172
+ (args: { query: string; bindValues: ParamsObject }): ReadonlyArray<unknown>
173
+ <TResult>(qb: QueryBuilder<TResult, any, any>): TResult
174
+ }
175
+
176
+ export type Materializer<TEventDef extends EventDef.AnyWithoutFn = EventDef.AnyWithoutFn> = (
177
+ event: TEventDef['schema']['Type'],
178
+ context: {
179
+ currentFacts: EventDefFacts
180
+ eventDef: TEventDef
181
+ /** Can be used to query the current state */
182
+ query: MaterializerContextQuery
183
+ },
184
+ ) => SingleOrReadonlyArray<MaterializerResult>
185
+
186
+ export const defineMaterializer = <TEventDef extends EventDef.AnyWithoutFn>(
187
+ eventDef: TEventDef,
188
+ materializer: Materializer<TEventDef>,
189
+ ): Materializer<TEventDef> => {
190
+ return materializer
191
+ }
192
+
193
+ export const materializers = <TInputRecord extends Record<string, EventDef.AnyWithoutFn>>(
194
+ eventDefRecord: TInputRecord,
195
+ handlers: {
196
+ [TEventName in TInputRecord[keyof TInputRecord]['name'] as Extract<
197
+ TInputRecord[keyof TInputRecord],
198
+ { name: TEventName }
199
+ >['options']['derived'] extends true
200
+ ? never
201
+ : TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], { name: TEventName }>>
202
+ // [K in TInputRecord[keyof TInputRecord]['name']]: Materializer<
203
+ // Extract<TInputRecord[keyof TInputRecord], { name: K }>
204
+ // >
205
+ },
206
+ ) => {
207
+ return handlers
208
+ }
209
+
210
+ export const rawSqlEvent = defineEvent({
211
+ name: 'livestore.RawSql',
212
+ schema: Schema.Struct({
213
+ sql: Schema.String,
214
+ bindValues: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
215
+ writeTables: Schema.optional(Schema.ReadonlySet(Schema.String)),
216
+ }),
217
+ clientOnly: true,
218
+ derived: true,
219
+ })
220
+
221
+ export const rawSqlMaterializer = defineMaterializer(rawSqlEvent, ({ sql, bindValues, writeTables }) => ({
222
+ sql,
223
+ bindValues: bindValues ?? {},
224
+ writeTables,
225
+ }))
226
+
227
+ export type RawSqlEvent = typeof rawSqlEvent
@@ -0,0 +1,12 @@
1
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
2
+ import { expect } from 'vitest'
3
+
4
+ import { EventSequenceNumber } from './mod.js'
5
+
6
+ Vitest.describe('EventSequenceNumber', () => {
7
+ Vitest.test('nextPair', () => {
8
+ const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
9
+ expect(EventSequenceNumber.nextPair(e_0_0, false).seqNum).toStrictEqual({ global: 1, client: 0 })
10
+ expect(EventSequenceNumber.nextPair(e_0_0, true).seqNum).toStrictEqual({ global: 0, client: 1 })
11
+ })
12
+ })
@@ -0,0 +1,121 @@
1
+ import { Brand, Schema } from '@livestore/utils/effect'
2
+
3
+ export type ClientEventSequenceNumber = Brand.Branded<number, 'ClientEventSequenceNumber'>
4
+ export const localEventSequenceNumber = Brand.nominal<ClientEventSequenceNumber>()
5
+ export const ClientEventSequenceNumber = Schema.fromBrand(localEventSequenceNumber)(Schema.Int)
6
+
7
+ export type GlobalEventSequenceNumber = Brand.Branded<number, 'GlobalEventSequenceNumber'>
8
+ export const globalEventSequenceNumber = Brand.nominal<GlobalEventSequenceNumber>()
9
+ export const GlobalEventSequenceNumber = Schema.fromBrand(globalEventSequenceNumber)(Schema.Int)
10
+
11
+ export const clientDefault = 0 as any as ClientEventSequenceNumber
12
+
13
+ /**
14
+ * LiveStore event sequence number value consisting of a globally unique event sequence number
15
+ * and a client sequence number.
16
+ *
17
+ * The client sequence number is only used for clientOnly events and starts from 0 for each global sequence number.
18
+ */
19
+ export type EventSequenceNumber = {
20
+ global: GlobalEventSequenceNumber
21
+ client: ClientEventSequenceNumber
22
+ /**
23
+ * TODO add generation number in favour of LEADER_MERGE_COUNTER_TABLE
24
+ */
25
+ // generation: number
26
+ }
27
+
28
+ // export const EventSequenceNumber = Schema.Struct({})
29
+ // export const EventSequenceNumber = Schema.Struct({})
30
+ // export const ClientEventSequenceNumber = Schema.Struct({})
31
+ // export const GlobalEventSequenceNumber = Schema.Struct({})
32
+
33
+ /**
34
+ * NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
35
+ */
36
+ export const EventSequenceNumber = Schema.Struct({
37
+ global: GlobalEventSequenceNumber,
38
+ /** Only increments for clientOnly events */
39
+ client: ClientEventSequenceNumber,
40
+
41
+ // TODO also provide a way to see "confirmation level" of event (e.g. confirmed by leader/sync backend)
42
+
43
+ // TODO: actually add this field
44
+ // Client only
45
+ // generation: Schema.Number.pipe(Schema.optional),
46
+ }).annotations({ title: 'LiveStore.EventSequenceNumber' })
47
+
48
+ /**
49
+ * Compare two event sequence numbers i.e. checks if the first event sequence number is less than the second.
50
+ */
51
+ export const compare = (a: EventSequenceNumber, b: EventSequenceNumber) => {
52
+ if (a.global !== b.global) {
53
+ return a.global - b.global
54
+ }
55
+ return a.client - b.client
56
+ }
57
+
58
+ /**
59
+ * Convert an event sequence number to a string representation.
60
+ */
61
+ export const toString = (seqNum: EventSequenceNumber) =>
62
+ seqNum.client === 0 ? `e${seqNum.global}` : `e${seqNum.global}+${seqNum.client}`
63
+
64
+ /**
65
+ * Convert a string representation of an event sequence number to an event sequence number.
66
+ */
67
+ export const fromString = (str: string): EventSequenceNumber => {
68
+ const [global, client] = str.slice(1, -1).split(',').map(Number)
69
+ if (global === undefined || client === undefined) {
70
+ throw new Error('Invalid event sequence number string')
71
+ }
72
+ return { global, client } as EventSequenceNumber
73
+ }
74
+
75
+ export const isEqual = (a: EventSequenceNumber, b: EventSequenceNumber) =>
76
+ a.global === b.global && a.client === b.client
77
+
78
+ export type EventSequenceNumberPair = { seqNum: EventSequenceNumber; parentSeqNum: EventSequenceNumber }
79
+
80
+ export const ROOT = {
81
+ global: 0 as any as GlobalEventSequenceNumber,
82
+ client: clientDefault,
83
+ } satisfies EventSequenceNumber
84
+
85
+ export const isGreaterThan = (a: EventSequenceNumber, b: EventSequenceNumber) => {
86
+ return a.global > b.global || (a.global === b.global && a.client > b.client)
87
+ }
88
+
89
+ export const isGreaterThanOrEqual = (a: EventSequenceNumber, b: EventSequenceNumber) => {
90
+ return a.global > b.global || (a.global === b.global && a.client >= b.client)
91
+ }
92
+
93
+ export const max = (a: EventSequenceNumber, b: EventSequenceNumber) => {
94
+ return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b
95
+ }
96
+
97
+ export const diff = (a: EventSequenceNumber, b: EventSequenceNumber) => {
98
+ return {
99
+ global: a.global - b.global,
100
+ client: a.client - b.client,
101
+ }
102
+ }
103
+
104
+ export const make = (seqNum: EventSequenceNumber | typeof EventSequenceNumber.Encoded): EventSequenceNumber => {
105
+ return Schema.is(EventSequenceNumber)(seqNum) ? seqNum : Schema.decodeSync(EventSequenceNumber)(seqNum)
106
+ }
107
+
108
+ export const nextPair = (seqNum: EventSequenceNumber, isLocal: boolean): EventSequenceNumberPair => {
109
+ if (isLocal) {
110
+ return {
111
+ seqNum: { global: seqNum.global, client: (seqNum.client + 1) as any as ClientEventSequenceNumber },
112
+ parentSeqNum: seqNum,
113
+ }
114
+ }
115
+
116
+ return {
117
+ seqNum: { global: (seqNum.global + 1) as any as GlobalEventSequenceNumber, client: clientDefault },
118
+ // NOTE we always point to `client: 0` for non-clientOnly events
119
+ parentSeqNum: { global: seqNum.global, client: clientDefault },
120
+ }
121
+ }
@@ -0,0 +1,240 @@
1
+ import { memoizeByRef } from '@livestore/utils'
2
+ import { Option, Schema } from '@livestore/utils/effect'
3
+
4
+ import type { EventDef, EventDefRecord } from './EventDef.js'
5
+ import * as EventSequenceNumber from './EventSequenceNumber.js'
6
+ import type { LiveStoreSchema } from './schema.js'
7
+
8
+ export namespace ForEventDef {
9
+ export type PartialDecoded<TEventDef extends EventDef.Any> = {
10
+ name: TEventDef['name']
11
+ args: Schema.Schema.Type<TEventDef['schema']>
12
+ }
13
+
14
+ export type PartialEncoded<TEventDef extends EventDef.Any> = {
15
+ name: TEventDef['name']
16
+ args: Schema.Schema.Encoded<TEventDef['schema']>
17
+ }
18
+
19
+ export type Decoded<TEventDef extends EventDef.Any> = {
20
+ name: TEventDef['name']
21
+ args: Schema.Schema.Type<TEventDef['schema']>
22
+ seqNum: EventSequenceNumber.EventSequenceNumber
23
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber
24
+ clientId: string
25
+ sessionId: string
26
+ }
27
+
28
+ export type Encoded<TEventDef extends EventDef.Any> = {
29
+ name: TEventDef['name']
30
+ args: Schema.Schema.Encoded<TEventDef['schema']>
31
+ seqNum: EventSequenceNumber.EventSequenceNumber
32
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber
33
+ clientId: string
34
+ sessionId: string
35
+ }
36
+ }
37
+
38
+ export type AnyDecoded = ForEventDef.Decoded<EventDef.Any>
39
+ export const AnyDecoded = Schema.Struct({
40
+ name: Schema.String,
41
+ args: Schema.Any,
42
+ seqNum: EventSequenceNumber.EventSequenceNumber,
43
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber,
44
+ clientId: Schema.String,
45
+ sessionId: Schema.String,
46
+ }).annotations({ title: 'LiveStoreEvent.AnyDecoded' })
47
+
48
+ export type AnyEncoded = ForEventDef.Encoded<EventDef.Any>
49
+ export const AnyEncoded = Schema.Struct({
50
+ name: Schema.String,
51
+ args: Schema.Any,
52
+ seqNum: EventSequenceNumber.EventSequenceNumber,
53
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber,
54
+ clientId: Schema.String,
55
+ sessionId: Schema.String,
56
+ }).annotations({ title: 'LiveStoreEvent.AnyEncoded' })
57
+
58
+ export const AnyEncodedGlobal = Schema.Struct({
59
+ name: Schema.String,
60
+ args: Schema.Any,
61
+ seqNum: EventSequenceNumber.GlobalEventSequenceNumber,
62
+ parentSeqNum: EventSequenceNumber.GlobalEventSequenceNumber,
63
+ clientId: Schema.String,
64
+ sessionId: Schema.String,
65
+ }).annotations({ title: 'LiveStoreEvent.AnyEncodedGlobal' })
66
+ export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type
67
+
68
+ export type PartialAnyDecoded = ForEventDef.PartialDecoded<EventDef.Any>
69
+ export type PartialAnyEncoded = ForEventDef.PartialEncoded<EventDef.Any>
70
+
71
+ export const PartialAnyEncoded = Schema.Struct({
72
+ name: Schema.String,
73
+ args: Schema.Any,
74
+ })
75
+
76
+ export type PartialForSchema<TSchema extends LiveStoreSchema> = {
77
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef.PartialDecoded<TSchema['_EventDefMapType'][K]>
78
+ }[keyof TSchema['_EventDefMapType']]
79
+
80
+ export type ForSchema<TSchema extends LiveStoreSchema> = {
81
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
82
+ }[keyof TSchema['_EventDefMapType']]
83
+
84
+ export const isPartialEventDef = (event: AnyDecoded | PartialAnyDecoded): event is PartialAnyDecoded =>
85
+ 'num' in event === false && 'parentSeqNum' in event === false
86
+
87
+ export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
88
+ {
89
+ [K in keyof TEventDefRecord]: {
90
+ name: K
91
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
92
+ seqNum: EventSequenceNumber.EventSequenceNumber
93
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber
94
+ clientId: string
95
+ sessionId: string
96
+ }
97
+ }[keyof TEventDefRecord],
98
+ {
99
+ [K in keyof TEventDefRecord]: {
100
+ name: K
101
+ args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
102
+ seqNum: EventSequenceNumber.EventSequenceNumber
103
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber
104
+ clientId: string
105
+ sessionId: string
106
+ }
107
+ }[keyof TEventDefRecord]
108
+ >
109
+
110
+ export type EventDefPartialSchema<TEventDefRecord extends EventDefRecord> = Schema.Schema<
111
+ {
112
+ [K in keyof TEventDefRecord]: {
113
+ name: K
114
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
115
+ }
116
+ }[keyof TEventDefRecord],
117
+ {
118
+ [K in keyof TEventDefRecord]: {
119
+ name: K
120
+ args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
121
+ }
122
+ }[keyof TEventDefRecord]
123
+ >
124
+
125
+ export const makeEventDefSchema = <TSchema extends LiveStoreSchema>(
126
+ schema: TSchema,
127
+ ): ForEventDefRecord<TSchema['_EventDefMapType']> =>
128
+ Schema.Union(
129
+ ...[...schema.eventsDefsMap.values()].map((def) =>
130
+ Schema.Struct({
131
+ name: Schema.Literal(def.name),
132
+ args: def.schema,
133
+ seqNum: EventSequenceNumber.EventSequenceNumber,
134
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber,
135
+ clientId: Schema.String,
136
+ sessionId: Schema.String,
137
+ }),
138
+ ),
139
+ ).annotations({ title: 'EventDef' }) as any
140
+
141
+ export const makeEventDefPartialSchema = <TSchema extends LiveStoreSchema>(
142
+ schema: TSchema,
143
+ ): EventDefPartialSchema<TSchema['_EventDefMapType']> =>
144
+ Schema.Union(
145
+ ...[...schema.eventsDefsMap.values()].map((def) =>
146
+ Schema.Struct({
147
+ name: Schema.Literal(def.name),
148
+ args: def.schema,
149
+ }),
150
+ ),
151
+ ).annotations({ title: 'EventDefPartial' }) as any
152
+
153
+ export const makeEventDefSchemaMemo = memoizeByRef(makeEventDefSchema)
154
+
155
+ /** Equivalent to AnyEncoded but with a meta field and some convenience methods */
156
+ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.EncodedWithMeta')({
157
+ name: Schema.String,
158
+ args: Schema.Any,
159
+ seqNum: EventSequenceNumber.EventSequenceNumber,
160
+ parentSeqNum: EventSequenceNumber.EventSequenceNumber,
161
+ clientId: Schema.String,
162
+ sessionId: Schema.String,
163
+ // TODO get rid of `meta` again by cleaning up the usage implementations
164
+ meta: Schema.Struct({
165
+ sessionChangeset: Schema.Union(
166
+ Schema.TaggedStruct('sessionChangeset', {
167
+ data: Schema.Uint8Array,
168
+ debug: Schema.Any.pipe(Schema.optional),
169
+ }),
170
+ Schema.TaggedStruct('no-op', {}),
171
+ Schema.TaggedStruct('unset', {}),
172
+ ),
173
+ syncMetadata: Schema.Option(Schema.JsonValue),
174
+ }).pipe(
175
+ Schema.mutable,
176
+ Schema.optional,
177
+ Schema.withDefaults({
178
+ constructor: () => ({ sessionChangeset: { _tag: 'unset' as const }, syncMetadata: Option.none() }),
179
+ decoding: () => ({ sessionChangeset: { _tag: 'unset' as const }, syncMetadata: Option.none() }),
180
+ }),
181
+ ),
182
+ }) {
183
+ toJSON = (): any => {
184
+ // Only used for logging/debugging
185
+ // - More readable way to print the seqNum + parentSeqNum
186
+ // - not including `meta`, `clientId`, `sessionId`
187
+ return {
188
+ seqNum: `${EventSequenceNumber.toString(this.seqNum)} → ${EventSequenceNumber.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
189
+ name: this.name,
190
+ args: this.args,
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Example: (global event)
196
+ * For event e2 → e1 which should be rebased on event e3 → e2
197
+ * the resulting event num will be e4 → e3
198
+ *
199
+ * Example: (client event)
200
+ * For event e2+1 → e2 which should be rebased on event e3 → e2
201
+ * the resulting event num will be e3+1 → e3
202
+ *
203
+ * Syntax: e2+2 → e2+1
204
+ * ^ ^ ^ ^
205
+ * | | | +- client parent number
206
+ * | | +--- global parent number
207
+ * | +-- client number
208
+ * +---- global number
209
+ * Client num is ommitted for global events
210
+ */
211
+ rebase = (parentSeqNum: EventSequenceNumber.EventSequenceNumber, isClient: boolean) =>
212
+ new EncodedWithMeta({
213
+ ...this,
214
+ ...EventSequenceNumber.nextPair(parentSeqNum, isClient),
215
+ })
216
+
217
+ static fromGlobal = (event: AnyEncodedGlobal, syncMetadata: Option.Option<Schema.JsonValue>) =>
218
+ new EncodedWithMeta({
219
+ ...event,
220
+ seqNum: { global: event.seqNum, client: EventSequenceNumber.clientDefault },
221
+ parentSeqNum: { global: event.parentSeqNum, client: EventSequenceNumber.clientDefault },
222
+ meta: { sessionChangeset: { _tag: 'unset' as const }, syncMetadata },
223
+ })
224
+
225
+ toGlobal = (): AnyEncodedGlobal => ({
226
+ ...this,
227
+ seqNum: this.seqNum.global,
228
+ parentSeqNum: this.parentSeqNum.global,
229
+ })
230
+ }
231
+
232
+ /** NOTE `meta` is not considered for equality */
233
+ export const isEqualEncoded = (a: AnyEncoded, b: AnyEncoded) =>
234
+ a.seqNum.global === b.seqNum.global &&
235
+ a.seqNum.client === b.seqNum.client &&
236
+ a.name === b.name &&
237
+ a.clientId === b.clientId &&
238
+ a.sessionId === b.sessionId &&
239
+ // TODO use schema equality here
240
+ JSON.stringify(a.args) === JSON.stringify(b.args)
@@ -0,0 +1 @@
1
+ export { defineEvent, synced, clientOnly } from './EventDef.js'
package/src/schema/mod.ts CHANGED
@@ -1,7 +1,9 @@
1
- export * from './system-tables.js'
2
- export * as DbSchema from './table-def.js'
3
- export * from './mutations.js'
4
- export * from './schema-helpers.js'
1
+ export * as SystemTables from './state/sqlite/system-tables.js'
2
+ export { SqliteAst, SqliteDsl } from './state/sqlite/db-schema/mod.js'
3
+ export * from './EventDef.js'
4
+ export * from './state/sqlite/schema-helpers.js'
5
5
  export * from './schema.js'
6
- export * as MutationEvent from './MutationEvent.js'
7
- export * as EventId from './EventId.js'
6
+ export * as State from './state/mod.js'
7
+ export * as LiveStoreEvent from './LiveStoreEvent.js'
8
+ export * as EventSequenceNumber from './EventSequenceNumber.js'
9
+ export * as Events from './events.js'