@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
@@ -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 { EVENTLOG_META_TABLE, SCHEMA_EVENT_DEFS_META_TABLE, SCHEMA_META_TABLE } 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,251 @@ export const bootDevtools = (options: DevtoolsOptions) =>
21
15
  return
22
16
  }
23
17
 
24
- const { persistenceInfo, shutdownChannel, devtoolsWebChannel } = yield* options.makeContext
18
+ const { syncProcessor, extraIncomingMessagesQueue } = 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)
33
-
34
- const outgoingMessagesQueue = yield* Queue.unbounded<Devtools.MessageFromAppLeader>().pipe(
35
- Effect.acquireRelease(Queue.shutdown),
36
- )
37
-
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) =>
69
- 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
- }),
78
- )
79
- }
80
- } else {
81
- yield* Effect.logWarning('TODO implement rebases in devtools')
82
- }
83
- }),
84
- ),
85
- Stream.runDrain,
86
- Effect.forkScoped,
87
- )
88
-
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
- }),
101
- ),
20
+ yield* listenToDevtools({
21
+ incomingMessages: Stream.fromQueue(extraIncomingMessagesQueue),
22
+ sendMessage: () => Effect.void,
23
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
24
+
25
+ const { persistenceInfo, devtoolsWebChannel } = yield* options.makeBootContext
26
+
27
+ const sendMessage: SendMessageToDevtools = (message) =>
28
+ devtoolsWebChannel
29
+ .send(message)
30
+ .pipe(
31
+ Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
32
+ Effect.interruptible,
33
+ Effect.ignoreLogged,
34
+ )
35
+
36
+ const syncState = yield* syncProcessor.syncState
37
+ const mergeCounter = syncProcessor.getMergeCounter()
38
+
39
+ yield* syncProcessor.pull({ cursor: { mergeCounter, eventId: syncState.localHead } }).pipe(
40
+ Stream.tap(({ payload }) => sendMessage(Devtools.Leader.SyncPull.make({ payload, liveStoreVersion }))),
102
41
  Stream.runDrain,
103
- Effect.withSpan(`@livestore/common:leader-thread:devtools:onPortMessage`),
104
- Effect.ignoreLogged,
105
42
  Effect.forkScoped,
106
43
  )
107
44
 
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
45
  yield* listenToDevtools({
115
- incomingMessages,
46
+ incomingMessages: devtoolsWebChannel.listen.pipe(Stream.flatten(), Stream.orDie),
116
47
  sendMessage,
117
- // isConnected,
118
- // disconnect,
119
- // storeId,
120
- // appHostId,
121
- // isLeader,
122
48
  persistenceInfo,
123
- shutdownChannel,
124
- })
49
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
125
50
  }).pipe(Effect.withSpan('@livestore/common:leader-thread:devtools:boot'))
126
51
 
127
52
  const listenToDevtools = ({
128
53
  incomingMessages,
129
54
  sendMessage,
130
- // isConnected,
131
- // disconnect,
132
- // appHostId,
133
- // storeId,
134
- // isLeader,
135
55
  persistenceInfo,
136
- shutdownChannel,
137
56
  }: {
138
- incomingMessages: Stream.Stream<Devtools.MessageToAppLeader>
57
+ incomingMessages: Stream.Stream<Devtools.Leader.MessageToApp>
139
58
  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
59
+ persistenceInfo?: PersistenceInfoPair
147
60
  }) =>
148
61
  Effect.gen(function* () {
149
- const innerWorkerCtx = yield* LeaderThreadCtx
150
- const { syncBackend, makeSyncDb, db, dbLog, shutdownStateSubRef, syncProcessor } = innerWorkerCtx
62
+ const {
63
+ syncBackend,
64
+ makeSqliteDb,
65
+ dbReadModel,
66
+ dbEventlog,
67
+ shutdownStateSubRef,
68
+ shutdownChannel,
69
+ syncProcessor,
70
+ clientId,
71
+ devtools,
72
+ } = yield* LeaderThreadCtx
73
+
74
+ type SubscriptionId = string
75
+ const subscriptionFiberMap = yield* FiberMap.make<SubscriptionId>()
151
76
 
152
77
  type RequestId = string
153
- const subscriptionFiberMap = yield* FiberMap.make<RequestId>()
78
+ const handledRequestIds = new Set<RequestId>()
154
79
 
155
80
  yield* incomingMessages.pipe(
156
81
  Stream.tap((decodedEvent) =>
157
82
  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)
83
+ const { requestId } = decodedEvent
84
+ const reqPayload = { requestId, liveStoreVersion, clientId }
162
85
 
163
- // yield* disconnect
86
+ // yield* Effect.logDebug(
87
+ // `[@livestore/common:leader-thread:devtools] incomingMessage: ${decodedEvent._tag} (${requestId})`,
88
+ // decodedEvent,
89
+ // )
164
90
 
165
- // TODO is there a better place for this?
166
- // yield* sendMessage(Devtools.AppHostReady.make({ appHostId, liveStoreVersion, isLeader }), {
167
- // force: true,
168
- // })
91
+ if (decodedEvent._tag === 'LSD.Leader.Disconnect') {
92
+ return
93
+ }
169
94
 
95
+ // TODO we should try to move the duplicate message handling on the webmesh layer
96
+ // So far I could only observe this problem with webmesh proxy channels (e.g. for Expo)
97
+ // Proof: https://share.cleanshot.com/V9G87B0B
98
+ // Also see `store/devtools.ts` for same problem
99
+ if (handledRequestIds.has(requestId)) {
100
+ // yield* Effect.logWarning(`Duplicate message`, decodedEvent)
170
101
  return
171
102
  }
172
103
 
173
- const { requestId } = decodedEvent
174
- const reqPayload = { requestId, liveStoreVersion }
104
+ handledRequestIds.add(requestId)
175
105
 
176
106
  switch (decodedEvent._tag) {
177
- case 'LSD.Ping': {
178
- yield* sendMessage(Devtools.Pong.make({ ...reqPayload }))
107
+ case 'LSD.Leader.Ping': {
108
+ yield* sendMessage(Devtools.Leader.Pong.make({ ...reqPayload }))
179
109
  return
180
110
  }
181
111
  case 'LSD.Leader.SnapshotReq': {
182
- const snapshot = db.export()
112
+ const snapshot = dbReadModel.export()
183
113
 
184
- yield* sendMessage(Devtools.SnapshotRes.make({ snapshot, ...reqPayload }))
114
+ yield* sendMessage(Devtools.Leader.SnapshotRes.make({ snapshot, ...reqPayload }))
185
115
 
186
116
  return
187
117
  }
188
- case 'LSD.Leader.LoadDatabaseFileReq': {
118
+ case 'LSD.Leader.LoadDatabaseFile.Request': {
189
119
  const { data } = decodedEvent
190
120
 
191
121
  let tableNames: Set<string>
192
122
 
193
123
  try {
194
- const tmpSyncDb = yield* makeSyncDb({ _tag: 'in-memory' })
195
- tmpSyncDb.import(data)
196
- const tableNameResults = tmpSyncDb.select<{ name: string }>(
124
+ const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
125
+ tmpDb.import(data)
126
+ const tableNameResults = tmpDb.select<{ name: string }>(
197
127
  `select name from sqlite_master where type = 'table'`,
198
128
  )
199
129
 
200
130
  tableNames = new Set(tableNameResults.map((_) => _.name))
201
131
 
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' }))
132
+ tmpDb.close()
133
+ } catch (cause) {
134
+ yield* Effect.logError(`Error importing database file`, cause)
135
+ yield* sendMessage(
136
+ Devtools.Leader.LoadDatabaseFile.Error.make({
137
+ ...reqPayload,
138
+ cause: { _tag: 'unexpected-error', cause },
139
+ }),
140
+ )
206
141
 
207
142
  return
208
143
  }
209
144
 
210
- if (tableNames.has(MUTATION_LOG_META_TABLE)) {
211
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
212
-
213
- dbLog.import(data)
145
+ try {
146
+ if (tableNames.has(EVENTLOG_META_TABLE)) {
147
+ // Is eventlog
148
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
214
149
 
215
- db.destroy()
216
- } else if (tableNames.has(SCHEMA_META_TABLE) && tableNames.has(SCHEMA_MUTATIONS_META_TABLE)) {
217
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
150
+ dbEventlog.import(data)
218
151
 
219
- db.import(data)
152
+ dbReadModel.destroy()
153
+ } else if (tableNames.has(SCHEMA_META_TABLE) && tableNames.has(SCHEMA_EVENT_DEFS_META_TABLE)) {
154
+ // Is read model
155
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
220
156
 
221
- dbLog.destroy()
222
- } else {
223
- yield* sendMessage(Devtools.LoadDatabaseFileRes.make({ ...reqPayload, status: 'unsupported-database' }))
224
- return
225
- }
157
+ dbReadModel.import(data)
226
158
 
227
- yield* sendMessage(Devtools.LoadDatabaseFileRes.make({ ...reqPayload, status: 'ok' }))
159
+ dbEventlog.destroy()
160
+ } else {
161
+ yield* sendMessage(
162
+ Devtools.Leader.LoadDatabaseFile.Error.make({
163
+ ...reqPayload,
164
+ cause: { _tag: 'unsupported-database' },
165
+ }),
166
+ )
167
+ return
168
+ }
228
169
 
229
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' }))
170
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }))
171
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void
230
172
 
231
- return
173
+ return
174
+ } catch (cause) {
175
+ yield* Effect.logError(`Error importing database file`, cause)
176
+ yield* sendMessage(
177
+ Devtools.Leader.LoadDatabaseFile.Error.make({
178
+ ...reqPayload,
179
+ cause: { _tag: 'unexpected-error', cause },
180
+ }),
181
+ )
182
+ return
183
+ }
232
184
  }
233
- case 'LSD.Leader.ResetAllDataReq': {
185
+ case 'LSD.Leader.ResetAllData.Request': {
234
186
  const { mode } = decodedEvent
235
187
 
236
188
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
237
189
 
238
- db.destroy()
190
+ dbReadModel.destroy()
239
191
 
240
192
  if (mode === 'all-data') {
241
- dbLog.destroy()
193
+ dbEventlog.destroy()
242
194
  }
243
195
 
244
- yield* sendMessage(Devtools.ResetAllDataRes.make({ ...reqPayload }))
196
+ yield* sendMessage(Devtools.Leader.ResetAllData.Success.make({ ...reqPayload }))
245
197
 
246
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' }))
198
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' })) ?? Effect.void
247
199
 
248
200
  return
249
201
  }
250
202
  case 'LSD.Leader.DatabaseFileInfoReq': {
203
+ if (persistenceInfo === undefined) {
204
+ console.log('[@livestore/common:leader-thread:devtools] persistenceInfo is required for this request')
205
+ return
206
+ }
207
+
251
208
  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
209
+ const dbFileSize = dbReadModel.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
210
+ const eventlogFileSize = dbEventlog.select<{ size: number }>(dbSizeQuery, undefined)[0]!.size
254
211
 
255
212
  yield* sendMessage(
256
- Devtools.DatabaseFileInfoRes.make({
257
- db: { fileSize: dbFileSize, persistenceInfo: persistenceInfo.db },
258
- mutationLog: { fileSize: mutationLogFileSize, persistenceInfo: persistenceInfo.mutationLog },
213
+ Devtools.Leader.DatabaseFileInfoRes.make({
214
+ readModel: { fileSize: dbFileSize, persistenceInfo: persistenceInfo.readModel },
215
+ eventlog: { fileSize: eventlogFileSize, persistenceInfo: persistenceInfo.eventlog },
259
216
  ...reqPayload,
260
217
  }),
261
218
  )
262
219
 
263
220
  return
264
221
  }
265
- case 'LSD.Leader.MutationLogReq': {
266
- const mutationLog = dbLog.export()
222
+ case 'LSD.Leader.EventlogReq': {
223
+ const eventlog = dbEventlog.export()
267
224
 
268
- yield* sendMessage(Devtools.MutationLogRes.make({ mutationLog, ...reqPayload }))
225
+ yield* sendMessage(Devtools.Leader.EventlogRes.make({ eventlog, ...reqPayload }))
269
226
 
270
227
  return
271
228
  }
272
- case 'LSD.Leader.RunMutationReq': {
273
- yield* syncProcessor.pushPartial(decodedEvent.mutationEventEncoded)
229
+ case 'LSD.Leader.CommitEventReq': {
230
+ yield* syncProcessor.pushPartial({
231
+ event: decodedEvent.eventEncoded,
232
+ clientId: `devtools-${clientId}`,
233
+ sessionId: `devtools-${clientId}`,
234
+ })
274
235
 
275
- yield* sendMessage(Devtools.RunMutationRes.make({ ...reqPayload }))
236
+ yield* sendMessage(Devtools.Leader.CommitEventRes.make({ ...reqPayload }))
276
237
 
277
238
  return
278
239
  }
279
240
  case 'LSD.Leader.SyncHistorySubscribe': {
280
- const { requestId } = decodedEvent
241
+ const { subscriptionId } = decodedEvent
281
242
 
282
243
  if (syncBackend !== undefined) {
283
244
  // TODO consider piggybacking on the existing leader-thread sync-pulling
284
245
  yield* syncBackend.pull(Option.none()).pipe(
285
246
  Stream.map((_) => _.batch),
286
247
  Stream.flattenIterables,
287
- Stream.tap(({ mutationEventEncoded, metadata }) =>
288
- sendMessage(Devtools.SyncHistoryRes.make({ mutationEventEncoded, metadata, ...reqPayload })),
248
+ Stream.tap(({ eventEncoded, metadata }) =>
249
+ sendMessage(
250
+ Devtools.Leader.SyncHistoryRes.make({
251
+ eventEncoded,
252
+ metadata,
253
+ subscriptionId,
254
+ ...reqPayload,
255
+ requestId: nanoid(10),
256
+ }),
257
+ ),
289
258
  ),
290
259
  Stream.runDrain,
291
- Effect.acquireRelease(() => Effect.log('syncHistorySubscribe done')),
292
260
  Effect.interruptible,
293
261
  Effect.tapCauseLogPretty,
294
- FiberMap.run(subscriptionFiberMap, requestId),
262
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
295
263
  )
296
264
  }
297
265
 
@@ -306,37 +274,42 @@ const listenToDevtools = ({
306
274
  return
307
275
  }
308
276
  case 'LSD.Leader.SyncingInfoReq': {
309
- const syncingInfo = Devtools.SyncingInfo.make({
277
+ const syncingInfo = Devtools.Leader.SyncingInfo.make({
310
278
  enabled: syncBackend !== undefined,
311
- metadata: {},
279
+ metadata: syncBackend?.metadata ?? {},
312
280
  })
313
281
 
314
- yield* sendMessage(Devtools.SyncingInfoRes.make({ syncingInfo, ...reqPayload }))
282
+ yield* sendMessage(Devtools.Leader.SyncingInfoRes.make({ syncingInfo, ...reqPayload }))
315
283
 
316
284
  return
317
285
  }
318
286
  case 'LSD.Leader.NetworkStatusSubscribe': {
319
287
  if (syncBackend !== undefined) {
320
- const { requestId } = decodedEvent
288
+ const { subscriptionId } = decodedEvent
321
289
 
322
290
  // TODO investigate and fix bug. seems that when sending messages right after
323
291
  // the devtools have connected get sometimes lost
324
292
  // This is probably the same "flaky databrowser loading" bug as we're seeing in the playwright tests
325
293
  yield* Effect.sleep(1000)
326
294
 
327
- yield* syncBackend.isConnected.changes.pipe(
328
- Stream.tap((isConnected) =>
295
+ yield* Stream.zipLatest(
296
+ syncBackend.isConnected.changes,
297
+ devtools.enabled ? devtools.syncBackendLatchState.changes : Stream.make({ latchClosed: false }),
298
+ ).pipe(
299
+ Stream.tap(([isConnected, { latchClosed }]) =>
329
300
  sendMessage(
330
- Devtools.NetworkStatusRes.make({
331
- networkStatus: { isConnected, timestampMs: Date.now() },
301
+ Devtools.Leader.NetworkStatusRes.make({
302
+ networkStatus: { isConnected, timestampMs: Date.now(), latchClosed },
303
+ subscriptionId,
332
304
  ...reqPayload,
305
+ requestId: nanoid(10),
333
306
  }),
334
307
  ),
335
308
  ),
336
309
  Stream.runDrain,
337
310
  Effect.interruptible,
338
311
  Effect.tapCauseLogPretty,
339
- FiberMap.run(subscriptionFiberMap, requestId),
312
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
340
313
  )
341
314
  }
342
315
 
@@ -349,6 +322,56 @@ const listenToDevtools = ({
349
322
 
350
323
  return
351
324
  }
325
+ case 'LSD.Leader.SyncHeadSubscribe': {
326
+ const { subscriptionId } = decodedEvent
327
+
328
+ yield* syncProcessor.syncState.changes.pipe(
329
+ Stream.tap((syncState) =>
330
+ sendMessage(
331
+ Devtools.Leader.SyncHeadRes.make({
332
+ local: syncState.localHead,
333
+ upstream: syncState.upstreamHead,
334
+ subscriptionId,
335
+ ...reqPayload,
336
+ requestId: nanoid(10),
337
+ }),
338
+ ),
339
+ ),
340
+ Stream.runDrain,
341
+ Effect.interruptible,
342
+ Effect.tapCauseLogPretty,
343
+ FiberMap.run(subscriptionFiberMap, subscriptionId),
344
+ )
345
+
346
+ return
347
+ }
348
+ case 'LSD.Leader.SyncHeadUnsubscribe': {
349
+ const { subscriptionId } = decodedEvent
350
+
351
+ yield* FiberMap.remove(subscriptionFiberMap, subscriptionId)
352
+
353
+ return
354
+ }
355
+ case 'LSD.Leader.SetSyncLatch.Request': {
356
+ const { closeLatch } = decodedEvent
357
+
358
+ if (devtools.enabled === false) return
359
+
360
+ if (closeLatch === true) {
361
+ yield* devtools.syncBackendLatch.close
362
+ } else {
363
+ yield* devtools.syncBackendLatch.open
364
+ }
365
+
366
+ yield* SubscriptionRef.set(devtools.syncBackendLatchState, { latchClosed: closeLatch })
367
+
368
+ yield* sendMessage(Devtools.Leader.SetSyncLatch.Success.make({ ...reqPayload }))
369
+
370
+ return
371
+ }
372
+ default: {
373
+ yield* Effect.logWarning(`TODO implement devtools message`, decodedEvent)
374
+ }
352
375
  }
353
376
  }).pipe(Effect.withSpan(`@livestore/common:leader-thread:onDevtoolsMessage:${decodedEvent._tag}`)),
354
377
  ),