@livestore/common 0.4.0 → 0.5.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +1 -1
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/MaterializationJournal.d.ts +44 -0
  5. package/dist/MaterializationJournal.d.ts.map +1 -0
  6. package/dist/MaterializationJournal.js +112 -0
  7. package/dist/MaterializationJournal.js.map +1 -0
  8. package/dist/StateHead.d.ts +26 -0
  9. package/dist/StateHead.d.ts.map +1 -0
  10. package/dist/StateHead.js +50 -0
  11. package/dist/StateHead.js.map +1 -0
  12. package/dist/WorkerTransportError.d.ts +3 -3
  13. package/dist/WorkerTransportError.d.ts.map +1 -1
  14. package/dist/WorkerTransportError.js +3 -3
  15. package/dist/WorkerTransportError.js.map +1 -1
  16. package/dist/__tests__/fixture.d.ts +1 -1
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +3 -3
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +29 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +20 -37
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/debug-info.d.ts +56 -56
  25. package/dist/debug-info.d.ts.map +1 -1
  26. package/dist/debug-info.js +28 -41
  27. package/dist/debug-info.js.map +1 -1
  28. package/dist/defs.d.ts +9 -9
  29. package/dist/defs.js +2 -2
  30. package/dist/devtools/devtools-compatibility.test.js +1 -0
  31. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  32. package/dist/devtools/devtools-messages-client-session.d.ts +520 -332
  33. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.js +76 -74
  35. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  36. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  37. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  38. package/dist/devtools/devtools-messages-common.js +5 -5
  39. package/dist/devtools/devtools-messages-common.js.map +1 -1
  40. package/dist/devtools/devtools-messages-leader.d.ts +405 -343
  41. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.js +101 -89
  43. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  44. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  45. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  46. package/dist/devtools/devtools-sessioninfo.js +8 -5
  47. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  48. package/dist/devtools/mod.d.ts +4 -5
  49. package/dist/devtools/mod.d.ts.map +1 -1
  50. package/dist/devtools/mod.js +9 -5
  51. package/dist/devtools/mod.js.map +1 -1
  52. package/dist/errors.d.ts +45 -69
  53. package/dist/errors.d.ts.map +1 -1
  54. package/dist/errors.js +18 -16
  55. package/dist/errors.js.map +1 -1
  56. package/dist/index.d.ts +4 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/leader-thread/LeaderSyncProcessor.d.ts +66 -18
  61. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  62. package/dist/leader-thread/LeaderSyncProcessor.js +519 -461
  63. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  64. package/dist/leader-thread/RejectedPushError.d.ts +67 -36
  65. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  66. package/dist/leader-thread/RejectedPushError.js +24 -5
  67. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  68. package/dist/leader-thread/connection.d.ts +1 -0
  69. package/dist/leader-thread/connection.d.ts.map +1 -1
  70. package/dist/leader-thread/connection.js +9 -8
  71. package/dist/leader-thread/connection.js.map +1 -1
  72. package/dist/leader-thread/eventlog.d.ts +4 -4
  73. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  74. package/dist/leader-thread/eventlog.js +6 -6
  75. package/dist/leader-thread/eventlog.js.map +1 -1
  76. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  77. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  78. package/dist/leader-thread/leader-worker-devtools.js +33 -17
  79. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  80. package/dist/leader-thread/make-leader-thread-layer.d.ts +9 -5
  81. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  82. package/dist/leader-thread/make-leader-thread-layer.js +25 -35
  83. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  84. package/dist/leader-thread/make-leader-thread-layer.test.js +7 -7
  85. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  86. package/dist/leader-thread/materialize-event.d.ts +2 -1
  87. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  88. package/dist/leader-thread/materialize-event.js +4 -0
  89. package/dist/leader-thread/materialize-event.js.map +1 -1
  90. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  91. package/dist/leader-thread/recreate-db.js +18 -39
  92. package/dist/leader-thread/recreate-db.js.map +1 -1
  93. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  94. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  95. package/dist/leader-thread/shutdown-channel.js +2 -3
  96. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  97. package/dist/leader-thread/stream-events.d.ts +4 -7
  98. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  99. package/dist/leader-thread/stream-events.js +13 -16
  100. package/dist/leader-thread/stream-events.js.map +1 -1
  101. package/dist/leader-thread/types.d.ts +32 -69
  102. package/dist/leader-thread/types.d.ts.map +1 -1
  103. package/dist/leader-thread/types.js +5 -5
  104. package/dist/leader-thread/types.js.map +1 -1
  105. package/dist/logging.d.ts +5 -30
  106. package/dist/logging.d.ts.map +1 -1
  107. package/dist/logging.js +1 -32
  108. package/dist/logging.js.map +1 -1
  109. package/dist/make-client-session.d.ts +1 -2
  110. package/dist/make-client-session.d.ts.map +1 -1
  111. package/dist/make-client-session.js +3 -3
  112. package/dist/make-client-session.js.map +1 -1
  113. package/dist/materializer-helper.d.ts +0 -1
  114. package/dist/materializer-helper.d.ts.map +1 -1
  115. package/dist/materializer-helper.js +7 -35
  116. package/dist/materializer-helper.js.map +1 -1
  117. package/dist/otel.d.ts +2 -3
  118. package/dist/otel.d.ts.map +1 -1
  119. package/dist/otel.js +2 -7
  120. package/dist/otel.js.map +1 -1
  121. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  122. package/dist/rematerialize-from-eventlog.js +28 -26
  123. package/dist/rematerialize-from-eventlog.js.map +1 -1
  124. package/dist/schema/EventDef/define.d.ts +4 -4
  125. package/dist/schema/EventDef/define.d.ts.map +1 -1
  126. package/dist/schema/EventDef/define.js +5 -5
  127. package/dist/schema/EventDef/define.js.map +1 -1
  128. package/dist/schema/EventDef/define.test.d.ts +2 -0
  129. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  130. package/dist/schema/EventDef/define.test.js +23 -0
  131. package/dist/schema/EventDef/define.test.js.map +1 -0
  132. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  133. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  134. package/dist/schema/EventDef/deprecated.js +12 -13
  135. package/dist/schema/EventDef/deprecated.js.map +1 -1
  136. package/dist/schema/EventDef/deprecated.test.js +1 -1
  137. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  138. package/dist/schema/EventDef/event-def.d.ts +1 -1
  139. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  140. package/dist/schema/EventSequenceNumber/client.d.ts +12 -12
  141. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  142. package/dist/schema/EventSequenceNumber/client.js +8 -9
  143. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  144. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  145. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  146. package/dist/schema/EventSequenceNumber/global.js +1 -1
  147. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  148. package/dist/schema/EventSequenceNumber.test.js +5 -5
  149. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  150. package/dist/schema/LiveStoreEvent/client.d.ts +50 -179
  151. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  152. package/dist/schema/LiveStoreEvent/client.js +32 -29
  153. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  154. package/dist/schema/LiveStoreEvent/client.test.js +11 -2
  155. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  156. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  157. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  158. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  159. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  160. package/dist/schema/LiveStoreEvent/global.js +1 -1
  161. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  162. package/dist/schema/LiveStoreEvent/input.d.ts +5 -5
  163. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  164. package/dist/schema/LiveStoreEvent/input.js +3 -3
  165. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  166. package/dist/schema/mod.d.ts +1 -0
  167. package/dist/schema/mod.d.ts.map +1 -1
  168. package/dist/schema/mod.js +1 -0
  169. package/dist/schema/mod.js.map +1 -1
  170. package/dist/schema/schema.d.ts.map +1 -1
  171. package/dist/schema/schema.js +3 -2
  172. package/dist/schema/schema.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.d.ts +12 -17
  174. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  175. package/dist/schema/state/sqlite/client-document-def.js +23 -20
  176. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  177. package/dist/schema/state/sqlite/client-document-def.test.js +29 -8
  178. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  180. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  181. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  182. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  183. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  184. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  185. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  186. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  187. package/dist/schema/state/sqlite/column-def.js +57 -31
  188. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  189. package/dist/schema/state/sqlite/column-def.test.js +118 -72
  190. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  191. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  192. package/dist/schema/state/sqlite/column-spec.test.js +2 -2
  193. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  194. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +13 -4
  196. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  198. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +8 -13
  200. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  201. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +27 -16
  202. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  203. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  204. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  205. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +5 -3
  206. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  207. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  208. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  209. package/dist/schema/state/sqlite/mod.js +1 -1
  210. package/dist/schema/state/sqlite/mod.js.map +1 -1
  211. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  212. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/persistence.js +10 -0
  214. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  215. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  216. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  217. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  218. package/dist/schema/state/sqlite/query-builder/astToSql.js +27 -23
  219. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  220. package/dist/schema/state/sqlite/query-builder/impl.d.ts +3 -1
  221. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/query-builder/impl.js +16 -14
  223. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  224. package/dist/schema/state/sqlite/query-builder/impl.test.js +362 -596
  225. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/schema-helpers.js +1 -1
  227. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  228. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  229. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +2 -2
  231. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  232. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +328 -106
  233. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/system-tables/state-tables.js +33 -1
  235. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.d.ts +16 -19
  237. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.js +53 -3
  239. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  240. package/dist/schema/state/sqlite/table-def.test.js +153 -36
  241. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  242. package/dist/schema/unknown-events.d.ts.map +1 -1
  243. package/dist/schema/unknown-events.js +2 -1
  244. package/dist/schema/unknown-events.js.map +1 -1
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +2 -2
  246. package/dist/session-id-symbol.d.ts +29 -0
  247. package/dist/session-id-symbol.d.ts.map +1 -0
  248. package/dist/session-id-symbol.js +44 -0
  249. package/dist/session-id-symbol.js.map +1 -0
  250. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  251. package/dist/sql-queries/sql-queries.js +8 -10
  252. package/dist/sql-queries/sql-queries.js.map +1 -1
  253. package/dist/sql-queries/types.d.ts +6 -7
  254. package/dist/sql-queries/types.d.ts.map +1 -1
  255. package/dist/sql-queries/types.js.map +1 -1
  256. package/dist/sqlite-db-helper.d.ts +21 -1
  257. package/dist/sqlite-db-helper.d.ts.map +1 -1
  258. package/dist/sqlite-db-helper.js +37 -2
  259. package/dist/sqlite-db-helper.js.map +1 -1
  260. package/dist/sqlite-types.d.ts +3 -6
  261. package/dist/sqlite-types.d.ts.map +1 -1
  262. package/dist/sqlite-types.js +3 -3
  263. package/dist/sqlite-types.js.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +38 -16
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +196 -66
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +12 -18
  269. package/dist/sync/errors.d.ts.map +1 -1
  270. package/dist/sync/errors.js +2 -2
  271. package/dist/sync/errors.js.map +1 -1
  272. package/dist/sync/mock-sync-backend.d.ts +2 -3
  273. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  274. package/dist/sync/mock-sync-backend.js +54 -33
  275. package/dist/sync/mock-sync-backend.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  277. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.test.js +49 -0
  279. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  280. package/dist/sync/next/history-dag-common.d.ts +4 -0
  281. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  282. package/dist/sync/next/history-dag-common.js +52 -31
  283. package/dist/sync/next/history-dag-common.js.map +1 -1
  284. package/dist/sync/next/history-dag.d.ts.map +1 -1
  285. package/dist/sync/next/history-dag.js +2 -1
  286. package/dist/sync/next/history-dag.js.map +1 -1
  287. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  288. package/dist/sync/next/test/event-fixtures.d.ts +7 -7
  289. package/dist/sync/next/test/event-fixtures.js +1 -1
  290. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  291. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  292. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  293. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  294. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  295. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  296. package/dist/sync/sync-backend-kv.js +4 -2
  297. package/dist/sync/sync-backend-kv.js.map +1 -1
  298. package/dist/sync/sync-backend.d.ts +15 -15
  299. package/dist/sync/sync-backend.d.ts.map +1 -1
  300. package/dist/sync/sync-backend.js +9 -5
  301. package/dist/sync/sync-backend.js.map +1 -1
  302. package/dist/sync/sync.d.ts +1 -1
  303. package/dist/sync/sync.d.ts.map +1 -1
  304. package/dist/sync/syncstate.d.ts +97 -173
  305. package/dist/sync/syncstate.d.ts.map +1 -1
  306. package/dist/sync/syncstate.js +34 -37
  307. package/dist/sync/syncstate.js.map +1 -1
  308. package/dist/sync/syncstate.test.js +100 -61
  309. package/dist/sync/syncstate.test.js.map +1 -1
  310. package/dist/sync/transport-chunking.d.ts +15 -16
  311. package/dist/sync/transport-chunking.d.ts.map +1 -1
  312. package/dist/sync/transport-chunking.js +23 -32
  313. package/dist/sync/transport-chunking.js.map +1 -1
  314. package/dist/util.d.ts +11 -4
  315. package/dist/util.d.ts.map +1 -1
  316. package/dist/util.js +19 -2
  317. package/dist/util.js.map +1 -1
  318. package/dist/version.d.ts.map +1 -1
  319. package/dist/version.js.map +1 -1
  320. package/package.json +19 -37
  321. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  322. package/src/MaterializationJournal.ts +184 -0
  323. package/src/StateHead.ts +80 -0
  324. package/src/WorkerTransportError.ts +4 -4
  325. package/src/__tests__/fixture.ts +3 -3
  326. package/src/adapter-types.ts +24 -61
  327. package/src/debug-info.ts +50 -70
  328. package/src/defs.ts +2 -2
  329. package/src/devtools/devtools-compatibility.test.ts +1 -0
  330. package/src/devtools/devtools-messages-client-session.ts +56 -65
  331. package/src/devtools/devtools-messages-common.ts +12 -11
  332. package/src/devtools/devtools-messages-leader.ts +71 -69
  333. package/src/devtools/devtools-sessioninfo.ts +13 -11
  334. package/src/devtools/mod.ts +4 -5
  335. package/src/errors.ts +46 -34
  336. package/src/index.ts +8 -1
  337. package/src/leader-thread/LeaderSyncProcessor.ts +794 -691
  338. package/src/leader-thread/RejectedPushError.ts +40 -27
  339. package/src/leader-thread/connection.ts +12 -8
  340. package/src/leader-thread/eventlog.ts +7 -7
  341. package/src/leader-thread/leader-worker-devtools.ts +37 -19
  342. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  343. package/src/leader-thread/make-leader-thread-layer.ts +56 -53
  344. package/src/leader-thread/materialize-event.ts +13 -8
  345. package/src/leader-thread/recreate-db.ts +24 -59
  346. package/src/leader-thread/shutdown-channel.ts +3 -14
  347. package/src/leader-thread/stream-events.ts +104 -101
  348. package/src/leader-thread/types.ts +24 -62
  349. package/src/logging.ts +5 -52
  350. package/src/make-client-session.ts +6 -6
  351. package/src/materializer-helper.ts +8 -37
  352. package/src/otel.ts +5 -14
  353. package/src/rematerialize-from-eventlog.ts +97 -94
  354. package/src/schema/EventDef/define.test.ts +28 -0
  355. package/src/schema/EventDef/define.ts +20 -19
  356. package/src/schema/EventDef/deprecated.test.ts +1 -8
  357. package/src/schema/EventDef/deprecated.ts +17 -20
  358. package/src/schema/EventDef/event-def.ts +2 -4
  359. package/src/schema/EventSequenceNumber/client.ts +8 -9
  360. package/src/schema/EventSequenceNumber/global.ts +1 -1
  361. package/src/schema/EventSequenceNumber.test.ts +5 -5
  362. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  363. package/src/schema/LiveStoreEvent/client.ts +36 -35
  364. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  365. package/src/schema/LiveStoreEvent/global.ts +1 -1
  366. package/src/schema/LiveStoreEvent/input.ts +6 -6
  367. package/src/schema/mod.ts +1 -0
  368. package/src/schema/schema.ts +3 -2
  369. package/src/schema/state/sqlite/client-document-def.test.ts +32 -13
  370. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  371. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  372. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  373. package/src/schema/state/sqlite/column-def.test.ts +132 -77
  374. package/src/schema/state/sqlite/column-def.ts +72 -37
  375. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  376. package/src/schema/state/sqlite/column-spec.ts +3 -2
  377. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +15 -5
  378. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  379. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  380. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +25 -31
  381. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  382. package/src/schema/state/sqlite/mod.ts +2 -4
  383. package/src/schema/state/sqlite/persistence.ts +11 -0
  384. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  385. package/src/schema/state/sqlite/query-builder/astToSql.ts +31 -26
  386. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  387. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  388. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  389. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  390. package/src/schema/state/sqlite/system-tables/state-tables.ts +41 -1
  391. package/src/schema/state/sqlite/table-def.test.ts +204 -66
  392. package/src/schema/state/sqlite/table-def.ts +96 -45
  393. package/src/schema/unknown-events.ts +3 -2
  394. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +2 -2
  395. package/src/session-id-symbol.ts +59 -0
  396. package/src/sql-queries/sql-queries.ts +8 -12
  397. package/src/sql-queries/types.ts +6 -7
  398. package/src/sqlite-db-helper.ts +64 -2
  399. package/src/sqlite-types.ts +5 -8
  400. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  401. package/src/sync/errors.ts +14 -12
  402. package/src/sync/mock-sync-backend.test.ts +78 -0
  403. package/src/sync/mock-sync-backend.ts +93 -47
  404. package/src/sync/next/history-dag-common.ts +60 -34
  405. package/src/sync/next/history-dag.ts +4 -1
  406. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  407. package/src/sync/next/test/event-fixtures.ts +1 -1
  408. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  409. package/src/sync/sync-backend-kv.ts +4 -2
  410. package/src/sync/sync-backend.ts +15 -15
  411. package/src/sync/sync.ts +1 -1
  412. package/src/sync/syncstate.test.ts +191 -140
  413. package/src/sync/syncstate.ts +63 -53
  414. package/src/sync/transport-chunking.ts +34 -39
  415. package/src/util.ts +18 -9
  416. package/src/version.ts +1 -2
  417. package/dist/sql-queries/misc.d.ts +0 -2
  418. package/dist/sql-queries/misc.d.ts.map +0 -1
  419. package/dist/sql-queries/misc.js +0 -2
  420. package/dist/sql-queries/misc.js.map +0 -1
  421. package/src/sql-queries/misc.ts +0 -2
@@ -58,24 +58,24 @@ export class SyncState extends Schema.Class<SyncState>('SyncState')({
58
58
  /**
59
59
  * This payload propagates a rebase from the upstream node
60
60
  */
61
- export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
61
+ export const PayloadUpstreamRebase = Schema.TaggedStruct('upstream-rebase', {
62
62
  /** Events which need to be rolled back */
63
63
  rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
64
64
  /** Events which need to be applied after the rollback (already rebased by the upstream node) */
65
65
  newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
66
- }) {}
66
+ })
67
67
 
68
- export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
68
+ export const PayloadUpstreamAdvance = Schema.TaggedStruct('upstream-advance', {
69
69
  newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
70
- }) {}
70
+ })
71
71
 
72
- export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
72
+ export const PayloadLocalPush = Schema.TaggedStruct('local-push', {
73
73
  newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
74
- }) {}
74
+ })
75
75
 
76
- export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {}
76
+ export const Payload = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush])
77
77
 
78
- export class PayloadUpstream extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance) {}
78
+ export const PayloadUpstream = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance])
79
79
 
80
80
  /** Only used for debugging purposes */
81
81
  export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
@@ -159,14 +159,10 @@ export class MergeResultReject extends Schema.Class<MergeResultReject>('MergeRes
159
159
  }
160
160
  }
161
161
 
162
- export class MergeResult extends Schema.Union(
163
- MergeResultAdvance,
164
- MergeResultRebase,
165
- MergeResultReject,
166
- ) {}
162
+ export const MergeResult = Schema.Union([MergeResultAdvance, MergeResultRebase, MergeResultReject])
167
163
 
168
164
  export const payloadFromMergeResult = (
169
- mergeResult: typeof MergeResultAdvance.Type | typeof MergeResultRebase.Type,
165
+ mergeResult: MergeResultAdvance | MergeResultRebase,
170
166
  ): typeof PayloadUpstream.Type =>
171
167
  Match.value(mergeResult).pipe(
172
168
  Match.tag('advance', (result) => ({
@@ -191,16 +187,31 @@ TODO: possibly even keep the client events in a separate table in the client lea
191
187
  export const merge = Effect.fnUntraced(function* ({
192
188
  syncState,
193
189
  payload,
194
- isClientEvent,
190
+ isClientOnlyEvent,
195
191
  isEqualEvent,
196
- ignoreClientEvents = false,
192
+ ignoreClientOnlyEvents = false,
197
193
  }: {
198
194
  syncState: SyncState
199
195
  payload: typeof Payload.Type
200
- isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
196
+ /**
197
+ * `LiveStoreEvent.Client.EncodedWithMeta` does not carry the event definition's
198
+ * `clientOnly` flag. The caller supplies this schema-aware predicate so `merge`
199
+ * can preserve the correct sequence-number shape when rebasing: client-only
200
+ * events advance the client component, synced events advance the global component.
201
+ */
202
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
203
+ /**
204
+ * Pending events are confirmed by comparing their logical encoded identity with
205
+ * upstream events. This is caller-supplied because comparing encoded args may
206
+ * require event-schema knowledge that the generic merge algorithm does not own.
207
+ * Implementations should ignore transport/runtime metadata.
208
+ */
201
209
  isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
202
- /** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
203
- ignoreClientEvents?: boolean
210
+ /**
211
+ * This is used in the leader which should ignore client events when
212
+ * receiving an upstream-advance payload
213
+ */
214
+ ignoreClientOnlyEvents?: boolean
204
215
  }) {
205
216
  yield* validateSyncState(syncState)
206
217
  yield* validatePayload(payload)
@@ -218,7 +229,7 @@ export const merge = Effect.fnUntraced(function* ({
218
229
  const rebasedPending = rebaseEvents({
219
230
  events: syncState.pending,
220
231
  baseEventSequenceNumber: newUpstreamHead,
221
- isClientEvent,
232
+ isClientOnlyEvent,
222
233
  })
223
234
 
224
235
  return yield* validateMergeResult(
@@ -282,8 +293,8 @@ export const merge = Effect.fnUntraced(function* ({
282
293
  existingEvents: syncState.pending,
283
294
  incomingEvents: payload.newEvents,
284
295
  isEqualEvent,
285
- isClientEvent,
286
- ignoreClientEvents,
296
+ isClientOnlyEvent,
297
+ ignoreClientOnlyEvents,
287
298
  })
288
299
 
289
300
  // No divergent pending events, thus we can just advance (some of) the pending events
@@ -304,7 +315,7 @@ export const merge = Effect.fnUntraced(function* ({
304
315
  const [pendingMatching, pendingRemaining] = ReadonlyArray.splitWhere(
305
316
  syncState.pending,
306
317
  (pendingEvent, index) => {
307
- if (ignoreClientEvents === true && isClientEvent(pendingEvent) === true) {
318
+ if (ignoreClientOnlyEvents === true && isClientOnlyEvent(pendingEvent) === true) {
308
319
  clientIndexOffset++
309
320
  return false
310
321
  }
@@ -336,15 +347,15 @@ export const merge = Effect.fnUntraced(function* ({
336
347
  const rebasedPending = rebaseEvents({
337
348
  events: divergentPending,
338
349
  baseEventSequenceNumber: newUpstreamHead,
339
- isClientEvent,
350
+ isClientOnlyEvent: isClientOnlyEvent,
340
351
  })
341
352
 
342
353
  const divergentNewEventsIndex = findDivergencePoint({
343
354
  existingEvents: payload.newEvents,
344
355
  incomingEvents: syncState.pending,
345
356
  isEqualEvent,
346
- isClientEvent,
347
- ignoreClientEvents,
357
+ isClientOnlyEvent: isClientOnlyEvent,
358
+ ignoreClientOnlyEvents: ignoreClientOnlyEvents,
348
359
  })
349
360
 
350
361
  return yield* validateMergeResult(
@@ -387,7 +398,7 @@ export const merge = Effect.fnUntraced(function* ({
387
398
  if (invalidEventSequenceNumber === true) {
388
399
  const expectedMinimumId = EventSequenceNumber.Client.nextPair({
389
400
  seqNum: syncState.localHead,
390
- isClient: true,
401
+ isClientOnly: true,
391
402
  }).seqNum
392
403
  return yield* validateMergeResult(
393
404
  MergeResultReject.make({
@@ -397,9 +408,11 @@ export const merge = Effect.fnUntraced(function* ({
397
408
  }),
398
409
  )
399
410
  } else {
400
- const nonClientEvents =
401
- ignoreClientEvents === true ? payload.newEvents.filter((event) => !isClientEvent(event)) : payload.newEvents
402
- const newPending = [...syncState.pending, ...nonClientEvents]
411
+ const nonClientOnlyEvents =
412
+ ignoreClientOnlyEvents === true
413
+ ? payload.newEvents.filter((event) => !isClientOnlyEvent(event))
414
+ : payload.newEvents
415
+ const newPending = [...syncState.pending, ...nonClientOnlyEvents]
403
416
  const newLocalHead =
404
417
  newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead)
405
418
 
@@ -422,7 +435,7 @@ export const merge = Effect.fnUntraced(function* ({
422
435
  default:
423
436
  return casesHandled(payload)
424
437
  }
425
- })
438
+ })
426
439
 
427
440
  /**
428
441
  * Gets the index relative to `existingEvents` where the divergence point is
@@ -432,28 +445,28 @@ export const findDivergencePoint = ({
432
445
  existingEvents,
433
446
  incomingEvents,
434
447
  isEqualEvent,
435
- isClientEvent,
436
- ignoreClientEvents,
448
+ isClientOnlyEvent,
449
+ ignoreClientOnlyEvents,
437
450
  }: {
438
451
  existingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
439
452
  incomingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
440
453
  isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
441
- isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
442
- ignoreClientEvents: boolean
454
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
455
+ ignoreClientOnlyEvents: boolean
443
456
  }): number => {
444
- if (ignoreClientEvents === true) {
445
- const filteredExistingEvents = existingEvents.filter((event) => !isClientEvent(event))
446
- const divergencePointWithoutClientEvents = findDivergencePoint({
457
+ if (ignoreClientOnlyEvents === true) {
458
+ const filteredExistingEvents = existingEvents.filter((event) => !isClientOnlyEvent(event))
459
+ const divergencePointWithoutClientOnlyEvents = findDivergencePoint({
447
460
  existingEvents: filteredExistingEvents,
448
461
  incomingEvents,
449
462
  isEqualEvent,
450
- isClientEvent,
451
- ignoreClientEvents: false,
463
+ isClientOnlyEvent,
464
+ ignoreClientOnlyEvents: false,
452
465
  })
453
466
 
454
- if (divergencePointWithoutClientEvents === -1) return -1
467
+ if (divergencePointWithoutClientOnlyEvents === -1) return -1
455
468
 
456
- const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientEvents]!.seqNum
469
+ const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientOnlyEvents]!.seqNum
457
470
  // Now find the divergence point in the original array
458
471
  return existingEvents.findIndex((event) =>
459
472
  EventSequenceNumber.Client.isEqual(event.seqNum, divergencePointEventSequenceNumber),
@@ -470,19 +483,20 @@ export const findDivergencePoint = ({
470
483
  const rebaseEvents = ({
471
484
  events,
472
485
  baseEventSequenceNumber,
473
- isClientEvent,
486
+ isClientOnlyEvent,
474
487
  }: {
475
488
  events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
476
489
  baseEventSequenceNumber: EventSequenceNumber.Client.Composite
477
- isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
490
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
478
491
  }): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
479
492
  let prevEventSequenceNumber = baseEventSequenceNumber
480
493
  const rebaseGeneration = baseEventSequenceNumber.rebaseGeneration + 1
481
494
  return events.map((event) => {
482
- const isClient = isClientEvent(event)
495
+ // Rebasing must preserve whether an event is client-only: client-only
496
+ // events become eN.1/eN.2, while synced events become eN+1.
483
497
  const newEvent = event.rebase({
484
498
  parentSeqNum: prevEventSequenceNumber,
485
- isClient,
499
+ isClientOnly: isClientOnlyEvent(event),
486
500
  rebaseGeneration,
487
501
  })
488
502
  prevEventSequenceNumber = newEvent.seqNum
@@ -497,7 +511,7 @@ const rebaseEvents = ({
497
511
  * it could make sense to "flatten" update results into a single update result which the client session
498
512
  * can process more efficiently which avoids push-threshing
499
513
  */
500
- const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
514
+ const _flattenMergeResults = (_updateResults: ReadonlyArray<typeof MergeResult>) => {}
501
515
 
502
516
  const validatePayload = (payload: typeof Payload.Type) =>
503
517
  Effect.gen(function* () {
@@ -515,9 +529,7 @@ const validatePayload = (payload: typeof Payload.Type) =>
515
529
  }
516
530
  })
517
531
 
518
- const validateSyncState = Effect.fnUntraced(function* (
519
- syncState: SyncState,
520
- ) {
532
+ const validateSyncState = Effect.fnUntraced(function* (syncState: SyncState) {
521
533
  for (let i = 0; i < syncState.pending.length; i++) {
522
534
  const event = syncState.pending[i]!
523
535
  const nextEvent = syncState.pending[i + 1]
@@ -553,9 +565,7 @@ const validateSyncState = Effect.fnUntraced(function* (
553
565
  }
554
566
  })
555
567
 
556
- const validateMergeResult = Effect.fnUntraced(function* (
557
- mergeResult: typeof MergeResult.Type,
558
- ) {
568
+ const validateMergeResult = Effect.fnUntraced(function* (mergeResult: typeof MergeResult.Type) {
559
569
  if (mergeResult._tag === 'reject') return mergeResult
560
570
 
561
571
  yield* validateSyncState(mergeResult.newSyncState)
@@ -1,14 +1,15 @@
1
- import { Chunk, Effect, Schema } from '@livestore/utils/effect'
1
+ import type { ReadonlyArray as EffectArray } from '@livestore/utils/effect'
2
+ import { Effect, Schema } from '@livestore/utils/effect'
2
3
 
3
4
  const textEncoder = new TextEncoder()
4
5
 
5
6
  /**
6
- * Configuration describing how to break a chunk into smaller payload-safe chunks.
7
+ * Configuration describing how to break an array batch into smaller payload-safe batches.
7
8
  */
8
9
  export interface ChunkingOptions<A> {
9
- /** Maximum number of items that may appear in any emitted chunk. */
10
+ /** Maximum number of items that may appear in any emitted batch. */
10
11
  readonly maxItems: number
11
- /** Maximum encoded byte size allowed for any emitted chunk. */
12
+ /** Maximum encoded byte size allowed for any emitted batch. */
12
13
  readonly maxBytes: number
13
14
  /**
14
15
  * Callback that produces a JSON-serialisable structure whose byte size should
@@ -22,19 +23,23 @@ export interface ChunkingOptions<A> {
22
23
  readonly measure?: (items: ReadonlyArray<A>) => number
23
24
  }
24
25
 
25
- /**
26
- * Derives a function that splits an input chunk into sub-chunks confined by
27
- * both item count and encoded byte size limits. Designed for transports with
28
- * strict frame caps (e.g. Cloudflare hibernated WebSockets).
29
- */
30
- export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>('~@livestore/common/OversizeChunkItemError')('OversizeChunkItemError', {
31
- size: Schema.Number,
32
- maxBytes: Schema.Number,
26
+ export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>(
27
+ '~@livestore/common/OversizeChunkItemError',
28
+ )('OversizeChunkItemError', {
29
+ size: Schema.Finite,
30
+ maxBytes: Schema.Finite,
33
31
  }) {}
34
32
 
35
- export const splitChunkBySize =
33
+ /**
34
+ * Derives a function that splits an input array into sub-arrays confined by
35
+ * both item count and encoded byte size limits. Designed for stream boundaries
36
+ * and transports with strict frame caps (e.g. Cloudflare hibernated WebSockets).
37
+ */
38
+ export const splitArrayBySize =
36
39
  <A>(options: ChunkingOptions<A>) =>
37
- (chunk: Chunk.Chunk<A>): Effect.Effect<Chunk.Chunk<Chunk.Chunk<A>>, OversizeChunkItemError> =>
40
+ (
41
+ items: EffectArray.NonEmptyReadonlyArray<A>,
42
+ ): Effect.Effect<EffectArray.NonEmptyArray<ReadonlyArray<A>>, OversizeChunkItemError> =>
38
43
  Effect.gen(function* () {
39
44
  const maxItems = Math.max(1, options.maxItems)
40
45
  const maxBytes = Math.max(1, options.maxBytes)
@@ -50,41 +55,31 @@ export const splitChunkBySize =
50
55
  return textEncoder.encode(JSON.stringify(encoded)).byteLength
51
56
  }
52
57
 
53
- const items = Chunk.toReadonlyArray(chunk)
54
- if (items.length === 0) {
55
- return Chunk.fromIterable<Chunk.Chunk<A>>([])
56
- }
58
+ const [first, ...rest] = items
59
+ let current: EffectArray.NonEmptyArray<A> = [first]
60
+ const result: EffectArray.NonEmptyArray<ReadonlyArray<A>> = [current]
57
61
 
58
- const result: Array<Chunk.Chunk<A>> = []
59
- let current: Array<A> = []
60
-
61
- const flushCurrent = () => {
62
- if (current.length > 0) {
63
- result.push(Chunk.fromIterable(current))
64
- current = []
65
- }
62
+ if (computeSize(current) > maxBytes) {
63
+ return yield* new OversizeChunkItemError({ size: computeSize(current), maxBytes })
66
64
  }
67
65
 
68
- for (const item of items) {
66
+ for (const item of rest) {
69
67
  current.push(item)
70
68
  const exceedsLimit = current.length > maxItems || computeSize(current) > maxBytes
71
69
 
72
70
  if (exceedsLimit === true) {
73
- // remove the item we just added and emit the previous chunk if it exists
74
- const last = current.pop()!
75
- flushCurrent()
71
+ // Remove the item we just added; the previous batch was already recorded in `result`.
72
+ current.splice(current.length - 1, 1)
73
+ current = [item]
76
74
 
77
- if (last !== undefined) {
78
- current = [last]
79
- const singleItemTooLarge = computeSize(current) > maxBytes
80
- if (singleItemTooLarge === true || current.length > maxItems) {
81
- return yield* new OversizeChunkItemError({ size: computeSize([last]), maxBytes })
82
- }
75
+ const singleItemTooLarge = computeSize(current) > maxBytes
76
+ if (singleItemTooLarge === true || current.length > maxItems) {
77
+ return yield* new OversizeChunkItemError({ size: computeSize(current), maxBytes })
83
78
  }
79
+
80
+ result.push(current)
84
81
  }
85
82
  }
86
83
 
87
- flushCurrent()
88
-
89
- return Chunk.fromIterable(result)
84
+ return result
90
85
  })
package/src/util.ts CHANGED
@@ -1,24 +1,33 @@
1
1
  /// <reference lib="es2022" />
2
2
 
3
- import type { Brand } from '@livestore/utils/effect'
4
- import { Schema } from '@livestore/utils/effect'
3
+ import { type Brand, Schema } from '@livestore/utils/effect'
5
4
 
6
5
  export type ParamsObject = Record<string, SqlValue>
7
6
  export type SqlValue = string | number | Uint8Array<ArrayBuffer> | null
8
7
 
9
8
  export type Bindable = ReadonlyArray<SqlValue> | ParamsObject
10
9
 
11
- export const SqlValueSchema = Schema.Union(
10
+ /**
11
+ * Numeric schema for the SQLite `REAL` domain. Unlike `Schema.Finite` it accepts
12
+ * `Infinity`/`NaN`, because SQLite `REAL` columns can legitimately store them and
13
+ * bind values / DEFAULT codecs must round-trip those through the devtools/debug
14
+ * protocol. This is the single carve-out for the SQLite REAL numeric domain — use it
15
+ * instead of a bare `Schema.Number` so the `schemaNumber` exception lives in one place.
16
+ */
17
+ // @effect-diagnostics-next-line schemaNumber:off -- see SqliteReal docstring: SQLite REAL permits Infinity/NaN, so Schema.Finite would wrongly reject valid values
18
+ export const SqliteReal = Schema.Number
19
+
20
+ export const SqlValueSchema = Schema.Union([
12
21
  Schema.String,
13
- Schema.Number,
14
- Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
22
+ SqliteReal,
23
+ Schema.Uint8Array as any as Schema.Codec<Uint8Array<ArrayBuffer>>,
15
24
  Schema.Null,
16
- )
25
+ ])
17
26
 
18
- export const PreparedBindValues = Schema.Union(
27
+ export const PreparedBindValues = Schema.Union([
19
28
  Schema.Array(SqlValueSchema),
20
- Schema.Record({ key: Schema.String, value: SqlValueSchema }),
21
- ).pipe(Schema.brand('PreparedBindValues'))
29
+ Schema.Record(Schema.String, SqlValueSchema),
30
+ ]).pipe(Schema.brand('PreparedBindValues'))
22
31
 
23
32
  export type PreparedBindValues = Brand.Branded<Bindable, 'PreparedBindValues'>
24
33
 
package/src/version.ts CHANGED
@@ -7,8 +7,7 @@ import pkg from '../package.json' with { type: 'json' }
7
7
  */
8
8
  export const liveStoreVersion: string = (globalThis as any).__LIVESTORE_VERSION_OVERRIDE__ ?? pkg.version
9
9
 
10
- export const devtoolsProtocolVersion: number =
11
- (globalThis as any).__LIVESTORE_DEVTOOLS_PROTOCOL_VERSION_OVERRIDE__ ?? 1
10
+ export const devtoolsProtocolVersion: number = (globalThis as any).__LIVESTORE_DEVTOOLS_PROTOCOL_VERSION_OVERRIDE__ ?? 1
12
11
 
13
12
  export const supportedDevtoolsProtocolVersions: ReadonlyArray<number> = [devtoolsProtocolVersion]
14
13
 
@@ -1,2 +0,0 @@
1
- export declare const objectEntries: <T extends Record<string, any>>(obj: T) => [keyof T & string, T[keyof T]][];
2
- //# sourceMappingURL=misc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/sql-queries/misc.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,KAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC3C,CAAA"}
@@ -1,2 +0,0 @@
1
- export const objectEntries = (obj) => Object.entries(obj);
2
- //# sourceMappingURL=misc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/sql-queries/misc.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAgC,GAAM,EAAoC,EAAE,CACvG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAqC,CAAA"}
@@ -1,2 +0,0 @@
1
- export const objectEntries = <T extends Record<string, any>>(obj: T): [keyof T & string, T[keyof T]][] =>
2
- Object.entries(obj) as [keyof T & string, T[keyof T]][]