@livestore/common 0.4.0-dev.9 → 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 (513) 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 +3 -3
  369. package/dist/testing/event-factory.d.ts.map +1 -1
  370. package/dist/testing/event-factory.js +5 -7
  371. package/dist/testing/event-factory.js.map +1 -1
  372. package/dist/util.js +2 -2
  373. package/dist/util.js.map +1 -1
  374. package/dist/version.d.ts +24 -5
  375. package/dist/version.d.ts.map +1 -1
  376. package/dist/version.js +25 -8
  377. package/dist/version.js.map +1 -1
  378. package/package.json +67 -15
  379. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  380. package/src/WorkerTransportError.ts +12 -0
  381. package/src/adapter-types.ts +50 -7
  382. package/src/bounded-collections.ts +6 -5
  383. package/src/debug-info.ts +37 -6
  384. package/src/devtools/devtools-compatibility.test.ts +18 -0
  385. package/src/devtools/devtools-messages-client-session.ts +22 -4
  386. package/src/devtools/devtools-messages-common.ts +7 -12
  387. package/src/devtools/devtools-messages-leader.ts +29 -10
  388. package/src/devtools/devtools-sessioninfo.ts +8 -5
  389. package/src/devtools/mod.ts +11 -2
  390. package/src/errors.ts +32 -24
  391. package/src/index.ts +4 -1
  392. package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
  393. package/src/leader-thread/RejectedPushError.ts +106 -0
  394. package/src/leader-thread/connection.ts +1 -1
  395. package/src/leader-thread/eventlog.ts +112 -39
  396. package/src/leader-thread/leader-worker-devtools.ts +201 -120
  397. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  398. package/src/leader-thread/make-leader-thread-layer.ts +125 -40
  399. package/src/leader-thread/materialize-event.ts +40 -10
  400. package/src/leader-thread/mod.ts +1 -0
  401. package/src/leader-thread/recreate-db.ts +7 -7
  402. package/src/leader-thread/shutdown-channel.ts +4 -8
  403. package/src/leader-thread/stream-events.ts +206 -0
  404. package/src/leader-thread/types.ts +68 -18
  405. package/src/logging.ts +62 -0
  406. package/src/make-client-session.ts +11 -5
  407. package/src/materializer-helper.ts +27 -16
  408. package/src/otel.ts +13 -2
  409. package/src/rematerialize-from-eventlog.ts +61 -51
  410. package/src/schema/EventDef/define.ts +217 -0
  411. package/src/schema/EventDef/deprecated.test.ts +129 -0
  412. package/src/schema/EventDef/deprecated.ts +175 -0
  413. package/src/schema/EventDef/event-def.ts +125 -0
  414. package/src/schema/EventDef/facts.ts +135 -0
  415. package/src/schema/EventDef/materializer.ts +172 -0
  416. package/src/schema/EventDef/mod.ts +5 -0
  417. package/src/schema/EventSequenceNumber/client.ts +257 -0
  418. package/src/schema/EventSequenceNumber/global.ts +19 -0
  419. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  420. package/src/schema/EventSequenceNumber.test.ts +72 -53
  421. package/src/schema/LiveStoreEvent/client.test.ts +129 -0
  422. package/src/schema/LiveStoreEvent/client.ts +235 -0
  423. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  424. package/src/schema/LiveStoreEvent/global.ts +45 -0
  425. package/src/schema/LiveStoreEvent/input.ts +63 -0
  426. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  427. package/src/schema/events.ts +1 -1
  428. package/src/schema/mod.ts +6 -4
  429. package/src/schema/schema.ts +46 -5
  430. package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
  431. package/src/schema/state/sqlite/client-document-def.ts +47 -34
  432. package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
  433. package/src/schema/state/sqlite/column-annotations.ts +2 -1
  434. package/src/schema/state/sqlite/column-def.test.ts +66 -12
  435. package/src/schema/state/sqlite/column-def.ts +119 -47
  436. package/src/schema/state/sqlite/column-spec.test.ts +32 -17
  437. package/src/schema/state/sqlite/column-spec.ts +37 -11
  438. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
  439. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
  440. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
  441. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
  442. package/src/schema/state/sqlite/mod.ts +7 -8
  443. package/src/schema/state/sqlite/query-builder/api.ts +55 -17
  444. package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
  445. package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
  446. package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
  447. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  448. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  449. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  450. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  451. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  452. package/src/schema/state/sqlite/table-def.test.ts +114 -3
  453. package/src/schema/state/sqlite/table-def.ts +16 -22
  454. package/src/schema/unknown-events.ts +131 -0
  455. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  456. package/src/schema-management/common.ts +2 -2
  457. package/src/schema-management/migrations.ts +42 -9
  458. package/src/schema-management/validate-schema.ts +3 -3
  459. package/src/sql-queries/sql-queries.ts +18 -6
  460. package/src/sql-queries/sql-query-builder.ts +1 -0
  461. package/src/sqlite-db-helper.ts +3 -3
  462. package/src/sqlite-types.ts +6 -5
  463. package/src/sync/ClientSessionSyncProcessor.ts +152 -142
  464. package/src/sync/errors.ts +12 -24
  465. package/src/sync/index.ts +2 -0
  466. package/src/sync/mock-sync-backend.ts +146 -104
  467. package/src/sync/next/compact-events.ts +10 -11
  468. package/src/sync/next/facts.ts +13 -14
  469. package/src/sync/next/history-dag-common.ts +280 -26
  470. package/src/sync/next/history-dag.ts +17 -13
  471. package/src/sync/next/rebase-events.ts +12 -12
  472. package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
  473. package/src/sync/next/test/compact-events.test.ts +4 -3
  474. package/src/sync/next/test/event-fixtures.ts +13 -13
  475. package/src/sync/sync-backend-kv.ts +4 -3
  476. package/src/sync/sync-backend.ts +66 -17
  477. package/src/sync/sync.ts +24 -2
  478. package/src/sync/syncstate.test.ts +583 -419
  479. package/src/sync/syncstate.ts +127 -122
  480. package/src/sync/transport-chunking.ts +90 -0
  481. package/src/sync/validate-push-payload.ts +6 -8
  482. package/src/testing/event-factory.ts +10 -12
  483. package/src/util.ts +2 -2
  484. package/src/version.ts +33 -8
  485. package/dist/schema/EventDef.d.ts +0 -126
  486. package/dist/schema/EventDef.d.ts.map +0 -1
  487. package/dist/schema/EventDef.js +0 -46
  488. package/dist/schema/EventDef.js.map +0 -1
  489. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  490. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  491. package/dist/schema/EventSequenceNumber.js +0 -139
  492. package/dist/schema/EventSequenceNumber.js.map +0 -1
  493. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  494. package/dist/schema/LiveStoreEvent.js +0 -147
  495. package/dist/schema/LiveStoreEvent.js.map +0 -1
  496. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  497. package/dist/schema/state/sqlite/system-tables.js +0 -81
  498. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  499. package/dist/sync/next/graphology.d.ts +0 -8
  500. package/dist/sync/next/graphology.d.ts.map +0 -1
  501. package/dist/sync/next/graphology.js +0 -30
  502. package/dist/sync/next/graphology.js.map +0 -1
  503. package/dist/sync/next/graphology_.d.ts +0 -3
  504. package/dist/sync/next/graphology_.d.ts.map +0 -1
  505. package/dist/sync/next/graphology_.js +0 -3
  506. package/dist/sync/next/graphology_.js.map +0 -1
  507. package/src/schema/EventDef.ts +0 -222
  508. package/src/schema/EventSequenceNumber.ts +0 -199
  509. package/src/schema/LiveStoreEvent.ts +0 -286
  510. package/src/schema/state/sqlite/system-tables.ts +0 -106
  511. package/src/sync/next/ambient.d.ts +0 -3
  512. package/src/sync/next/graphology.ts +0 -41
  513. package/src/sync/next/graphology_.ts +0 -2
@@ -1,48 +1,51 @@
1
- import { describe, expect, it } from 'vitest';
2
- import * as EventSequenceNumber from "../schema/EventSequenceNumber.js";
3
- import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
1
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
2
+ import { Cause, Effect, Exit, Schema } from '@livestore/utils/effect';
3
+ import { assert, expect } from 'vitest';
4
+ import * as EventSequenceNumber from "../schema/EventSequenceNumber/mod.js";
5
+ import * as LiveStoreEvent from "../schema/LiveStoreEvent/mod.js";
4
6
  import * as SyncState from "./syncstate.js";
5
- class TestEvent extends LiveStoreEvent.EncodedWithMeta {
6
- payload;
7
- isClient;
8
- constructor(seqNum, parentSeqNum, payload, isClient) {
9
- super({
10
- seqNum: EventSequenceNumber.make(seqNum),
11
- parentSeqNum: EventSequenceNumber.make(parentSeqNum),
7
+ class TestEvent extends LiveStoreEvent.Client.EncodedWithMeta {
8
+ payload = 'uninitialized';
9
+ isClient = false;
10
+ static new = (seqNum, parentSeqNum, payload, isClient) => {
11
+ const event = new TestEvent({
12
+ seqNum: EventSequenceNumber.Client.Composite.make(seqNum),
13
+ parentSeqNum: EventSequenceNumber.Client.Composite.make(parentSeqNum),
12
14
  name: 'a',
13
15
  args: payload,
14
16
  clientId: 'static-local-id',
15
17
  sessionId: 'static-session-id',
16
18
  });
17
- this.payload = payload;
18
- this.isClient = isClient;
19
- }
19
+ event.payload = payload;
20
+ event.isClient = isClient;
21
+ return event;
22
+ };
20
23
  rebase_ = (parentSeqNum, rebaseGeneration) => {
21
24
  return this.rebase({ parentSeqNum, isClient: this.isClient, rebaseGeneration });
22
25
  };
23
26
  }
24
- const e0_1 = new TestEvent({ global: 0, client: 1 }, EventSequenceNumber.ROOT, 'a', true);
25
- const e1_0 = new TestEvent({ global: 1, client: 0 }, EventSequenceNumber.ROOT, 'a', false);
26
- const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.seqNum, 'a', true);
27
- const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.seqNum, 'a', true);
28
- const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.seqNum, 'a', true);
29
- const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.seqNum, 'a', false);
30
- const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.seqNum, 'a', true);
31
- const isEqualEvent = LiveStoreEvent.isEqualEncoded;
27
+ const e0_1 = TestEvent.new({ global: 0, client: 1 }, EventSequenceNumber.Client.ROOT, 'a', true);
28
+ const e1_0 = TestEvent.new({ global: 1, client: 0 }, EventSequenceNumber.Client.ROOT, 'a', false);
29
+ const e1_1 = TestEvent.new({ global: 1, client: 1 }, e1_0.seqNum, 'a', true);
30
+ const e1_2 = TestEvent.new({ global: 1, client: 2 }, e1_1.seqNum, 'a', true);
31
+ const e1_3 = TestEvent.new({ global: 1, client: 3 }, e1_2.seqNum, 'a', true);
32
+ const e2_0 = TestEvent.new({ global: 2, client: 0 }, e1_0.seqNum, 'a', false);
33
+ const e2_1 = TestEvent.new({ global: 2, client: 1 }, e2_0.seqNum, 'a', true);
34
+ const isEqualEvent = LiveStoreEvent.Client.isEqualEncoded;
32
35
  const isClientEvent = (event) => event.isClient;
33
- describe('syncstate', () => {
34
- describe('merge', () => {
36
+ Vitest.describe('syncstate', () => {
37
+ Vitest.describe('merge', () => {
35
38
  const merge = ({ syncState, payload, ignoreClientEvents = false, }) => SyncState.merge({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents });
36
- describe('upstream-rebase', () => {
37
- it('should rollback until start', () => {
39
+ Vitest.describe('upstream-rebase', () => {
40
+ Vitest.it.effect('should rollback until start', () => Effect.gen(function* () {
38
41
  const syncState = new SyncState.SyncState({
39
42
  pending: [e2_0],
40
- upstreamHead: EventSequenceNumber.ROOT,
43
+ upstreamHead: EventSequenceNumber.Client.ROOT,
41
44
  localHead: e2_0.seqNum,
42
45
  });
43
46
  const e1_0_e2_0 = e1_0.rebase_(e2_0.seqNum, 0);
44
47
  const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.seqNum, 0);
45
- const result = merge({
48
+ const result = yield* merge({
46
49
  syncState,
47
50
  payload: SyncState.PayloadUpstreamRebase.make({
48
51
  rollbackEvents: [e1_0, e1_1],
@@ -56,15 +59,15 @@ describe('syncstate', () => {
56
59
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
57
60
  expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0]);
58
61
  expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0]);
59
- });
60
- it('should rollback only to specified point', () => {
62
+ }));
63
+ Vitest.it.effect('should rollback only to specified point', () => Effect.gen(function* () {
61
64
  const syncState = new SyncState.SyncState({
62
65
  pending: [e2_0],
63
- upstreamHead: EventSequenceNumber.ROOT,
66
+ upstreamHead: EventSequenceNumber.Client.ROOT,
64
67
  localHead: e2_0.seqNum,
65
68
  });
66
69
  const e1_1_e2_0 = e1_1.rebase_(e1_0.seqNum, 0);
67
- const result = merge({
70
+ const result = yield* merge({
68
71
  syncState,
69
72
  payload: SyncState.PayloadUpstreamRebase.make({
70
73
  newEvents: [e1_1_e2_0],
@@ -78,14 +81,14 @@ describe('syncstate', () => {
78
81
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
79
82
  expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0]);
80
83
  expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0]);
81
- });
82
- it('should work for empty pending', () => {
84
+ }));
85
+ Vitest.it.effect('should work for empty pending', () => Effect.gen(function* () {
83
86
  const syncState = new SyncState.SyncState({
84
87
  pending: [],
85
- upstreamHead: EventSequenceNumber.ROOT,
88
+ upstreamHead: EventSequenceNumber.Client.ROOT,
86
89
  localHead: e1_0.seqNum,
87
90
  });
88
- const result = merge({
91
+ const result = yield* merge({
89
92
  syncState,
90
93
  payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
91
94
  });
@@ -94,94 +97,101 @@ describe('syncstate', () => {
94
97
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
95
98
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
96
99
  expect(result.newEvents).toStrictEqual([e2_0]);
97
- });
100
+ }));
98
101
  });
99
- describe('upstream-advance: advance', () => {
100
- it('should throw error if newEvents are not sorted in ascending order by event number (client)', () => {
102
+ Vitest.describe('upstream-advance: advance', () => {
103
+ Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (client)', () => Effect.gen(function* () {
101
104
  const syncState = new SyncState.SyncState({
102
105
  pending: [e1_0],
103
- upstreamHead: EventSequenceNumber.ROOT,
106
+ upstreamHead: EventSequenceNumber.Client.ROOT,
104
107
  localHead: e1_0.seqNum,
105
108
  });
106
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } });
107
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
108
- });
109
- it('should throw error if newEvents are not sorted in ascending order by event number (global)', () => {
109
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } }).pipe(Effect.exit);
110
+ assert(Exit.isFailure(exit));
111
+ expect(Cause.isDie(exit.cause)).toBe(true);
112
+ }));
113
+ Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (global)', () => Effect.gen(function* () {
110
114
  const syncState = new SyncState.SyncState({
111
115
  pending: [e1_0],
112
- upstreamHead: EventSequenceNumber.ROOT,
116
+ upstreamHead: EventSequenceNumber.Client.ROOT,
113
117
  localHead: e1_0.seqNum,
114
118
  });
115
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } });
116
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
117
- });
118
- it('should throw error if incoming event is < expected upstream head', () => {
119
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } }).pipe(Effect.exit);
120
+ assert(Exit.isFailure(exit));
121
+ expect(Cause.isDie(exit.cause)).toBe(true);
122
+ }));
123
+ Vitest.it.effect('should die if incoming event is < expected upstream head', () => Effect.gen(function* () {
119
124
  const syncState = new SyncState.SyncState({
120
125
  pending: [],
121
126
  upstreamHead: e2_0.seqNum,
122
127
  localHead: e2_0.seqNum,
123
128
  });
124
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
125
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
126
- });
127
- it('should throw error if incoming event is = expected upstream head', () => {
129
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
130
+ assert(Exit.isFailure(exit));
131
+ expect(Cause.isDie(exit.cause)).toBe(true);
132
+ }));
133
+ Vitest.it.effect('should die if incoming event is = expected upstream head', () => Effect.gen(function* () {
128
134
  const syncState = new SyncState.SyncState({
129
135
  pending: [],
130
136
  upstreamHead: e2_0.seqNum,
131
137
  localHead: e2_0.seqNum,
132
138
  });
133
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } });
134
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
135
- });
136
- it('should confirm pending event when receiving matching event', () => {
139
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } }).pipe(Effect.exit);
140
+ assert(Exit.isFailure(exit));
141
+ expect(Cause.isDie(exit.cause)).toBe(true);
142
+ }));
143
+ Vitest.it.effect('should confirm pending event when receiving matching event', () => Effect.gen(function* () {
137
144
  const syncState = new SyncState.SyncState({
138
145
  pending: [e1_0],
139
- upstreamHead: EventSequenceNumber.ROOT,
146
+ upstreamHead: EventSequenceNumber.Client.ROOT,
140
147
  localHead: e1_0.seqNum,
141
148
  });
142
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
149
+ const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
143
150
  expectAdvance(result);
144
151
  expectEventArraysEqual(result.newSyncState.pending, []);
145
152
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
146
153
  expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
147
154
  expectEventArraysEqual(result.newEvents, []);
148
155
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
149
- });
150
- it('should confirm partial pending event when receiving matching event', () => {
156
+ }));
157
+ Vitest.it.effect('should confirm partial pending event when receiving matching event', () => Effect.gen(function* () {
151
158
  const syncState = new SyncState.SyncState({
152
159
  pending: [e1_0, e2_0],
153
- upstreamHead: EventSequenceNumber.ROOT,
160
+ upstreamHead: EventSequenceNumber.Client.ROOT,
154
161
  localHead: e2_0.seqNum,
155
162
  });
156
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
163
+ const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
157
164
  expectAdvance(result);
158
165
  expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
159
166
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
160
167
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
161
168
  expectEventArraysEqual(result.newEvents, []);
162
169
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
163
- });
164
- it('should confirm pending event and add new event', () => {
170
+ }));
171
+ Vitest.it.effect('should confirm pending event and add new event', () => Effect.gen(function* () {
165
172
  const syncState = new SyncState.SyncState({
166
173
  pending: [e1_0],
167
- upstreamHead: EventSequenceNumber.ROOT,
174
+ upstreamHead: EventSequenceNumber.Client.ROOT,
168
175
  localHead: e1_0.seqNum,
169
176
  });
170
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } });
177
+ const result = yield* merge({
178
+ syncState,
179
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] },
180
+ });
171
181
  expectAdvance(result);
172
182
  expectEventArraysEqual(result.newSyncState.pending, []);
173
183
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
174
184
  expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
175
185
  expect(result.newEvents).toStrictEqual([e1_1]);
176
186
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
177
- });
178
- it('should confirm pending event and add multiple new events', () => {
187
+ }));
188
+ Vitest.it.effect('should confirm pending event and add multiple new events', () => Effect.gen(function* () {
179
189
  const syncState = new SyncState.SyncState({
180
190
  pending: [e1_1],
181
191
  upstreamHead: e1_0.seqNum,
182
192
  localHead: e1_1.seqNum,
183
193
  });
184
- const result = merge({
194
+ const result = yield* merge({
185
195
  syncState,
186
196
  payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
187
197
  });
@@ -191,14 +201,14 @@ describe('syncstate', () => {
191
201
  expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum);
192
202
  expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1]);
193
203
  expectEventArraysEqual(result.confirmedEvents, [e1_1]);
194
- });
195
- it('should confirm pending global event while keep pending client events', () => {
204
+ }));
205
+ Vitest.it.effect('should confirm pending global event while keep pending client events', () => Effect.gen(function* () {
196
206
  const syncState = new SyncState.SyncState({
197
207
  pending: [e1_0, e1_1],
198
- upstreamHead: EventSequenceNumber.ROOT,
208
+ upstreamHead: EventSequenceNumber.Client.ROOT,
199
209
  localHead: e1_1.seqNum,
200
210
  });
201
- const result = merge({
211
+ const result = yield* merge({
202
212
  syncState,
203
213
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
204
214
  });
@@ -208,14 +218,14 @@ describe('syncstate', () => {
208
218
  expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
209
219
  expectEventArraysEqual(result.newEvents, []);
210
220
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
211
- });
212
- it('should ignore client events (incoming is subset of pending)', () => {
221
+ }));
222
+ Vitest.it.effect('should ignore client events (incoming is subset of pending)', () => Effect.gen(function* () {
213
223
  const syncState = new SyncState.SyncState({
214
224
  pending: [e0_1, e1_0],
215
- upstreamHead: EventSequenceNumber.ROOT,
225
+ upstreamHead: EventSequenceNumber.Client.ROOT,
216
226
  localHead: e1_0.seqNum,
217
227
  });
218
- const result = merge({
228
+ const result = yield* merge({
219
229
  syncState,
220
230
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
221
231
  ignoreClientEvents: true,
@@ -226,14 +236,14 @@ describe('syncstate', () => {
226
236
  expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
227
237
  expectEventArraysEqual(result.newEvents, []);
228
238
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
229
- });
230
- it('should ignore client events (incoming is subset of pending case 2)', () => {
239
+ }));
240
+ Vitest.it.effect('should ignore client events (incoming is subset of pending case 2)', () => Effect.gen(function* () {
231
241
  const syncState = new SyncState.SyncState({
232
242
  pending: [e0_1, e1_0, e2_0],
233
- upstreamHead: EventSequenceNumber.ROOT,
243
+ upstreamHead: EventSequenceNumber.Client.ROOT,
234
244
  localHead: e1_0.seqNum,
235
245
  });
236
- const result = merge({
246
+ const result = yield* merge({
237
247
  syncState,
238
248
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
239
249
  ignoreClientEvents: true,
@@ -244,14 +254,14 @@ describe('syncstate', () => {
244
254
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
245
255
  expectEventArraysEqual(result.newEvents, []);
246
256
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
247
- });
248
- it('should ignore client events (incoming goes beyond pending)', () => {
257
+ }));
258
+ Vitest.it.effect('should ignore client events (incoming goes beyond pending)', () => Effect.gen(function* () {
249
259
  const syncState = new SyncState.SyncState({
250
260
  pending: [e0_1, e1_0, e1_1],
251
- upstreamHead: EventSequenceNumber.ROOT,
261
+ upstreamHead: EventSequenceNumber.Client.ROOT,
252
262
  localHead: e1_1.seqNum,
253
263
  });
254
- const result = merge({
264
+ const result = yield* merge({
255
265
  syncState,
256
266
  payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
257
267
  ignoreClientEvents: true,
@@ -262,25 +272,65 @@ describe('syncstate', () => {
262
272
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
263
273
  expect(result.newEvents).toStrictEqual([e2_0]);
264
274
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1]);
265
- });
266
- it('should fail if incoming event is ≤ local head', () => {
275
+ }));
276
+ Vitest.it.effect('should die if incoming event is ≤ local head', () => Effect.gen(function* () {
267
277
  const syncState = new SyncState.SyncState({
268
278
  pending: [],
269
279
  upstreamHead: e2_0.seqNum,
270
280
  localHead: e2_0.seqNum,
271
281
  });
272
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
273
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
274
- });
282
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
283
+ assert(Exit.isFailure(exit));
284
+ expect(Cause.isDie(exit.cause)).toBe(true);
285
+ }));
286
+ Vitest.it.effect('should advance (not rebase) when pending event has undefined-valued key dropped by JSON wire round-trip', () => Effect.gen(function* () {
287
+ const argsSchema = Schema.Struct({
288
+ id: Schema.String,
289
+ flag: Schema.UndefinedOr(Schema.Boolean),
290
+ });
291
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' });
292
+ const wireArgs = JSON.parse(JSON.stringify(localArgs));
293
+ const localPending = new TestEvent({
294
+ seqNum: e1_0.seqNum,
295
+ parentSeqNum: e1_0.parentSeqNum,
296
+ name: e1_0.name,
297
+ args: localArgs,
298
+ clientId: e1_0.clientId,
299
+ sessionId: e1_0.sessionId,
300
+ });
301
+ const fromUpstream = new TestEvent({
302
+ seqNum: e1_0.seqNum,
303
+ parentSeqNum: e1_0.parentSeqNum,
304
+ name: e1_0.name,
305
+ args: wireArgs,
306
+ clientId: e1_0.clientId,
307
+ sessionId: e1_0.sessionId,
308
+ });
309
+ const syncState = new SyncState.SyncState({
310
+ pending: [localPending],
311
+ upstreamHead: EventSequenceNumber.Client.ROOT,
312
+ localHead: localPending.seqNum,
313
+ });
314
+ const result = yield* merge({
315
+ syncState,
316
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [fromUpstream] }),
317
+ });
318
+ expectAdvance(result);
319
+ expect(result.confirmedEvents).toHaveLength(1);
320
+ expect(result.newSyncState.pending).toHaveLength(0);
321
+ }));
275
322
  });
276
- describe('upstream-advance: rebase', () => {
277
- it('should rebase single client event to end', () => {
323
+ Vitest.describe('upstream-advance: rebase', () => {
324
+ Vitest.it.effect('should rebase single client event to end', () => Effect.gen(function* () {
278
325
  const syncState = new SyncState.SyncState({
279
326
  pending: [e1_0],
280
- upstreamHead: EventSequenceNumber.ROOT,
327
+ upstreamHead: EventSequenceNumber.Client.ROOT,
281
328
  localHead: e1_0.seqNum,
282
329
  });
283
- const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) });
330
+ const result = yield* merge({
331
+ syncState,
332
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }),
333
+ });
284
334
  const e1_0_e1_2 = e1_0.rebase_(e1_1.seqNum, 1);
285
335
  expectRebase(result);
286
336
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2]);
@@ -288,15 +338,18 @@ describe('syncstate', () => {
288
338
  expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.seqNum);
289
339
  expectEventArraysEqual(result.rollbackEvents, [e1_0]);
290
340
  expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2]);
291
- });
292
- it('should rebase different event with same id', () => {
293
- const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false);
341
+ }));
342
+ Vitest.it.effect('should rebase different event with same id', () => Effect.gen(function* () {
343
+ const e2_0_b = TestEvent.new({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false);
294
344
  const syncState = new SyncState.SyncState({
295
345
  pending: [e2_0_b],
296
- upstreamHead: EventSequenceNumber.ROOT,
346
+ upstreamHead: EventSequenceNumber.Client.ROOT,
297
347
  localHead: e2_0_b.seqNum,
298
348
  });
299
- const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) });
349
+ const result = yield* merge({
350
+ syncState,
351
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }),
352
+ });
300
353
  const e2_0_e3_0 = e2_0_b.rebase_(e2_0.seqNum, 1);
301
354
  expectRebase(result);
302
355
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
@@ -304,14 +357,14 @@ describe('syncstate', () => {
304
357
  expectEventArraysEqual(result.rollbackEvents, [e2_0_b]);
305
358
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
306
359
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
307
- });
308
- it('should rebase single client event to end (more incoming events)', () => {
360
+ }));
361
+ Vitest.it.effect('should rebase single client event to end (more incoming events)', () => Effect.gen(function* () {
309
362
  const syncState = new SyncState.SyncState({
310
363
  pending: [e1_0],
311
- upstreamHead: EventSequenceNumber.ROOT,
364
+ upstreamHead: EventSequenceNumber.Client.ROOT,
312
365
  localHead: e1_0.seqNum,
313
366
  });
314
- const result = merge({
367
+ const result = yield* merge({
315
368
  syncState,
316
369
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
317
370
  });
@@ -320,14 +373,14 @@ describe('syncstate', () => {
320
373
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0]);
321
374
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
322
375
  expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.seqNum);
323
- });
324
- it('should only rebase divergent events when first event matches', () => {
376
+ }));
377
+ Vitest.it.effect('should only rebase divergent events when first event matches', () => Effect.gen(function* () {
325
378
  const syncState = new SyncState.SyncState({
326
379
  pending: [e1_0, e1_1],
327
- upstreamHead: EventSequenceNumber.ROOT,
380
+ upstreamHead: EventSequenceNumber.Client.ROOT,
328
381
  localHead: e1_0.seqNum,
329
382
  });
330
- const result = merge({
383
+ const result = yield* merge({
331
384
  syncState,
332
385
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
333
386
  });
@@ -338,14 +391,14 @@ describe('syncstate', () => {
338
391
  expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1]);
339
392
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
340
393
  expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.seqNum);
341
- });
342
- it('should rebase all client events when incoming chain starts differently', () => {
394
+ }));
395
+ Vitest.it.effect('should rebase all client events when incoming chain starts differently', () => Effect.gen(function* () {
343
396
  const syncState = new SyncState.SyncState({
344
397
  pending: [e1_0, e1_1],
345
- upstreamHead: EventSequenceNumber.ROOT,
398
+ upstreamHead: EventSequenceNumber.Client.ROOT,
346
399
  localHead: e1_1.seqNum,
347
400
  });
348
- const result = merge({
401
+ const result = yield* merge({
349
402
  syncState,
350
403
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
351
404
  });
@@ -357,41 +410,77 @@ describe('syncstate', () => {
357
410
  expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1]);
358
411
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
359
412
  expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.seqNum);
360
- });
361
- describe('local-push', () => {
362
- describe('advance', () => {
363
- it('should advance with new events', () => {
413
+ }));
414
+ Vitest.describe('local-push', () => {
415
+ Vitest.describe('advance', () => {
416
+ Vitest.it.effect('should advance with new events', () => Effect.gen(function* () {
364
417
  const syncState = new SyncState.SyncState({
365
418
  pending: [e1_0],
366
- upstreamHead: EventSequenceNumber.ROOT,
419
+ upstreamHead: EventSequenceNumber.Client.ROOT,
367
420
  localHead: e1_0.seqNum,
368
421
  });
369
- const result = merge({
422
+ const result = yield* merge({
370
423
  syncState,
371
424
  payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
372
425
  });
373
426
  expectAdvance(result);
374
427
  expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3]);
375
- expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.ROOT);
428
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
376
429
  expect(result.newSyncState.localHead).toMatchObject(e1_3.seqNum);
377
430
  expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3]);
378
431
  expectEventArraysEqual(result.confirmedEvents, []);
379
- });
380
- });
381
- describe('reject', () => {
382
- it('should reject when new events are greater than pending events', () => {
432
+ }));
433
+ // Leaders can choose to ignore client-only events while still returning them for broadcast.
434
+ // Ensure pending/local head only reflects events that must be pushed upstream.
435
+ Vitest.it.effect('keeps pending empty when pushing only client-only events that are being ignored', () => Effect.gen(function* () {
436
+ const syncState = new SyncState.SyncState({
437
+ pending: [],
438
+ upstreamHead: EventSequenceNumber.Client.ROOT,
439
+ localHead: EventSequenceNumber.Client.ROOT,
440
+ });
441
+ const result = yield* merge({
442
+ syncState,
443
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1] }),
444
+ ignoreClientEvents: true,
445
+ });
446
+ expectAdvance(result);
447
+ expectEventArraysEqual(result.newSyncState.pending, []);
448
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
449
+ expect(result.newSyncState.localHead).toMatchObject(EventSequenceNumber.Client.ROOT);
450
+ expectEventArraysEqual(result.newEvents, [e0_1]);
451
+ }));
452
+ Vitest.it.effect('appends only upstream-bound events to pending when ignoring client-only pushes', () => Effect.gen(function* () {
453
+ const syncState = new SyncState.SyncState({
454
+ pending: [],
455
+ upstreamHead: EventSequenceNumber.Client.ROOT,
456
+ localHead: EventSequenceNumber.Client.ROOT,
457
+ });
458
+ const result = yield* merge({
459
+ syncState,
460
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1, e1_0] }),
461
+ ignoreClientEvents: true,
462
+ });
463
+ expectAdvance(result);
464
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0]);
465
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
466
+ expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
467
+ expectEventArraysEqual(result.newEvents, [e0_1, e1_0]);
468
+ }));
469
+ });
470
+ Vitest.describe('reject', () => {
471
+ Vitest.it.effect('should reject when new events are greater than pending events', () => Effect.gen(function* () {
383
472
  const syncState = new SyncState.SyncState({
384
473
  pending: [e1_0, e1_1],
385
- upstreamHead: EventSequenceNumber.ROOT,
474
+ upstreamHead: EventSequenceNumber.Client.ROOT,
386
475
  localHead: e1_1.seqNum,
387
476
  });
388
- const result = merge({
477
+ const result = yield* merge({
389
478
  syncState,
390
479
  payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
391
480
  });
392
481
  expectReject(result);
393
482
  expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum);
394
- });
483
+ }));
395
484
  });
396
485
  });
397
486
  });
@@ -406,13 +495,13 @@ const expectEventArraysEqual = (actual, expected) => {
406
495
  expect(event.args).toStrictEqual(expected[i].args);
407
496
  });
408
497
  };
409
- function expectAdvance(result) {
498
+ const expectAdvance = (result) => {
410
499
  expect(result._tag).toBe('advance');
411
- }
412
- function expectRebase(result) {
413
- expect(result._tag, `Expected rebase, got ${result}`).toBe('rebase');
414
- }
415
- function expectReject(result) {
500
+ };
501
+ const expectRebase = (result) => {
502
+ expect(result._tag, `Expected rebase, got ${result._tag}`).toBe('rebase');
503
+ };
504
+ const expectReject = (result) => {
416
505
  expect(result._tag).toBe('reject');
417
- }
506
+ };
418
507
  //# sourceMappingURL=syncstate.test.js.map