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