@livestore/common 0.3.0-dev.2 → 0.3.0-dev.21

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