@livestore/common 0.3.0-dev.4 → 0.3.0-dev.41

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