@livestore/common 0.3.0-dev.5 → 0.3.0-dev.51

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 (491) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +120 -64
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +39 -8
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts.map +1 -1
  11. package/dist/debug-info.d.ts +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +97 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -580
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -174
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +36 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +55 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +33 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +7 -13
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -9
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  45. package/dist/leader-thread/LeaderSyncProcessor.js +595 -0
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  47. package/dist/leader-thread/connection.d.ts +34 -6
  48. package/dist/leader-thread/connection.d.ts.map +1 -1
  49. package/dist/leader-thread/connection.js +22 -7
  50. package/dist/leader-thread/connection.js.map +1 -1
  51. package/dist/leader-thread/eventlog.d.ts +27 -0
  52. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  53. package/dist/leader-thread/eventlog.js +119 -0
  54. package/dist/leader-thread/eventlog.js.map +1 -0
  55. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  56. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  57. package/dist/leader-thread/leader-worker-devtools.js +155 -80
  58. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts +23 -11
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +72 -47
  62. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  63. package/dist/leader-thread/materialize-event.d.ts +16 -0
  64. package/dist/leader-thread/materialize-event.d.ts.map +1 -0
  65. package/dist/leader-thread/materialize-event.js +109 -0
  66. package/dist/leader-thread/materialize-event.js.map +1 -0
  67. package/dist/leader-thread/mod.d.ts +1 -1
  68. package/dist/leader-thread/mod.d.ts.map +1 -1
  69. package/dist/leader-thread/mod.js +1 -1
  70. package/dist/leader-thread/mod.js.map +1 -1
  71. package/dist/leader-thread/recreate-db.d.ts +4 -2
  72. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  73. package/dist/leader-thread/recreate-db.js +33 -31
  74. package/dist/leader-thread/recreate-db.js.map +1 -1
  75. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  76. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  77. package/dist/leader-thread/shutdown-channel.js +2 -4
  78. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  79. package/dist/leader-thread/types.d.ts +87 -40
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +1 -3
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/make-client-session.d.ts +23 -0
  84. package/dist/make-client-session.d.ts.map +1 -0
  85. package/dist/make-client-session.js +57 -0
  86. package/dist/make-client-session.js.map +1 -0
  87. package/dist/materializer-helper.d.ts +23 -0
  88. package/dist/materializer-helper.d.ts.map +1 -0
  89. package/dist/materializer-helper.js +86 -0
  90. package/dist/materializer-helper.js.map +1 -0
  91. package/dist/otel.d.ts +2 -0
  92. package/dist/otel.d.ts.map +1 -1
  93. package/dist/otel.js +5 -0
  94. package/dist/otel.js.map +1 -1
  95. package/dist/rematerialize-from-eventlog.d.ts +14 -0
  96. package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
  97. package/dist/rematerialize-from-eventlog.js +64 -0
  98. package/dist/rematerialize-from-eventlog.js.map +1 -0
  99. package/dist/schema/EventDef.d.ts +146 -0
  100. package/dist/schema/EventDef.d.ts.map +1 -0
  101. package/dist/schema/EventDef.js +58 -0
  102. package/dist/schema/EventDef.js.map +1 -0
  103. package/dist/schema/EventId.d.ts +43 -25
  104. package/dist/schema/EventId.d.ts.map +1 -1
  105. package/dist/schema/EventId.js +56 -18
  106. package/dist/schema/EventId.js.map +1 -1
  107. package/dist/schema/EventId.test.d.ts +2 -0
  108. package/dist/schema/EventId.test.d.ts.map +1 -0
  109. package/dist/schema/EventId.test.js +11 -0
  110. package/dist/schema/EventId.test.js.map +1 -0
  111. package/dist/schema/EventNumber.d.ts +57 -0
  112. package/dist/schema/EventNumber.d.ts.map +1 -0
  113. package/dist/schema/EventNumber.js +82 -0
  114. package/dist/schema/EventNumber.js.map +1 -0
  115. package/dist/schema/EventNumber.test.d.ts +2 -0
  116. package/dist/schema/EventNumber.test.d.ts.map +1 -0
  117. package/dist/schema/EventNumber.test.js +11 -0
  118. package/dist/schema/EventNumber.test.js.map +1 -0
  119. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  120. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  121. package/dist/schema/EventSequenceNumber.js +82 -0
  122. package/dist/schema/EventSequenceNumber.js.map +1 -0
  123. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  124. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  125. package/dist/schema/EventSequenceNumber.test.js +11 -0
  126. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  127. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  128. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  129. package/dist/schema/LiveStoreEvent.js +117 -0
  130. package/dist/schema/LiveStoreEvent.js.map +1 -0
  131. package/dist/schema/events.d.ts +2 -0
  132. package/dist/schema/events.d.ts.map +1 -0
  133. package/dist/schema/events.js +2 -0
  134. package/dist/schema/events.js.map +1 -0
  135. package/dist/schema/mod.d.ts +8 -6
  136. package/dist/schema/mod.d.ts.map +1 -1
  137. package/dist/schema/mod.js +8 -6
  138. package/dist/schema/mod.js.map +1 -1
  139. package/dist/schema/schema.d.ts +50 -32
  140. package/dist/schema/schema.d.ts.map +1 -1
  141. package/dist/schema/schema.js +36 -43
  142. package/dist/schema/schema.js.map +1 -1
  143. package/dist/schema/state/mod.d.ts +3 -0
  144. package/dist/schema/state/mod.d.ts.map +1 -0
  145. package/dist/schema/state/mod.js +3 -0
  146. package/dist/schema/state/mod.js.map +1 -0
  147. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  148. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  149. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  150. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  151. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  152. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  153. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  154. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  155. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  156. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  157. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  158. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  159. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  160. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  161. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  162. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  163. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  164. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  165. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  166. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  167. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  168. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  169. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  170. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  171. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  172. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  173. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  174. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  175. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  176. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  177. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  178. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  179. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  180. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  181. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  182. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  183. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  184. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  185. package/dist/schema/state/sqlite/mod.js +41 -0
  186. package/dist/schema/state/sqlite/mod.js.map +1 -0
  187. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  188. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  189. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  190. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  191. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  192. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  193. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  194. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  195. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  196. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  197. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  198. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  199. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  200. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  201. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  202. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  203. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  204. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  205. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  206. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  207. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  208. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  209. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  210. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  211. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  212. package/dist/schema/state/sqlite/system-tables.js +88 -0
  213. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  214. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  215. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  216. package/dist/schema/state/sqlite/table-def.js +36 -0
  217. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  218. package/dist/schema-management/common.d.ts +7 -7
  219. package/dist/schema-management/common.d.ts.map +1 -1
  220. package/dist/schema-management/common.js.map +1 -1
  221. package/dist/schema-management/migrations.d.ts +6 -6
  222. package/dist/schema-management/migrations.d.ts.map +1 -1
  223. package/dist/schema-management/migrations.js +27 -18
  224. package/dist/schema-management/migrations.js.map +1 -1
  225. package/dist/schema-management/validate-schema.d.ts +8 -0
  226. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  227. package/dist/schema-management/validate-schema.js +39 -0
  228. package/dist/schema-management/validate-schema.js.map +1 -0
  229. package/dist/sql-queries/misc.d.ts.map +1 -1
  230. package/dist/sql-queries/sql-queries.d.ts +1 -1
  231. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  232. package/dist/sql-queries/sql-queries.js.map +1 -1
  233. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  234. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  235. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  236. package/dist/sql-queries/types.d.ts +2 -1
  237. package/dist/sql-queries/types.d.ts.map +1 -1
  238. package/dist/sql-queries/types.js.map +1 -1
  239. package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
  240. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  241. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  242. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  243. package/dist/sync/index.d.ts +1 -1
  244. package/dist/sync/index.d.ts.map +1 -1
  245. package/dist/sync/index.js +1 -1
  246. package/dist/sync/index.js.map +1 -1
  247. package/dist/sync/next/compact-events.d.ts.map +1 -1
  248. package/dist/sync/next/compact-events.js +38 -35
  249. package/dist/sync/next/compact-events.js.map +1 -1
  250. package/dist/sync/next/facts.d.ts +21 -21
  251. package/dist/sync/next/facts.d.ts.map +1 -1
  252. package/dist/sync/next/facts.js +11 -11
  253. package/dist/sync/next/facts.js.map +1 -1
  254. package/dist/sync/next/history-dag-common.d.ts +9 -7
  255. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  256. package/dist/sync/next/history-dag-common.js +10 -5
  257. package/dist/sync/next/history-dag-common.js.map +1 -1
  258. package/dist/sync/next/history-dag.d.ts +0 -2
  259. package/dist/sync/next/history-dag.d.ts.map +1 -1
  260. package/dist/sync/next/history-dag.js +16 -14
  261. package/dist/sync/next/history-dag.js.map +1 -1
  262. package/dist/sync/next/rebase-events.d.ts +10 -8
  263. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  264. package/dist/sync/next/rebase-events.js +18 -10
  265. package/dist/sync/next/rebase-events.js.map +1 -1
  266. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  267. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  268. package/dist/sync/next/test/compact-events.test.js +77 -77
  269. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  270. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +38 -28
  271. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  272. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
  273. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  274. package/dist/sync/next/test/mod.d.ts +1 -1
  275. package/dist/sync/next/test/mod.d.ts.map +1 -1
  276. package/dist/sync/next/test/mod.js +1 -1
  277. package/dist/sync/next/test/mod.js.map +1 -1
  278. package/dist/sync/sync.d.ts +60 -25
  279. package/dist/sync/sync.d.ts.map +1 -1
  280. package/dist/sync/sync.js +10 -6
  281. package/dist/sync/sync.js.map +1 -1
  282. package/dist/sync/syncstate.d.ts +213 -82
  283. package/dist/sync/syncstate.d.ts.map +1 -1
  284. package/dist/sync/syncstate.js +337 -139
  285. package/dist/sync/syncstate.js.map +1 -1
  286. package/dist/sync/syncstate.test.js +310 -286
  287. package/dist/sync/syncstate.test.js.map +1 -1
  288. package/dist/sync/validate-push-payload.d.ts +2 -2
  289. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  290. package/dist/sync/validate-push-payload.js +4 -4
  291. package/dist/sync/validate-push-payload.js.map +1 -1
  292. package/dist/util.d.ts +2 -2
  293. package/dist/util.d.ts.map +1 -1
  294. package/dist/version.d.ts +2 -2
  295. package/dist/version.d.ts.map +1 -1
  296. package/dist/version.js +2 -2
  297. package/dist/version.js.map +1 -1
  298. package/package.json +13 -6
  299. package/src/__tests__/fixture.ts +36 -15
  300. package/src/adapter-types.ts +107 -68
  301. package/src/debug-info.ts +1 -0
  302. package/src/devtools/devtools-messages-client-session.ts +142 -0
  303. package/src/devtools/devtools-messages-common.ts +115 -0
  304. package/src/devtools/devtools-messages-leader.ts +191 -0
  305. package/src/devtools/devtools-messages.ts +3 -246
  306. package/src/devtools/devtools-sessioninfo.ts +101 -0
  307. package/src/devtools/mod.ts +59 -0
  308. package/src/index.ts +7 -15
  309. package/src/leader-thread/LeaderSyncProcessor.ts +940 -0
  310. package/src/leader-thread/connection.ts +54 -9
  311. package/src/leader-thread/eventlog.ts +199 -0
  312. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  313. package/src/leader-thread/make-leader-thread-layer.ts +128 -78
  314. package/src/leader-thread/materialize-event.ts +173 -0
  315. package/src/leader-thread/mod.ts +1 -1
  316. package/src/leader-thread/recreate-db.ts +38 -39
  317. package/src/leader-thread/shutdown-channel.ts +2 -4
  318. package/src/leader-thread/types.ts +96 -50
  319. package/src/make-client-session.ts +136 -0
  320. package/src/materializer-helper.ts +138 -0
  321. package/src/otel.ts +8 -0
  322. package/src/rematerialize-from-eventlog.ts +117 -0
  323. package/src/schema/EventDef.ts +227 -0
  324. package/src/schema/EventSequenceNumber.test.ts +12 -0
  325. package/src/schema/EventSequenceNumber.ts +121 -0
  326. package/src/schema/LiveStoreEvent.ts +240 -0
  327. package/src/schema/events.ts +1 -0
  328. package/src/schema/mod.ts +8 -6
  329. package/src/schema/schema.ts +88 -84
  330. package/src/schema/state/mod.ts +2 -0
  331. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  332. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  333. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  334. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  335. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  336. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  337. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  338. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  339. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  340. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  341. package/src/schema/state/sqlite/mod.ts +73 -0
  342. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  343. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  344. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  345. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  346. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  347. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  348. package/src/schema/state/sqlite/system-tables.ts +117 -0
  349. package/src/schema/state/sqlite/table-def.ts +197 -0
  350. package/src/schema-management/common.ts +7 -7
  351. package/src/schema-management/migrations.ts +37 -31
  352. package/src/schema-management/validate-schema.ts +61 -0
  353. package/src/sql-queries/sql-queries.ts +1 -1
  354. package/src/sql-queries/sql-query-builder.ts +1 -2
  355. package/src/sql-queries/types.ts +3 -1
  356. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  357. package/src/sync/index.ts +1 -1
  358. package/src/sync/next/compact-events.ts +38 -35
  359. package/src/sync/next/facts.ts +43 -41
  360. package/src/sync/next/history-dag-common.ts +17 -10
  361. package/src/sync/next/history-dag.ts +16 -17
  362. package/src/sync/next/rebase-events.ts +29 -17
  363. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  364. package/src/sync/next/test/compact-events.test.ts +79 -79
  365. package/src/sync/next/test/event-fixtures.ts +226 -0
  366. package/src/sync/next/test/mod.ts +1 -1
  367. package/src/sync/sync.ts +60 -24
  368. package/src/sync/syncstate.test.ts +347 -320
  369. package/src/sync/syncstate.ts +422 -230
  370. package/src/sync/validate-push-payload.ts +6 -6
  371. package/src/version.ts +2 -2
  372. package/dist/derived-mutations.d.ts +0 -109
  373. package/dist/derived-mutations.d.ts.map +0 -1
  374. package/dist/derived-mutations.js +0 -54
  375. package/dist/derived-mutations.js.map +0 -1
  376. package/dist/derived-mutations.test.d.ts +0 -2
  377. package/dist/derived-mutations.test.d.ts.map +0 -1
  378. package/dist/derived-mutations.test.js +0 -93
  379. package/dist/derived-mutations.test.js.map +0 -1
  380. package/dist/devtools/devtools-bridge.d.ts +0 -13
  381. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  382. package/dist/devtools/devtools-bridge.js +0 -2
  383. package/dist/devtools/devtools-bridge.js.map +0 -1
  384. package/dist/devtools/devtools-window-message.d.ts +0 -29
  385. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  386. package/dist/devtools/devtools-window-message.js +0 -33
  387. package/dist/devtools/devtools-window-message.js.map +0 -1
  388. package/dist/devtools/index.d.ts +0 -42
  389. package/dist/devtools/index.d.ts.map +0 -1
  390. package/dist/devtools/index.js +0 -48
  391. package/dist/devtools/index.js.map +0 -1
  392. package/dist/init-singleton-tables.d.ts +0 -4
  393. package/dist/init-singleton-tables.d.ts.map +0 -1
  394. package/dist/init-singleton-tables.js +0 -16
  395. package/dist/init-singleton-tables.js.map +0 -1
  396. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  397. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  398. package/dist/leader-thread/apply-mutation.js +0 -95
  399. package/dist/leader-thread/apply-mutation.js.map +0 -1
  400. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  401. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  402. package/dist/leader-thread/leader-sync-processor.js +0 -425
  403. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  404. package/dist/leader-thread/mutationlog.d.ts +0 -10
  405. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  406. package/dist/leader-thread/mutationlog.js +0 -28
  407. package/dist/leader-thread/mutationlog.js.map +0 -1
  408. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  409. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  410. package/dist/leader-thread/pull-queue-set.js +0 -39
  411. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  412. package/dist/mutation.d.ts +0 -13
  413. package/dist/mutation.d.ts.map +0 -1
  414. package/dist/mutation.js +0 -57
  415. package/dist/mutation.js.map +0 -1
  416. package/dist/query-builder/api.d.ts +0 -190
  417. package/dist/query-builder/api.d.ts.map +0 -1
  418. package/dist/query-builder/api.js +0 -8
  419. package/dist/query-builder/api.js.map +0 -1
  420. package/dist/query-builder/impl.d.ts +0 -12
  421. package/dist/query-builder/impl.d.ts.map +0 -1
  422. package/dist/query-builder/impl.js +0 -244
  423. package/dist/query-builder/impl.js.map +0 -1
  424. package/dist/query-builder/impl.test.d.ts +0 -2
  425. package/dist/query-builder/impl.test.d.ts.map +0 -1
  426. package/dist/query-builder/impl.test.js +0 -212
  427. package/dist/query-builder/impl.test.js.map +0 -1
  428. package/dist/query-builder/mod.d.ts.map +0 -1
  429. package/dist/query-builder/mod.js.map +0 -1
  430. package/dist/query-info.d.ts +0 -38
  431. package/dist/query-info.d.ts.map +0 -1
  432. package/dist/query-info.js +0 -7
  433. package/dist/query-info.js.map +0 -1
  434. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  435. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  436. package/dist/rehydrate-from-mutationlog.js +0 -72
  437. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  438. package/dist/schema/MutationEvent.d.ts +0 -166
  439. package/dist/schema/MutationEvent.d.ts.map +0 -1
  440. package/dist/schema/MutationEvent.js +0 -72
  441. package/dist/schema/MutationEvent.js.map +0 -1
  442. package/dist/schema/mutations.d.ts +0 -107
  443. package/dist/schema/mutations.d.ts.map +0 -1
  444. package/dist/schema/mutations.js +0 -42
  445. package/dist/schema/mutations.js.map +0 -1
  446. package/dist/schema/schema-helpers.d.ts.map +0 -1
  447. package/dist/schema/schema-helpers.js.map +0 -1
  448. package/dist/schema/system-tables.d.ts +0 -399
  449. package/dist/schema/system-tables.d.ts.map +0 -1
  450. package/dist/schema/system-tables.js +0 -58
  451. package/dist/schema/system-tables.js.map +0 -1
  452. package/dist/schema/table-def.d.ts +0 -156
  453. package/dist/schema/table-def.d.ts.map +0 -1
  454. package/dist/schema/table-def.js +0 -79
  455. package/dist/schema/table-def.js.map +0 -1
  456. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  457. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  458. package/dist/schema-management/validate-mutation-defs.js +0 -39
  459. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  460. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  461. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  462. package/dist/sync/client-session-sync-processor.js +0 -131
  463. package/dist/sync/client-session-sync-processor.js.map +0 -1
  464. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  465. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  466. package/src/derived-mutations.test.ts +0 -101
  467. package/src/derived-mutations.ts +0 -166
  468. package/src/devtools/devtools-bridge.ts +0 -14
  469. package/src/devtools/devtools-window-message.ts +0 -27
  470. package/src/devtools/index.ts +0 -48
  471. package/src/init-singleton-tables.ts +0 -24
  472. package/src/leader-thread/apply-mutation.ts +0 -143
  473. package/src/leader-thread/leader-sync-processor.ts +0 -670
  474. package/src/leader-thread/mutationlog.ts +0 -46
  475. package/src/leader-thread/pull-queue-set.ts +0 -58
  476. package/src/mutation.ts +0 -81
  477. package/src/query-builder/api.ts +0 -289
  478. package/src/query-builder/impl.test.ts +0 -239
  479. package/src/query-builder/impl.ts +0 -285
  480. package/src/query-info.ts +0 -78
  481. package/src/rehydrate-from-mutationlog.ts +0 -127
  482. package/src/schema/EventId.ts +0 -60
  483. package/src/schema/MutationEvent.ts +0 -180
  484. package/src/schema/mutations.ts +0 -192
  485. package/src/schema/system-tables.ts +0 -104
  486. package/src/schema/table-def.ts +0 -343
  487. package/src/schema-management/validate-mutation-defs.ts +0 -63
  488. package/src/sync/client-session-sync-processor.ts +0 -207
  489. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  490. package/tsconfig.json +0 -11
  491. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,373 +1,397 @@
1
1
  /* eslint-disable prefer-arrow/prefer-arrow-functions */
2
2
  import { describe, expect, it } from 'vitest';
3
- import * as EventId from '../schema/EventId.js';
4
- import * as MutationEvent from '../schema/MutationEvent.js';
3
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber.js';
4
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent.js';
5
5
  import * as SyncState from './syncstate.js';
6
- class TestEvent extends MutationEvent.EncodedWithMeta {
6
+ class TestEvent extends LiveStoreEvent.EncodedWithMeta {
7
7
  payload;
8
8
  isLocal;
9
- constructor(id, parentId, payload, isLocal) {
9
+ constructor(seqNum, parentSeqNum, payload, isLocal) {
10
10
  super({
11
- id: EventId.make(id),
12
- parentId: EventId.make(parentId),
13
- mutation: 'a',
11
+ seqNum: EventSequenceNumber.make(seqNum),
12
+ parentSeqNum: EventSequenceNumber.make(parentSeqNum),
13
+ name: 'a',
14
14
  args: payload,
15
- meta: {},
15
+ clientId: 'static-local-id',
16
+ sessionId: 'static-session-id',
16
17
  });
17
18
  this.payload = payload;
18
19
  this.isLocal = isLocal;
19
20
  }
20
- rebase_ = (parentId) => {
21
- return this.rebase(parentId, this.isLocal);
21
+ rebase_ = (parentSeqNum) => {
22
+ return this.rebase(parentSeqNum, this.isLocal);
22
23
  };
23
24
  }
24
- const e_r_1 = new TestEvent({ global: -1, local: 1 }, EventId.ROOT, 'a', true);
25
- const e_0_0 = new TestEvent({ global: 0, local: 0 }, EventId.ROOT, 'a', false);
26
- const e_0_1 = new TestEvent({ global: 0, local: 1 }, e_0_0.id, 'a', true);
27
- const e_0_2 = new TestEvent({ global: 0, local: 2 }, e_0_1.id, 'a', true);
28
- const e_0_3 = new TestEvent({ global: 0, local: 3 }, e_0_2.id, 'a', true);
29
- const e_1_0 = new TestEvent({ global: 1, local: 0 }, e_0_0.id, 'a', false);
30
- const e_1_1 = new TestEvent({ global: 1, local: 1 }, e_1_0.id, 'a', true);
31
- const isEqualEvent = MutationEvent.isEqualEncoded;
32
- const isLocalEvent = (event) => event.isLocal;
25
+ const e0_1 = new TestEvent({ global: 0, client: 1 }, EventSequenceNumber.ROOT, 'a', true);
26
+ const e1_0 = new TestEvent({ global: 1, client: 0 }, EventSequenceNumber.ROOT, 'a', false);
27
+ const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.seqNum, 'a', true);
28
+ const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.seqNum, 'a', true);
29
+ const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.seqNum, 'a', true);
30
+ const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.seqNum, 'a', false);
31
+ const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.seqNum, 'a', true);
32
+ const isEqualEvent = LiveStoreEvent.isEqualEncoded;
33
+ const isClientEvent = (event) => event.isLocal;
33
34
  describe('syncstate', () => {
34
- describe('updateSyncState', () => {
35
- const run = ({ syncState, payload, ignoreLocalEvents = false, }) => SyncState.updateSyncState({ syncState, payload, isLocalEvent, isEqualEvent, ignoreLocalEvents });
36
- describe.each([{ trimRollbackUntil: false }, { trimRollbackUntil: true }])('upstream-rebase (trimRollbackUntil: $trimRollbackUntil)', ({ trimRollbackUntil }) => {
35
+ describe('merge', () => {
36
+ const merge = ({ syncState, payload, ignoreClientEvents = false, }) => SyncState.merge({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents });
37
+ describe('upstream-rebase', () => {
37
38
  it('should rollback until start', () => {
38
- const syncState = {
39
- pending: [e_1_0],
40
- rollbackTail: [e_0_0, e_0_1],
41
- upstreamHead: EventId.ROOT,
42
- localHead: e_1_0.id,
43
- };
44
- const e_0_0_e_1_0 = e_0_0.rebase_(e_1_0.id);
45
- const e_0_1_e_1_1 = e_0_1.rebase_(e_0_0_e_1_0.id);
46
- const result = run({
39
+ const syncState = new SyncState.SyncState({
40
+ pending: [e2_0],
41
+ upstreamHead: EventSequenceNumber.ROOT,
42
+ localHead: e2_0.seqNum,
43
+ });
44
+ const e1_0_e2_0 = e1_0.rebase_(e2_0.seqNum);
45
+ const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.seqNum);
46
+ const result = merge({
47
47
  syncState,
48
- payload: {
49
- _tag: 'upstream-rebase',
50
- rollbackUntil: e_0_0.id,
51
- newEvents: [e_0_0_e_1_0, e_0_1_e_1_1],
52
- trimRollbackUntil: trimRollbackUntil ? e_0_1_e_1_1.id : undefined,
53
- },
54
- });
55
- const e_1_0_e_2_0 = e_1_0.rebase_(e_0_0_e_1_0.id);
48
+ payload: SyncState.PayloadUpstreamRebase.make({
49
+ rollbackEvents: [e1_0, e1_1],
50
+ newEvents: [e1_0_e2_0, e1_1_e2_1],
51
+ }),
52
+ });
53
+ const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.seqNum);
56
54
  expectRebase(result);
57
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0]);
58
- if (trimRollbackUntil) {
59
- expectEventArraysEqual(result.newSyncState.rollbackTail, []);
60
- }
61
- else {
62
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0_e_1_0, e_0_1_e_1_1]);
63
- }
64
- expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_1.id);
65
- expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
66
- expectEventArraysEqual(result.newEvents, [e_0_0_e_1_0, e_0_1_e_1_1]);
67
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0]);
55
+ expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
56
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.seqNum);
57
+ expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
58
+ expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0]);
59
+ expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0]);
68
60
  });
69
61
  it('should rollback only to specified point', () => {
70
- const syncState = {
71
- pending: [e_1_0],
72
- rollbackTail: [e_0_0, e_0_1],
73
- upstreamHead: EventId.ROOT,
74
- localHead: e_1_0.id,
75
- };
76
- const e_0_1_e_1_0 = e_0_1.rebase_(e_0_0.id);
77
- const result = run({
62
+ const syncState = new SyncState.SyncState({
63
+ pending: [e2_0],
64
+ upstreamHead: EventSequenceNumber.ROOT,
65
+ localHead: e2_0.seqNum,
66
+ });
67
+ const e1_1_e2_0 = e1_1.rebase_(e1_0.seqNum);
68
+ const result = merge({
78
69
  syncState,
79
- payload: {
80
- _tag: 'upstream-rebase',
81
- rollbackUntil: e_0_1.id,
82
- newEvents: [e_0_1_e_1_0],
83
- trimRollbackUntil: trimRollbackUntil ? e_0_0.id : undefined,
84
- },
85
- });
86
- const e_1_0_e_2_0 = e_1_0.rebase_(e_0_1_e_1_0.id);
70
+ payload: SyncState.PayloadUpstreamRebase.make({
71
+ newEvents: [e1_1_e2_0],
72
+ rollbackEvents: [e1_1],
73
+ }),
74
+ });
75
+ const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.seqNum);
87
76
  expectRebase(result);
88
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0]);
89
- if (trimRollbackUntil) {
90
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1_e_1_0]);
91
- }
92
- else {
93
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1_e_1_0]);
94
- }
95
- expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_0.id);
96
- expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
97
- expectEventArraysEqual(result.newEvents, [e_0_1_e_1_0]);
98
- expectEventArraysEqual(result.eventsToRollback, [e_0_1, e_1_0]);
77
+ expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
78
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.seqNum);
79
+ expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
80
+ expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0]);
81
+ expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0]);
99
82
  });
100
83
  it('should work for empty pending', () => {
101
- const syncState = { pending: [], rollbackTail: [e_0_0], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
102
- const result = run({
103
- syncState,
104
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
84
+ const syncState = new SyncState.SyncState({
85
+ pending: [],
86
+ upstreamHead: EventSequenceNumber.ROOT,
87
+ localHead: e1_0.seqNum,
105
88
  });
106
- expectRebase(result);
107
- expectEventArraysEqual(result.newSyncState.pending, []);
108
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_1_0]);
109
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
110
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
111
- expect(result.newEvents).toEqual([e_1_0]);
112
- });
113
- it('should fail for empty rollback tail', () => {
114
- const syncState = { pending: [], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
115
- expect(() => run({
116
- syncState,
117
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
118
- })).toThrow();
119
- });
120
- it('should work for empty incoming', () => {
121
- const syncState = { pending: [], rollbackTail: [e_0_0], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
122
- const result = run({
89
+ const result = merge({
123
90
  syncState,
124
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [] },
91
+ payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
125
92
  });
126
93
  expectRebase(result);
127
94
  expectEventArraysEqual(result.newSyncState.pending, []);
128
- expectEventArraysEqual(result.newSyncState.rollbackTail, []);
129
- expect(result.newSyncState.upstreamHead).toBe(EventId.ROOT);
130
- expect(result.newSyncState.localHead).toMatchObject(EventId.ROOT);
131
- expect(result.newEvents).toEqual([]);
95
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
96
+ expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
97
+ expect(result.newEvents).toStrictEqual([e2_0]);
132
98
  });
133
99
  });
134
100
  describe('upstream-advance: advance', () => {
135
- it('should throw error if newEvents are not sorted in ascending order by eventId (local)', () => {
136
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
137
- expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_0] } })).toThrow();
101
+ it('should throw error if newEvents are not sorted in ascending order by event number (client)', () => {
102
+ const syncState = new SyncState.SyncState({
103
+ pending: [e1_0],
104
+ upstreamHead: EventSequenceNumber.ROOT,
105
+ localHead: e1_0.seqNum,
106
+ });
107
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } });
108
+ expect(result).toMatchObject({ _tag: 'unexpected-error' });
138
109
  });
139
- it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
140
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
141
- expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0, e_0_0] } })).toThrow();
110
+ it('should throw error if newEvents are not sorted in ascending order by event number (global)', () => {
111
+ const syncState = new SyncState.SyncState({
112
+ pending: [e1_0],
113
+ upstreamHead: EventSequenceNumber.ROOT,
114
+ localHead: e1_0.seqNum,
115
+ });
116
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } });
117
+ expect(result).toMatchObject({ _tag: 'unexpected-error' });
142
118
  });
143
- it('should acknowledge pending event when receiving matching event', () => {
144
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
145
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
119
+ it('should throw error if incoming event is < expected upstream head', () => {
120
+ const syncState = new SyncState.SyncState({
121
+ pending: [],
122
+ upstreamHead: e2_0.seqNum,
123
+ localHead: e2_0.seqNum,
124
+ });
125
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
126
+ expect(result).toMatchObject({ _tag: 'unexpected-error' });
127
+ });
128
+ it('should throw error if incoming event is = expected upstream head', () => {
129
+ const syncState = new SyncState.SyncState({
130
+ pending: [],
131
+ upstreamHead: e2_0.seqNum,
132
+ localHead: e2_0.seqNum,
133
+ });
134
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } });
135
+ expect(result).toMatchObject({ _tag: 'unexpected-error' });
136
+ });
137
+ it('should confirm pending event when receiving matching event', () => {
138
+ const syncState = new SyncState.SyncState({
139
+ pending: [e1_0],
140
+ upstreamHead: EventSequenceNumber.ROOT,
141
+ localHead: e1_0.seqNum,
142
+ });
143
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
146
144
  expectAdvance(result);
147
145
  expectEventArraysEqual(result.newSyncState.pending, []);
148
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
149
- expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
150
- expect(result.newSyncState.localHead).toMatchObject(e_0_0.id);
151
- expect(result.newEvents).toEqual([]);
146
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
147
+ expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
148
+ expectEventArraysEqual(result.newEvents, []);
149
+ expectEventArraysEqual(result.confirmedEvents, [e1_0]);
152
150
  });
153
- it('should acknowledge partial pending event when receiving matching event', () => {
154
- const syncState = {
155
- pending: [e_0_0, e_1_0],
156
- rollbackTail: [],
157
- upstreamHead: EventId.ROOT,
158
- localHead: e_1_0.id,
159
- };
160
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
151
+ it('should confirm partial pending event when receiving matching event', () => {
152
+ const syncState = new SyncState.SyncState({
153
+ pending: [e1_0, e2_0],
154
+ upstreamHead: EventSequenceNumber.ROOT,
155
+ localHead: e2_0.seqNum,
156
+ });
157
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
161
158
  expectAdvance(result);
162
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0]);
163
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
164
- expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
165
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
166
- expect(result.newEvents).toEqual([]);
159
+ expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
160
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
161
+ expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
162
+ expectEventArraysEqual(result.newEvents, []);
163
+ expectEventArraysEqual(result.confirmedEvents, [e1_0]);
167
164
  });
168
- it('should acknowledge pending event and add new event', () => {
169
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
170
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_0_1] } });
165
+ it('should confirm pending event and add new event', () => {
166
+ const syncState = new SyncState.SyncState({
167
+ pending: [e1_0],
168
+ upstreamHead: EventSequenceNumber.ROOT,
169
+ localHead: e1_0.seqNum,
170
+ });
171
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } });
171
172
  expectAdvance(result);
172
173
  expectEventArraysEqual(result.newSyncState.pending, []);
173
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1]);
174
- expect(result.newSyncState.upstreamHead).toBe(e_0_1.id);
175
- expect(result.newSyncState.localHead).toMatchObject(e_0_1.id);
176
- expect(result.newEvents).toEqual([e_0_1]);
174
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
175
+ expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
176
+ expect(result.newEvents).toStrictEqual([e1_1]);
177
+ expectEventArraysEqual(result.confirmedEvents, [e1_0]);
177
178
  });
178
- it('should acknowledge pending event and add multiple new events', () => {
179
- const syncState = { pending: [e_0_1], rollbackTail: [], upstreamHead: e_0_0.id, localHead: e_0_1.id };
180
- const result = run({
179
+ it('should confirm pending event and add multiple new events', () => {
180
+ const syncState = new SyncState.SyncState({
181
+ pending: [e1_1],
182
+ upstreamHead: e1_0.seqNum,
183
+ localHead: e1_1.seqNum,
184
+ });
185
+ const result = merge({
181
186
  syncState,
182
- payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0, e_1_1] },
187
+ payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
183
188
  });
184
189
  expectAdvance(result);
185
190
  expectEventArraysEqual(result.newSyncState.pending, []);
186
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0, e_1_1]);
187
- expect(result.newSyncState.upstreamHead).toBe(e_1_1.id);
188
- expect(result.newSyncState.localHead).toMatchObject(e_1_1.id);
189
- expect(result.newEvents).toEqual([e_0_2, e_0_3, e_1_0, e_1_1]);
191
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.seqNum);
192
+ expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum);
193
+ expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1]);
194
+ expectEventArraysEqual(result.confirmedEvents, [e1_1]);
190
195
  });
191
- it('should ignore local events (incoming is subset of pending)', () => {
192
- const syncState = {
193
- pending: [e_r_1, e_0_0],
194
- rollbackTail: [],
195
- upstreamHead: EventId.ROOT,
196
- localHead: e_0_0.id,
197
- };
198
- const result = run({
196
+ it('should confirm pending global event while keep pending client events', () => {
197
+ const syncState = new SyncState.SyncState({
198
+ pending: [e1_0, e1_1],
199
+ upstreamHead: EventSequenceNumber.ROOT,
200
+ localHead: e1_1.seqNum,
201
+ });
202
+ const result = merge({
199
203
  syncState,
200
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
201
- ignoreLocalEvents: true,
204
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
205
+ });
206
+ expectAdvance(result);
207
+ expectEventArraysEqual(result.newSyncState.pending, [e1_1]);
208
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
209
+ expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
210
+ expectEventArraysEqual(result.newEvents, []);
211
+ expectEventArraysEqual(result.confirmedEvents, [e1_0]);
212
+ });
213
+ it('should ignore client events (incoming is subset of pending)', () => {
214
+ const syncState = new SyncState.SyncState({
215
+ pending: [e0_1, e1_0],
216
+ upstreamHead: EventSequenceNumber.ROOT,
217
+ localHead: e1_0.seqNum,
218
+ });
219
+ const result = merge({
220
+ syncState,
221
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
222
+ ignoreClientEvents: true,
202
223
  });
203
224
  expectAdvance(result);
204
225
  expectEventArraysEqual(result.newSyncState.pending, []);
205
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0]);
206
- expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
207
- expect(result.newSyncState.localHead).toMatchObject(e_0_0.id);
208
- expect(result.newEvents).toEqual([]);
226
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
227
+ expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
228
+ expectEventArraysEqual(result.newEvents, []);
229
+ expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
209
230
  });
210
- it('should ignore local events (incoming is subset of pending case 2)', () => {
211
- const syncState = {
212
- pending: [e_r_1, e_0_0, e_1_0],
213
- rollbackTail: [],
214
- upstreamHead: EventId.ROOT,
215
- localHead: e_0_0.id,
216
- };
217
- const result = run({
231
+ it('should ignore client events (incoming is subset of pending case 2)', () => {
232
+ const syncState = new SyncState.SyncState({
233
+ pending: [e0_1, e1_0, e2_0],
234
+ upstreamHead: EventSequenceNumber.ROOT,
235
+ localHead: e1_0.seqNum,
236
+ });
237
+ const result = merge({
218
238
  syncState,
219
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
220
- ignoreLocalEvents: true,
239
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
240
+ ignoreClientEvents: true,
221
241
  });
222
242
  expectAdvance(result);
223
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0]);
224
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0]);
225
- expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
226
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
227
- expect(result.newEvents).toEqual([]);
243
+ expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
244
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
245
+ expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
246
+ expectEventArraysEqual(result.newEvents, []);
247
+ expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
228
248
  });
229
- it('should ignore local events (incoming goes beyond pending)', () => {
230
- const syncState = {
231
- pending: [e_r_1, e_0_0, e_0_1],
232
- rollbackTail: [],
233
- upstreamHead: EventId.ROOT,
234
- localHead: e_0_1.id,
235
- };
236
- const result = run({
249
+ it('should ignore client events (incoming goes beyond pending)', () => {
250
+ const syncState = new SyncState.SyncState({
251
+ pending: [e0_1, e1_0, e1_1],
252
+ upstreamHead: EventSequenceNumber.ROOT,
253
+ localHead: e1_1.seqNum,
254
+ });
255
+ const result = merge({
237
256
  syncState,
238
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_1_0] },
239
- ignoreLocalEvents: true,
257
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
258
+ ignoreClientEvents: true,
240
259
  });
241
260
  expectAdvance(result);
242
261
  expectEventArraysEqual(result.newSyncState.pending, []);
243
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0, e_0_1, e_1_0]);
244
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
245
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
246
- expect(result.newEvents).toEqual([e_1_0]);
262
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
263
+ expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
264
+ expect(result.newEvents).toStrictEqual([e2_0]);
265
+ expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1]);
266
+ });
267
+ it('should fail if incoming event is ≤ local head', () => {
268
+ const syncState = new SyncState.SyncState({
269
+ pending: [],
270
+ upstreamHead: e2_0.seqNum,
271
+ localHead: e2_0.seqNum,
272
+ });
273
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
274
+ expect(result).toMatchObject({ _tag: 'unexpected-error' });
247
275
  });
248
276
  });
249
277
  describe('upstream-advance: rebase', () => {
250
- it('should rebase single local event to end', () => {
251
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
252
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1] } });
253
- const e_0_0_e_0_2 = e_0_0.rebase_(e_0_1.id);
254
- expectRebase(result);
255
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_0_2]);
256
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1]);
257
- expect(result.newSyncState.upstreamHead).toBe(e_0_1.id);
258
- expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_0_2.id);
259
- expectEventArraysEqual(result.eventsToRollback, [e_0_0]);
260
- expectEventArraysEqual(result.newEvents, [e_0_1, e_0_0_e_0_2]);
261
- });
262
- it('should rebase different event with same id (no rollback tail)', () => {
263
- const e_0_0_b = new TestEvent({ global: 0, local: 0 }, EventId.ROOT, '0_0_b', true);
264
- const syncState = { pending: [e_0_0_b], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0_b.id };
265
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
266
- const e_0_0_e_1_0 = e_0_0_b.rebase_(e_0_0.id);
278
+ it('should rebase single client event to end', () => {
279
+ const syncState = new SyncState.SyncState({
280
+ pending: [e1_0],
281
+ upstreamHead: EventSequenceNumber.ROOT,
282
+ localHead: e1_0.seqNum,
283
+ });
284
+ const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) });
285
+ const e1_0_e1_2 = e1_0.rebase_(e1_1.seqNum);
267
286
  expectRebase(result);
268
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_1_0]);
269
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
270
- expectEventArraysEqual(result.newEvents, [e_0_0, e_0_0_e_1_0]);
271
- expectEventArraysEqual(result.eventsToRollback, [e_0_0_b]);
272
- expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
273
- expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_1_0.id);
287
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2]);
288
+ expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
289
+ expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.seqNum);
290
+ expectEventArraysEqual(result.rollbackEvents, [e1_0]);
291
+ expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2]);
274
292
  });
275
293
  it('should rebase different event with same id', () => {
276
- const e_1_0_b = new TestEvent({ global: 1, local: 0 }, e_0_0.id, '1_0_b', false);
277
- const syncState = {
278
- pending: [e_1_0_b],
279
- rollbackTail: [e_0_0, e_0_1],
280
- upstreamHead: EventId.ROOT,
281
- localHead: e_1_0_b.id,
282
- };
283
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0] } });
284
- const e_1_0_e_2_0 = e_1_0_b.rebase_(e_1_0.id);
294
+ const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false);
295
+ const syncState = new SyncState.SyncState({
296
+ pending: [e2_0_b],
297
+ upstreamHead: EventSequenceNumber.ROOT,
298
+ localHead: e2_0_b.seqNum,
299
+ });
300
+ const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) });
301
+ const e2_0_e3_0 = e2_0_b.rebase_(e2_0.seqNum);
285
302
  expectRebase(result);
286
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0]);
287
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1, e_1_0]);
288
- expectEventArraysEqual(result.newEvents, [e_1_0, e_1_0_e_2_0]);
289
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0_b]);
290
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
291
- expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
303
+ expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
304
+ expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0]);
305
+ expectEventArraysEqual(result.rollbackEvents, [e2_0_b]);
306
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
307
+ expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
292
308
  });
293
- it('should rebase single local event to end (more incoming events)', () => {
294
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
295
- const result = run({
309
+ it('should rebase single client event to end (more incoming events)', () => {
310
+ const syncState = new SyncState.SyncState({
311
+ pending: [e1_0],
312
+ upstreamHead: EventSequenceNumber.ROOT,
313
+ localHead: e1_0.seqNum,
314
+ });
315
+ const result = merge({
296
316
  syncState,
297
- payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0] },
317
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
298
318
  });
299
- const e_0_0_e_2_0 = e_0_0.rebase_(e_1_0.id);
319
+ const e1_0_e3_0 = e1_0.rebase_(e2_0.seqNum);
300
320
  expectRebase(result);
301
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_2_0]);
302
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0]);
303
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
304
- expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_2_0.id);
321
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0]);
322
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
323
+ expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.seqNum);
305
324
  });
306
325
  it('should only rebase divergent events when first event matches', () => {
307
- const syncState = {
308
- pending: [e_0_0, e_0_1],
309
- rollbackTail: [],
310
- upstreamHead: EventId.ROOT,
311
- localHead: e_0_0.id,
312
- };
313
- const result = run({
326
+ const syncState = new SyncState.SyncState({
327
+ pending: [e1_0, e1_1],
328
+ upstreamHead: EventSequenceNumber.ROOT,
329
+ localHead: e1_0.seqNum,
330
+ });
331
+ const result = merge({
314
332
  syncState,
315
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_0_2, e_0_3, e_1_0] },
333
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
316
334
  });
317
- const e_0_1_e_1_1 = e_0_1.rebase_(e_1_0.id);
335
+ const e1_1_e2_1 = e1_1.rebase_(e2_0.seqNum);
318
336
  expectRebase(result);
319
- expectEventArraysEqual(result.newSyncState.pending, [e_0_1_e_1_1]);
320
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_2, e_0_3, e_1_0]);
321
- expectEventArraysEqual(result.eventsToRollback, [e_0_1]);
322
- expectEventArraysEqual(result.newEvents, [e_0_2, e_0_3, e_1_0, e_0_1_e_1_1]);
323
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
324
- expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_1.id);
337
+ expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1]);
338
+ expectEventArraysEqual(result.rollbackEvents, [e1_1]);
339
+ expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1]);
340
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
341
+ expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.seqNum);
325
342
  });
326
- it('should rebase all local events when incoming chain starts differently', () => {
327
- const syncState = {
328
- pending: [e_0_0, e_0_1],
329
- rollbackTail: [],
330
- upstreamHead: EventId.ROOT,
331
- localHead: e_0_1.id,
332
- };
333
- const result = run({
343
+ it('should rebase all client events when incoming chain starts differently', () => {
344
+ const syncState = new SyncState.SyncState({
345
+ pending: [e1_0, e1_1],
346
+ upstreamHead: EventSequenceNumber.ROOT,
347
+ localHead: e1_1.seqNum,
348
+ });
349
+ const result = merge({
334
350
  syncState,
335
- payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0] },
351
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
336
352
  });
337
- const e_0_0_e_1_1 = e_0_0.rebase_(e_1_0.id);
338
- const e_0_1_e_1_2 = e_0_1.rebase_(e_0_0_e_1_1.id);
353
+ const e1_0_e2_1 = e1_0.rebase_(e2_0.seqNum);
354
+ const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.seqNum);
339
355
  expectRebase(result);
340
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_1_1, e_0_1_e_1_2]);
341
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0]);
342
- expectEventArraysEqual(result.newEvents, [e_0_1, e_0_2, e_0_3, e_1_0, e_0_0_e_1_1, e_0_1_e_1_2]);
343
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1]);
344
- expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
345
- expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_2.id);
356
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2]);
357
+ expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2]);
358
+ expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1]);
359
+ expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
360
+ expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.seqNum);
346
361
  });
347
362
  describe('local-push', () => {
348
363
  describe('advance', () => {
349
364
  it('should advance with new events', () => {
350
- const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
351
- const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2, e_0_3] } });
365
+ const syncState = new SyncState.SyncState({
366
+ pending: [e1_0],
367
+ upstreamHead: EventSequenceNumber.ROOT,
368
+ localHead: e1_0.seqNum,
369
+ });
370
+ const result = merge({
371
+ syncState,
372
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
373
+ });
352
374
  expectAdvance(result);
353
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0, e_0_1, e_0_2, e_0_3]);
354
- expectEventArraysEqual(result.newSyncState.rollbackTail, []);
355
- expect(result.newSyncState.upstreamHead).toBe(EventId.ROOT);
356
- expect(result.newSyncState.localHead).toMatchObject(e_0_3.id);
357
- expectEventArraysEqual(result.newEvents, [e_0_1, e_0_2, e_0_3]);
375
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3]);
376
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.ROOT);
377
+ expect(result.newSyncState.localHead).toMatchObject(e1_3.seqNum);
378
+ expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3]);
379
+ expectEventArraysEqual(result.confirmedEvents, []);
358
380
  });
359
381
  });
360
382
  describe('reject', () => {
361
383
  it('should reject when new events are greater than pending events', () => {
362
- const syncState = {
363
- pending: [e_0_0, e_0_1],
364
- rollbackTail: [],
365
- upstreamHead: EventId.ROOT,
366
- localHead: e_0_1.id,
367
- };
368
- const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2] } });
384
+ const syncState = new SyncState.SyncState({
385
+ pending: [e1_0, e1_1],
386
+ upstreamHead: EventSequenceNumber.ROOT,
387
+ localHead: e1_1.seqNum,
388
+ });
389
+ const result = merge({
390
+ syncState,
391
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
392
+ });
369
393
  expectReject(result);
370
- expect(result.expectedMinimumId).toMatchObject(e_0_2.id);
394
+ expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum);
371
395
  });
372
396
  });
373
397
  });
@@ -377,17 +401,17 @@ describe('syncstate', () => {
377
401
  const expectEventArraysEqual = (actual, expected) => {
378
402
  expect(actual.length).toBe(expected.length);
379
403
  actual.forEach((event, i) => {
380
- expect(event.id).toEqual(expected[i].id);
381
- expect(event.parentId).toEqual(expected[i].parentId);
382
- expect(event.mutation).toEqual(expected[i].mutation);
383
- expect(event.args).toEqual(expected[i].args);
404
+ expect(event.seqNum).toStrictEqual(expected[i].seqNum);
405
+ expect(event.parentSeqNum).toStrictEqual(expected[i].parentSeqNum);
406
+ expect(event.name).toStrictEqual(expected[i].name);
407
+ expect(event.args).toStrictEqual(expected[i].args);
384
408
  });
385
409
  };
386
410
  function expectAdvance(result) {
387
411
  expect(result._tag).toBe('advance');
388
412
  }
389
413
  function expectRebase(result) {
390
- expect(result._tag).toBe('rebase');
414
+ expect(result._tag, `Expected rebase, got ${result}`).toBe('rebase');
391
415
  }
392
416
  function expectReject(result) {
393
417
  expect(result._tag).toBe('reject');