@automerge/automerge-repo 2.2.0 → 2.3.0-alpha.0
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/dist/Repo.d.ts +15 -1
- package/dist/Repo.d.ts.map +1 -1
- package/dist/Repo.js +42 -11
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/src/Repo.ts +44 -13
- package/src/index.ts +1 -0
- package/test/Repo.test.ts +29 -4
package/dist/Repo.d.ts
CHANGED
|
@@ -91,8 +91,22 @@ export declare class Repo extends EventEmitter<RepoEvents> {
|
|
|
91
91
|
/**
|
|
92
92
|
* Imports document binary into the repo.
|
|
93
93
|
* @param binary - The binary to import
|
|
94
|
+
* @param args - Optional argument specifying what document ID to import into,
|
|
95
|
+
* if at all possible avoid using this, see the remarks below
|
|
96
|
+
*
|
|
97
|
+
* @remarks
|
|
98
|
+
* If no document ID is provided, a new document will be created. When
|
|
99
|
+
* specifying the document ID it is important to ensure that two documents using
|
|
100
|
+
* the same ID share the same history - i.e. don't create a document with the
|
|
101
|
+
* same ID on unrelated processes that have never communicated with each
|
|
102
|
+
* other. If you need to ship around a bunch of documents with their IDs
|
|
103
|
+
* consider using the `automerge-repo-bundles` package which provides a
|
|
104
|
+
* serialization format for documents and IDs and handles the boilerplate of
|
|
105
|
+
* importing and exporting these bundles.
|
|
94
106
|
*/
|
|
95
|
-
import<T>(binary: Uint8Array
|
|
107
|
+
import<T>(binary: Uint8Array, args?: {
|
|
108
|
+
docId?: DocumentId;
|
|
109
|
+
}): DocHandle<T>;
|
|
96
110
|
subscribeToRemotes: (remotes: StorageId[]) => void;
|
|
97
111
|
storageId: () => Promise<StorageId | undefined>;
|
|
98
112
|
/**
|
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;IAUnC,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;
|
|
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;IAUnC,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;gBAU3C,EACV,OAAO,EACP,OAAY,EACZ,MAAuB,EACvB,WAAW,EACX,WAAmC,EACnC,0BAAkC,EAClC,QAAa,EACb,gBAAsB,GACvB,GAAE,UAAe;IAiRlB,8CAA8C;IAC9C,IAAI,OAAO,uCAEV;IAED,+CAA+C;IAC/C,IAAI,KAAK,IAAI,MAAM,EAAE,CAEpB;IAED,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIzD;;;;OAIG;IACH,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAuBzC;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAmBnC,gBAAgB,CAAC,CAAC,EAChB,EAAE,EAAE,aAAa,EACjB,OAAO,GAAE,YAAiB,GACzB,uBAAuB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAgKzC,IAAI,CAAC,CAAC,EACV,EAAE,EAAE,aAAa,EACjB,OAAO,GAAE,eAAe,GAAG,YAAiB,GAC3C,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IA0ExB;;;OAGG;IACG,WAAW,CAAC,CAAC;IACjB,sDAAsD;IACtD,EAAE,EAAE,aAAa,EACjB,OAAO,GAAE,eAAe,GAAG,YAAiB,GAC3C,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAmBxB,MAAM;IACJ,oDAAoD;IACpD,EAAE,EAAE,aAAa;IAanB;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQhE;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC,CAAC;IAmB1E,kBAAkB,GAAI,SAAS,SAAS,EAAE,UASzC;IAED,SAAS,QAAa,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAMnD;IAED;;;;;OAKG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;;;OAKG;IACG,eAAe,CAAC,UAAU,EAAE,UAAU;IA8B5C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzB,OAAO,IAAI;QAAE,SAAS,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAA;KAAE;CAGjD;AAED,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;8DAC0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,gDAAgD;IAChD,OAAO,CAAC,EAAE,uBAAuB,CAAA;IAEjC,iEAAiE;IACjE,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAA;IAEnC;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IAEzB;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IAEpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;;KAOK;AACL,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,KACpB,OAAO,CAAC,OAAO,CAAC,CAAA;AAGrB,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAA;IACxC,6BAA6B;IAC7B,iBAAiB,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACvD,4FAA4F;IAC5F,sBAAsB,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAC5D,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,MAAM,UAAU,GAClB,cAAc,GACd;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB,GACD;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA"}
|
package/dist/Repo.js
CHANGED
|
@@ -43,6 +43,7 @@ export class Repo extends EventEmitter {
|
|
|
43
43
|
#remoteHeadsSubscriptions = new RemoteHeadsSubscriptions();
|
|
44
44
|
#remoteHeadsGossipingEnabled = false;
|
|
45
45
|
#progressCache = {};
|
|
46
|
+
#saveFns = {};
|
|
46
47
|
constructor({ storage, network = [], peerId = randomPeerId(), sharePolicy, isEphemeral = storage === undefined, enableRemoteHeadsGossiping = false, denylist = [], saveDebounceRate = 100, } = {}) {
|
|
47
48
|
super();
|
|
48
49
|
this.#remoteHeadsGossipingEnabled = enableRemoteHeadsGossiping;
|
|
@@ -80,11 +81,17 @@ export class Repo extends EventEmitter {
|
|
|
80
81
|
this.storageSubsystem = storageSubsystem;
|
|
81
82
|
this.#saveDebounceRate = saveDebounceRate;
|
|
82
83
|
if (this.storageSubsystem) {
|
|
83
|
-
const saveFn = ({ handle, doc }) => {
|
|
84
|
-
void this.storageSubsystem.saveDoc(handle.documentId, doc);
|
|
85
|
-
};
|
|
86
84
|
// Save no more often than saveDebounceRate.
|
|
87
|
-
this.#saveFn =
|
|
85
|
+
this.#saveFn = ({ handle, doc }) => {
|
|
86
|
+
let fn = this.#saveFns[handle.documentId];
|
|
87
|
+
if (!fn) {
|
|
88
|
+
fn = throttle(() => {
|
|
89
|
+
void this.storageSubsystem.saveDoc(handle.documentId, doc);
|
|
90
|
+
}, this.#saveDebounceRate);
|
|
91
|
+
this.#saveFns[handle.documentId] = fn;
|
|
92
|
+
}
|
|
93
|
+
fn({ handle, doc });
|
|
94
|
+
};
|
|
88
95
|
}
|
|
89
96
|
else {
|
|
90
97
|
this.#saveFn = () => { };
|
|
@@ -531,6 +538,7 @@ export class Repo extends EventEmitter {
|
|
|
531
538
|
handle.delete();
|
|
532
539
|
delete this.#handleCache[documentId];
|
|
533
540
|
delete this.#progressCache[documentId];
|
|
541
|
+
delete this.#saveFns[documentId];
|
|
534
542
|
this.emit("delete-document", { documentId });
|
|
535
543
|
}
|
|
536
544
|
/**
|
|
@@ -549,14 +557,36 @@ export class Repo extends EventEmitter {
|
|
|
549
557
|
/**
|
|
550
558
|
* Imports document binary into the repo.
|
|
551
559
|
* @param binary - The binary to import
|
|
560
|
+
* @param args - Optional argument specifying what document ID to import into,
|
|
561
|
+
* if at all possible avoid using this, see the remarks below
|
|
562
|
+
*
|
|
563
|
+
* @remarks
|
|
564
|
+
* If no document ID is provided, a new document will be created. When
|
|
565
|
+
* specifying the document ID it is important to ensure that two documents using
|
|
566
|
+
* the same ID share the same history - i.e. don't create a document with the
|
|
567
|
+
* same ID on unrelated processes that have never communicated with each
|
|
568
|
+
* other. If you need to ship around a bunch of documents with their IDs
|
|
569
|
+
* consider using the `automerge-repo-bundles` package which provides a
|
|
570
|
+
* serialization format for documents and IDs and handles the boilerplate of
|
|
571
|
+
* importing and exporting these bundles.
|
|
552
572
|
*/
|
|
553
|
-
import(binary) {
|
|
554
|
-
const
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
573
|
+
import(binary, args) {
|
|
574
|
+
const docId = args?.docId;
|
|
575
|
+
if (docId != null) {
|
|
576
|
+
const handle = this.#getHandle({ documentId: docId });
|
|
577
|
+
handle.update(doc => {
|
|
578
|
+
return Automerge.loadIncremental(doc, binary);
|
|
579
|
+
});
|
|
580
|
+
return handle;
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
const doc = Automerge.load(binary);
|
|
584
|
+
const handle = this.create();
|
|
585
|
+
handle.update(() => {
|
|
586
|
+
return Automerge.clone(doc);
|
|
587
|
+
});
|
|
588
|
+
return handle;
|
|
589
|
+
}
|
|
560
590
|
}
|
|
561
591
|
subscribeToRemotes = (remotes) => {
|
|
562
592
|
if (this.#remoteHeadsGossipingEnabled) {
|
|
@@ -616,6 +646,7 @@ export class Repo extends EventEmitter {
|
|
|
616
646
|
}
|
|
617
647
|
delete this.#handleCache[documentId];
|
|
618
648
|
delete this.#progressCache[documentId];
|
|
649
|
+
delete this.#saveFns[documentId];
|
|
619
650
|
this.synchronizer.removeDocument(documentId);
|
|
620
651
|
}
|
|
621
652
|
else {
|
package/dist/index.d.ts
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
export { DocHandle } from "./DocHandle.js";
|
|
29
|
-
export { isValidAutomergeUrl, isValidDocumentId, parseAutomergeUrl, stringifyAutomergeUrl, interpretAsDocumentId, generateAutomergeUrl, encodeHeads, decodeHeads, } from "./AutomergeUrl.js";
|
|
29
|
+
export { isValidAutomergeUrl, isValidDocumentId, parseAutomergeUrl, stringifyAutomergeUrl, interpretAsDocumentId, documentIdToBinary, generateAutomergeUrl, encodeHeads, decodeHeads, } from "./AutomergeUrl.js";
|
|
30
30
|
export { Repo } from "./Repo.js";
|
|
31
31
|
export { NetworkAdapter } from "./network/NetworkAdapter.js";
|
|
32
32
|
export type { NetworkAdapterInterface } from "./network/NetworkAdapterInterface.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
export { DocHandle } from "./DocHandle.js";
|
|
29
|
-
export { isValidAutomergeUrl, isValidDocumentId, parseAutomergeUrl, stringifyAutomergeUrl, interpretAsDocumentId, generateAutomergeUrl, encodeHeads, decodeHeads, } from "./AutomergeUrl.js";
|
|
29
|
+
export { isValidAutomergeUrl, isValidDocumentId, parseAutomergeUrl, stringifyAutomergeUrl, interpretAsDocumentId, documentIdToBinary, generateAutomergeUrl, encodeHeads, decodeHeads, } from "./AutomergeUrl.js";
|
|
30
30
|
export { Repo } from "./Repo.js";
|
|
31
31
|
export { NetworkAdapter } from "./network/NetworkAdapter.js";
|
|
32
32
|
export { isRepoMessage } from "./network/messages.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automerge/automerge-repo",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0-alpha.0",
|
|
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": "4e54d3585f0f8f80fb558cac01ce2652e7cbf985"
|
|
63
63
|
}
|
package/src/Repo.ts
CHANGED
|
@@ -96,6 +96,10 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
96
96
|
#remoteHeadsSubscriptions = new RemoteHeadsSubscriptions()
|
|
97
97
|
#remoteHeadsGossipingEnabled = false
|
|
98
98
|
#progressCache: Record<DocumentId, FindProgress<any>> = {}
|
|
99
|
+
#saveFns: Record<
|
|
100
|
+
DocumentId,
|
|
101
|
+
(payload: DocHandleEncodedChangePayload<any>) => void
|
|
102
|
+
> = {}
|
|
99
103
|
|
|
100
104
|
constructor({
|
|
101
105
|
storage,
|
|
@@ -155,11 +159,17 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
155
159
|
this.#saveDebounceRate = saveDebounceRate
|
|
156
160
|
|
|
157
161
|
if (this.storageSubsystem) {
|
|
158
|
-
const saveFn = ({ handle, doc }: DocHandleEncodedChangePayload<any>) => {
|
|
159
|
-
void this.storageSubsystem!.saveDoc(handle.documentId, doc)
|
|
160
|
-
}
|
|
161
162
|
// Save no more often than saveDebounceRate.
|
|
162
|
-
this.#saveFn =
|
|
163
|
+
this.#saveFn = ({ handle, doc }: DocHandleEncodedChangePayload<any>) => {
|
|
164
|
+
let fn = this.#saveFns[handle.documentId]
|
|
165
|
+
if (!fn) {
|
|
166
|
+
fn = throttle(() => {
|
|
167
|
+
void this.storageSubsystem!.saveDoc(handle.documentId, doc)
|
|
168
|
+
}, this.#saveDebounceRate)
|
|
169
|
+
this.#saveFns[handle.documentId] = fn
|
|
170
|
+
}
|
|
171
|
+
fn({ handle, doc })
|
|
172
|
+
}
|
|
163
173
|
} else {
|
|
164
174
|
this.#saveFn = () => {}
|
|
165
175
|
}
|
|
@@ -725,6 +735,7 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
725
735
|
|
|
726
736
|
delete this.#handleCache[documentId]
|
|
727
737
|
delete this.#progressCache[documentId]
|
|
738
|
+
delete this.#saveFns[documentId]
|
|
728
739
|
this.emit("delete-document", { documentId })
|
|
729
740
|
}
|
|
730
741
|
|
|
@@ -746,17 +757,36 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
746
757
|
/**
|
|
747
758
|
* Imports document binary into the repo.
|
|
748
759
|
* @param binary - The binary to import
|
|
760
|
+
* @param args - Optional argument specifying what document ID to import into,
|
|
761
|
+
* if at all possible avoid using this, see the remarks below
|
|
762
|
+
*
|
|
763
|
+
* @remarks
|
|
764
|
+
* If no document ID is provided, a new document will be created. When
|
|
765
|
+
* specifying the document ID it is important to ensure that two documents using
|
|
766
|
+
* the same ID share the same history - i.e. don't create a document with the
|
|
767
|
+
* same ID on unrelated processes that have never communicated with each
|
|
768
|
+
* other. If you need to ship around a bunch of documents with their IDs
|
|
769
|
+
* consider using the `automerge-repo-bundles` package which provides a
|
|
770
|
+
* serialization format for documents and IDs and handles the boilerplate of
|
|
771
|
+
* importing and exporting these bundles.
|
|
749
772
|
*/
|
|
750
|
-
import<T>(binary: Uint8Array) {
|
|
751
|
-
const
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
773
|
+
import<T>(binary: Uint8Array, args?: { docId?: DocumentId }): DocHandle<T> {
|
|
774
|
+
const docId = args?.docId
|
|
775
|
+
if (docId != null) {
|
|
776
|
+
const handle = this.#getHandle<T>({ documentId: docId })
|
|
777
|
+
handle.update(doc => {
|
|
778
|
+
return Automerge.loadIncremental(doc, binary)
|
|
779
|
+
})
|
|
780
|
+
return handle
|
|
781
|
+
} else {
|
|
782
|
+
const doc = Automerge.load<T>(binary)
|
|
783
|
+
const handle = this.create<T>()
|
|
784
|
+
handle.update(() => {
|
|
785
|
+
return Automerge.clone(doc)
|
|
786
|
+
})
|
|
758
787
|
|
|
759
|
-
|
|
788
|
+
return handle
|
|
789
|
+
}
|
|
760
790
|
}
|
|
761
791
|
|
|
762
792
|
subscribeToRemotes = (remotes: StorageId[]) => {
|
|
@@ -825,6 +855,7 @@ export class Repo extends EventEmitter<RepoEvents> {
|
|
|
825
855
|
}
|
|
826
856
|
delete this.#handleCache[documentId]
|
|
827
857
|
delete this.#progressCache[documentId]
|
|
858
|
+
delete this.#saveFns[documentId]
|
|
828
859
|
this.synchronizer.removeDocument(documentId)
|
|
829
860
|
} else {
|
|
830
861
|
this.#log(
|
package/src/index.ts
CHANGED
package/test/Repo.test.ts
CHANGED
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
import { getRandomItem } from "./helpers/getRandomItem.js"
|
|
34
34
|
import { TestDoc } from "./types.js"
|
|
35
35
|
import { StorageId, StorageKey } from "../src/storage/types.js"
|
|
36
|
-
import { chunkTypeFromKey } from "../src/storage/chunkTypeFromKey.js"
|
|
37
36
|
|
|
38
37
|
describe("Repo", () => {
|
|
39
38
|
describe("constructor", () => {
|
|
@@ -47,13 +46,13 @@ describe("Repo", () => {
|
|
|
47
46
|
const setup = ({ startReady = true } = {}) => {
|
|
48
47
|
const storageAdapter = new DummyStorageAdapter()
|
|
49
48
|
const networkAdapter = new DummyNetworkAdapter({ startReady })
|
|
50
|
-
|
|
49
|
+
const saveDebounceRate = 1
|
|
51
50
|
const repo = new Repo({
|
|
52
51
|
storage: storageAdapter,
|
|
53
52
|
network: [networkAdapter],
|
|
54
|
-
saveDebounceRate
|
|
53
|
+
saveDebounceRate,
|
|
55
54
|
})
|
|
56
|
-
return { repo, storageAdapter, networkAdapter }
|
|
55
|
+
return { repo, storageAdapter, networkAdapter, saveDebounceRate }
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
it("can instantiate a Repo", () => {
|
|
@@ -340,6 +339,32 @@ describe("Repo", () => {
|
|
|
340
339
|
assert.equal(v?.foo, "bar")
|
|
341
340
|
})
|
|
342
341
|
|
|
342
|
+
it("can save several documents in quick succession", async () => {
|
|
343
|
+
// See https://github.com/automerge/automerge-repo/pull/471
|
|
344
|
+
const { repo, storageAdapter, saveDebounceRate } = setup()
|
|
345
|
+
const a = repo.create<TestDoc>()
|
|
346
|
+
const b = repo.create<TestDoc>()
|
|
347
|
+
const c = repo.create<TestDoc>()
|
|
348
|
+
|
|
349
|
+
a.change(doc => (doc.foo = "a"))
|
|
350
|
+
b.change(doc => (doc.foo = "b"))
|
|
351
|
+
c.change(doc => (doc.foo = "c"))
|
|
352
|
+
|
|
353
|
+
await pause(saveDebounceRate)
|
|
354
|
+
|
|
355
|
+
const repo2 = new Repo({
|
|
356
|
+
storage: storageAdapter,
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
const a2 = await repo2.find<TestDoc>(a.url)
|
|
360
|
+
const b2 = await repo2.find<TestDoc>(b.url)
|
|
361
|
+
const c2 = await repo2.find<TestDoc>(c.url)
|
|
362
|
+
|
|
363
|
+
assert.deepEqual(a2?.doc(), { foo: "a" })
|
|
364
|
+
assert.deepEqual(b2?.doc(), { foo: "b" })
|
|
365
|
+
assert.deepEqual(c2?.doc(), { foo: "c" })
|
|
366
|
+
})
|
|
367
|
+
|
|
343
368
|
it("can delete an existing document", async () => {
|
|
344
369
|
const { repo } = setup()
|
|
345
370
|
const handle = repo.create<TestDoc>()
|