@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,496 +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)
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)
40
41
 
41
- const isEqualEvent = MutationEvent.isEqualEncoded
42
+ const isEqualEvent = LiveStoreEvent.isEqualEncoded
42
43
 
43
- const isLocalEvent = (event: MutationEvent.EncodedWithMeta) => (event as TestEvent).isLocal
44
+ const isClientEvent = (event: LiveStoreEvent.EncodedWithMeta) => (event as TestEvent).isLocal
44
45
 
45
46
  describe('syncstate', () => {
46
- describe('updateSyncState', () => {
47
- const run = ({
47
+ describe('merge', () => {
48
+ const merge = ({
48
49
  syncState,
49
50
  payload,
50
- ignoreLocalEvents = false,
51
+ ignoreClientEvents = false,
51
52
  }: {
52
53
  syncState: SyncState.SyncState
53
54
  payload: typeof SyncState.Payload.Type
54
- ignoreLocalEvents?: boolean
55
- }) => SyncState.updateSyncState({ syncState, payload, isLocalEvent, isEqualEvent, ignoreLocalEvents })
56
-
57
- describe.each([{ trimRollbackUntil: false }, { trimRollbackUntil: true }])(
58
- 'upstream-rebase (trimRollbackUntil: $trimRollbackUntil)',
59
- ({ trimRollbackUntil }) => {
60
- it('should rollback until start', () => {
61
- const syncState = new SyncState.SyncState({
62
- pending: [e_1_0],
63
- rollbackTail: [e_0_0, e_0_1],
64
- upstreamHead: EventId.ROOT,
65
- localHead: e_1_0.id,
66
- })
67
- const e_0_0_e_1_0 = e_0_0.rebase_(e_1_0.id)
68
- const e_0_1_e_1_1 = e_0_1.rebase_(e_0_0_e_1_0.id)
69
- const result = run({
70
- syncState,
71
- payload: {
72
- _tag: 'upstream-rebase',
73
- rollbackUntil: e_0_0.id,
74
- newEvents: [e_0_0_e_1_0, e_0_1_e_1_1],
75
- trimRollbackUntil: trimRollbackUntil ? e_0_1_e_1_1.id : undefined,
76
- },
77
- })
78
- const e_1_0_e_2_0 = e_1_0.rebase_(e_0_0_e_1_0.id)
79
- expectRebase(result)
80
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0])
81
- if (trimRollbackUntil) {
82
- expectEventArraysEqual(result.newSyncState.rollbackTail, [])
83
- } else {
84
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0_e_1_0, e_0_1_e_1_1])
85
- }
86
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_1_e_1_1.id)
87
- expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id)
88
- expectEventArraysEqual(result.newEvents, [e_0_0_e_1_0, e_0_1_e_1_1])
89
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0])
90
- })
91
-
92
- it('should rollback only to specified point', () => {
93
- const syncState = new SyncState.SyncState({
94
- pending: [e_1_0],
95
- rollbackTail: [e_0_0, e_0_1],
96
- upstreamHead: EventId.ROOT,
97
- localHead: e_1_0.id,
98
- })
99
- const e_0_1_e_1_0 = e_0_1.rebase_(e_0_0.id)
100
- const result = run({
101
- syncState,
102
- payload: {
103
- _tag: 'upstream-rebase',
104
- rollbackUntil: e_0_1.id,
105
- newEvents: [e_0_1_e_1_0],
106
- trimRollbackUntil: trimRollbackUntil ? e_0_0.id : undefined,
107
- },
108
- })
109
- const e_1_0_e_2_0 = e_1_0.rebase_(e_0_1_e_1_0.id)
110
- expectRebase(result)
111
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0])
112
- if (trimRollbackUntil) {
113
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1_e_1_0])
114
- } else {
115
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1_e_1_0])
116
- }
117
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_1_e_1_0.id)
118
- expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id)
119
- expectEventArraysEqual(result.newEvents, [e_0_1_e_1_0])
120
- expectEventArraysEqual(result.eventsToRollback, [e_0_1, e_1_0])
121
- })
122
-
123
- it('should work for empty pending', () => {
124
- const syncState = new SyncState.SyncState({
125
- pending: [],
126
- rollbackTail: [e_0_0],
127
- upstreamHead: EventId.ROOT,
128
- localHead: e_0_0.id,
129
- })
130
- const result = run({
131
- syncState,
132
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
133
- })
134
- expectRebase(result)
135
- expectEventArraysEqual(result.newSyncState.pending, [])
136
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_1_0])
137
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
138
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id)
139
- expect(result.newEvents).toStrictEqual([e_1_0])
140
- })
141
-
142
- it('should fail for empty rollback tail', () => {
143
- const syncState = new SyncState.SyncState({
144
- pending: [],
145
- rollbackTail: [],
146
- upstreamHead: EventId.ROOT,
147
- localHead: e_0_0.id,
148
- })
149
- expect(() =>
150
- run({
151
- syncState,
152
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
153
- }),
154
- ).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,
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
+ }),
155
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
+ })
156
82
 
157
- it('should work for empty incoming', () => {
158
- const syncState = new SyncState.SyncState({
159
- pending: [],
160
- rollbackTail: [e_0_0],
161
- upstreamHead: EventId.ROOT,
162
- localHead: e_0_0.id,
163
- })
164
- const result = run({
165
- syncState,
166
- payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [] },
167
- })
168
- expectRebase(result)
169
- expectEventArraysEqual(result.newSyncState.pending, [])
170
- expectEventArraysEqual(result.newSyncState.rollbackTail, [])
171
- expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT)
172
- expect(result.newSyncState.localHead).toMatchObject(EventId.ROOT)
173
- 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
+ }),
174
96
  })
175
- },
176
- )
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
+ })
177
123
 
178
124
  describe('upstream-advance: advance', () => {
179
- it('should throw error if newEvents are not sorted in ascending order by eventId (local)', () => {
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' })
133
+ })
134
+
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', () => {
180
146
  const syncState = new SyncState.SyncState({
181
- pending: [e_0_0],
182
- rollbackTail: [],
183
- upstreamHead: EventId.ROOT,
184
- localHead: e_0_0.id,
147
+ pending: [],
148
+ upstreamHead: e2_0.seqNum,
149
+ localHead: e2_0.seqNum,
185
150
  })
186
- expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_0] } })).toThrow()
151
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
152
+ expect(result).toMatchObject({ _tag: 'unexpected-error' })
187
153
  })
188
154
 
189
- it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
155
+ it('should throw error if incoming event is = expected upstream head', () => {
190
156
  const syncState = new SyncState.SyncState({
191
- pending: [e_0_0],
192
- rollbackTail: [],
193
- upstreamHead: EventId.ROOT,
194
- localHead: e_0_0.id,
157
+ pending: [],
158
+ upstreamHead: e2_0.seqNum,
159
+ localHead: e2_0.seqNum,
195
160
  })
196
- expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0, e_0_0] } })).toThrow()
161
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } })
162
+ expect(result).toMatchObject({ _tag: 'unexpected-error' })
197
163
  })
198
164
 
199
- it('should acknowledge pending event when receiving matching event', () => {
165
+ it('should confirm pending event when receiving matching event', () => {
200
166
  const syncState = new SyncState.SyncState({
201
- pending: [e_0_0],
202
- rollbackTail: [],
203
- upstreamHead: EventId.ROOT,
204
- localHead: e_0_0.id,
167
+ pending: [e1_0],
168
+ upstreamHead: EventSequenceNumber.ROOT,
169
+ localHead: e1_0.seqNum,
205
170
  })
206
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } })
171
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
207
172
 
208
173
  expectAdvance(result)
209
174
  expectEventArraysEqual(result.newSyncState.pending, [])
210
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0])
211
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_0.id)
212
- expect(result.newSyncState.localHead).toMatchObject(e_0_0.id)
213
- 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])
214
179
  })
215
180
 
216
- it('should acknowledge partial pending event when receiving matching event', () => {
181
+ it('should confirm partial pending event when receiving matching event', () => {
217
182
  const syncState = new SyncState.SyncState({
218
- pending: [e_0_0, e_1_0],
219
- rollbackTail: [],
220
- upstreamHead: EventId.ROOT,
221
- localHead: e_1_0.id,
183
+ pending: [e1_0, e2_0],
184
+ upstreamHead: EventSequenceNumber.ROOT,
185
+ localHead: e2_0.seqNum,
222
186
  })
223
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } })
187
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
224
188
 
225
189
  expectAdvance(result)
226
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0])
227
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0])
228
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_0.id)
229
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id)
230
- 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])
231
195
  })
232
196
 
233
- it('should acknowledge pending event and add new event', () => {
197
+ it('should confirm pending event and add new event', () => {
234
198
  const syncState = new SyncState.SyncState({
235
- pending: [e_0_0],
236
- rollbackTail: [],
237
- upstreamHead: EventId.ROOT,
238
- localHead: e_0_0.id,
199
+ pending: [e1_0],
200
+ upstreamHead: EventSequenceNumber.ROOT,
201
+ localHead: e1_0.seqNum,
239
202
  })
240
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_0_1] } })
203
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } })
241
204
 
242
205
  expectAdvance(result)
243
206
  expectEventArraysEqual(result.newSyncState.pending, [])
244
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1])
245
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_1.id)
246
- expect(result.newSyncState.localHead).toMatchObject(e_0_1.id)
247
- 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])
248
211
  })
249
212
 
250
- it('should acknowledge pending event and add multiple new events', () => {
213
+ it('should confirm pending event and add multiple new events', () => {
251
214
  const syncState = new SyncState.SyncState({
252
- pending: [e_0_1],
253
- rollbackTail: [],
254
- upstreamHead: e_0_0.id,
255
- localHead: e_0_1.id,
215
+ pending: [e1_1],
216
+ upstreamHead: e1_0.seqNum,
217
+ localHead: e1_1.seqNum,
256
218
  })
257
- const result = run({
219
+ const result = merge({
258
220
  syncState,
259
- 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] },
260
222
  })
261
223
 
262
224
  expectAdvance(result)
263
225
  expectEventArraysEqual(result.newSyncState.pending, [])
264
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0, e_1_1])
265
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_1.id)
266
- expect(result.newSyncState.localHead).toMatchObject(e_1_1.id)
267
- 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])
230
+ })
231
+
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
+ syncState,
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])
268
249
  })
269
250
 
270
- it('should ignore local events (incoming is subset of pending)', () => {
251
+ it('should ignore client events (incoming is subset of pending)', () => {
271
252
  const syncState = new SyncState.SyncState({
272
- pending: [e_r_1, e_0_0],
273
- rollbackTail: [],
274
- upstreamHead: EventId.ROOT,
275
- localHead: e_0_0.id,
253
+ pending: [e0_1, e1_0],
254
+ upstreamHead: EventSequenceNumber.ROOT,
255
+ localHead: e1_0.seqNum,
276
256
  })
277
- const result = run({
257
+ const result = merge({
278
258
  syncState,
279
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
280
- ignoreLocalEvents: true,
259
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
260
+ ignoreClientEvents: true,
281
261
  })
282
262
  expectAdvance(result)
283
263
  expectEventArraysEqual(result.newSyncState.pending, [])
284
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0])
285
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_0.id)
286
- expect(result.newSyncState.localHead).toMatchObject(e_0_0.id)
287
- 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])
288
268
  })
289
269
 
290
- it('should ignore local events (incoming is subset of pending case 2)', () => {
270
+ it('should ignore client events (incoming is subset of pending case 2)', () => {
291
271
  const syncState = new SyncState.SyncState({
292
- pending: [e_r_1, e_0_0, e_1_0],
293
- rollbackTail: [],
294
- upstreamHead: EventId.ROOT,
295
- localHead: e_0_0.id,
272
+ pending: [e0_1, e1_0, e2_0],
273
+ upstreamHead: EventSequenceNumber.ROOT,
274
+ localHead: e1_0.seqNum,
296
275
  })
297
- const result = run({
276
+ const result = merge({
298
277
  syncState,
299
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
300
- ignoreLocalEvents: true,
278
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
279
+ ignoreClientEvents: true,
301
280
  })
302
281
  expectAdvance(result)
303
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0])
304
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0])
305
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_0.id)
306
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id)
307
- 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])
308
287
  })
309
288
 
310
- it('should ignore local events (incoming goes beyond pending)', () => {
289
+ it('should ignore client events (incoming goes beyond pending)', () => {
311
290
  const syncState = new SyncState.SyncState({
312
- pending: [e_r_1, e_0_0, e_0_1],
313
- rollbackTail: [],
314
- upstreamHead: EventId.ROOT,
315
- localHead: e_0_1.id,
291
+ pending: [e0_1, e1_0, e1_1],
292
+ upstreamHead: EventSequenceNumber.ROOT,
293
+ localHead: e1_1.seqNum,
316
294
  })
317
- const result = run({
295
+ const result = merge({
318
296
  syncState,
319
- payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_1_0] },
320
- ignoreLocalEvents: true,
297
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
298
+ ignoreClientEvents: true,
321
299
  })
322
300
 
323
301
  expectAdvance(result)
324
302
  expectEventArraysEqual(result.newSyncState.pending, [])
325
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0, e_0_1, e_1_0])
326
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
327
- expect(result.newSyncState.localHead).toMatchObject(e_1_0.id)
328
- 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])
329
307
  })
330
- })
331
308
 
332
- describe('upstream-advance: rebase', () => {
333
- it('should rebase single local event to end', () => {
309
+ it('should fail if incoming event is ≤ local head', () => {
334
310
  const syncState = new SyncState.SyncState({
335
- pending: [e_0_0],
336
- rollbackTail: [],
337
- upstreamHead: EventId.ROOT,
338
- localHead: e_0_0.id,
311
+ pending: [],
312
+ upstreamHead: e2_0.seqNum,
313
+ localHead: e2_0.seqNum,
339
314
  })
340
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1] } })
341
-
342
- const e_0_0_e_0_2 = e_0_0.rebase_(e_0_1.id)
343
-
344
- expectRebase(result)
345
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_0_2])
346
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1])
347
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_1.id)
348
- expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_0_2.id)
349
- expectEventArraysEqual(result.eventsToRollback, [e_0_0])
350
- expectEventArraysEqual(result.newEvents, [e_0_1, e_0_0_e_0_2])
315
+ const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
316
+ expect(result).toMatchObject({ _tag: 'unexpected-error' })
351
317
  })
318
+ })
352
319
 
353
- it('should rebase different event with same id (no rollback tail)', () => {
354
- const e_0_0_b = new TestEvent({ global: 0, local: 0 }, EventId.ROOT, '0_0_b', true)
320
+ describe('upstream-advance: rebase', () => {
321
+ it('should rebase single client event to end', () => {
355
322
  const syncState = new SyncState.SyncState({
356
- pending: [e_0_0_b],
357
- rollbackTail: [],
358
- upstreamHead: EventId.ROOT,
359
- localHead: e_0_0_b.id,
323
+ pending: [e1_0],
324
+ upstreamHead: EventSequenceNumber.ROOT,
325
+ localHead: e1_0.seqNum,
360
326
  })
361
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } })
327
+ const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) })
362
328
 
363
- 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)
364
330
 
365
331
  expectRebase(result)
366
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_1_0])
367
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0])
368
- expectEventArraysEqual(result.newEvents, [e_0_0, e_0_0_e_1_0])
369
- expectEventArraysEqual(result.eventsToRollback, [e_0_0_b])
370
- expect(result.newSyncState.upstreamHead).toMatchObject(e_0_0.id)
371
- 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])
372
337
  })
373
338
 
374
339
  it('should rebase different event with same id', () => {
375
- const e_1_0_b = new TestEvent({ global: 1, local: 0 }, e_0_0.id, '1_0_b', false)
340
+ const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false)
376
341
  const syncState = new SyncState.SyncState({
377
- pending: [e_1_0_b],
378
- rollbackTail: [e_0_0, e_0_1],
379
- upstreamHead: EventId.ROOT,
380
- localHead: e_1_0_b.id,
342
+ pending: [e2_0_b],
343
+ upstreamHead: EventSequenceNumber.ROOT,
344
+ localHead: e2_0_b.seqNum,
381
345
  })
382
- const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0] } })
383
- const e_1_0_e_2_0 = e_1_0_b.rebase_(e_1_0.id)
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)
384
348
 
385
349
  expectRebase(result)
386
- expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0])
387
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1, e_1_0])
388
- expectEventArraysEqual(result.newEvents, [e_1_0, e_1_0_e_2_0])
389
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0_b])
390
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
391
- 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)
392
355
  })
393
356
 
394
- it('should rebase single local event to end (more incoming events)', () => {
357
+ it('should rebase single client event to end (more incoming events)', () => {
395
358
  const syncState = new SyncState.SyncState({
396
- pending: [e_0_0],
397
- rollbackTail: [],
398
- upstreamHead: EventId.ROOT,
399
- localHead: e_0_0.id,
359
+ pending: [e1_0],
360
+ upstreamHead: EventSequenceNumber.ROOT,
361
+ localHead: e1_0.seqNum,
400
362
  })
401
- const result = run({
363
+ const result = merge({
402
364
  syncState,
403
- 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] }),
404
366
  })
405
367
 
406
- 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)
407
369
 
408
370
  expectRebase(result)
409
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_2_0])
410
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0])
411
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
412
- 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)
413
374
  })
414
375
 
415
376
  it('should only rebase divergent events when first event matches', () => {
416
377
  const syncState = new SyncState.SyncState({
417
- pending: [e_0_0, e_0_1],
418
- rollbackTail: [],
419
- upstreamHead: EventId.ROOT,
420
- localHead: e_0_0.id,
378
+ pending: [e1_0, e1_1],
379
+ upstreamHead: EventSequenceNumber.ROOT,
380
+ localHead: e1_0.seqNum,
421
381
  })
422
- const result = run({
382
+ const result = merge({
423
383
  syncState,
424
- 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] }),
425
385
  })
426
386
 
427
- 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)
428
388
 
429
389
  expectRebase(result)
430
- expectEventArraysEqual(result.newSyncState.pending, [e_0_1_e_1_1])
431
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_2, e_0_3, e_1_0])
432
- expectEventArraysEqual(result.eventsToRollback, [e_0_1])
433
- expectEventArraysEqual(result.newEvents, [e_0_2, e_0_3, e_1_0, e_0_1_e_1_1])
434
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
435
- 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)
436
395
  })
437
396
 
438
- it('should rebase all local events when incoming chain starts differently', () => {
397
+ it('should rebase all client events when incoming chain starts differently', () => {
439
398
  const syncState = new SyncState.SyncState({
440
- pending: [e_0_0, e_0_1],
441
- rollbackTail: [],
442
- upstreamHead: EventId.ROOT,
443
- localHead: e_0_1.id,
399
+ pending: [e1_0, e1_1],
400
+ upstreamHead: EventSequenceNumber.ROOT,
401
+ localHead: e1_1.seqNum,
444
402
  })
445
- const result = run({
403
+ const result = merge({
446
404
  syncState,
447
- 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] }),
448
406
  })
449
407
 
450
- const e_0_0_e_1_1 = e_0_0.rebase_(e_1_0.id)
451
- 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)
452
410
 
453
411
  expectRebase(result)
454
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_1_1, e_0_1_e_1_2])
455
- expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0])
456
- 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])
457
- expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1])
458
- expect(result.newSyncState.upstreamHead).toMatchObject(e_1_0.id)
459
- 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)
460
417
  })
461
418
 
462
419
  describe('local-push', () => {
463
420
  describe('advance', () => {
464
421
  it('should advance with new events', () => {
465
422
  const syncState = new SyncState.SyncState({
466
- pending: [e_0_0],
467
- rollbackTail: [],
468
- upstreamHead: EventId.ROOT,
469
- localHead: e_0_0.id,
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] }),
470
430
  })
471
- const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2, e_0_3] } })
472
431
 
473
432
  expectAdvance(result)
474
- expectEventArraysEqual(result.newSyncState.pending, [e_0_0, e_0_1, e_0_2, e_0_3])
475
- expectEventArraysEqual(result.newSyncState.rollbackTail, [])
476
- expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT)
477
- expect(result.newSyncState.localHead).toMatchObject(e_0_3.id)
478
- 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, [])
479
438
  })
480
439
  })
481
440
 
482
441
  describe('reject', () => {
483
442
  it('should reject when new events are greater than pending events', () => {
484
443
  const syncState = new SyncState.SyncState({
485
- pending: [e_0_0, e_0_1],
486
- rollbackTail: [],
487
- upstreamHead: EventId.ROOT,
488
- localHead: e_0_1.id,
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] }),
489
451
  })
490
- const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2] } })
491
452
 
492
453
  expectReject(result)
493
- expect(result.expectedMinimumId).toMatchObject(e_0_2.id)
454
+ expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum)
494
455
  })
495
456
  })
496
457
  })
@@ -499,26 +460,32 @@ describe('syncstate', () => {
499
460
  })
500
461
 
501
462
  const expectEventArraysEqual = (
502
- actual: ReadonlyArray<MutationEvent.EncodedWithMeta>,
503
- expected: ReadonlyArray<MutationEvent.EncodedWithMeta>,
463
+ actual: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
464
+ expected: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
504
465
  ) => {
505
466
  expect(actual.length).toBe(expected.length)
506
467
  actual.forEach((event, i) => {
507
- expect(event.id).toStrictEqual(expected[i]!.id)
508
- expect(event.parentId).toStrictEqual(expected[i]!.parentId)
509
- 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)
510
471
  expect(event.args).toStrictEqual(expected[i]!.args)
511
472
  })
512
473
  }
513
474
 
514
- 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 {
515
478
  expect(result._tag).toBe('advance')
516
479
  }
517
480
 
518
- function expectRebase(result: SyncState.UpdateResult): asserts result is SyncState.UpdateResultRebase {
519
- 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')
520
485
  }
521
486
 
522
- 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 {
523
490
  expect(result._tag).toBe('reject')
524
491
  }