@automerge/automerge-repo 2.0.1 → 2.0.4
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.
- package/README.md +5 -0
- package/dist/Repo.d.ts.map +1 -1
- package/dist/Repo.js +7 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/synchronizer/CollectionSynchronizer.d.ts +1 -0
- package/dist/synchronizer/CollectionSynchronizer.d.ts.map +1 -1
- package/dist/synchronizer/CollectionSynchronizer.js +8 -3
- package/dist/synchronizer/DocSynchronizer.d.ts.map +1 -1
- package/dist/synchronizer/DocSynchronizer.js +6 -1
- package/package.json +2 -2
- package/src/Repo.ts +9 -4
- package/src/index.ts +6 -0
- package/src/synchronizer/CollectionSynchronizer.ts +8 -3
- package/src/synchronizer/DocSynchronizer.ts +6 -1
- package/test/CollectionSynchronizer.test.ts +23 -0
- package/test/Repo.test.ts +65 -0
package/README.md
CHANGED
package/dist/Repo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Repo.d.ts","sourceRoot":"","sources":["../src/Repo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ5C,OAAO,EAEL,SAAS,EAKV,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EACL,uBAAuB,EACvB,KAAK,YAAY,EAClB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,OAAO,EACL,cAAc,EAEf,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,MAAM,EACP,MAAM,YAAY,CAAA;AACnB,OAAO,EAAa,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG;IACzD,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,IAAI,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,CAAA;IAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CACzE,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,IAAI,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,CAAA;IAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IACxE,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;CACjE,CAAA;AAMD,8FAA8F;AAC9F;;;;;;GAMG;AACH,qBAAa,IAAK,SAAQ,YAAY,CAAC,UAAU,CAAC;;IAGhD,cAAc;IACd,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IAEnC,mDAAmD;IACnD,cAAc;IACd,gBAAgB,SAAM;IAItB,cAAc;IACd,YAAY,EAAE,sBAAsB,CAAA;IAEpC,sDAAsD;IACtD,cAAc;IACd,WAAW,EAAE,WAAW,CAAmB;IAE3C,8GAA8G;IAC9G,cAAc;IACd,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAK;gBAM3C,EACV,OAAO,EACP,OAAY,EACZ,MAAuB,EACvB,WAAW,EACX,WAAmC,EACnC,0BAAkC,EAClC,QAAa,GACd,GAAE,UAAe;
|
|
1
|
+
{"version":3,"file":"Repo.d.ts","sourceRoot":"","sources":["../src/Repo.ts"],"names":[],"mappings":"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"}
|
package/dist/Repo.js
CHANGED
|
@@ -48,8 +48,7 @@ export class Repo extends EventEmitter {
|
|
|
48
48
|
this.#log = debug(`automerge-repo:repo`);
|
|
49
49
|
this.sharePolicy = sharePolicy ?? this.sharePolicy;
|
|
50
50
|
this.on("delete-document", ({ documentId }) => {
|
|
51
|
-
|
|
52
|
-
// synchronizer.removeDocument(documentId)
|
|
51
|
+
this.synchronizer.removeDocument(documentId);
|
|
53
52
|
if (storageSubsystem) {
|
|
54
53
|
storageSubsystem.removeDoc(documentId).catch(err => {
|
|
55
54
|
this.#log("error deleting document", { documentId, err });
|
|
@@ -450,6 +449,10 @@ export class Repo extends EventEmitter {
|
|
|
450
449
|
}
|
|
451
450
|
// If the handle isn't ready, wait for it and then return it
|
|
452
451
|
await progress.handle.whenReady([READY, UNAVAILABLE]);
|
|
452
|
+
if (progress.handle.state === "unavailable" &&
|
|
453
|
+
!allowableStates.includes(UNAVAILABLE)) {
|
|
454
|
+
throw new Error(`Document ${id} is unavailable`);
|
|
455
|
+
}
|
|
453
456
|
return progress.handle;
|
|
454
457
|
}
|
|
455
458
|
}
|
|
@@ -594,8 +597,8 @@ export class Repo extends EventEmitter {
|
|
|
594
597
|
this.#log(`WARN: removeFromCache called but handle for documentId: ${documentId} in unexpected state: ${handle.state}`);
|
|
595
598
|
}
|
|
596
599
|
delete this.#handleCache[documentId];
|
|
597
|
-
|
|
598
|
-
|
|
600
|
+
delete this.#progressCache[documentId];
|
|
601
|
+
this.synchronizer.removeDocument(documentId);
|
|
599
602
|
}
|
|
600
603
|
else {
|
|
601
604
|
this.#log(`WARN: removeFromCache called but doc undefined for documentId: ${documentId}`);
|
package/dist/index.d.ts
CHANGED
|
@@ -46,6 +46,8 @@ export * from "./types.js";
|
|
|
46
46
|
export declare const Counter: typeof Automerge.Counter;
|
|
47
47
|
export declare const RawString: typeof Automerge.RawString;
|
|
48
48
|
export declare const ImmutableString: typeof Automerge.RawString;
|
|
49
|
+
export type RawString = InstanceType<typeof Automerge.RawString>;
|
|
50
|
+
export type ImmutableString = RawString;
|
|
49
51
|
export type Counter = Automerge.Counter;
|
|
50
52
|
export type Doc<T> = Automerge.Doc<T>;
|
|
51
53
|
export type Heads = Automerge.Heads;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAE7D,eAAe;AACf,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AAIzC,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,EAChC,2BAA2B,EAC3B,eAAe,EACf,gBAAgB,EAChB,wCAAwC,EACxC,WAAW,GACZ,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,GACb,MAAM,sCAAsC,CAAA;AAE7C,YAAY,EACV,sBAAsB,EACtB,WAAW,GACZ,MAAM,+BAA+B,CAAA;AAEtC,YAAY,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,uBAAuB,CAAA;AAE9B,YAAY,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,oBAAoB,CAAA;AAE3B,cAAc,YAAY,CAAA;AAiB1B,eAAO,MAAM,OAAO,0BAAoB,CAAA;AACxC,eAAO,MAAM,SAAS,4BAAsB,CAAA;AAE5C,eAAO,MAAM,eAAe,4BAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAE7D,eAAe;AACf,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AAIzC,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,EAChC,2BAA2B,EAC3B,eAAe,EACf,gBAAgB,EAChB,wCAAwC,EACxC,WAAW,GACZ,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,GACb,MAAM,sCAAsC,CAAA;AAE7C,YAAY,EACV,sBAAsB,EACtB,WAAW,GACZ,MAAM,+BAA+B,CAAA;AAEtC,YAAY,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,uBAAuB,CAAA;AAE9B,YAAY,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,oBAAoB,CAAA;AAE3B,cAAc,YAAY,CAAA;AAiB1B,eAAO,MAAM,OAAO,0BAAoB,CAAA;AACxC,eAAO,MAAM,SAAS,4BAAsB,CAAA;AAE5C,eAAO,MAAM,eAAe,4BAAsB,CAAA;AAIlD,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAA;AAChE,MAAM,MAAM,eAAe,GAAG,SAAS,CAAA;AAEvC,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAA;AACvC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACrC,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;AACnC,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;AACnC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AACzD,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;AACjC,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAA;AACvC,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;AACrC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC/C,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;AACjC,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAA;AAC3C,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;AAIrC,eAAO,MAAM,UAAU,6BAAuB,CAAA;AAC9C,eAAO,MAAM,aAAa,gCAA0B,CAAA;AACpD,eAAO,MAAM,YAAY,+BAAyB,CAAA;AAClD,eAAO,MAAM,IAAI,uBAAiB,CAAA;AAClC,eAAO,MAAM,YAAY,+BAAyB,CAAA;AAKlD,eAAO,MAAM,SAAS,4BAAsB,CAAA;AAC5C,eAAO,MAAM,iBAAiB,oCAA8B,CAAA;AAC5D,eAAO,MAAM,MAAM,yBAAmB,CAAA;AACtC,eAAO,MAAM,UAAU,6BAAuB,CAAA;AAC9C,eAAO,MAAM,QAAQ,2BAAqB,CAAA;AAC1C,eAAO,MAAM,QAAQ,2BAAqB,CAAA;AAC1C,eAAO,MAAM,IAAI,uBAAiB,CAAA;AAClC,eAAO,MAAM,MAAM,yBAAmB,CAAA;AACtC,eAAO,MAAM,WAAW,8BAAwB,CAAA;AAEhD,eAAO,MAAM,iBAAiB,8BAAwB,CAAA"}
|
|
@@ -21,6 +21,7 @@ export declare class CollectionSynchronizer extends Synchronizer {
|
|
|
21
21
|
* Starts synchronizing the given document with all peers that we share it generously with.
|
|
22
22
|
*/
|
|
23
23
|
addDocument(handle: DocHandle<unknown>): void;
|
|
24
|
+
/** Removes a document and stops synchronizing them */
|
|
24
25
|
removeDocument(documentId: DocumentId): void;
|
|
25
26
|
/** Adds a peer and maybe starts synchronizing with them */
|
|
26
27
|
addPeer(peerId: PeerId): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionSynchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/CollectionSynchronizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIhD,4FAA4F;AAC5F,qBAAa,sBAAuB,SAAQ,YAAY;;IAa1C,OAAO,CAAC,IAAI;IATxB,kDAAkD;IAClD,cAAc;IACd,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAK;gBAOtC,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAE,YAAY,EAAO;IAwD7D;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU;IAyCxC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CollectionSynchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/CollectionSynchronizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIhD,4FAA4F;AAC5F,qBAAa,sBAAuB,SAAQ,YAAY;;IAa1C,OAAO,CAAC,IAAI;IATxB,kDAAkD;IAClD,cAAc;IACd,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAK;gBAOtC,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAE,YAAY,EAAO;IAwD7D;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU;IAyCxC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC;IAWtC,sDAAsD;IACtD,cAAc,CAAC,UAAU,EAAE,UAAU;IAUrC,2DAA2D;IAC3D,OAAO,CAAC,MAAM,EAAE,MAAM;IAgBtB,uDAAuD;IACvD,UAAU,CAAC,MAAM,EAAE,MAAM;IASzB,+CAA+C;IAC/C,IAAI,KAAK,IAAI,MAAM,EAAE,CAEpB;IAED,OAAO,IAAI;QACT,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,KAAK,EAAE,MAAM,EAAE,CAAA;YACf,IAAI,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,CAAA;aAAE,CAAA;SAC7C,CAAA;KACF;CASF"}
|
|
@@ -106,10 +106,15 @@ export class CollectionSynchronizer extends Synchronizer {
|
|
|
106
106
|
void docSynchronizer.beginSync(peers);
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
|
-
|
|
110
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
109
|
+
/** Removes a document and stops synchronizing them */
|
|
111
110
|
removeDocument(documentId) {
|
|
112
|
-
|
|
111
|
+
log(`removing document ${documentId}`);
|
|
112
|
+
const docSynchronizer = this.docSynchronizers[documentId];
|
|
113
|
+
if (docSynchronizer !== undefined) {
|
|
114
|
+
this.peers.forEach(peerId => docSynchronizer.endSync(peerId));
|
|
115
|
+
}
|
|
116
|
+
delete this.docSynchronizers[documentId];
|
|
117
|
+
delete this.#docSetUp[documentId];
|
|
113
118
|
}
|
|
114
119
|
/** Adds a peer and maybe starts synchronizing with them */
|
|
115
120
|
addPeer(peerId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocSynchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/DocSynchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,2BAA2B,CAAA;AAGrD,OAAO,EACL,SAAS,EAKV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,gBAAgB,EAEhB,WAAW,EACX,cAAc,EACd,WAAW,EAEZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,KAAK,kBAAkB,GAAG,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,OAAO,CAAA;AAOrE,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAA;CACvE;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;;IAE/C,gBAAgB,SAAM;gBAyBV,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,qBAAqB;IAyBtE,IAAI,UAAU,uCAEb;IAED,IAAI,UAAU,qCAEb;IAqID,OAAO,CAAC,MAAM,EAAE,MAAM;IAIhB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;IA8DjC,OAAO,CAAC,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"DocSynchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/DocSynchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,2BAA2B,CAAA;AAGrD,OAAO,EACL,SAAS,EAKV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,gBAAgB,EAEhB,WAAW,EACX,cAAc,EACd,WAAW,EAEZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,KAAK,kBAAkB,GAAG,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,OAAO,CAAA;AAOrE,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAA;CACvE;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;;IAE/C,gBAAgB,SAAM;gBAyBV,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,qBAAqB;IAyBtE,IAAI,UAAU,uCAEb;IAED,IAAI,UAAU,qCAEb;IAqID,OAAO,CAAC,MAAM,EAAE,MAAM;IAIhB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;IA8DjC,OAAO,CAAC,MAAM,EAAE,MAAM;IAOtB,cAAc,CAAC,OAAO,EAAE,WAAW;IAkBnC,uBAAuB,CAAC,OAAO,EAAE,gBAAgB;IAuBjD,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc;IA2FxD,OAAO,IAAI;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;CAM7E"}
|
|
@@ -209,6 +209,8 @@ export class DocSynchronizer extends Synchronizer {
|
|
|
209
209
|
endSync(peerId) {
|
|
210
210
|
this.#log(`removing peer ${peerId}`);
|
|
211
211
|
this.#peers = this.#peers.filter(p => p !== peerId);
|
|
212
|
+
delete this.#peerDocumentStatuses[peerId];
|
|
213
|
+
this.#checkDocUnavailable();
|
|
212
214
|
}
|
|
213
215
|
receiveMessage(message) {
|
|
214
216
|
switch (message.type) {
|
|
@@ -288,12 +290,15 @@ export class DocSynchronizer extends Synchronizer {
|
|
|
288
290
|
#checkDocUnavailable() {
|
|
289
291
|
// if we know none of the peers have the document, tell all our peers that we don't either
|
|
290
292
|
if (this.#syncStarted &&
|
|
291
|
-
this.#handle.inState([REQUESTING]) &&
|
|
293
|
+
this.#handle.inState([REQUESTING, UNAVAILABLE]) &&
|
|
292
294
|
this.#peers.every(peerId => this.#peerDocumentStatuses[peerId] === "unavailable" ||
|
|
293
295
|
this.#peerDocumentStatuses[peerId] === "wants")) {
|
|
294
296
|
this.#peers
|
|
295
297
|
.filter(peerId => this.#peerDocumentStatuses[peerId] === "wants")
|
|
296
298
|
.forEach(peerId => {
|
|
299
|
+
// Transition the peer to unavailable so that we don't send it a doc-unavailable
|
|
300
|
+
// message every time we run #checkDocUnavailable
|
|
301
|
+
this.#peerDocumentStatuses[peerId] = "unavailable";
|
|
297
302
|
const message = {
|
|
298
303
|
type: "doc-unavailable",
|
|
299
304
|
documentId: this.#handle.documentId,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automerge/automerge-repo",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "A repository object to manage a collection of automerge documents",
|
|
5
5
|
"repository": "https://github.com/automerge/automerge-repo/tree/master/packages/automerge-repo",
|
|
6
6
|
"author": "Peter van Hardenberg <pvh@pvh.ca>",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "7100c8827c5da9e04fd2dc4319d015f5e624f8fa"
|
|
63
63
|
}
|
package/src/Repo.ts
CHANGED
|
@@ -110,8 +110,7 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
110
110
|
this.sharePolicy = sharePolicy ?? this.sharePolicy
|
|
111
111
|
|
|
112
112
|
this.on("delete-document", ({ documentId }) => {
|
|
113
|
-
|
|
114
|
-
// synchronizer.removeDocument(documentId)
|
|
113
|
+
this.synchronizer.removeDocument(documentId)
|
|
115
114
|
|
|
116
115
|
if (storageSubsystem) {
|
|
117
116
|
storageSubsystem.removeDoc(documentId).catch(err => {
|
|
@@ -625,6 +624,12 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
625
624
|
}
|
|
626
625
|
// If the handle isn't ready, wait for it and then return it
|
|
627
626
|
await progress.handle.whenReady([READY, UNAVAILABLE])
|
|
627
|
+
if (
|
|
628
|
+
progress.handle.state === "unavailable" &&
|
|
629
|
+
!allowableStates.includes(UNAVAILABLE)
|
|
630
|
+
) {
|
|
631
|
+
throw new Error(`Document ${id} is unavailable`)
|
|
632
|
+
}
|
|
628
633
|
return progress.handle
|
|
629
634
|
}
|
|
630
635
|
}
|
|
@@ -798,8 +803,8 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
798
803
|
)
|
|
799
804
|
}
|
|
800
805
|
delete this.#handleCache[documentId]
|
|
801
|
-
|
|
802
|
-
|
|
806
|
+
delete this.#progressCache[documentId]
|
|
807
|
+
this.synchronizer.removeDocument(documentId)
|
|
803
808
|
} else {
|
|
804
809
|
this.#log(
|
|
805
810
|
`WARN: removeFromCache called but doc undefined for documentId: ${documentId}`
|
package/src/index.ts
CHANGED
|
@@ -121,6 +121,12 @@ export const Counter = Automerge.Counter
|
|
|
121
121
|
export const RawString = Automerge.RawString
|
|
122
122
|
// In automerge 3.0 RawString is renamed to ImmutableString
|
|
123
123
|
export const ImmutableString = Automerge.RawString
|
|
124
|
+
|
|
125
|
+
// Export separate RawString and ImmutableString types,
|
|
126
|
+
// whose symbols are only usable as values otherwise.
|
|
127
|
+
export type RawString = InstanceType<typeof Automerge.RawString>
|
|
128
|
+
export type ImmutableString = RawString
|
|
129
|
+
|
|
124
130
|
export type Counter = Automerge.Counter
|
|
125
131
|
export type Doc<T> = Automerge.Doc<T>
|
|
126
132
|
export type Heads = Automerge.Heads
|
|
@@ -138,10 +138,15 @@ export class CollectionSynchronizer extends Synchronizer {
|
|
|
138
138
|
})
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
141
|
+
/** Removes a document and stops synchronizing them */
|
|
143
142
|
removeDocument(documentId: DocumentId) {
|
|
144
|
-
|
|
143
|
+
log(`removing document ${documentId}`)
|
|
144
|
+
const docSynchronizer = this.docSynchronizers[documentId]
|
|
145
|
+
if (docSynchronizer !== undefined) {
|
|
146
|
+
this.peers.forEach(peerId => docSynchronizer.endSync(peerId))
|
|
147
|
+
}
|
|
148
|
+
delete this.docSynchronizers[documentId]
|
|
149
|
+
delete this.#docSetUp[documentId]
|
|
145
150
|
}
|
|
146
151
|
|
|
147
152
|
/** Adds a peer and maybe starts synchronizing with them */
|
|
@@ -298,6 +298,8 @@ export class DocSynchronizer extends Synchronizer {
|
|
|
298
298
|
endSync(peerId: PeerId) {
|
|
299
299
|
this.#log(`removing peer ${peerId}`)
|
|
300
300
|
this.#peers = this.#peers.filter(p => p !== peerId)
|
|
301
|
+
delete this.#peerDocumentStatuses[peerId]
|
|
302
|
+
this.#checkDocUnavailable()
|
|
301
303
|
}
|
|
302
304
|
|
|
303
305
|
receiveMessage(message: RepoMessage) {
|
|
@@ -399,7 +401,7 @@ export class DocSynchronizer extends Synchronizer {
|
|
|
399
401
|
// if we know none of the peers have the document, tell all our peers that we don't either
|
|
400
402
|
if (
|
|
401
403
|
this.#syncStarted &&
|
|
402
|
-
this.#handle.inState([REQUESTING]) &&
|
|
404
|
+
this.#handle.inState([REQUESTING, UNAVAILABLE]) &&
|
|
403
405
|
this.#peers.every(
|
|
404
406
|
peerId =>
|
|
405
407
|
this.#peerDocumentStatuses[peerId] === "unavailable" ||
|
|
@@ -409,6 +411,9 @@ export class DocSynchronizer extends Synchronizer {
|
|
|
409
411
|
this.#peers
|
|
410
412
|
.filter(peerId => this.#peerDocumentStatuses[peerId] === "wants")
|
|
411
413
|
.forEach(peerId => {
|
|
414
|
+
// Transition the peer to unavailable so that we don't send it a doc-unavailable
|
|
415
|
+
// message every time we run #checkDocUnavailable
|
|
416
|
+
this.#peerDocumentStatuses[peerId] = "unavailable"
|
|
412
417
|
const message: MessageContents<DocumentUnavailableMessage> = {
|
|
413
418
|
type: "doc-unavailable",
|
|
414
419
|
documentId: this.#handle.documentId,
|
|
@@ -75,4 +75,27 @@ describe("CollectionSynchronizer", () => {
|
|
|
75
75
|
|
|
76
76
|
setTimeout(done)
|
|
77
77
|
}))
|
|
78
|
+
|
|
79
|
+
it("removes document", () =>
|
|
80
|
+
new Promise<void>((done, reject) => {
|
|
81
|
+
const handle = repo.create()
|
|
82
|
+
synchronizer.addDocument(handle)
|
|
83
|
+
synchronizer.addPeer("peer1" as PeerId)
|
|
84
|
+
// starts synchronizing document to peer
|
|
85
|
+
synchronizer.once("message", event => {
|
|
86
|
+
const { targetId, documentId } = event as SyncMessage
|
|
87
|
+
assert(targetId === "peer1")
|
|
88
|
+
assert(documentId === handle.documentId)
|
|
89
|
+
done()
|
|
90
|
+
})
|
|
91
|
+
// no message should be sent after removing document
|
|
92
|
+
synchronizer.once("message", () => {
|
|
93
|
+
reject(new Error("Should not have sent a message"))
|
|
94
|
+
})
|
|
95
|
+
assert(synchronizer.docSynchronizers[handle.documentId] !== undefined)
|
|
96
|
+
synchronizer.removeDocument(handle.documentId)
|
|
97
|
+
assert(synchronizer.docSynchronizers[handle.documentId] === undefined)
|
|
98
|
+
// removing document again should not throw an error
|
|
99
|
+
synchronizer.removeDocument(handle.documentId)
|
|
100
|
+
}))
|
|
78
101
|
})
|
package/test/Repo.test.ts
CHANGED
|
@@ -208,6 +208,65 @@ describe("Repo", () => {
|
|
|
208
208
|
}).rejects.toThrow(/Document (.*) is unavailable/)
|
|
209
209
|
})
|
|
210
210
|
|
|
211
|
+
it("immediately marks a document as unavailable even if requested multiple times", async () => {
|
|
212
|
+
/**
|
|
213
|
+
* This exercises an issue where the first time a document is requested
|
|
214
|
+
* from some remote and the remote doesn't have the document then it
|
|
215
|
+
* immediately returns an unavailable error, but if the same document is
|
|
216
|
+
* requested again before the remote is restarted then it never sends
|
|
217
|
+
* the unavailable message leading to timeouts on the requesting end
|
|
218
|
+
*/
|
|
219
|
+
const alice = new Repo({
|
|
220
|
+
peerId: "alice" as PeerId,
|
|
221
|
+
sharePolicy: async () => false,
|
|
222
|
+
})
|
|
223
|
+
const bob = new Repo({ peerId: "bob" as PeerId })
|
|
224
|
+
const [aliceToBob, bobToAlice] = DummyNetworkAdapter.createConnectedPair()
|
|
225
|
+
alice.networkSubsystem.addNetworkAdapter(aliceToBob)
|
|
226
|
+
bob.networkSubsystem.addNetworkAdapter(bobToAlice)
|
|
227
|
+
aliceToBob.peerCandidate("bob" as PeerId)
|
|
228
|
+
bobToAlice.peerCandidate("alice" as PeerId)
|
|
229
|
+
await Promise.all([
|
|
230
|
+
alice.networkSubsystem.whenReady(),
|
|
231
|
+
bob.networkSubsystem.whenReady(),
|
|
232
|
+
])
|
|
233
|
+
|
|
234
|
+
await assert.rejects(() =>
|
|
235
|
+
bob.find("automerge:uKK1dJ4vE3E6r27kz5bsFaCykvM" as AutomergeUrl)
|
|
236
|
+
)
|
|
237
|
+
aliceToBob.emit("peer-disconnected", { peerId: "bob" as PeerId })
|
|
238
|
+
bobToAlice.emit("peer-disconnected", { peerId: "alice" as PeerId })
|
|
239
|
+
|
|
240
|
+
const charlie = new Repo({ peerId: "charlie" as PeerId })
|
|
241
|
+
const [charlieToAlice, aliceToCharlie] =
|
|
242
|
+
DummyNetworkAdapter.createConnectedPair()
|
|
243
|
+
charlie.networkSubsystem.addNetworkAdapter(charlieToAlice)
|
|
244
|
+
alice.networkSubsystem.addNetworkAdapter(aliceToCharlie)
|
|
245
|
+
charlieToAlice.peerCandidate("alice" as PeerId)
|
|
246
|
+
aliceToCharlie.peerCandidate("charlie" as PeerId)
|
|
247
|
+
await Promise.all([
|
|
248
|
+
charlie.networkSubsystem.whenReady(),
|
|
249
|
+
alice.networkSubsystem.whenReady(),
|
|
250
|
+
])
|
|
251
|
+
|
|
252
|
+
await assert.rejects(() =>
|
|
253
|
+
charlie.find("automerge:uKK1dJ4vE3E6r27kz5bsFaCykvM" as AutomergeUrl)
|
|
254
|
+
)
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it("should not return an unavailable handle on second request", async () => {
|
|
258
|
+
const alice = new Repo({
|
|
259
|
+
peerId: "alice" as PeerId,
|
|
260
|
+
sharePolicy: async () => true,
|
|
261
|
+
})
|
|
262
|
+
await assert.rejects(() =>
|
|
263
|
+
alice.find("automerge:uKK1dJ4vE3E6r27kz5bsFaCykvM" as AutomergeUrl)
|
|
264
|
+
)
|
|
265
|
+
await assert.rejects(() =>
|
|
266
|
+
alice.find("automerge:uKK1dJ4vE3E6r27kz5bsFaCykvM" as AutomergeUrl)
|
|
267
|
+
)
|
|
268
|
+
})
|
|
269
|
+
|
|
211
270
|
it("doesn't mark a document as unavailable until network adapters are ready", async () => {
|
|
212
271
|
const { repo, networkAdapter } = setup({ startReady: false })
|
|
213
272
|
const url = generateAutomergeUrl()
|
|
@@ -519,6 +578,9 @@ describe("Repo", () => {
|
|
|
519
578
|
const handle = repo.create({ foo: "bar" })
|
|
520
579
|
await repo.delete(handle.documentId)
|
|
521
580
|
assert(repo.handles[handle.documentId] === undefined)
|
|
581
|
+
assert(
|
|
582
|
+
repo.synchronizer.docSynchronizers[handle.documentId] === undefined
|
|
583
|
+
)
|
|
522
584
|
})
|
|
523
585
|
|
|
524
586
|
it("removeFromCache removes doc handle", async () => {
|
|
@@ -526,6 +588,9 @@ describe("Repo", () => {
|
|
|
526
588
|
const handle = repo.create({ foo: "bar" })
|
|
527
589
|
await repo.removeFromCache(handle.documentId)
|
|
528
590
|
assert(repo.handles[handle.documentId] === undefined)
|
|
591
|
+
assert(
|
|
592
|
+
repo.synchronizer.docSynchronizers[handle.documentId] === undefined
|
|
593
|
+
)
|
|
529
594
|
})
|
|
530
595
|
|
|
531
596
|
it("removeFromCache for documentId not found", async () => {
|