@automerge/automerge-repo 2.0.0-alpha.2 → 2.0.0-alpha.22

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 (76) hide show
  1. package/README.md +5 -6
  2. package/dist/AutomergeUrl.d.ts +17 -5
  3. package/dist/AutomergeUrl.d.ts.map +1 -1
  4. package/dist/AutomergeUrl.js +71 -24
  5. package/dist/DocHandle.d.ts +89 -20
  6. package/dist/DocHandle.d.ts.map +1 -1
  7. package/dist/DocHandle.js +189 -28
  8. package/dist/FindProgress.d.ts +30 -0
  9. package/dist/FindProgress.d.ts.map +1 -0
  10. package/dist/FindProgress.js +1 -0
  11. package/dist/RemoteHeadsSubscriptions.d.ts +4 -5
  12. package/dist/RemoteHeadsSubscriptions.d.ts.map +1 -1
  13. package/dist/RemoteHeadsSubscriptions.js +4 -1
  14. package/dist/Repo.d.ts +44 -6
  15. package/dist/Repo.d.ts.map +1 -1
  16. package/dist/Repo.js +226 -87
  17. package/dist/entrypoints/fullfat.d.ts +1 -0
  18. package/dist/entrypoints/fullfat.d.ts.map +1 -1
  19. package/dist/entrypoints/fullfat.js +1 -2
  20. package/dist/helpers/abortable.d.ts +39 -0
  21. package/dist/helpers/abortable.d.ts.map +1 -0
  22. package/dist/helpers/abortable.js +45 -0
  23. package/dist/helpers/bufferFromHex.d.ts +3 -0
  24. package/dist/helpers/bufferFromHex.d.ts.map +1 -0
  25. package/dist/helpers/bufferFromHex.js +13 -0
  26. package/dist/helpers/headsAreSame.d.ts +2 -2
  27. package/dist/helpers/headsAreSame.d.ts.map +1 -1
  28. package/dist/helpers/mergeArrays.d.ts +1 -1
  29. package/dist/helpers/mergeArrays.d.ts.map +1 -1
  30. package/dist/helpers/tests/network-adapter-tests.d.ts.map +1 -1
  31. package/dist/helpers/tests/network-adapter-tests.js +13 -13
  32. package/dist/helpers/tests/storage-adapter-tests.d.ts +2 -2
  33. package/dist/helpers/tests/storage-adapter-tests.d.ts.map +1 -1
  34. package/dist/helpers/tests/storage-adapter-tests.js +25 -48
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/storage/StorageSubsystem.d.ts +11 -1
  39. package/dist/storage/StorageSubsystem.d.ts.map +1 -1
  40. package/dist/storage/StorageSubsystem.js +20 -4
  41. package/dist/synchronizer/CollectionSynchronizer.d.ts +17 -3
  42. package/dist/synchronizer/CollectionSynchronizer.d.ts.map +1 -1
  43. package/dist/synchronizer/CollectionSynchronizer.js +43 -18
  44. package/dist/synchronizer/DocSynchronizer.d.ts +10 -2
  45. package/dist/synchronizer/DocSynchronizer.d.ts.map +1 -1
  46. package/dist/synchronizer/DocSynchronizer.js +30 -8
  47. package/dist/synchronizer/Synchronizer.d.ts +11 -0
  48. package/dist/synchronizer/Synchronizer.d.ts.map +1 -1
  49. package/dist/types.d.ts +4 -1
  50. package/dist/types.d.ts.map +1 -1
  51. package/fuzz/fuzz.ts +3 -3
  52. package/package.json +3 -3
  53. package/src/AutomergeUrl.ts +101 -26
  54. package/src/DocHandle.ts +256 -38
  55. package/src/FindProgress.ts +48 -0
  56. package/src/RemoteHeadsSubscriptions.ts +11 -9
  57. package/src/Repo.ts +310 -95
  58. package/src/entrypoints/fullfat.ts +1 -2
  59. package/src/helpers/abortable.ts +61 -0
  60. package/src/helpers/bufferFromHex.ts +14 -0
  61. package/src/helpers/headsAreSame.ts +2 -2
  62. package/src/helpers/tests/network-adapter-tests.ts +14 -13
  63. package/src/helpers/tests/storage-adapter-tests.ts +44 -86
  64. package/src/index.ts +2 -0
  65. package/src/storage/StorageSubsystem.ts +29 -4
  66. package/src/synchronizer/CollectionSynchronizer.ts +56 -19
  67. package/src/synchronizer/DocSynchronizer.ts +34 -9
  68. package/src/synchronizer/Synchronizer.ts +14 -0
  69. package/src/types.ts +4 -1
  70. package/test/AutomergeUrl.test.ts +130 -0
  71. package/test/CollectionSynchronizer.test.ts +4 -4
  72. package/test/DocHandle.test.ts +189 -29
  73. package/test/DocSynchronizer.test.ts +10 -3
  74. package/test/Repo.test.ts +377 -191
  75. package/test/StorageSubsystem.test.ts +17 -0
  76. package/test/remoteHeads.test.ts +27 -12
@@ -211,6 +211,23 @@ describe("StorageSubsystem", () => {
211
211
  )
212
212
  assert.strictEqual(loadedSyncState, undefined)
213
213
  })
214
+
215
+ it("returns a undefined if loading an existing sync state fails", async () => {
216
+ const storage = new StorageSubsystem(adapter)
217
+
218
+ const { documentId } = parseAutomergeUrl(generateAutomergeUrl())
219
+ const bobStorageId = Uuid.v4() as StorageId
220
+
221
+ const syncStateKey = [documentId, "sync-state", bobStorageId]
222
+ // Save garbage data to simulate a corrupted sync state
223
+ await adapter.save(syncStateKey, Buffer.from("invalid data"))
224
+
225
+ const loadedSyncState = await storage.loadSyncState(
226
+ documentId,
227
+ bobStorageId
228
+ )
229
+ assert.strictEqual(loadedSyncState, undefined)
230
+ })
214
231
  })
215
232
 
216
233
  describe("storage id", () => {
@@ -13,6 +13,7 @@ import {
13
13
  import { DummyStorageAdapter } from "../src/helpers/DummyStorageAdapter.js"
14
14
  import { collectMessages } from "./helpers/collectMessages.js"
15
15
  import { TestDoc } from "./types.js"
16
+ import { pause } from "../src/helpers/pause.js"
16
17
 
17
18
  describe("DocHandle.remoteHeads", () => {
18
19
  const TEST_ID = parseAutomergeUrl(generateAutomergeUrl()).documentId
@@ -128,13 +129,15 @@ describe("DocHandle.remoteHeads", () => {
128
129
  const aliceDoc = alice.create<TestDoc>()
129
130
  aliceDoc.change(d => (d.foo = "bar"))
130
131
 
132
+ await pause(50)
133
+
131
134
  // bob waits for the document to arrive
132
- const bobDoc = bob.find<TestDoc>(aliceDoc.url)
133
- await bobDoc.whenReady()
135
+ const bobDoc = await bob.find<TestDoc>(aliceDoc.url)
134
136
 
135
137
  // alice's service worker waits for the document to arrive
136
- const aliceServiceWorkerDoc = aliceServiceWorker.find(aliceDoc.documentId)
137
- await aliceServiceWorkerDoc.whenReady()
138
+ const aliceServiceWorkerDoc = await aliceServiceWorker.find(
139
+ aliceDoc.documentId
140
+ )
138
141
 
139
142
  let aliceSeenByBobPromise = new Promise<DocHandleRemoteHeadsPayload>(
140
143
  resolve => {
@@ -168,17 +171,21 @@ describe("DocHandle.remoteHeads", () => {
168
171
  const bobDocB = bob.create<TestDoc>()
169
172
  bobDocB.change(d => (d.foo = "B"))
170
173
 
174
+ await pause(50)
175
+
171
176
  // alice opens doc A
172
- const aliceDocA = alice.find<TestDoc>(bobDocA.url)
177
+ const aliceDocAPromise = alice.find<TestDoc>(bobDocA.url)
173
178
 
174
179
  const remoteHeadsChangedMessages = (
175
180
  await collectMessages({
176
181
  emitter: alice.networkSubsystem,
177
182
  event: "message",
178
- until: aliceDocA.whenReady(),
183
+ until: aliceDocAPromise,
179
184
  })
180
185
  ).filter(({ type }) => type === "remote-heads-changed")
181
186
 
187
+ const aliceDocA = await aliceDocAPromise
188
+
182
189
  // we should only be notified of the head changes of doc A
183
190
  assert(
184
191
  remoteHeadsChangedMessages.every(
@@ -197,6 +204,8 @@ describe("DocHandle.remoteHeads", () => {
197
204
  const bobDocB = bob.create<TestDoc>()
198
205
  bobDocB.change(d => (d.foo = "B"))
199
206
 
207
+ await pause(50)
208
+
200
209
  // alice opens the docs
201
210
  const _aliceDocA = alice.find<TestDoc>(bobDocA.url)
202
211
  const _aliceDocB = alice.find<TestDoc>(bobDocB.url)
@@ -209,19 +218,21 @@ describe("DocHandle.remoteHeads", () => {
209
218
  // stored remote heads immediately.
210
219
 
211
220
  // open doc and subscribe alice's second tab to bob's service worker
212
- const alice2DocA = alice2.find<TestDoc>(bobDocA.url)
221
+ const alice2DocAPromise = alice2.find<TestDoc>(bobDocA.url)
213
222
  alice2.subscribeToRemotes([bobServiceWorkerStorageId])
214
223
 
215
224
  const remoteHeadsChangedMessages = (
216
225
  await collectMessages({
217
226
  emitter: alice2.networkSubsystem,
218
227
  event: "message",
219
- until: alice2DocA.whenReady(),
228
+ until: alice2DocAPromise,
220
229
  })
221
230
  ).filter(({ type }) => type === "remote-heads-changed")
222
231
 
232
+ const alice2DocA = await alice2DocAPromise
233
+
223
234
  // we should only be notified of the head changes of doc A
224
- assert.strictEqual(remoteHeadsChangedMessages.length, 2)
235
+ assert.strictEqual(remoteHeadsChangedMessages.length, 1)
225
236
  assert(
226
237
  remoteHeadsChangedMessages.every(
227
238
  d => d.documentId === alice2DocA.documentId
@@ -242,18 +253,22 @@ describe("DocHandle.remoteHeads", () => {
242
253
  // alice subscribes to bob's service worker
243
254
  alice.subscribeToRemotes([bobServiceWorkerStorageId])
244
255
 
256
+ await pause(50)
257
+
245
258
  // alice opens doc A
246
- const alice1DocA = alice.find<TestDoc>(bobDocA.url)
259
+ const alice1DocAPromise = alice.find<TestDoc>(bobDocA.url)
247
260
 
248
261
  const remoteHeadsChangedMessages = (
249
262
  await collectMessages({
250
263
  emitter: alice.networkSubsystem,
251
264
  event: "message",
252
- until: alice1DocA.whenReady(),
265
+ until: alice1DocAPromise,
253
266
  })
254
267
  ).filter(({ type }) => type === "remote-heads-changed")
255
268
 
256
- assert.strictEqual(remoteHeadsChangedMessages.length, 2)
269
+ const alice1DocA = await alice1DocAPromise
270
+
271
+ assert.strictEqual(remoteHeadsChangedMessages.length, 1)
257
272
  assert(
258
273
  remoteHeadsChangedMessages.every(
259
274
  d => d.documentId === alice1DocA.documentId