@livestore/common 0.4.0-dev.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/WorkerTransportError.d.ts +11 -0
  6. package/dist/WorkerTransportError.d.ts.map +1 -0
  7. package/dist/WorkerTransportError.js +11 -0
  8. package/dist/WorkerTransportError.js.map +1 -0
  9. package/dist/adapter-types.d.ts +37 -7
  10. package/dist/adapter-types.d.ts.map +1 -1
  11. package/dist/adapter-types.js +27 -1
  12. package/dist/adapter-types.js.map +1 -1
  13. package/dist/bounded-collections.d.ts.map +1 -1
  14. package/dist/bounded-collections.js +6 -4
  15. package/dist/bounded-collections.js.map +1 -1
  16. package/dist/debug-info.d.ts.map +1 -1
  17. package/dist/debug-info.js +33 -6
  18. package/dist/debug-info.js.map +1 -1
  19. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  20. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  21. package/dist/devtools/devtools-compatibility.test.js +15 -0
  22. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  23. package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
  24. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  25. package/dist/devtools/devtools-messages-client-session.js +22 -5
  26. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  27. package/dist/devtools/devtools-messages-common.d.ts +11 -14
  28. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages-common.js +7 -9
  30. package/dist/devtools/devtools-messages-common.js.map +1 -1
  31. package/dist/devtools/devtools-messages-leader.d.ts +65 -30
  32. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  33. package/dist/devtools/devtools-messages-leader.js +29 -11
  34. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  35. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  36. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  37. package/dist/devtools/devtools-sessioninfo.js +7 -4
  38. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  39. package/dist/devtools/mod.d.ts +13 -2
  40. package/dist/devtools/mod.d.ts.map +1 -1
  41. package/dist/devtools/mod.js +10 -3
  42. package/dist/devtools/mod.js.map +1 -1
  43. package/dist/errors.d.ts +48 -18
  44. package/dist/errors.d.ts.map +1 -1
  45. package/dist/errors.js +20 -12
  46. package/dist/errors.js.map +1 -1
  47. package/dist/index.d.ts +4 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/leader-thread/LeaderSyncProcessor.d.ts +53 -6
  52. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  53. package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
  54. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  55. package/dist/leader-thread/RejectedPushError.d.ts +107 -0
  56. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  57. package/dist/leader-thread/RejectedPushError.js +78 -0
  58. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  59. package/dist/leader-thread/connection.js +1 -1
  60. package/dist/leader-thread/connection.js.map +1 -1
  61. package/dist/leader-thread/eventlog.d.ts +19 -14
  62. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  63. package/dist/leader-thread/eventlog.js +78 -18
  64. package/dist/leader-thread/eventlog.js.map +1 -1
  65. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  66. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  67. package/dist/leader-thread/leader-worker-devtools.js +90 -58
  68. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  69. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
  70. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  71. package/dist/leader-thread/make-leader-thread-layer.js +49 -17
  72. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  73. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  74. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  75. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  76. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  77. package/dist/leader-thread/materialize-event.d.ts +1 -1
  78. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  79. package/dist/leader-thread/materialize-event.js +28 -9
  80. package/dist/leader-thread/materialize-event.js.map +1 -1
  81. package/dist/leader-thread/mod.d.ts +1 -0
  82. package/dist/leader-thread/mod.d.ts.map +1 -1
  83. package/dist/leader-thread/mod.js +1 -0
  84. package/dist/leader-thread/mod.js.map +1 -1
  85. package/dist/leader-thread/recreate-db.d.ts +2 -2
  86. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  87. package/dist/leader-thread/recreate-db.js +6 -6
  88. package/dist/leader-thread/recreate-db.js.map +1 -1
  89. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  90. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  91. package/dist/leader-thread/shutdown-channel.js +2 -2
  92. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  93. package/dist/leader-thread/stream-events.d.ts +56 -0
  94. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  95. package/dist/leader-thread/stream-events.js +167 -0
  96. package/dist/leader-thread/stream-events.js.map +1 -0
  97. package/dist/leader-thread/types.d.ts +95 -17
  98. package/dist/leader-thread/types.d.ts.map +1 -1
  99. package/dist/leader-thread/types.js +13 -0
  100. package/dist/leader-thread/types.js.map +1 -1
  101. package/dist/logging.d.ts +40 -0
  102. package/dist/logging.d.ts.map +1 -0
  103. package/dist/logging.js +33 -0
  104. package/dist/logging.js.map +1 -0
  105. package/dist/make-client-session.d.ts +5 -3
  106. package/dist/make-client-session.d.ts.map +1 -1
  107. package/dist/make-client-session.js +7 -4
  108. package/dist/make-client-session.js.map +1 -1
  109. package/dist/materializer-helper.d.ts +6 -6
  110. package/dist/materializer-helper.d.ts.map +1 -1
  111. package/dist/materializer-helper.js +18 -8
  112. package/dist/materializer-helper.js.map +1 -1
  113. package/dist/otel.d.ts +2 -1
  114. package/dist/otel.d.ts.map +1 -1
  115. package/dist/otel.js +7 -2
  116. package/dist/otel.js.map +1 -1
  117. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  118. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  119. package/dist/rematerialize-from-eventlog.js +40 -29
  120. package/dist/rematerialize-from-eventlog.js.map +1 -1
  121. package/dist/schema/EventDef/define.d.ts +161 -0
  122. package/dist/schema/EventDef/define.d.ts.map +1 -0
  123. package/dist/schema/EventDef/define.js +140 -0
  124. package/dist/schema/EventDef/define.js.map +1 -0
  125. package/dist/schema/EventDef/deprecated.d.ts +99 -0
  126. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  127. package/dist/schema/EventDef/deprecated.js +144 -0
  128. package/dist/schema/EventDef/deprecated.js.map +1 -0
  129. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  130. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  131. package/dist/schema/EventDef/deprecated.test.js +95 -0
  132. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  133. package/dist/schema/EventDef/event-def.d.ts +110 -0
  134. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  135. package/dist/schema/EventDef/event-def.js +2 -0
  136. package/dist/schema/EventDef/event-def.js.map +1 -0
  137. package/dist/schema/EventDef/facts.d.ts +118 -0
  138. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  139. package/dist/schema/EventDef/facts.js +53 -0
  140. package/dist/schema/EventDef/facts.js.map +1 -0
  141. package/dist/schema/EventDef/materializer.d.ts +155 -0
  142. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  143. package/dist/schema/EventDef/materializer.js +83 -0
  144. package/dist/schema/EventDef/materializer.js.map +1 -0
  145. package/dist/schema/EventDef/mod.d.ts +6 -0
  146. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  147. package/dist/schema/EventDef/mod.js +6 -0
  148. package/dist/schema/EventDef/mod.js.map +1 -0
  149. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  150. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  151. package/dist/schema/EventSequenceNumber/client.js +193 -0
  152. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  153. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  154. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  155. package/dist/schema/EventSequenceNumber/global.js +14 -0
  156. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  157. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  158. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  159. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  160. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  161. package/dist/schema/EventSequenceNumber.test.js +44 -44
  162. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  163. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
  164. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  165. package/dist/schema/LiveStoreEvent/client.js +176 -0
  166. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  167. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  168. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  169. package/dist/schema/LiveStoreEvent/client.test.js +111 -0
  170. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  171. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  172. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  173. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  174. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  175. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  176. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  177. package/dist/schema/LiveStoreEvent/global.js +31 -0
  178. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  179. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  180. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  181. package/dist/schema/LiveStoreEvent/input.js +26 -0
  182. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  183. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  184. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  185. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  186. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  187. package/dist/schema/events.d.ts +1 -1
  188. package/dist/schema/events.d.ts.map +1 -1
  189. package/dist/schema/events.js +1 -1
  190. package/dist/schema/events.js.map +1 -1
  191. package/dist/schema/mod.d.ts +6 -4
  192. package/dist/schema/mod.d.ts.map +1 -1
  193. package/dist/schema/mod.js +5 -4
  194. package/dist/schema/mod.js.map +1 -1
  195. package/dist/schema/schema.d.ts +16 -1
  196. package/dist/schema/schema.d.ts.map +1 -1
  197. package/dist/schema/schema.js +32 -4
  198. package/dist/schema/schema.js.map +1 -1
  199. package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
  200. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  201. package/dist/schema/state/sqlite/client-document-def.js +36 -15
  202. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  203. package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
  204. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  205. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/column-annotations.js +1 -1
  207. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  208. package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
  209. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  210. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  211. package/dist/schema/state/sqlite/column-def.js +96 -47
  212. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  213. package/dist/schema/state/sqlite/column-def.test.js +51 -12
  214. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  215. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/column-spec.js +30 -12
  217. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  218. package/dist/schema/state/sqlite/column-spec.test.js +24 -15
  219. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  220. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
  221. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  222. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +16 -10
  223. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  224. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +15 -4
  225. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  226. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  227. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +1 -1
  229. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  231. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  232. package/dist/schema/state/sqlite/mod.d.ts +2 -2
  233. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/mod.js +5 -7
  235. package/dist/schema/state/sqlite/mod.js.map +1 -1
  236. package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
  237. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/query-builder/astToSql.js +99 -22
  240. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  241. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  242. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  243. package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
  244. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  245. package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
  246. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  247. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  248. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  250. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  251. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  252. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  253. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  254. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  255. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
  256. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  257. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  258. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  259. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  260. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  261. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  262. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  263. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  264. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  265. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  266. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  267. package/dist/schema/state/sqlite/table-def.d.ts +5 -3
  268. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/table-def.js +1 -1
  270. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  271. package/dist/schema/state/sqlite/table-def.test.js +92 -3
  272. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  273. package/dist/schema/unknown-events.d.ts +47 -0
  274. package/dist/schema/unknown-events.d.ts.map +1 -0
  275. package/dist/schema/unknown-events.js +69 -0
  276. package/dist/schema/unknown-events.js.map +1 -0
  277. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  278. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  279. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  280. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  281. package/dist/schema-management/common.js +2 -2
  282. package/dist/schema-management/common.js.map +1 -1
  283. package/dist/schema-management/migrations.d.ts +32 -2
  284. package/dist/schema-management/migrations.d.ts.map +1 -1
  285. package/dist/schema-management/migrations.js +38 -6
  286. package/dist/schema-management/migrations.js.map +1 -1
  287. package/dist/schema-management/validate-schema.d.ts +3 -3
  288. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  289. package/dist/schema-management/validate-schema.js +2 -2
  290. package/dist/schema-management/validate-schema.js.map +1 -1
  291. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  292. package/dist/sql-queries/sql-queries.js +18 -6
  293. package/dist/sql-queries/sql-queries.js.map +1 -1
  294. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  295. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  296. package/dist/sqlite-db-helper.js +3 -3
  297. package/dist/sqlite-db-helper.js.map +1 -1
  298. package/dist/sqlite-types.d.ts +5 -5
  299. package/dist/sqlite-types.d.ts.map +1 -1
  300. package/dist/sqlite-types.js.map +1 -1
  301. package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
  302. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  303. package/dist/sync/ClientSessionSyncProcessor.js +99 -114
  304. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  305. package/dist/sync/errors.d.ts +0 -33
  306. package/dist/sync/errors.d.ts.map +1 -1
  307. package/dist/sync/errors.js +5 -22
  308. package/dist/sync/errors.js.map +1 -1
  309. package/dist/sync/index.d.ts +2 -0
  310. package/dist/sync/index.d.ts.map +1 -1
  311. package/dist/sync/index.js +2 -0
  312. package/dist/sync/index.js.map +1 -1
  313. package/dist/sync/mock-sync-backend.d.ts +10 -8
  314. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  315. package/dist/sync/mock-sync-backend.js +71 -69
  316. package/dist/sync/mock-sync-backend.js.map +1 -1
  317. package/dist/sync/next/compact-events.d.ts.map +1 -1
  318. package/dist/sync/next/compact-events.js +11 -12
  319. package/dist/sync/next/compact-events.js.map +1 -1
  320. package/dist/sync/next/facts.d.ts +5 -5
  321. package/dist/sync/next/facts.d.ts.map +1 -1
  322. package/dist/sync/next/facts.js +7 -8
  323. package/dist/sync/next/facts.js.map +1 -1
  324. package/dist/sync/next/history-dag-common.d.ts +54 -15
  325. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  326. package/dist/sync/next/history-dag-common.js +198 -9
  327. package/dist/sync/next/history-dag-common.js.map +1 -1
  328. package/dist/sync/next/history-dag.d.ts.map +1 -1
  329. package/dist/sync/next/history-dag.js +11 -11
  330. package/dist/sync/next/history-dag.js.map +1 -1
  331. package/dist/sync/next/rebase-events.d.ts +5 -5
  332. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  333. package/dist/sync/next/rebase-events.js +6 -6
  334. package/dist/sync/next/rebase-events.js.map +1 -1
  335. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  336. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  337. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  338. package/dist/sync/next/test/compact-events.test.js +2 -2
  339. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  340. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  341. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  342. package/dist/sync/next/test/event-fixtures.js +11 -11
  343. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  344. package/dist/sync/sync-backend-kv.d.ts +3 -3
  345. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  346. package/dist/sync/sync-backend-kv.js +3 -3
  347. package/dist/sync/sync-backend-kv.js.map +1 -1
  348. package/dist/sync/sync-backend.d.ts +33 -13
  349. package/dist/sync/sync-backend.d.ts.map +1 -1
  350. package/dist/sync/sync-backend.js +38 -1
  351. package/dist/sync/sync-backend.js.map +1 -1
  352. package/dist/sync/sync.d.ts +23 -2
  353. package/dist/sync/sync.d.ts.map +1 -1
  354. package/dist/sync/syncstate.d.ts +55 -55
  355. package/dist/sync/syncstate.d.ts.map +1 -1
  356. package/dist/sync/syncstate.js +80 -98
  357. package/dist/sync/syncstate.js.map +1 -1
  358. package/dist/sync/syncstate.test.js +221 -132
  359. package/dist/sync/syncstate.test.js.map +1 -1
  360. package/dist/sync/transport-chunking.d.ts +36 -0
  361. package/dist/sync/transport-chunking.d.ts.map +1 -0
  362. package/dist/sync/transport-chunking.js +56 -0
  363. package/dist/sync/transport-chunking.js.map +1 -0
  364. package/dist/sync/validate-push-payload.d.ts +2 -2
  365. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  366. package/dist/sync/validate-push-payload.js +4 -6
  367. package/dist/sync/validate-push-payload.js.map +1 -1
  368. package/dist/testing/event-factory.d.ts +68 -0
  369. package/dist/testing/event-factory.d.ts.map +1 -0
  370. package/dist/testing/event-factory.js +78 -0
  371. package/dist/testing/event-factory.js.map +1 -0
  372. package/dist/testing/mod.d.ts +2 -0
  373. package/dist/testing/mod.d.ts.map +1 -0
  374. package/dist/testing/mod.js +2 -0
  375. package/dist/testing/mod.js.map +1 -0
  376. package/dist/util.js +2 -2
  377. package/dist/util.js.map +1 -1
  378. package/dist/version.d.ts +24 -5
  379. package/dist/version.d.ts.map +1 -1
  380. package/dist/version.js +25 -8
  381. package/dist/version.js.map +1 -1
  382. package/package.json +69 -16
  383. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  384. package/src/WorkerTransportError.ts +12 -0
  385. package/src/adapter-types.ts +50 -7
  386. package/src/bounded-collections.ts +6 -5
  387. package/src/debug-info.ts +37 -6
  388. package/src/devtools/devtools-compatibility.test.ts +18 -0
  389. package/src/devtools/devtools-messages-client-session.ts +22 -4
  390. package/src/devtools/devtools-messages-common.ts +7 -12
  391. package/src/devtools/devtools-messages-leader.ts +29 -10
  392. package/src/devtools/devtools-sessioninfo.ts +8 -5
  393. package/src/devtools/mod.ts +11 -2
  394. package/src/errors.ts +32 -24
  395. package/src/index.ts +4 -1
  396. package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
  397. package/src/leader-thread/RejectedPushError.ts +106 -0
  398. package/src/leader-thread/connection.ts +1 -1
  399. package/src/leader-thread/eventlog.ts +112 -39
  400. package/src/leader-thread/leader-worker-devtools.ts +201 -120
  401. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  402. package/src/leader-thread/make-leader-thread-layer.ts +125 -40
  403. package/src/leader-thread/materialize-event.ts +40 -10
  404. package/src/leader-thread/mod.ts +1 -0
  405. package/src/leader-thread/recreate-db.ts +7 -7
  406. package/src/leader-thread/shutdown-channel.ts +4 -8
  407. package/src/leader-thread/stream-events.ts +206 -0
  408. package/src/leader-thread/types.ts +68 -18
  409. package/src/logging.ts +62 -0
  410. package/src/make-client-session.ts +11 -5
  411. package/src/materializer-helper.ts +27 -16
  412. package/src/otel.ts +13 -2
  413. package/src/rematerialize-from-eventlog.ts +61 -51
  414. package/src/schema/EventDef/define.ts +217 -0
  415. package/src/schema/EventDef/deprecated.test.ts +129 -0
  416. package/src/schema/EventDef/deprecated.ts +175 -0
  417. package/src/schema/EventDef/event-def.ts +125 -0
  418. package/src/schema/EventDef/facts.ts +135 -0
  419. package/src/schema/EventDef/materializer.ts +172 -0
  420. package/src/schema/EventDef/mod.ts +5 -0
  421. package/src/schema/EventSequenceNumber/client.ts +257 -0
  422. package/src/schema/EventSequenceNumber/global.ts +19 -0
  423. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  424. package/src/schema/EventSequenceNumber.test.ts +72 -53
  425. package/src/schema/LiveStoreEvent/client.test.ts +129 -0
  426. package/src/schema/LiveStoreEvent/client.ts +235 -0
  427. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  428. package/src/schema/LiveStoreEvent/global.ts +45 -0
  429. package/src/schema/LiveStoreEvent/input.ts +63 -0
  430. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  431. package/src/schema/events.ts +1 -1
  432. package/src/schema/mod.ts +6 -4
  433. package/src/schema/schema.ts +46 -5
  434. package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
  435. package/src/schema/state/sqlite/client-document-def.ts +47 -34
  436. package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
  437. package/src/schema/state/sqlite/column-annotations.ts +2 -1
  438. package/src/schema/state/sqlite/column-def.test.ts +66 -12
  439. package/src/schema/state/sqlite/column-def.ts +119 -47
  440. package/src/schema/state/sqlite/column-spec.test.ts +32 -17
  441. package/src/schema/state/sqlite/column-spec.ts +37 -11
  442. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
  443. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
  444. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
  445. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
  446. package/src/schema/state/sqlite/mod.ts +7 -8
  447. package/src/schema/state/sqlite/query-builder/api.ts +55 -17
  448. package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
  449. package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
  450. package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
  451. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  452. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  453. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  454. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  455. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  456. package/src/schema/state/sqlite/table-def.test.ts +114 -3
  457. package/src/schema/state/sqlite/table-def.ts +16 -22
  458. package/src/schema/unknown-events.ts +131 -0
  459. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  460. package/src/schema-management/common.ts +2 -2
  461. package/src/schema-management/migrations.ts +42 -9
  462. package/src/schema-management/validate-schema.ts +3 -3
  463. package/src/sql-queries/sql-queries.ts +18 -6
  464. package/src/sql-queries/sql-query-builder.ts +1 -0
  465. package/src/sqlite-db-helper.ts +3 -3
  466. package/src/sqlite-types.ts +6 -5
  467. package/src/sync/ClientSessionSyncProcessor.ts +152 -142
  468. package/src/sync/errors.ts +12 -24
  469. package/src/sync/index.ts +2 -0
  470. package/src/sync/mock-sync-backend.ts +146 -104
  471. package/src/sync/next/compact-events.ts +10 -11
  472. package/src/sync/next/facts.ts +13 -14
  473. package/src/sync/next/history-dag-common.ts +280 -26
  474. package/src/sync/next/history-dag.ts +17 -13
  475. package/src/sync/next/rebase-events.ts +12 -12
  476. package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
  477. package/src/sync/next/test/compact-events.test.ts +4 -3
  478. package/src/sync/next/test/event-fixtures.ts +13 -13
  479. package/src/sync/sync-backend-kv.ts +4 -3
  480. package/src/sync/sync-backend.ts +66 -17
  481. package/src/sync/sync.ts +24 -2
  482. package/src/sync/syncstate.test.ts +583 -419
  483. package/src/sync/syncstate.ts +127 -122
  484. package/src/sync/transport-chunking.ts +90 -0
  485. package/src/sync/validate-push-payload.ts +6 -8
  486. package/src/testing/event-factory.ts +131 -0
  487. package/src/testing/mod.ts +1 -0
  488. package/src/util.ts +2 -2
  489. package/src/version.ts +33 -8
  490. package/dist/schema/EventDef.d.ts +0 -126
  491. package/dist/schema/EventDef.d.ts.map +0 -1
  492. package/dist/schema/EventDef.js +0 -46
  493. package/dist/schema/EventDef.js.map +0 -1
  494. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  495. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  496. package/dist/schema/EventSequenceNumber.js +0 -139
  497. package/dist/schema/EventSequenceNumber.js.map +0 -1
  498. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  499. package/dist/schema/LiveStoreEvent.js +0 -147
  500. package/dist/schema/LiveStoreEvent.js.map +0 -1
  501. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  502. package/dist/schema/state/sqlite/system-tables.js +0 -81
  503. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  504. package/dist/sync/next/graphology.d.ts +0 -8
  505. package/dist/sync/next/graphology.d.ts.map +0 -1
  506. package/dist/sync/next/graphology.js +0 -30
  507. package/dist/sync/next/graphology.js.map +0 -1
  508. package/dist/sync/next/graphology_.d.ts +0 -3
  509. package/dist/sync/next/graphology_.d.ts.map +0 -1
  510. package/dist/sync/next/graphology_.js +0 -3
  511. package/dist/sync/next/graphology_.js.map +0 -1
  512. package/src/schema/EventDef.ts +0 -222
  513. package/src/schema/EventSequenceNumber.ts +0 -199
  514. package/src/schema/LiveStoreEvent.ts +0 -286
  515. package/src/schema/state/sqlite/system-tables.ts +0 -106
  516. package/src/sync/next/ambient.d.ts +0 -3
  517. package/src/sync/next/graphology.ts +0 -41
  518. package/src/sync/next/graphology_.ts +0 -2
package/package.json CHANGED
@@ -1,6 +1,16 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.4.0-dev.8",
3
+ "version": "0.4.0",
4
+ "license": "Apache-2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/livestorejs/livestore.git"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "package.json",
12
+ "src"
13
+ ],
4
14
  "type": "module",
5
15
  "sideEffects": false,
6
16
  "exports": {
@@ -8,29 +18,72 @@
8
18
  "./sql-queries": "./dist/sql-queries/index.js",
9
19
  "./leader-thread": "./dist/leader-thread/mod.js",
10
20
  "./schema": "./dist/schema/mod.js",
21
+ "./sync": "./dist/sync/index.js",
11
22
  "./sync/next": "./dist/sync/next/mod.js",
12
- "./sync/next/test": "./dist/sync/next/test/mod.js"
23
+ "./sync/next/test": "./dist/sync/next/test/mod.js",
24
+ "./testing": "./dist/testing/mod.js"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
13
28
  },
14
29
  "dependencies": {
15
30
  "@opentelemetry/api": "1.9.0",
16
- "graphology": "0.26.0-alpha1",
17
- "graphology-dag": "0.4.1",
18
- "graphology-types": "0.24.8",
19
- "@livestore/webmesh": "0.4.0-dev.8",
20
- "@livestore/utils": "0.4.0-dev.8"
31
+ "@livestore/utils": "^0.4.0",
32
+ "@livestore/webmesh": "^0.4.0"
21
33
  },
22
34
  "devDependencies": {
35
+ "@effect/ai": "0.35.0",
36
+ "@effect/cli": "0.75.1",
37
+ "@effect/cluster": "0.58.2",
38
+ "@effect/experimental": "0.60.0",
39
+ "@effect/opentelemetry": "0.63.0",
40
+ "@effect/platform": "0.96.1",
41
+ "@effect/platform-browser": "0.76.0",
42
+ "@effect/platform-bun": "0.89.0",
43
+ "@effect/platform-node": "0.106.0",
44
+ "@effect/printer": "0.49.0",
45
+ "@effect/printer-ansi": "0.49.0",
46
+ "@effect/rpc": "0.75.1",
47
+ "@effect/sql": "0.51.1",
48
+ "@effect/typeclass": "0.40.0",
49
+ "@effect/vitest": "0.29.0",
50
+ "@opentelemetry/api": "1.9.0",
51
+ "@opentelemetry/resources": "2.2.0",
52
+ "@standard-schema/spec": "1.1.0",
53
+ "effect": "3.21.2",
23
54
  "vitest": "3.2.4",
24
- "@livestore/utils-dev": "0.4.0-dev.8"
55
+ "@livestore/utils-dev": "^0.4.0"
25
56
  },
26
- "files": [
27
- "package.json",
28
- "src",
29
- "dist"
30
- ],
31
- "license": "Apache-2.0",
32
- "publishConfig": {
33
- "access": "public"
57
+ "peerDependencies": {
58
+ "@effect/ai": "^0.35.0",
59
+ "@effect/cli": "^0.75.1",
60
+ "@effect/cluster": "^0.58.2",
61
+ "@effect/experimental": "^0.60.0",
62
+ "@effect/opentelemetry": "^0.63.0",
63
+ "@effect/platform": "^0.96.1",
64
+ "@effect/platform-browser": "^0.76.0",
65
+ "@effect/platform-bun": "^0.89.0",
66
+ "@effect/platform-node": "^0.106.0",
67
+ "@effect/printer": "^0.49.0",
68
+ "@effect/printer-ansi": "^0.49.0",
69
+ "@effect/rpc": "^0.75.1",
70
+ "@effect/sql": "^0.51.1",
71
+ "@effect/typeclass": "^0.40.0",
72
+ "@effect/vitest": "^0.29.0",
73
+ "@opentelemetry/api": "^1.9.0",
74
+ "@opentelemetry/resources": "^2.2.0",
75
+ "@standard-schema/spec": "^1.1.0",
76
+ "effect": "^3.21.2"
77
+ },
78
+ "$genie": {
79
+ "source": "package.json.genie.ts",
80
+ "warning": "DO NOT EDIT - changes will be overwritten",
81
+ "workspaceClosureDirs": [
82
+ "packages/@livestore/common",
83
+ "packages/@livestore/utils",
84
+ "packages/@livestore/utils-dev",
85
+ "packages/@livestore/webmesh"
86
+ ]
34
87
  },
35
88
  "scripts": {
36
89
  "test": "vitest"
@@ -1,33 +1,48 @@
1
- import type { Effect, Stream } from '@livestore/utils/effect'
1
+ import type { Effect, Stream, Subscribable } from '@livestore/utils/effect'
2
2
 
3
+ import type { StorageMode } from './adapter-types.ts'
3
4
  import type { MigrationsReport } from './defs.ts'
4
5
  import type * as Devtools from './devtools/mod.ts'
5
- import type { UnexpectedError } from './errors.ts'
6
- import type * as EventSequenceNumber from './schema/EventSequenceNumber.ts'
6
+ import type { StreamEventsOptions } from './leader-thread/types.ts'
7
+ import type * as EventSequenceNumber from './schema/EventSequenceNumber/mod.ts'
7
8
  import type { LiveStoreEvent } from './schema/mod.ts'
8
- import type { LeaderAheadError } from './sync/sync.ts'
9
+ import type { RejectedPushError } from './leader-thread/RejectedPushError.ts'
10
+ import type { SyncBackend } from './sync/sync.ts'
9
11
  import type { PayloadUpstream, SyncState } from './sync/syncstate.ts'
10
12
 
11
13
  export interface ClientSessionLeaderThreadProxy {
12
14
  events: {
13
15
  pull: (args: {
14
- cursor: EventSequenceNumber.EventSequenceNumber
15
- }) => Stream.Stream<{ payload: typeof PayloadUpstream.Type }, UnexpectedError>
16
+ cursor: EventSequenceNumber.Client.Composite
17
+ }) => Stream.Stream<{ payload: typeof PayloadUpstream.Type }>
16
18
  /** It's important that a client session doesn't call `push` concurrently. */
17
- push(batch: ReadonlyArray<LiveStoreEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | LeaderAheadError>
19
+ push(batch: ReadonlyArray<LiveStoreEvent.Client.Encoded>): Effect.Effect<void, RejectedPushError>
20
+ /** Stream events with filtering */
21
+ stream(options: StreamEventsOptions): Stream.Stream<LiveStoreEvent.Client.Encoded>
18
22
  }
19
23
  /** The initial state after the leader thread has booted */
20
24
  readonly initialState: {
21
25
  /** The latest event sequence number during boot. Used for the client session to resume syncing. */
22
- readonly leaderHead: EventSequenceNumber.EventSequenceNumber
26
+ readonly leaderHead: EventSequenceNumber.Client.Composite
23
27
  /** The migrations report from the leader thread */
24
28
  readonly migrationsReport: MigrationsReport
29
+ /**
30
+ * Indicates how data is being stored.
31
+ * - `persisted`: Data is persisted to disk (e.g., via OPFS)
32
+ * - `in-memory`: Data is only stored in memory and will be lost on page refresh (e.g., private browsing)
33
+ */
34
+ readonly storageMode: StorageMode
25
35
  }
26
- export: Effect.Effect<Uint8Array<ArrayBuffer>, UnexpectedError>
27
- getEventlogData: Effect.Effect<Uint8Array<ArrayBuffer>, UnexpectedError>
28
- getSyncState: Effect.Effect<SyncState, UnexpectedError>
36
+ export: Effect.Effect<Uint8Array<ArrayBuffer>>
37
+ getEventlogData: Effect.Effect<Uint8Array<ArrayBuffer>>
38
+ syncState: Subscribable.Subscribable<SyncState>
29
39
  /** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
30
- sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void, UnexpectedError>
40
+ sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void>
41
+ /**
42
+ * Reactive stream describing the connectivity between the leader and its upstream sync backend.
43
+ * Includes raw connection state, last transition timestamp, and devtools overrides (latch state).
44
+ */
45
+ networkStatus: Subscribable.Subscribable<SyncBackend.NetworkStatus>
31
46
  }
32
47
 
33
48
  export const of = (
@@ -0,0 +1,12 @@
1
+ import { ParseResult, WorkerError } from '@livestore/utils/effect'
2
+
3
+ /**
4
+ * Type guard that identifies infrastructure errors from the Effect Worker transport layer.
5
+ *
6
+ * @remarks
7
+ *
8
+ * These errors ({@link WorkerError.WorkerError}, {@link ParseResult.ParseError}) represent communication failures between
9
+ * threads/processes — not application-level failures.
10
+ */
11
+ export const isWorkerTransportError = (e: unknown): e is WorkerError.WorkerError | ParseResult.ParseError =>
12
+ ParseResult.isParseError(e) || WorkerError.isWorkerError(e)
@@ -10,16 +10,21 @@ import {
10
10
 
11
11
  import type { ClientSessionLeaderThreadProxy } from './ClientSessionLeaderThreadProxy.ts'
12
12
  import type * as Devtools from './devtools/mod.ts'
13
- import type { IntentionalShutdownCause, MaterializeError, UnexpectedError } from './errors.ts'
13
+ import type { IntentionalShutdownCause, MaterializeError, UnknownError } from './errors.ts'
14
14
  import type { LiveStoreSchema } from './schema/mod.ts'
15
15
  import type { SqliteDb } from './sqlite-types.ts'
16
- import type { IsOfflineError, SyncError } from './sync/index.js'
16
+ import type { BackendIdMismatchError } from './sync/index.ts'
17
17
 
18
18
  export * as ClientSessionLeaderThreadProxy from './ClientSessionLeaderThreadProxy.ts'
19
19
  export * from './defs.ts'
20
20
  export * from './errors.ts'
21
21
  export * from './sqlite-types.ts'
22
22
 
23
+ /**
24
+ * Runtime handle to an active LiveStore client session within the current process.
25
+ * Provides direct access to the embedded SQLite database, leader thread bridge,
26
+ * and lifecycle controls useful for application-level coordination.
27
+ */
23
28
  export interface ClientSession {
24
29
  /** SQLite database with synchronous API running in the same thread (usually in-memory) */
25
30
  sqliteDb: SqliteDb
@@ -29,7 +34,10 @@ export interface ClientSession {
29
34
  /** Status info whether current session is leader or not */
30
35
  lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
31
36
  shutdown: (
32
- cause: Exit.Exit<IntentionalShutdownCause, UnexpectedError | SyncError | MaterializeError>,
37
+ cause: Exit.Exit<
38
+ IntentionalShutdownCause,
39
+ UnknownError | MaterializeError | BackendIdMismatchError
40
+ >,
33
41
  ) => Effect.Effect<void>
34
42
  /** A proxy API to communicate with the leader thread */
35
43
  leaderThread: ClientSessionLeaderThreadProxy
@@ -44,12 +52,42 @@ export const BootStateProgress = Schema.Struct({
44
52
  total: Schema.Number,
45
53
  })
46
54
 
55
+ /**
56
+ * Describes known reasons why LiveStore boot may encounter storage issues.
57
+ *
58
+ * @remarks
59
+ * - `private-browsing`: OPFS unavailable due to private/incognito browsing mode (Safari, Firefox)
60
+ * - `storage-unavailable`: OPFS access denied for other reasons (permissions, quota)
61
+ * - `unknown`: Unexpected error during storage initialization
62
+ */
63
+ export const BootWarningReason = Schema.Literal('private-browsing', 'storage-unavailable', 'unknown')
64
+ export type BootWarningReason = typeof BootWarningReason.Type
65
+
66
+ /**
67
+ * Describes the storage mode the store is operating in.
68
+ *
69
+ * @remarks
70
+ * - `persisted`: Data is persisted to disk (e.g., via OPFS)
71
+ * - `in-memory`: Data is only stored in memory and will be lost on page refresh
72
+ */
73
+ export const StorageMode = Schema.Literal('persisted', 'in-memory')
74
+ export type StorageMode = typeof StorageMode.Type
75
+
47
76
  export const BootStatus = Schema.Union(
48
77
  Schema.Struct({ stage: Schema.Literal('loading') }),
49
78
  Schema.Struct({ stage: Schema.Literal('migrating'), progress: BootStateProgress }),
50
79
  Schema.Struct({ stage: Schema.Literal('rehydrating'), progress: BootStateProgress }),
51
80
  Schema.Struct({ stage: Schema.Literal('syncing'), progress: BootStateProgress }),
52
81
  Schema.Struct({ stage: Schema.Literal('done') }),
82
+ /**
83
+ * Indicates a non-fatal issue occurred during boot that may degrade functionality.
84
+ * LiveStore continues running but without full capabilities (e.g., no persistence).
85
+ */
86
+ Schema.Struct({
87
+ stage: Schema.Literal('warning'),
88
+ reason: BootWarningReason,
89
+ message: Schema.String,
90
+ }),
53
91
  ).annotations({ title: 'BootStatus' })
54
92
 
55
93
  export type BootStatus = typeof BootStatus.Type
@@ -114,9 +152,9 @@ export interface ClientSessionDevtoolsChannel
114
152
 
115
153
  export type ConnectDevtoolsToStore = (
116
154
  storeDevtoolsChannel: ClientSessionDevtoolsChannel,
117
- ) => Effect.Effect<void, UnexpectedError, Scope.Scope>
155
+ ) => Effect.Effect<void, UnknownError, Scope.Scope>
118
156
 
119
- export type Adapter = (args: AdapterArgs) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
157
+ export type Adapter = (args: AdapterArgs) => Effect.Effect<ClientSession, UnknownError, Scope.Scope>
120
158
 
121
159
  export interface AdapterArgs {
122
160
  schema: LiveStoreSchema
@@ -125,7 +163,10 @@ export interface AdapterArgs {
125
163
  debugInstanceId: string
126
164
  bootStatusQueue: Queue.Queue<BootStatus>
127
165
  shutdown: (
128
- exit: Exit.Exit<IntentionalShutdownCause, UnexpectedError | SyncError | MaterializeError | IsOfflineError>,
166
+ exit: Exit.Exit<
167
+ IntentionalShutdownCause,
168
+ UnknownError | MaterializeError | BackendIdMismatchError
169
+ >,
129
170
  ) => Effect.Effect<void>
130
171
  connectDevtoolsToStore: ConnectDevtoolsToStore
131
172
  /**
@@ -133,5 +174,7 @@ export interface AdapterArgs {
133
174
  *
134
175
  * @default undefined
135
176
  */
136
- syncPayload: Schema.JsonValue | undefined
177
+ syncPayloadSchema: Schema.Schema<any> | undefined
178
+ /** Encoded representation of the sync payload matching `syncPayloadSchema`. */
179
+ syncPayloadEncoded: Schema.JsonValue | undefined
137
180
  }
@@ -16,10 +16,11 @@ export class BoundMap<K, V> {
16
16
  this.#map.set(key, value)
17
17
  // console.log(this.#map.size, this.#sizeLimit);
18
18
  if (this.#map.size > this.#sizeLimit) {
19
- const firstKey = this.#map.keys().next().value as K
19
+ const firstKey = this.#map.keys().next().value
20
+ if (firstKey === undefined) return
20
21
  const deletedValue = this.#map.get(firstKey)!
21
22
  this.#map.delete(firstKey)
22
- if (this.onEvict) {
23
+ if (this.onEvict !== undefined) {
23
24
  this.onEvict(firstKey, deletedValue)
24
25
  }
25
26
  }
@@ -47,7 +48,7 @@ export class BoundSet<V> {
47
48
  }
48
49
 
49
50
  #onEvict = (v: V) => {
50
- if (this.onEvict) {
51
+ if (this.onEvict !== undefined) {
51
52
  this.onEvict(v)
52
53
  }
53
54
  }
@@ -85,7 +86,7 @@ export class BoundArray<V> {
85
86
  this.#array.push(v)
86
87
  if (this.#array.length > this.sizeLimit) {
87
88
  const first = this.#array.shift()
88
- if (first && this.onEvict) {
89
+ if (first !== undefined && this.onEvict !== undefined) {
89
90
  this.onEvict(first)
90
91
  }
91
92
  }
@@ -116,6 +117,6 @@ export class BoundArray<V> {
116
117
  }
117
118
 
118
119
  sort = (fn?: (a: V, b: V) => number) => {
119
- return this.#array.sort(fn)
120
+ return this.#array.toSorted(fn)
120
121
  }
121
122
  }
package/src/debug-info.ts CHANGED
@@ -22,6 +22,15 @@ export const SlowQueryInfo = Schema.Struct({
22
22
  startTimePerfNow: Schema.Number,
23
23
  })
24
24
 
25
+ const getSizeLimit = (value: unknown): number =>
26
+ typeof (value as { sizeLimit?: number }).sizeLimit === 'number'
27
+ ? (value as { sizeLimit: number }).sizeLimit
28
+ : Number.POSITIVE_INFINITY
29
+
30
+ const isBoundArrayLike = (value: unknown): value is BoundArray<unknown> =>
31
+ value instanceof BoundArray ||
32
+ (value !== null && typeof value === 'object' && typeof (value as { sizeLimit?: number }).sizeLimit === 'number')
33
+
25
34
  const BoundArraySchemaFromSelf = <A, I, R>(
26
35
  item: Schema.Schema<A, I, R>,
27
36
  ): Schema.Schema<BoundArray<A>, BoundArray<I>, R> =>
@@ -29,16 +38,17 @@ const BoundArraySchemaFromSelf = <A, I, R>(
29
38
  [item],
30
39
  {
31
40
  decode: (item) => (input, parseOptions, ast) => {
32
- if (input instanceof BoundArray) {
41
+ if (isBoundArrayLike(input) === true) {
33
42
  const elements = ParseResult.decodeUnknown(Schema.Array(item))([...input], parseOptions)
34
- return ParseResult.map(elements, (as): BoundArray<A> => BoundArray.make(input.sizeLimit, as))
43
+ return ParseResult.map(elements, (as): BoundArray<A> => BoundArray.make(getSizeLimit(input), as))
35
44
  }
36
45
  return ParseResult.fail(new ParseResult.Type(ast, input))
37
46
  },
38
47
  encode: (item) => (input, parseOptions, ast) => {
39
- if (input instanceof BoundArray) {
40
- const elements = ParseResult.encodeUnknown(Schema.Array(item))([...input], parseOptions)
41
- return ParseResult.map(elements, (is): BoundArray<I> => BoundArray.make(input.sizeLimit, is))
48
+ if (isBoundArrayLike(input) === true) {
49
+ const items = [...input]
50
+ const elements = ParseResult.encodeUnknown(Schema.Array(item))(items, parseOptions)
51
+ return ParseResult.map(elements, (is): BoundArray<I> => BoundArray.make(getSizeLimit(input), is))
42
52
  }
43
53
  return ParseResult.fail(new ParseResult.Type(ast, input))
44
54
  },
@@ -47,7 +57,28 @@ const BoundArraySchemaFromSelf = <A, I, R>(
47
57
  description: `BoundArray<${Schema.format(item)}>`,
48
58
  pretty: () => (_) => `BoundArray(${_.length})`,
49
59
  arbitrary: () => (fc) => fc.anything() as any,
50
- equivalence: () => (a, b) => a === b,
60
+ equivalence: () => {
61
+ const elementEquivalence = Schema.equivalence(item)
62
+ return (a: unknown, b: unknown) => {
63
+ if (a === b) {
64
+ return true
65
+ }
66
+ if (isBoundArrayLike(a) === false || isBoundArrayLike(b) === false) {
67
+ return false
68
+ }
69
+ if (getSizeLimit(a) !== getSizeLimit(b) || a.length !== b.length) {
70
+ return false
71
+ }
72
+ const itemsA = [...a]
73
+ const itemsB = [...b]
74
+ for (let i = 0; i < itemsA.length; i++) {
75
+ if (elementEquivalence(itemsA[i] as any, itemsB[i] as any) === false) {
76
+ return false
77
+ }
78
+ }
79
+ return true
80
+ }
81
+ },
51
82
  },
52
83
  )
53
84
 
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { isDevtoolsProtocolVersionSupported, resolveDevtoolsProtocolVersion } from '../version.ts'
4
+
5
+ describe('DevTools protocol compatibility', () => {
6
+ it('treats legacy pings without a protocol version as protocol 1', () => {
7
+ expect(resolveDevtoolsProtocolVersion(undefined)).toBe(1)
8
+ expect(isDevtoolsProtocolVersionSupported(undefined, [1])).toBe(true)
9
+ })
10
+
11
+ it('accepts supported protocol versions independent of package version', () => {
12
+ expect(isDevtoolsProtocolVersionSupported(1, [1])).toBe(true)
13
+ })
14
+
15
+ it('rejects unsupported protocol versions', () => {
16
+ expect(isDevtoolsProtocolVersionSupported(2, [1])).toBe(false)
17
+ })
18
+ })
@@ -52,8 +52,8 @@ export class SyncHeadUnsubscribe extends LSDClientSessionReqResMessage('LSD.Clie
52
52
  subscriptionId: Schema.String,
53
53
  }) {}
54
54
  export class SyncHeadRes extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadRes', {
55
- local: EventSequenceNumber.EventSequenceNumber,
56
- upstream: EventSequenceNumber.EventSequenceNumber,
55
+ local: EventSequenceNumber.Client.Composite,
56
+ upstream: EventSequenceNumber.Client.Composite,
57
57
  subscriptionId: Schema.String,
58
58
  }) {}
59
59
 
@@ -103,9 +103,26 @@ export class LiveQueriesRes extends LSDClientSessionReqResMessage('LSD.ClientSes
103
103
  subscriptionId: Schema.String,
104
104
  }) {}
105
105
 
106
- export class Ping extends LSDClientSessionReqResMessage('LSD.ClientSession.Ping', {}) {}
106
+ export class Ping extends LSDClientSessionReqResMessage('LSD.ClientSession.Ping', {
107
+ devtoolsProtocolVersion: Schema.optional(Schema.Number),
108
+ }) {}
109
+
110
+ export class Pong extends LSDClientSessionReqResMessage('LSD.ClientSession.Pong', {
111
+ devtoolsProtocolVersion: Schema.optional(Schema.Number),
112
+ }) {}
107
113
 
108
- export class Pong extends LSDClientSessionReqResMessage('LSD.ClientSession.Pong', {}) {}
114
+ /**
115
+ * Sent by the app when the DevTools protocol isn't compatible.
116
+ * Contains package versions for display and protocol versions for the actual compatibility decision.
117
+ */
118
+ export class VersionMismatch extends LSDClientSessionReqResMessage('LSD.ClientSession.VersionMismatch', {
119
+ /** The version running in the app */
120
+ appVersion: Schema.String,
121
+ /** The version that was sent by DevTools (that caused the mismatch) */
122
+ receivedVersion: Schema.String,
123
+ appDevtoolsProtocolVersion: Schema.Number,
124
+ receivedDevtoolsProtocolVersion: Schema.optional(Schema.Number),
125
+ }) {}
109
126
 
110
127
  export class Disconnect extends LSDClientSessionChannelMessage('LSD.ClientSession.Disconnect', {}) {}
111
128
 
@@ -136,6 +153,7 @@ export const MessageFromApp = Schema.Union(
136
153
  LiveQueriesRes,
137
154
  Disconnect,
138
155
  Pong,
156
+ VersionMismatch,
139
157
  SyncHeadRes,
140
158
  ).annotations({ identifier: 'LSD.ClientSession.MessageFromApp' })
141
159
 
@@ -1,20 +1,15 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
- import { liveStoreVersion as pkgVersion } from '../version.ts'
4
-
5
- export const NetworkStatus = Schema.Struct({
6
- isConnected: Schema.Boolean,
7
- timestampMs: Schema.Number,
8
- /** Whether the network status devtools latch is closed. Used to simulate network disconnection. */
9
- latchClosed: Schema.Boolean,
10
- })
11
-
12
- export type NetworkStatus = typeof NetworkStatus.Type
3
+ export { NetworkStatus } from '../sync/sync-backend.ts'
13
4
 
14
5
  export const requestId = Schema.String
15
6
  export const clientId = Schema.String
16
7
  export const sessionId = Schema.String
17
- export const liveStoreVersion = Schema.Literal(pkgVersion)
8
+ /**
9
+ * Display/package version field for DevTools messages.
10
+ * Compatibility is decided by the optional DevTools protocol version carried by handshake messages.
11
+ */
12
+ export const liveStoreVersion = Schema.String
18
13
 
19
14
  export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
20
15
  Schema.TaggedStruct(tag, {
@@ -94,7 +89,7 @@ export const LeaderReqResMessage = <
94
89
  ...fields.success,
95
90
  }).annotations({ identifier: `${tag}.Response.Success` })
96
91
 
97
- const Error = fields.error
92
+ const Error = fields.error !== undefined
98
93
  ? Schema.TaggedStruct(`${tag}.Response.Error`, {
99
94
  requestId,
100
95
  liveStoreVersion,
@@ -1,6 +1,6 @@
1
1
  import { Schema, Transferable } from '@livestore/utils/effect'
2
2
 
3
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
3
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
4
4
  import { EventSequenceNumber } from '../schema/mod.ts'
5
5
  import * as SyncState from '../sync/syncstate.ts'
6
6
  import { LeaderReqResMessage, LSDMessage, LSDReqResMessage, NetworkStatus } from './devtools-messages-common.ts'
@@ -51,7 +51,7 @@ export class SyncHistoryUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHis
51
51
  subscriptionId: Schema.String,
52
52
  }) {}
53
53
  export class SyncHistoryRes extends LSDReqResMessage('LSD.Leader.SyncHistoryRes', {
54
- eventEncoded: LiveStoreEvent.AnyEncodedGlobal,
54
+ eventEncoded: LiveStoreEvent.Global.Encoded,
55
55
  metadata: Schema.Option(Schema.JsonValue),
56
56
  subscriptionId: Schema.String,
57
57
  }) {}
@@ -63,8 +63,8 @@ export class SyncHeadUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHeadUn
63
63
  subscriptionId: Schema.String,
64
64
  }) {}
65
65
  export class SyncHeadRes extends LSDReqResMessage('LSD.Leader.SyncHeadRes', {
66
- local: EventSequenceNumber.EventSequenceNumber,
67
- upstream: EventSequenceNumber.EventSequenceNumber,
66
+ local: EventSequenceNumber.Client.Composite,
67
+ upstream: EventSequenceNumber.Client.Composite,
68
68
  subscriptionId: Schema.String,
69
69
  }) {}
70
70
 
@@ -77,13 +77,14 @@ export class SnapshotRes extends LSDReqResMessage('LSD.Leader.SnapshotRes', {
77
77
  export const LoadDatabaseFile = LeaderReqResMessage('LSD.Leader.LoadDatabaseFile', {
78
78
  payload: {
79
79
  data: Transferable.Uint8Array as Schema.Schema<Uint8Array<ArrayBuffer>>,
80
+ batchId: Schema.optional(Schema.String),
80
81
  },
81
82
  success: {},
82
83
  error: {
83
84
  cause: Schema.Union(
84
85
  Schema.TaggedStruct('unsupported-file', {}),
85
86
  Schema.TaggedStruct('unsupported-database', {}),
86
- Schema.TaggedStruct('unexpected-error', { cause: Schema.Defect }),
87
+ Schema.TaggedStruct('unknown-error', { cause: Schema.Defect }),
87
88
  ),
88
89
  },
89
90
  })
@@ -95,7 +96,7 @@ export class SyncPull extends LSDMessage('LSD.Leader.SyncPull', {
95
96
 
96
97
  // TODO refactor this to use push/pull semantics
97
98
  export class CommitEventReq extends LSDReqResMessage('LSD.Leader.CommitEventReq', {
98
- eventEncoded: LiveStoreEvent.PartialAnyEncoded,
99
+ eventEncoded: LiveStoreEvent.Input.Encoded,
99
100
  }) {}
100
101
 
101
102
  export class CommitEventRes extends LSDReqResMessage('LSD.Leader.CommitEventRes', {}) {}
@@ -106,9 +107,26 @@ export class EventlogRes extends LSDReqResMessage('LSD.Leader.EventlogRes', {
106
107
  eventlog: Transferable.Uint8Array as Schema.Schema<Uint8Array<ArrayBuffer>>,
107
108
  }) {}
108
109
 
109
- export class Ping extends LSDReqResMessage('LSD.Leader.Ping', {}) {}
110
+ export class Ping extends LSDReqResMessage('LSD.Leader.Ping', {
111
+ devtoolsProtocolVersion: Schema.optional(Schema.Number),
112
+ }) {}
113
+
114
+ export class Pong extends LSDReqResMessage('LSD.Leader.Pong', {
115
+ devtoolsProtocolVersion: Schema.optional(Schema.Number),
116
+ }) {}
110
117
 
111
- export class Pong extends LSDReqResMessage('LSD.Leader.Pong', {}) {}
118
+ /**
119
+ * Sent by the app when the DevTools protocol isn't compatible.
120
+ * Contains package versions for display and protocol versions for the actual compatibility decision.
121
+ */
122
+ export class VersionMismatch extends LSDReqResMessage('LSD.Leader.VersionMismatch', {
123
+ /** The version running in the app */
124
+ appVersion: Schema.String,
125
+ /** The version that was sent by DevTools (that caused the mismatch) */
126
+ receivedVersion: Schema.String,
127
+ appDevtoolsProtocolVersion: Schema.Number,
128
+ receivedDevtoolsProtocolVersion: Schema.optional(Schema.Number),
129
+ }) {}
112
130
 
113
131
  export class Disconnect extends LSDReqResMessage('LSD.Leader.Disconnect', {}) {}
114
132
 
@@ -133,7 +151,7 @@ export const ResetAllData = LeaderReqResMessage('LSD.Leader.ResetAllData', {
133
151
  // liveStoreVersion,
134
152
  // },
135
153
  // success: DatabaseFileInfo,
136
- // failure: UnexpectedError,
154
+ // failure: UnknownError,
137
155
  // }) {}
138
156
 
139
157
  // export class NetworkStatus_ extends Schema.TaggedRequest<NetworkStatus_>()('LSD.Leader.NetworkStatus', {
@@ -142,7 +160,7 @@ export const ResetAllData = LeaderReqResMessage('LSD.Leader.ResetAllData', {
142
160
  // liveStoreVersion,
143
161
  // },
144
162
  // success: NetworkStatus,
145
- // failure: UnexpectedError,
163
+ // failure: UnknownError,
146
164
  // }) {}
147
165
 
148
166
  // export const MessageToApp_ = Schema.Union(DatabaseFileInfo_, NetworkStatus_)
@@ -180,6 +198,7 @@ export const MessageFromApp = Schema.Union(
180
198
  NetworkStatusRes,
181
199
  CommitEventRes,
182
200
  Pong,
201
+ VersionMismatch,
183
202
  DatabaseFileInfoRes,
184
203
  SyncHistoryRes,
185
204
  SyncingInfoRes,
@@ -21,6 +21,12 @@ export const SessionInfo = Schema.TaggedStruct('SessionInfo', {
21
21
  sessionId: Schema.String,
22
22
  schemaAlias: Schema.String,
23
23
  isLeader: Schema.Boolean,
24
+ /**
25
+ * Browser origin that produced this SessionInfo (for example, 'http://localhost:5173').
26
+ * Set by browser-based publishers so DevTools can defensively filter by origin.
27
+ * Currently only needed by the browser extension; non‑browser publishers typically set `undefined`.
28
+ */
29
+ origin: Schema.UndefinedOr(Schema.String),
24
30
  })
25
31
  export type SessionInfo = typeof SessionInfo.Type
26
32
 
@@ -55,7 +61,7 @@ export const requestSessionInfoSubscription = ({
55
61
  webChannel: WebChannel.WebChannel<Message, Message>
56
62
  pollInterval?: Duration.DurationInput
57
63
  staleTimeout?: Duration.DurationInput
58
- }): Effect.Effect<Subscribable.Subscribable<Set<SessionInfo>>, ParseResult.ParseError, Scope.Scope> =>
64
+ }): Effect.Effect<Subscribable.Subscribable<HashSet.HashSet<SessionInfo>>, ParseResult.ParseError, Scope.Scope> =>
59
65
  Effect.gen(function* () {
60
66
  yield* webChannel
61
67
  .send(RequestSessions.make({}))
@@ -94,8 +100,5 @@ export const requestSessionInfoSubscription = ({
94
100
  Effect.forkScoped,
95
101
  )
96
102
 
97
- return Subscribable.make({
98
- get: sessionInfoSubRef.get.pipe(Effect.map((sessionInfos) => new Set(sessionInfos))),
99
- changes: sessionInfoSubRef.changes.pipe(Stream.map((sessionInfos) => new Set(sessionInfos))),
100
- })
103
+ return Subscribable.make({ get: sessionInfoSubRef.get, changes: sessionInfoSubRef.changes })
101
104
  })