@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,21 +1,29 @@
1
1
  import type { Schema, Scope } from '@livestore/utils/effect'
2
- import { Effect, Mailbox, Option, Queue, Stream, SubscriptionRef } from '@livestore/utils/effect'
3
- import { UnexpectedError } from '../errors.ts'
2
+ import { Effect, Mailbox, Option, Queue, Ref, Stream, SubscriptionRef } from '@livestore/utils/effect'
3
+
4
+ import { UnknownError } from '../errors.ts'
4
5
  import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
5
- import { InvalidPushError } from './errors.ts'
6
+ import { type BackendIdMismatchError, type ServerAheadError } from './errors.ts'
6
7
  import * as SyncBackend from './sync-backend.ts'
7
8
  import { validatePushPayload } from './validate-push-payload.ts'
8
9
 
9
10
  export interface MockSyncBackend {
10
- pushedEvents: Stream.Stream<LiveStoreEvent.AnyEncodedGlobal>
11
+ pushedEvents: Stream.Stream<LiveStoreEvent.Global.Encoded>
11
12
  connect: Effect.Effect<void>
12
13
  disconnect: Effect.Effect<void>
13
- makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend, UnexpectedError, Scope.Scope>
14
- advance: (...batch: LiveStoreEvent.AnyEncodedGlobal[]) => Effect.Effect<void>
15
- /** Fail the next N push calls with an InvalidPushError (or custom error) */
14
+ makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend, UnknownError, Scope.Scope>
15
+ advance: (...batch: LiveStoreEvent.Global.Encoded[]) => Effect.Effect<void>
16
+ /** Fail the next N push calls with an UnknownError, ServerAheadError, BackendIdMismatchError, or custom error */
16
17
  failNextPushes: (
17
18
  count: number,
18
- error?: (batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>,
19
+ error?: (
20
+ batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>,
21
+ ) => Effect.Effect<never, UnknownError | ServerAheadError | BackendIdMismatchError>,
22
+ ) => Effect.Effect<void>
23
+ /** Fail the next N pull calls with an UnknownError, BackendIdMismatchError, or custom error */
24
+ failNextPulls: (
25
+ count: number,
26
+ error?: () => Effect.Effect<never, UnknownError | BackendIdMismatchError>,
19
27
  ) => Effect.Effect<void>
20
28
  }
21
29
 
@@ -29,109 +37,138 @@ export interface MockSyncBackendOptions {
29
37
 
30
38
  export const makeMockSyncBackend = (
31
39
  options?: MockSyncBackendOptions,
32
- ): Effect.Effect<MockSyncBackend, UnexpectedError, Scope.Scope> =>
40
+ ): Effect.Effect<MockSyncBackend, UnknownError, Scope.Scope> =>
33
41
  Effect.gen(function* () {
34
- const syncEventSequenceNumberRef = { current: EventSequenceNumber.ROOT.global }
35
- const syncPullQueue = yield* Queue.unbounded<LiveStoreEvent.AnyEncodedGlobal>()
36
- const pushedEventsQueue = yield* Mailbox.make<LiveStoreEvent.AnyEncodedGlobal>()
42
+ const span = yield* Effect.currentSpan.pipe(Effect.orDie)
43
+ const semaphore = yield* Effect.makeSemaphore(1)
44
+
45
+ // State refs
46
+ const syncHeadRef = yield* Ref.make(EventSequenceNumber.Client.ROOT.global)
47
+ const allEventsRef = yield* Ref.make<LiveStoreEvent.Global.Encoded[]>([])
37
48
  const syncIsConnectedRef = yield* SubscriptionRef.make(options?.startConnected ?? false)
38
- const allEventsRef: { current: LiveStoreEvent.AnyEncodedGlobal[] } = { current: [] }
39
49
 
40
- const span = yield* Effect.currentSpan.pipe(Effect.orDie)
50
+ // Queues for streaming
51
+ const syncPullQueue = yield* Queue.unbounded<LiveStoreEvent.Global.Encoded>()
52
+ const pushedEventsQueue = yield* Mailbox.make<LiveStoreEvent.Global.Encoded>()
53
+
54
+ // Failure simulation state
55
+ const failPushRef = yield* Ref.make<
56
+ FailureState<UnknownError | ServerAheadError | BackendIdMismatchError, [ReadonlyArray<LiveStoreEvent.Global.Encoded>]>
57
+ >({ remaining: 0, error: undefined })
58
+ const failPullRef = yield* Ref.make<FailureState<UnknownError | BackendIdMismatchError, []>>({
59
+ remaining: 0,
60
+ error: undefined,
61
+ })
41
62
 
42
- const semaphore = yield* Effect.makeSemaphore(1)
63
+ const nonLiveChunkSize = Math.max(1, options?.nonLiveChunkSize ?? 100)
64
+
65
+ /** Check and consume a simulated failure, returning the error effect if one should fire */
66
+ const checkFailure = <E, Args extends unknown[]>(
67
+ ref: Ref.Ref<FailureState<E, Args>>,
68
+ defaultError: E,
69
+ ...args: Args
70
+ ): Effect.Effect<void, E> =>
71
+ Ref.modify(ref, (state) => {
72
+ if (state.remaining <= 0) {
73
+ return [Option.none(), state] as const
74
+ }
75
+ const error = state.error?.(...args) ?? Effect.fail(defaultError)
76
+ return [Option.some(error), { ...state, remaining: state.remaining - 1 }] as const
77
+ }).pipe(
78
+ Effect.flatMap(
79
+ Option.match({
80
+ onNone: () => Effect.void,
81
+ onSome: (errorEffect) => errorEffect,
82
+ }),
83
+ ),
84
+ )
43
85
 
44
- // TODO improve the API and implementation of simulating errors
45
- const failCounterRef = yield* SubscriptionRef.make(0)
46
- const failEffectRef = yield* SubscriptionRef.make<
47
- ((batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>) | undefined
48
- >(undefined)
86
+ const pullNonLive = (cursor: Option.Option<{ eventSequenceNumber: EventSequenceNumber.Global.Type }>) =>
87
+ Effect.gen(function* () {
88
+ const lastSeen = Option.match(cursor, {
89
+ onNone: () => EventSequenceNumber.Client.ROOT.global,
90
+ onSome: (_) => _.eventSequenceNumber,
91
+ })
92
+ const allEvents = yield* Ref.get(allEventsRef)
93
+ const slice = allEvents.filter((e) => e.seqNum > lastSeen)
94
+
95
+ // Split into chunks with remaining count for pageInfo
96
+ const chunks: Array<{ events: LiveStoreEvent.Global.Encoded[]; remaining: number }> = []
97
+ for (let i = 0; i < slice.length; i += nonLiveChunkSize) {
98
+ const end = Math.min(i + nonLiveChunkSize, slice.length)
99
+ chunks.push({
100
+ events: slice.slice(i, end),
101
+ remaining: Math.max(slice.length - end, 0),
102
+ })
103
+ }
104
+ // Always return at least one empty chunk
105
+ if (chunks.length === 0) {
106
+ chunks.push({ events: [], remaining: 0 })
107
+ }
108
+ return chunks
109
+ }).pipe(
110
+ Effect.map((chunks) =>
111
+ Stream.fromIterable(chunks).pipe(
112
+ Stream.map(({ events, remaining }) => ({
113
+ batch: events.map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
114
+ pageInfo: remaining > 0 ? SyncBackend.pageInfoMoreKnown(remaining) : SyncBackend.pageInfoNoMore,
115
+ })),
116
+ ),
117
+ ),
118
+ Stream.fromEffect,
119
+ Stream.flatten(),
120
+ )
49
121
 
50
- const makeSyncBackend = Effect.gen(function* () {
51
- const nonLiveChunkSize = Math.max(1, options?.nonLiveChunkSize ?? 100)
122
+ const pullLive = Stream.concat(
123
+ Stream.make(SyncBackend.pullResItemEmpty()),
124
+ Stream.fromQueue(syncPullQueue).pipe(
125
+ Stream.chunks,
126
+ Stream.map((chunk) => ({
127
+ batch: [...chunk].map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
128
+ pageInfo: SyncBackend.pageInfoNoMore,
129
+ })),
130
+ ),
131
+ )
52
132
 
133
+ const makeSyncBackend = Effect.gen(function* () {
53
134
  // TODO consider making offline state actively error pull/push.
54
135
  // Currently, offline only reflects in `isConnected`, while operations still succeed,
55
136
  // mirroring how some real providers behave during transient disconnects.
56
- return SyncBackend.of<Schema.JsonValue>({
137
+ return SyncBackend.of({
57
138
  isConnected: syncIsConnectedRef,
58
139
  connect: SubscriptionRef.set(syncIsConnectedRef, true),
59
140
  ping: Effect.void,
60
- pull: (cursor, options) =>
61
- (options?.live
62
- ? Stream.concat(
63
- Stream.make(SyncBackend.pullResItemEmpty()),
64
- Stream.fromQueue(syncPullQueue).pipe(
65
- Stream.chunks,
66
- Stream.map((chunk) => ({
67
- batch: [...chunk].map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
68
- pageInfo: SyncBackend.pageInfoNoMore,
69
- })),
70
- ),
71
- )
72
- : Stream.fromEffect(
73
- Effect.sync(() => {
74
- const lastSeen = cursor.pipe(
75
- Option.match({
76
- onNone: () => EventSequenceNumber.ROOT.global,
77
- onSome: (_) => _.eventSequenceNumber,
78
- }),
79
- )
80
- // All events with seqNum greater than lastSeen
81
- const slice = allEventsRef.current.filter((e) => e.seqNum > lastSeen)
82
- // Split into configured chunk size
83
- const chunks: { events: LiveStoreEvent.AnyEncodedGlobal[]; remaining: number }[] = []
84
- for (let i = 0; i < slice.length; i += nonLiveChunkSize) {
85
- const end = Math.min(i + nonLiveChunkSize, slice.length)
86
- const remaining = Math.max(slice.length - end, 0)
87
- chunks.push({ events: slice.slice(i, end), remaining })
88
- }
89
- if (chunks.length === 0) {
90
- chunks.push({ events: [], remaining: 0 })
91
- }
92
- return chunks
93
- }),
94
- ).pipe(
95
- Stream.flatMap((chunks) =>
96
- Stream.fromIterable(chunks).pipe(
97
- Stream.map(({ events, remaining }) => ({
98
- batch: events.map((eventEncoded) => ({ eventEncoded, metadata: Option.none() })),
99
- pageInfo: remaining > 0 ? SyncBackend.pageInfoMoreKnown(remaining) : SyncBackend.pageInfoNoMore,
100
- })),
101
- ),
102
- ),
103
- )
104
- ).pipe(Stream.withSpan('MockSyncBackend:pull', { parent: span })),
141
+ pull: (cursor, pullOptions) =>
142
+ Stream.fromEffect(
143
+ checkFailure(
144
+ failPullRef,
145
+ new UnknownError({ cause: new Error('MockSyncBackend: simulated pull failure') }),
146
+ ),
147
+ ).pipe(
148
+ Stream.flatMap(() => (pullOptions?.live === true ? pullLive : pullNonLive(cursor))),
149
+ Stream.withSpan('MockSyncBackend:pull', { parent: span }),
150
+ ),
105
151
  push: (batch) =>
106
152
  Effect.gen(function* () {
107
- yield* validatePushPayload(batch, syncEventSequenceNumberRef.current)
108
-
109
- const remaining = yield* SubscriptionRef.get(failCounterRef)
110
- if (remaining > 0) {
111
- const maybeFail = yield* SubscriptionRef.get(failEffectRef)
112
- // decrement counter first
113
- yield* SubscriptionRef.set(failCounterRef, remaining - 1)
114
- if (maybeFail) {
115
- return yield* maybeFail(batch)
116
- }
117
- return yield* new InvalidPushError({
118
- cause: new UnexpectedError({ cause: new Error('MockSyncBackend: simulated push failure') }),
119
- })
120
- }
153
+ const currentHead = yield* Ref.get(syncHeadRef)
154
+ yield* validatePushPayload(batch, currentHead)
155
+
156
+ yield* checkFailure(
157
+ failPushRef,
158
+ new UnknownError({ cause: new Error('MockSyncBackend: simulated push failure') }),
159
+ batch,
160
+ )
121
161
 
122
162
  yield* Effect.sleep(10).pipe(Effect.withSpan('MockSyncBackend:push:sleep')) // Simulate network latency
123
163
 
124
164
  yield* pushedEventsQueue.offerAll(batch)
125
165
  yield* syncPullQueue.offerAll(batch)
126
- allEventsRef.current = allEventsRef.current.concat(batch)
127
-
128
- syncEventSequenceNumberRef.current = batch.at(-1)!.seqNum
166
+ yield* Ref.update(allEventsRef, (events) => events.concat(batch))
167
+ yield* Ref.set(syncHeadRef, batch.at(-1)!.seqNum)
129
168
  }).pipe(
130
169
  Effect.withSpan('MockSyncBackend:push', {
131
170
  parent: span,
132
- attributes: {
133
- nums: batch.map((_) => _.seqNum),
134
- },
171
+ attributes: { nums: batch.map((_) => _.seqNum) },
135
172
  }),
136
173
  semaphore.withPermits(1),
137
174
  ),
@@ -146,10 +183,10 @@ export const makeMockSyncBackend = (
146
183
  })
147
184
  })
148
185
 
149
- const advance = (...batch: LiveStoreEvent.AnyEncodedGlobal[]) =>
186
+ const advance = (...batch: LiveStoreEvent.Global.Encoded[]) =>
150
187
  Effect.gen(function* () {
151
- syncEventSequenceNumberRef.current = batch.at(-1)!.seqNum
152
- allEventsRef.current = allEventsRef.current.concat(batch)
188
+ yield* Ref.set(syncHeadRef, batch.at(-1)!.seqNum)
189
+ yield* Ref.update(allEventsRef, (events) => events.concat(batch))
153
190
  yield* syncPullQueue.offerAll(batch)
154
191
  }).pipe(
155
192
  Effect.withSpan('MockSyncBackend:advance', {
@@ -159,26 +196,31 @@ export const makeMockSyncBackend = (
159
196
  semaphore.withPermits(1),
160
197
  )
161
198
 
162
- const connect = SubscriptionRef.set(syncIsConnectedRef, true)
163
- const disconnect = SubscriptionRef.set(syncIsConnectedRef, false)
164
-
165
199
  const failNextPushes = (
166
200
  count: number,
167
- error?: (batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>) => Effect.Effect<never, InvalidPushError>,
168
- ) =>
169
- Effect.gen(function* () {
170
- yield* SubscriptionRef.set(failCounterRef, count)
171
- yield* SubscriptionRef.set(failEffectRef, error)
172
- })
201
+ error?: (
202
+ batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>,
203
+ ) => Effect.Effect<never, UnknownError | ServerAheadError | BackendIdMismatchError>,
204
+ ) => Ref.set(failPushRef, { remaining: count, error })
205
+
206
+ const failNextPulls = (
207
+ count: number,
208
+ error?: () => Effect.Effect<never, UnknownError | BackendIdMismatchError>,
209
+ ) => Ref.set(failPullRef, { remaining: count, error })
173
210
 
174
211
  return {
175
- syncEventSequenceNumberRef,
176
- syncPullQueue,
177
212
  pushedEvents: Mailbox.toStream(pushedEventsQueue),
178
- connect,
179
- disconnect,
213
+ connect: SubscriptionRef.set(syncIsConnectedRef, true),
214
+ disconnect: SubscriptionRef.set(syncIsConnectedRef, false),
180
215
  makeSyncBackend,
181
216
  advance,
182
217
  failNextPushes,
218
+ failNextPulls,
183
219
  }
184
220
  }).pipe(Effect.withSpanScoped('MockSyncBackend'))
221
+
222
+ /** Internal state for simulating failures */
223
+ interface FailureState<E, Args extends unknown[]> {
224
+ remaining: number
225
+ error: ((...args: Args) => Effect.Effect<never, E>) | undefined
226
+ }
@@ -1,6 +1,5 @@
1
1
  import { EventSequenceNumber } from '../../schema/mod.ts'
2
2
  import { replacesFacts } from './facts.ts'
3
- import { graphologyDag } from './graphology_.ts'
4
3
  import type { HistoryDag } from './history-dag-common.ts'
5
4
  import { emptyHistoryDag } from './history-dag-common.ts'
6
5
 
@@ -17,7 +16,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
17
16
  const dag = inputDag.copy()
18
17
  const compactedEventCount = 0
19
18
 
20
- const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag).reverse()
19
+ const orderedEventSequenceNumberStrs = dag.topologicalNodeIds().toReversed()
21
20
 
22
21
  // drop root
23
22
  orderedEventSequenceNumberStrs.pop()
@@ -30,7 +29,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
30
29
  const subDagsForEvent = Array.from(makeSubDagsForEvent(dag, eventNumStr))
31
30
  for (const subDag of subDagsForEvent) {
32
31
  let shouldRetry = true
33
- while (shouldRetry) {
32
+ while (shouldRetry === true) {
34
33
  const subDagsInHistory = findSubDagsInHistory(dag, subDag, eventNumStr)
35
34
 
36
35
  // console.debug(
@@ -65,7 +64,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
65
64
  return { dag, compactedEventCount }
66
65
  }
67
66
 
68
- function* makeSubDagsForEvent(inputDag: HistoryDag, eventNumStr: string): Generator<HistoryDag> {
67
+ const makeSubDagsForEvent = function* (inputDag: HistoryDag, eventNumStr: string): Generator<HistoryDag> {
69
68
  /** Map from eventNumStr to array of eventNumStrs that are dependencies */
70
69
  let nextIterationEls: Map<string, string[]> = new Map([[eventNumStr, []]])
71
70
  let previousDag: HistoryDag | undefined
@@ -116,7 +115,7 @@ const findSubDagsInHistory = (
116
115
  const subDags: HistoryDag[] = []
117
116
  const allOutsideDependencies: string[][] = []
118
117
 
119
- for (const eventNumStr of graphologyDag.topologicalSort(inputDag)) {
118
+ for (const eventNumStr of inputDag.topologicalNodeIds()) {
120
119
  if (eventNumStr === upToExclEventSequenceNumberStr) {
121
120
  break
122
121
  }
@@ -132,7 +131,7 @@ const findSubDagsInHistory = (
132
131
  allOutsideDependencies.push(outsideDependencies)
133
132
  }
134
133
 
135
- if (outsideDependencies.length === 0 && dagReplacesDag(subDag, targetSubDag)) {
134
+ if (outsideDependencies.length === 0 && dagReplacesDag(subDag, targetSubDag) === true) {
136
135
  subDags.push(subDag)
137
136
  } else {
138
137
  break
@@ -172,7 +171,7 @@ const dagDependsOnDag = (dagA: HistoryDag, dagB: HistoryDag, inputDag: HistoryDa
172
171
  for (const edgeEntryA of inputDag.inboundEdgeEntries(nodeAIdStr)) {
173
172
  if (edgeEntryA.attributes.type === 'facts') {
174
173
  const depNodeIdStr = edgeEntryA.target
175
- if (dagB.hasNode(depNodeIdStr)) {
174
+ if (dagB.hasNode(depNodeIdStr) === true) {
176
175
  return true
177
176
  }
178
177
  }
@@ -189,8 +188,8 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
189
188
  }
190
189
 
191
190
  // TODO write tests that covers deterministic order when DAGs have branches
192
- const nodeEntriesA = graphologyDag.topologicalSort(dagA).map((nodeId) => dagA.getNodeAttributes(nodeId))
193
- const nodeEntriesB = graphologyDag.topologicalSort(dagB).map((nodeId) => dagB.getNodeAttributes(nodeId))
191
+ const nodeEntriesA = dagA.topologicalNodeIds().map((nodeId) => dagA.getNodeAttributes(nodeId))
192
+ const nodeEntriesB = dagB.topologicalNodeIds().map((nodeId) => dagB.getNodeAttributes(nodeId))
194
193
 
195
194
  for (let i = 0; i < nodeEntriesA.length; i++) {
196
195
  const nodeA = nodeEntriesA[i]!
@@ -207,14 +206,14 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
207
206
  const removeEvent = (dag: HistoryDag, eventNumStr: string) => {
208
207
  // console.debug('removing event', eventNumStr)
209
208
  const event = dag.getNodeAttributes(eventNumStr)
210
- const parentSeqNumStr = EventSequenceNumber.toString(event.parentSeqNum)
209
+ const parentSeqNumStr = EventSequenceNumber.Client.toString(event.parentSeqNum)
211
210
  const childEdges = dag.outboundEdgeEntries(eventNumStr)
212
211
 
213
212
  for (const childEdge of childEdges) {
214
213
  if (childEdge.attributes.type === 'parent') {
215
214
  const childEvent = dag.getNodeAttributes(childEdge.target)
216
215
  childEvent.parentSeqNum = { ...event.parentSeqNum }
217
- dag.addEdge(parentSeqNumStr, EventSequenceNumber.toString(childEvent.seqNum), { type: 'parent' })
216
+ dag.addEdge(parentSeqNumStr, EventSequenceNumber.Client.toString(childEvent.seqNum), { type: 'parent' })
218
217
  }
219
218
  }
220
219
 
@@ -6,14 +6,13 @@ import type {
6
6
  EventDefFactsGroup,
7
7
  EventDefFactsSnapshot,
8
8
  FactsCallback,
9
- } from '../../schema/EventDef.ts'
10
- import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
11
- import { graphologyDag } from './graphology_.ts'
9
+ } from '../../schema/EventDef/mod.ts'
10
+ import type * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
12
11
  import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.ts'
13
12
 
14
13
  export const factsSnapshotForEvents = (
15
14
  events: HistoryDagNode[],
16
- endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber,
15
+ endEventSequenceNumber: EventSequenceNumber.Client.Composite,
17
16
  ): EventDefFactsSnapshot => {
18
17
  const facts = new Map<string, any>()
19
18
 
@@ -30,11 +29,11 @@ export const factsSnapshotForEvents = (
30
29
 
31
30
  export const factsSnapshotForDag = (
32
31
  dag: HistoryDag,
33
- endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber | undefined,
32
+ endEventSequenceNumber: EventSequenceNumber.Client.Composite | undefined,
34
33
  ): EventDefFactsSnapshot => {
35
34
  const facts = new Map<string, any>()
36
35
 
37
- const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag)
36
+ const orderedEventSequenceNumberStrs = dag.topologicalNodeIds()
38
37
 
39
38
  for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
40
39
  const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
@@ -131,7 +130,7 @@ const isSubSetMapByValue = (setA: EventDefFacts, setB: EventDefFacts) => {
131
130
  /** Check if setA is a subset of setB */
132
131
  const isSubSetMapByKey = (setA: EventDefFacts, setB: EventDefFacts) => {
133
132
  for (const [key, _value] of setA) {
134
- if (!setB.has(key)) {
133
+ if (setB.has(key) === false) {
135
134
  return false
136
135
  }
137
136
  }
@@ -169,7 +168,7 @@ export const factsToString = (facts: EventDefFacts) => {
169
168
 
170
169
  export const factsIntersect = (setA: EventDefFacts, setB: EventDefFacts): boolean => {
171
170
  for (const [key, _value] of setA) {
172
- if (setB.has(key)) {
171
+ if (setB.has(key) === true) {
173
172
  return true
174
173
  }
175
174
  }
@@ -200,7 +199,7 @@ export const getFactsGroupForEventArgs = ({
200
199
  }
201
200
  }
202
201
 
203
- notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
202
+ return notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
204
203
  },
205
204
  })
206
205
 
@@ -217,9 +216,9 @@ export const getFactsGroupForEventArgs = ({
217
216
  return map
218
217
  }
219
218
  const facts = {
220
- modifySet: factsRes?.modify.set ? iterableToMap(factsRes.modify.set) : new Map(),
221
- modifyUnset: factsRes?.modify.unset ? iterableToMap(factsRes.modify.unset) : new Map(),
222
- depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
219
+ modifySet: factsRes?.modify.set !== undefined ? iterableToMap(factsRes.modify.set) : new Map(),
220
+ modifyUnset: factsRes?.modify.unset !== undefined ? iterableToMap(factsRes.modify.unset) : new Map(),
221
+ depRequire: factsRes?.require !== undefined ? iterableToMap(factsRes.require) : new Map(),
223
222
  depRead,
224
223
  }
225
224
 
@@ -227,8 +226,8 @@ export const getFactsGroupForEventArgs = ({
227
226
  }
228
227
 
229
228
  export const compareEventSequenceNumbers = (
230
- a: EventSequenceNumber.EventSequenceNumber,
231
- b: EventSequenceNumber.EventSequenceNumber,
229
+ a: EventSequenceNumber.Client.Composite,
230
+ b: EventSequenceNumber.Client.Composite,
232
231
  ) => {
233
232
  if (a.global !== b.global) {
234
233
  return a.global - b.global