@livestore/common 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0 → 0.0.0-snapshot-8115ad48d5a57244358c943ecc92bb0a30274b87

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