@livestore/common 0.3.0-dev.8 → 0.3.0

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