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