@livestore/common 0.3.0-dev.4 → 0.3.0-dev.40

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 (470) 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 +132 -75
  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 +390 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +97 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -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 +32 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +36 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +55 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +33 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +7 -13
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -9
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  45. package/dist/leader-thread/LeaderSyncProcessor.js +593 -0
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  47. package/dist/leader-thread/connection.d.ts +34 -6
  48. package/dist/leader-thread/connection.d.ts.map +1 -1
  49. package/dist/leader-thread/connection.js +22 -7
  50. package/dist/leader-thread/connection.js.map +1 -1
  51. package/dist/leader-thread/eventlog.d.ts +27 -0
  52. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  53. package/dist/leader-thread/eventlog.js +119 -0
  54. package/dist/leader-thread/eventlog.js.map +1 -0
  55. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  56. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  57. package/dist/leader-thread/leader-worker-devtools.js +165 -134
  58. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +76 -48
  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 +105 -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 +33 -31
  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 +89 -40
  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 +21 -0
  84. package/dist/make-client-session.d.ts.map +1 -0
  85. package/dist/make-client-session.js +51 -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 +84 -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/EventId.d.ts +35 -15
  104. package/dist/schema/EventId.d.ts.map +1 -1
  105. package/dist/schema/EventId.js +57 -11
  106. package/dist/schema/EventId.js.map +1 -1
  107. package/dist/schema/EventId.test.d.ts +2 -0
  108. package/dist/schema/EventId.test.d.ts.map +1 -0
  109. package/dist/schema/EventId.test.js +11 -0
  110. package/dist/schema/EventId.test.js.map +1 -0
  111. package/dist/schema/LiveStoreEvent.d.ts +255 -0
  112. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  113. package/dist/schema/LiveStoreEvent.js +118 -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 +7 -5
  120. package/dist/schema/mod.d.ts.map +1 -1
  121. package/dist/schema/mod.js +7 -5
  122. package/dist/schema/mod.js.map +1 -1
  123. package/dist/schema/schema.d.ts +48 -30
  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 +554 -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 +87 -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 +33 -24
  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 +66 -0
  224. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  225. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  226. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  227. package/dist/sync/index.d.ts +1 -1
  228. package/dist/sync/index.d.ts.map +1 -1
  229. package/dist/sync/index.js +1 -1
  230. package/dist/sync/index.js.map +1 -1
  231. package/dist/sync/next/compact-events.d.ts.map +1 -1
  232. package/dist/sync/next/facts.d.ts +19 -19
  233. package/dist/sync/next/facts.d.ts.map +1 -1
  234. package/dist/sync/next/facts.js +3 -3
  235. package/dist/sync/next/facts.js.map +1 -1
  236. package/dist/sync/next/history-dag-common.d.ts +6 -7
  237. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  238. package/dist/sync/next/history-dag-common.js +4 -2
  239. package/dist/sync/next/history-dag-common.js.map +1 -1
  240. package/dist/sync/next/history-dag.d.ts.map +1 -1
  241. package/dist/sync/next/history-dag.js +2 -2
  242. package/dist/sync/next/history-dag.js.map +1 -1
  243. package/dist/sync/next/rebase-events.d.ts +10 -8
  244. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  245. package/dist/sync/next/rebase-events.js +11 -8
  246. package/dist/sync/next/rebase-events.js.map +1 -1
  247. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  248. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  249. package/dist/sync/next/test/compact-events.test.js +76 -76
  250. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  251. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  252. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  253. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +67 -36
  254. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  255. package/dist/sync/next/test/mod.d.ts +1 -1
  256. package/dist/sync/next/test/mod.d.ts.map +1 -1
  257. package/dist/sync/next/test/mod.js +1 -1
  258. package/dist/sync/next/test/mod.js.map +1 -1
  259. package/dist/sync/sync.d.ts +55 -20
  260. package/dist/sync/sync.d.ts.map +1 -1
  261. package/dist/sync/sync.js +7 -3
  262. package/dist/sync/sync.js.map +1 -1
  263. package/dist/sync/syncstate.d.ts +213 -82
  264. package/dist/sync/syncstate.d.ts.map +1 -1
  265. package/dist/sync/syncstate.js +319 -120
  266. package/dist/sync/syncstate.js.map +1 -1
  267. package/dist/sync/syncstate.test.js +295 -275
  268. package/dist/sync/syncstate.test.js.map +1 -1
  269. package/dist/sync/validate-push-payload.d.ts +2 -2
  270. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  271. package/dist/sync/validate-push-payload.js +2 -2
  272. package/dist/sync/validate-push-payload.js.map +1 -1
  273. package/dist/util.d.ts +2 -2
  274. package/dist/util.d.ts.map +1 -1
  275. package/dist/version.d.ts +1 -1
  276. package/dist/version.d.ts.map +1 -1
  277. package/dist/version.js +1 -1
  278. package/dist/version.js.map +1 -1
  279. package/package.json +13 -6
  280. package/src/__tests__/fixture.ts +36 -15
  281. package/src/adapter-types.ts +116 -83
  282. package/src/debug-info.ts +1 -0
  283. package/src/devtools/devtools-messages-client-session.ts +142 -0
  284. package/src/devtools/devtools-messages-common.ts +115 -0
  285. package/src/devtools/devtools-messages-leader.ts +191 -0
  286. package/src/devtools/devtools-messages.ts +3 -243
  287. package/src/devtools/devtools-sessioninfo.ts +101 -0
  288. package/src/devtools/mod.ts +59 -0
  289. package/src/index.ts +7 -15
  290. package/src/leader-thread/LeaderSyncProcessor.ts +933 -0
  291. package/src/leader-thread/connection.ts +54 -9
  292. package/src/leader-thread/eventlog.ts +194 -0
  293. package/src/leader-thread/leader-worker-devtools.ts +235 -191
  294. package/src/leader-thread/make-leader-thread-layer.ts +138 -78
  295. package/src/leader-thread/materialize-event.ts +169 -0
  296. package/src/leader-thread/mod.ts +1 -1
  297. package/src/leader-thread/recreate-db.ts +38 -39
  298. package/src/leader-thread/shutdown-channel.ts +2 -4
  299. package/src/leader-thread/types.ts +98 -53
  300. package/src/make-client-session.ts +119 -0
  301. package/src/materializer-helper.ts +135 -0
  302. package/src/otel.ts +8 -0
  303. package/src/rematerialize-from-eventlog.ts +117 -0
  304. package/src/schema/EventDef.ts +227 -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/events.ts +1 -0
  309. package/src/schema/mod.ts +7 -5
  310. package/src/schema/schema.ts +85 -81
  311. package/src/schema/state/mod.ts +2 -0
  312. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  313. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  314. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  315. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  317. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  318. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  319. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  320. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  321. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  322. package/src/schema/state/sqlite/mod.ts +73 -0
  323. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  324. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  325. package/src/schema/state/sqlite/query-builder/impl.test.ts +608 -0
  326. package/src/schema/state/sqlite/query-builder/impl.ts +350 -0
  327. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  328. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  329. package/src/schema/state/sqlite/system-tables.ts +116 -0
  330. package/src/schema/state/sqlite/table-def.ts +197 -0
  331. package/src/schema-management/common.ts +7 -7
  332. package/src/schema-management/migrations.ts +43 -37
  333. package/src/schema-management/validate-schema.ts +61 -0
  334. package/src/sql-queries/sql-queries.ts +1 -1
  335. package/src/sql-queries/sql-query-builder.ts +1 -2
  336. package/src/sql-queries/types.ts +3 -1
  337. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  338. package/src/sync/index.ts +1 -1
  339. package/src/sync/next/facts.ts +32 -33
  340. package/src/sync/next/history-dag-common.ts +9 -5
  341. package/src/sync/next/history-dag.ts +2 -2
  342. package/src/sync/next/rebase-events.ts +22 -16
  343. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  344. package/src/sync/next/test/compact-events.test.ts +78 -78
  345. package/src/sync/next/test/event-fixtures.ts +219 -0
  346. package/src/sync/next/test/mod.ts +1 -1
  347. package/src/sync/sync.ts +51 -19
  348. package/src/sync/syncstate.test.ts +335 -308
  349. package/src/sync/syncstate.ts +394 -212
  350. package/src/sync/validate-push-payload.ts +7 -4
  351. package/src/version.ts +1 -1
  352. package/dist/derived-mutations.d.ts +0 -109
  353. package/dist/derived-mutations.d.ts.map +0 -1
  354. package/dist/derived-mutations.js +0 -54
  355. package/dist/derived-mutations.js.map +0 -1
  356. package/dist/derived-mutations.test.d.ts +0 -2
  357. package/dist/derived-mutations.test.d.ts.map +0 -1
  358. package/dist/derived-mutations.test.js +0 -93
  359. package/dist/derived-mutations.test.js.map +0 -1
  360. package/dist/devtools/devtools-bridge.d.ts +0 -12
  361. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  362. package/dist/devtools/devtools-bridge.js +0 -2
  363. package/dist/devtools/devtools-bridge.js.map +0 -1
  364. package/dist/devtools/devtools-window-message.d.ts +0 -29
  365. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  366. package/dist/devtools/devtools-window-message.js +0 -33
  367. package/dist/devtools/devtools-window-message.js.map +0 -1
  368. package/dist/devtools/index.d.ts +0 -42
  369. package/dist/devtools/index.d.ts.map +0 -1
  370. package/dist/devtools/index.js +0 -48
  371. package/dist/devtools/index.js.map +0 -1
  372. package/dist/init-singleton-tables.d.ts +0 -4
  373. package/dist/init-singleton-tables.d.ts.map +0 -1
  374. package/dist/init-singleton-tables.js +0 -16
  375. package/dist/init-singleton-tables.js.map +0 -1
  376. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  377. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  378. package/dist/leader-thread/apply-mutation.js +0 -95
  379. package/dist/leader-thread/apply-mutation.js.map +0 -1
  380. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  381. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  382. package/dist/leader-thread/leader-sync-processor.js +0 -422
  383. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  384. package/dist/leader-thread/mutationlog.d.ts +0 -23
  385. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  386. package/dist/leader-thread/mutationlog.js +0 -27
  387. package/dist/leader-thread/mutationlog.js.map +0 -1
  388. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  389. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  390. package/dist/leader-thread/pull-queue-set.js +0 -39
  391. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  392. package/dist/mutation.d.ts +0 -13
  393. package/dist/mutation.d.ts.map +0 -1
  394. package/dist/mutation.js +0 -57
  395. package/dist/mutation.js.map +0 -1
  396. package/dist/query-builder/api.d.ts +0 -190
  397. package/dist/query-builder/api.d.ts.map +0 -1
  398. package/dist/query-builder/api.js +0 -8
  399. package/dist/query-builder/api.js.map +0 -1
  400. package/dist/query-builder/impl.d.ts +0 -12
  401. package/dist/query-builder/impl.d.ts.map +0 -1
  402. package/dist/query-builder/impl.js +0 -244
  403. package/dist/query-builder/impl.js.map +0 -1
  404. package/dist/query-builder/impl.test.d.ts +0 -2
  405. package/dist/query-builder/impl.test.d.ts.map +0 -1
  406. package/dist/query-builder/impl.test.js +0 -212
  407. package/dist/query-builder/impl.test.js.map +0 -1
  408. package/dist/query-builder/mod.d.ts.map +0 -1
  409. package/dist/query-builder/mod.js.map +0 -1
  410. package/dist/query-info.d.ts +0 -38
  411. package/dist/query-info.d.ts.map +0 -1
  412. package/dist/query-info.js +0 -7
  413. package/dist/query-info.js.map +0 -1
  414. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  415. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  416. package/dist/rehydrate-from-mutationlog.js +0 -72
  417. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  418. package/dist/schema/MutationEvent.d.ts +0 -191
  419. package/dist/schema/MutationEvent.d.ts.map +0 -1
  420. package/dist/schema/MutationEvent.js +0 -56
  421. package/dist/schema/MutationEvent.js.map +0 -1
  422. package/dist/schema/mutations.d.ts +0 -107
  423. package/dist/schema/mutations.d.ts.map +0 -1
  424. package/dist/schema/mutations.js +0 -42
  425. package/dist/schema/mutations.js.map +0 -1
  426. package/dist/schema/schema-helpers.d.ts.map +0 -1
  427. package/dist/schema/schema-helpers.js.map +0 -1
  428. package/dist/schema/system-tables.d.ts +0 -399
  429. package/dist/schema/system-tables.d.ts.map +0 -1
  430. package/dist/schema/system-tables.js +0 -51
  431. package/dist/schema/system-tables.js.map +0 -1
  432. package/dist/schema/table-def.d.ts +0 -156
  433. package/dist/schema/table-def.d.ts.map +0 -1
  434. package/dist/schema/table-def.js +0 -79
  435. package/dist/schema/table-def.js.map +0 -1
  436. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  437. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  438. package/dist/schema-management/validate-mutation-defs.js +0 -39
  439. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  440. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  441. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  442. package/dist/sync/client-session-sync-processor.js +0 -131
  443. package/dist/sync/client-session-sync-processor.js.map +0 -1
  444. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  445. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  446. package/src/derived-mutations.test.ts +0 -101
  447. package/src/derived-mutations.ts +0 -166
  448. package/src/devtools/devtools-bridge.ts +0 -13
  449. package/src/devtools/devtools-window-message.ts +0 -27
  450. package/src/devtools/index.ts +0 -48
  451. package/src/init-singleton-tables.ts +0 -24
  452. package/src/leader-thread/apply-mutation.ts +0 -143
  453. package/src/leader-thread/leader-sync-processor.ts +0 -666
  454. package/src/leader-thread/mutationlog.ts +0 -42
  455. package/src/leader-thread/pull-queue-set.ts +0 -58
  456. package/src/mutation.ts +0 -81
  457. package/src/query-builder/api.ts +0 -289
  458. package/src/query-builder/impl.test.ts +0 -239
  459. package/src/query-builder/impl.ts +0 -285
  460. package/src/query-info.ts +0 -78
  461. package/src/rehydrate-from-mutationlog.ts +0 -127
  462. package/src/schema/MutationEvent.ts +0 -161
  463. package/src/schema/mutations.ts +0 -192
  464. package/src/schema/system-tables.ts +0 -97
  465. package/src/schema/table-def.ts +0 -343
  466. package/src/schema-management/validate-mutation-defs.ts +0 -63
  467. package/src/sync/client-session-sync-processor.ts +0 -207
  468. package/src/sync/next/test/mutation-fixtures.ts +0 -231
  469. package/tsconfig.json +0 -11
  470. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,18 +1,12 @@
1
- import { Effect, FiberMap, Option, PubSub, Queue, Stream, SubscriptionRef } from '@livestore/utils/effect'
1
+ import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
+ import { nanoid } from '@livestore/utils/nanoid'
2
3
 
3
4
  import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnexpectedError } from '../index.js'
4
- import { MUTATION_LOG_META_TABLE, SCHEMA_META_TABLE, SCHEMA_MUTATIONS_META_TABLE } from '../schema/mod.js'
5
- import type { ShutdownChannel } from './shutdown-channel.js'
5
+ import { SystemTables } from '../schema/mod.js'
6
6
  import type { DevtoolsOptions, PersistenceInfoPair } from './types.js'
7
7
  import { LeaderThreadCtx } from './types.js'
8
8
 
9
- type SendMessageToDevtools = (
10
- message: Devtools.MessageFromAppLeader,
11
- options?: {
12
- /** Send message even if not connected (e.g. for initial broadcast messages) */
13
- force: boolean
14
- },
15
- ) => Effect.Effect<void>
9
+ type SendMessageToDevtools = (message: Devtools.Leader.MessageFromApp) => Effect.Effect<void>
16
10
 
17
11
  // TODO bind scope to the webchannel lifetime
18
12
  export const bootDevtools = (options: DevtoolsOptions) =>
@@ -21,277 +15,272 @@ export const bootDevtools = (options: DevtoolsOptions) =>
21
15
  return
22
16
  }
23
17
 
24
- const { persistenceInfo, shutdownChannel, devtoolsWebChannel } = yield* options.makeContext
18
+ const { syncProcessor, extraIncomingMessagesQueue, clientId, storeId } = yield* LeaderThreadCtx
25
19
 
26
- const isConnected = yield* SubscriptionRef.make(true)
27
-
28
- const incomingMessagesPubSub = yield* PubSub.unbounded<Devtools.MessageToAppLeader>().pipe(
29
- Effect.acquireRelease(PubSub.shutdown),
30
- )
31
-
32
- const incomingMessages = Stream.fromPubSub(incomingMessagesPubSub)
20
+ yield* listenToDevtools({
21
+ incomingMessages: Stream.fromQueue(extraIncomingMessagesQueue),
22
+ sendMessage: () => Effect.void,
23
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
33
24
 
34
- const outgoingMessagesQueue = yield* Queue.unbounded<Devtools.MessageFromAppLeader>().pipe(
35
- Effect.acquireRelease(Queue.shutdown),
36
- )
25
+ const { node, persistenceInfo, mode } = yield* options.boot
37
26
 
38
- const devtoolsCoordinatorChannel = devtoolsWebChannel
39
- // coordinatorMessagePortOrChannel instanceof MessagePort
40
- // ? yield* WebChannel.messagePortChannel({
41
- // port: coordinatorMessagePortOrChannel,
42
- // schema: { send: Devtools.MessageFromAppLeader, listen: Devtools.MessageToAppLeader },
43
- // })
44
- // : coordinatorMessagePortOrChannel
45
-
46
- const sendMessage: SendMessageToDevtools = (message, options) =>
47
- Effect.gen(function* () {
48
- if (options?.force === true || (yield* isConnected)) {
49
- yield* devtoolsCoordinatorChannel.send(message)
50
- } else {
51
- yield* Queue.offer(outgoingMessagesQueue, message)
52
- }
53
- }).pipe(
54
- Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
55
- Effect.interruptible,
56
- Effect.ignoreLogged,
57
- )
58
-
59
- // broadcastCallbacks.add((message) => sendMessage(message))
60
-
61
- const { connectedClientSessionPullQueues, syncProcessor } = yield* LeaderThreadCtx
62
- const { localHead } = yield* syncProcessor.syncState
63
-
64
- // TODO close queue when devtools disconnects
65
- const pullQueue = yield* connectedClientSessionPullQueues.makeQueue(localHead)
66
-
67
- yield* Stream.fromQueue(pullQueue).pipe(
68
- Stream.tap((msg) =>
27
+ yield* node.listenForChannel.pipe(
28
+ Stream.filter(
29
+ (res) =>
30
+ Devtools.isChannelName.devtoolsClientLeader(res.channelName, { storeId, clientId }) && res.mode === mode,
31
+ ),
32
+ Stream.tap(({ channelName, source }) =>
69
33
  Effect.gen(function* () {
70
- if (msg.payload._tag === 'upstream-advance') {
71
- for (const mutationEventEncoded of msg.payload.newEvents) {
72
- yield* sendMessage(
73
- Devtools.MutationBroadcast.make({
74
- mutationEventEncoded,
75
-
76
- liveStoreVersion,
77
- }),
34
+ const channel = yield* node.makeChannel({
35
+ target: source,
36
+ channelName,
37
+ schema: { listen: Devtools.Leader.MessageToApp, send: Devtools.Leader.MessageFromApp },
38
+ mode,
39
+ })
40
+
41
+ const sendMessage: SendMessageToDevtools = (message) =>
42
+ channel
43
+ .send(message)
44
+ .pipe(
45
+ Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
46
+ Effect.interruptible,
47
+ Effect.ignoreLogged,
78
48
  )
79
- }
80
- } else {
81
- yield* Effect.logWarning('TODO implement rebases in devtools')
82
- }
83
- }),
84
- ),
85
- Stream.runDrain,
86
- Effect.forkScoped,
87
- )
88
49
 
89
- yield* devtoolsCoordinatorChannel.listen.pipe(
90
- Stream.flatten(),
91
- // Stream.tapLogWithLabel('@livestore/common:leader-thread:devtools:onPortMessage'),
92
- Stream.tap((msg) =>
93
- Effect.gen(function* () {
94
- // yield* Effect.logDebug(`[@livestore/common:leader-thread:devtools] message from port: ${msg._tag}`, msg)
95
- // if (msg._tag === 'LSD.MessagePortForStoreRes') {
96
- // yield* Deferred.succeed(storeMessagePortDeferred, msg.port)
97
- // } else {
98
- yield* PubSub.publish(incomingMessagesPubSub, msg)
99
- // }
100
- }),
50
+ const syncState = yield* syncProcessor.syncState
51
+ const mergeCounter = syncProcessor.getMergeCounter()
52
+
53
+ yield* syncProcessor.pull({ cursor: { mergeCounter, eventId: syncState.localHead } }).pipe(
54
+ Stream.tap(({ payload }) => sendMessage(Devtools.Leader.SyncPull.make({ payload, liveStoreVersion }))),
55
+ Stream.runDrain,
56
+ Effect.forkScoped,
57
+ )
58
+
59
+ yield* listenToDevtools({
60
+ incomingMessages: channel.listen.pipe(Stream.flatten(), Stream.orDie),
61
+ sendMessage,
62
+ persistenceInfo,
63
+ })
64
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped),
101
65
  ),
102
66
  Stream.runDrain,
103
- Effect.withSpan(`@livestore/common:leader-thread:devtools:onPortMessage`),
104
- Effect.ignoreLogged,
105
- Effect.forkScoped,
106
67
  )
107
-
108
- // yield* sendMessage(Devtools.AppHostReady.make({ appHostId, liveStoreVersion, isLeader }), { force: true })
109
-
110
- // yield* sendMessage(Devtools.MessagePortForStoreReq.make({ appHostId, liveStoreVersion, requestId: nanoid() }), {
111
- // force: true,
112
- // })
113
-
114
- yield* listenToDevtools({
115
- incomingMessages,
116
- sendMessage,
117
- // isConnected,
118
- // disconnect,
119
- // storeId,
120
- // appHostId,
121
- // isLeader,
122
- persistenceInfo,
123
- shutdownChannel,
124
- })
125
68
  }).pipe(Effect.withSpan('@livestore/common:leader-thread:devtools:boot'))
126
69
 
127
70
  const listenToDevtools = ({
128
71
  incomingMessages,
129
72
  sendMessage,
130
- // isConnected,
131
- // disconnect,
132
- // appHostId,
133
- // storeId,
134
- // isLeader,
135
73
  persistenceInfo,
136
- shutdownChannel,
137
74
  }: {
138
- incomingMessages: Stream.Stream<Devtools.MessageToAppLeader>
75
+ incomingMessages: Stream.Stream<Devtools.Leader.MessageToApp>
139
76
  sendMessage: SendMessageToDevtools
140
- // isConnected: SubscriptionRef.SubscriptionRef<boolean>
141
- // disconnect: Effect.Effect<void>
142
- // appHostId: string
143
- // storeId: string
144
- // isLeader: boolean
145
- persistenceInfo: PersistenceInfoPair
146
- shutdownChannel: ShutdownChannel
77
+ persistenceInfo?: PersistenceInfoPair
147
78
  }) =>
148
79
  Effect.gen(function* () {
149
- const innerWorkerCtx = yield* LeaderThreadCtx
150
- const { syncBackend, makeSyncDb, db, dbLog, shutdownStateSubRef, syncProcessor } = innerWorkerCtx
80
+ const {
81
+ syncBackend,
82
+ makeSqliteDb,
83
+ dbState,
84
+ dbEventlog,
85
+ shutdownStateSubRef,
86
+ shutdownChannel,
87
+ syncProcessor,
88
+ clientId,
89
+ devtools,
90
+ } = yield* LeaderThreadCtx
91
+
92
+ type SubscriptionId = string
93
+ const subscriptionFiberMap = yield* FiberMap.make<SubscriptionId>()
151
94
 
152
95
  type RequestId = string
153
- const subscriptionFiberMap = yield* FiberMap.make<RequestId>()
96
+ const handledRequestIds = new Set<RequestId>()
154
97
 
155
98
  yield* incomingMessages.pipe(
156
99
  Stream.tap((decodedEvent) =>
157
100
  Effect.gen(function* () {
158
- // yield* Effect.logDebug('[@livestore/common:leader-thread:devtools] incomingMessage', decodedEvent)
159
-
160
- if (decodedEvent._tag === 'LSD.Disconnect') {
161
- // yield* SubscriptionRef.set(isConnected, false)
101
+ const { requestId } = decodedEvent
102
+ const reqPayload = { requestId, liveStoreVersion, clientId }
162
103
 
163
- // yield* disconnect
104
+ // yield* Effect.logDebug(
105
+ // `[@livestore/common:leader-thread:devtools] incomingMessage: ${decodedEvent._tag} (${requestId})`,
106
+ // decodedEvent,
107
+ // )
164
108
 
165
- // TODO is there a better place for this?
166
- // yield* sendMessage(Devtools.AppHostReady.make({ appHostId, liveStoreVersion, isLeader }), {
167
- // force: true,
168
- // })
109
+ if (decodedEvent._tag === 'LSD.Leader.Disconnect') {
110
+ return
111
+ }
169
112
 
113
+ // TODO we should try to move the duplicate message handling on the webmesh layer
114
+ // So far I could only observe this problem with webmesh proxy channels (e.g. for Expo)
115
+ // Proof: https://share.cleanshot.com/V9G87B0B
116
+ // Also see `store/devtools.ts` for same problem
117
+ if (handledRequestIds.has(requestId)) {
118
+ // yield* Effect.logWarning(`Duplicate message`, decodedEvent)
170
119
  return
171
120
  }
172
121
 
173
- const { requestId } = decodedEvent
174
- const reqPayload = { requestId, liveStoreVersion }
122
+ handledRequestIds.add(requestId)
175
123
 
176
124
  switch (decodedEvent._tag) {
177
- case 'LSD.Ping': {
178
- yield* sendMessage(Devtools.Pong.make({ ...reqPayload }))
125
+ case 'LSD.Leader.Ping': {
126
+ yield* sendMessage(Devtools.Leader.Pong.make({ ...reqPayload }))
179
127
  return
180
128
  }
181
129
  case 'LSD.Leader.SnapshotReq': {
182
- const snapshot = db.export()
130
+ const snapshot = dbState.export()
183
131
 
184
- yield* sendMessage(Devtools.SnapshotRes.make({ snapshot, ...reqPayload }))
132
+ yield* sendMessage(Devtools.Leader.SnapshotRes.make({ snapshot, ...reqPayload }))
185
133
 
186
134
  return
187
135
  }
188
- case 'LSD.Leader.LoadDatabaseFileReq': {
136
+ case 'LSD.Leader.LoadDatabaseFile.Request': {
189
137
  const { data } = decodedEvent
190
138
 
191
139
  let tableNames: Set<string>
192
140
 
193
141
  try {
194
- const tmpSyncDb = yield* makeSyncDb({ _tag: 'in-memory' })
195
- tmpSyncDb.import(data)
196
- const tableNameResults = tmpSyncDb.select<{ name: string }>(
142
+ const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
143
+ tmpDb.import(data)
144
+ const tableNameResults = tmpDb.select<{ name: string }>(
197
145
  `select name from sqlite_master where type = 'table'`,
198
146
  )
199
147
 
200
148
  tableNames = new Set(tableNameResults.map((_) => _.name))
201
149
 
202
- tmpSyncDb.close()
203
- } catch (e) {
204
- yield* Effect.logError(`Error importing database file`, e)
205
- yield* sendMessage(Devtools.LoadDatabaseFileRes.make({ ...reqPayload, status: 'unsupported-file' }))
150
+ tmpDb.close()
151
+ } catch (cause) {
152
+ yield* Effect.logError(`Error importing database file`, cause)
153
+ yield* sendMessage(
154
+ Devtools.Leader.LoadDatabaseFile.Error.make({
155
+ ...reqPayload,
156
+ cause: { _tag: 'unexpected-error', cause },
157
+ }),
158
+ )
206
159
 
207
160
  return
208
161
  }
209
162
 
210
- if (tableNames.has(MUTATION_LOG_META_TABLE)) {
211
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
212
-
213
- dbLog.import(data)
214
-
215
- db.destroy()
216
- } else if (tableNames.has(SCHEMA_META_TABLE) && tableNames.has(SCHEMA_MUTATIONS_META_TABLE)) {
217
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
218
-
219
- db.import(data)
163
+ try {
164
+ if (tableNames.has(SystemTables.EVENTLOG_META_TABLE)) {
165
+ // Is eventlog db
166
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
167
+
168
+ dbEventlog.import(data)
169
+
170
+ dbState.destroy()
171
+ } else if (
172
+ tableNames.has(SystemTables.SCHEMA_META_TABLE) &&
173
+ tableNames.has(SystemTables.SCHEMA_EVENT_DEFS_META_TABLE)
174
+ ) {
175
+ // Is state db
176
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
177
+
178
+ dbState.import(data)
179
+
180
+ dbEventlog.destroy()
181
+ } else {
182
+ yield* sendMessage(
183
+ Devtools.Leader.LoadDatabaseFile.Error.make({
184
+ ...reqPayload,
185
+ cause: { _tag: 'unsupported-database' },
186
+ }),
187
+ )
188
+ return
189
+ }
190
+
191
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }))
192
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void
220
193
 
221
- dbLog.destroy()
222
- } else {
223
- yield* sendMessage(Devtools.LoadDatabaseFileRes.make({ ...reqPayload, status: 'unsupported-database' }))
194
+ return
195
+ } catch (cause) {
196
+ yield* Effect.logError(`Error importing database file`, cause)
197
+ yield* sendMessage(
198
+ Devtools.Leader.LoadDatabaseFile.Error.make({
199
+ ...reqPayload,
200
+ cause: { _tag: 'unexpected-error', cause },
201
+ }),
202
+ )
224
203
  return
225
204
  }
226
-
227
- yield* sendMessage(Devtools.LoadDatabaseFileRes.make({ ...reqPayload, status: 'ok' }))
228
-
229
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' }))
230
-
231
- return
232
205
  }
233
- case 'LSD.Leader.ResetAllDataReq': {
206
+ case 'LSD.Leader.ResetAllData.Request': {
234
207
  const { mode } = decodedEvent
235
208
 
236
209
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
237
210
 
238
- db.destroy()
211
+ dbState.destroy()
239
212
 
240
213
  if (mode === 'all-data') {
241
- dbLog.destroy()
214
+ dbEventlog.destroy()
242
215
  }
243
216
 
244
- yield* sendMessage(Devtools.ResetAllDataRes.make({ ...reqPayload }))
217
+ yield* sendMessage(Devtools.Leader.ResetAllData.Success.make({ ...reqPayload }))
245
218
 
246
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' }))
219
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' })) ?? Effect.void
247
220
 
248
221
  return
249
222
  }
250
223
  case 'LSD.Leader.DatabaseFileInfoReq': {
224
+ if (persistenceInfo === undefined) {
225
+ console.log('[@livestore/common:leader-thread:devtools] persistenceInfo is required for this request')
226
+ return
227
+ }
228
+
251
229
  const dbSizeQuery = `SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size();`
252
- const dbFileSize = db.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
253
- const mutationLogFileSize = dbLog.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
230
+ const dbFileSize = dbState.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
231
+ const eventlogFileSize = dbEventlog.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
254
232
 
255
233
  yield* sendMessage(
256
- Devtools.DatabaseFileInfoRes.make({
257
- db: { fileSize: dbFileSize, persistenceInfo: persistenceInfo.db },
258
- mutationLog: { fileSize: mutationLogFileSize, persistenceInfo: persistenceInfo.mutationLog },
234
+ Devtools.Leader.DatabaseFileInfoRes.make({
235
+ state: { fileSize: dbFileSize, persistenceInfo: persistenceInfo.state },
236
+ eventlog: { fileSize: eventlogFileSize, persistenceInfo: persistenceInfo.eventlog },
259
237
  ...reqPayload,
260
238
  }),
261
239
  )
262
240
 
263
241
  return
264
242
  }
265
- case 'LSD.Leader.MutationLogReq': {
266
- const mutationLog = dbLog.export()
243
+ case 'LSD.Leader.EventlogReq': {
244
+ const eventlog = dbEventlog.export()
267
245
 
268
- yield* sendMessage(Devtools.MutationLogRes.make({ mutationLog, ...reqPayload }))
246
+ yield* sendMessage(Devtools.Leader.EventlogRes.make({ eventlog, ...reqPayload }))
269
247
 
270
248
  return
271
249
  }
272
- case 'LSD.Leader.RunMutationReq': {
273
- yield* syncProcessor.pushPartial(decodedEvent.mutationEventEncoded)
250
+ case 'LSD.Leader.CommitEventReq': {
251
+ yield* syncProcessor.pushPartial({
252
+ event: decodedEvent.eventEncoded,
253
+ clientId: `devtools-${clientId}`,
254
+ sessionId: `devtools-${clientId}`,
255
+ })
274
256
 
275
- yield* sendMessage(Devtools.RunMutationRes.make({ ...reqPayload }))
257
+ yield* sendMessage(Devtools.Leader.CommitEventRes.make({ ...reqPayload }))
276
258
 
277
259
  return
278
260
  }
279
261
  case 'LSD.Leader.SyncHistorySubscribe': {
280
- const { requestId } = decodedEvent
262
+ const { subscriptionId } = decodedEvent
281
263
 
282
264
  if (syncBackend !== undefined) {
283
265
  // TODO consider piggybacking on the existing leader-thread sync-pulling
284
266
  yield* syncBackend.pull(Option.none()).pipe(
285
267
  Stream.map((_) => _.batch),
286
268
  Stream.flattenIterables,
287
- Stream.tap(({ mutationEventEncoded, metadata }) =>
288
- sendMessage(Devtools.SyncHistoryRes.make({ mutationEventEncoded, metadata, ...reqPayload })),
269
+ Stream.tap(({ eventEncoded, metadata }) =>
270
+ sendMessage(
271
+ Devtools.Leader.SyncHistoryRes.make({
272
+ eventEncoded,
273
+ metadata,
274
+ subscriptionId,
275
+ ...reqPayload,
276
+ requestId: nanoid(10),
277
+ }),
278
+ ),
289
279
  ),
290
280
  Stream.runDrain,
291
- Effect.acquireRelease(() => Effect.log('syncHistorySubscribe done')),
292
281
  Effect.interruptible,
293
282
  Effect.tapCauseLogPretty,
294
- FiberMap.run(subscriptionFiberMap, requestId),
283
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
295
284
  )
296
285
  }
297
286
 
@@ -306,37 +295,42 @@ const listenToDevtools = ({
306
295
  return
307
296
  }
308
297
  case 'LSD.Leader.SyncingInfoReq': {
309
- const syncingInfo = Devtools.SyncingInfo.make({
298
+ const syncingInfo = Devtools.Leader.SyncingInfo.make({
310
299
  enabled: syncBackend !== undefined,
311
- metadata: {},
300
+ metadata: syncBackend?.metadata ?? {},
312
301
  })
313
302
 
314
- yield* sendMessage(Devtools.SyncingInfoRes.make({ syncingInfo, ...reqPayload }))
303
+ yield* sendMessage(Devtools.Leader.SyncingInfoRes.make({ syncingInfo, ...reqPayload }))
315
304
 
316
305
  return
317
306
  }
318
307
  case 'LSD.Leader.NetworkStatusSubscribe': {
319
308
  if (syncBackend !== undefined) {
320
- const { requestId } = decodedEvent
309
+ const { subscriptionId } = decodedEvent
321
310
 
322
311
  // TODO investigate and fix bug. seems that when sending messages right after
323
312
  // the devtools have connected get sometimes lost
324
313
  // This is probably the same "flaky databrowser loading" bug as we're seeing in the playwright tests
325
314
  yield* Effect.sleep(1000)
326
315
 
327
- yield* syncBackend.isConnected.changes.pipe(
328
- Stream.tap((isConnected) =>
316
+ yield* Stream.zipLatest(
317
+ syncBackend.isConnected.changes,
318
+ devtools.enabled ? devtools.syncBackendLatchState.changes : Stream.make({ latchClosed: false }),
319
+ ).pipe(
320
+ Stream.tap(([isConnected, { latchClosed }]) =>
329
321
  sendMessage(
330
- Devtools.NetworkStatusRes.make({
331
- networkStatus: { isConnected, timestampMs: Date.now() },
322
+ Devtools.Leader.NetworkStatusRes.make({
323
+ networkStatus: { isConnected, timestampMs: Date.now(), latchClosed },
324
+ subscriptionId,
332
325
  ...reqPayload,
326
+ requestId: nanoid(10),
333
327
  }),
334
328
  ),
335
329
  ),
336
330
  Stream.runDrain,
337
331
  Effect.interruptible,
338
332
  Effect.tapCauseLogPretty,
339
- FiberMap.run(subscriptionFiberMap, requestId),
333
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
340
334
  )
341
335
  }
342
336
 
@@ -349,6 +343,56 @@ const listenToDevtools = ({
349
343
 
350
344
  return
351
345
  }
346
+ case 'LSD.Leader.SyncHeadSubscribe': {
347
+ const { subscriptionId } = decodedEvent
348
+
349
+ yield* syncProcessor.syncState.changes.pipe(
350
+ Stream.tap((syncState) =>
351
+ sendMessage(
352
+ Devtools.Leader.SyncHeadRes.make({
353
+ local: syncState.localHead,
354
+ upstream: syncState.upstreamHead,
355
+ subscriptionId,
356
+ ...reqPayload,
357
+ requestId: nanoid(10),
358
+ }),
359
+ ),
360
+ ),
361
+ Stream.runDrain,
362
+ Effect.interruptible,
363
+ Effect.tapCauseLogPretty,
364
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
365
+ )
366
+
367
+ return
368
+ }
369
+ case 'LSD.Leader.SyncHeadUnsubscribe': {
370
+ const { subscriptionId } = decodedEvent
371
+
372
+ yield* FiberMap.remove(subscriptionFiberMap, subscriptionId)
373
+
374
+ return
375
+ }
376
+ case 'LSD.Leader.SetSyncLatch.Request': {
377
+ const { closeLatch } = decodedEvent
378
+
379
+ if (devtools.enabled === false) return
380
+
381
+ if (closeLatch === true) {
382
+ yield* devtools.syncBackendLatch.close
383
+ } else {
384
+ yield* devtools.syncBackendLatch.open
385
+ }
386
+
387
+ yield* SubscriptionRef.set(devtools.syncBackendLatchState, { latchClosed: closeLatch })
388
+
389
+ yield* sendMessage(Devtools.Leader.SetSyncLatch.Success.make({ ...reqPayload }))
390
+
391
+ return
392
+ }
393
+ default: {
394
+ yield* Effect.logWarning(`TODO implement devtools message`, decodedEvent)
395
+ }
352
396
  }
353
397
  }).pipe(Effect.withSpan(`@livestore/common:leader-thread:onDevtoolsMessage:${decodedEvent._tag}`)),
354
398
  ),