@livestore/common 0.3.0-dev.3 → 0.3.0-dev.31

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