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