@automerge/automerge-repo 2.1.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/README.md CHANGED
@@ -125,7 +125,7 @@ yarn
125
125
  yarn add @automerge/automerge @automerge/automerge-repo-react-hooks @automerge/automerge-repo-network-broadcastchannel @automerge/automerge-repo-storage-indexeddb vite-plugin-wasm
126
126
  ```
127
127
 
128
- Edit the `vite.config.ts`. (This is all need to work around packaging hiccups due to WASM. We look
128
+ Edit the `vite.config.ts`. (This is all needed to work around packaging hiccups due to WASM. We look
129
129
  forward to the day that we can delete this step entirely.)
130
130
 
131
131
  ```ts
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): DocHandle<T>;
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Repo.d.ts","sourceRoot":"","sources":["../src/Repo.ts"],"names":[],"mappings":"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"}
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 = throttle(saveFn, this.#saveDebounceRate);
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 doc = Automerge.load(binary);
555
- const handle = this.create();
556
- handle.update(() => {
557
- return Automerge.clone(doc);
558
- });
559
- return handle;
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";
@@ -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.1.0",
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": "34ba1fc8aec5a33b8bfc509fa45aaa44d4672fe7"
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 = throttle(saveFn, this.#saveDebounceRate)
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 doc = Automerge.load<T>(binary)
752
-
753
- const handle = this.create<T>()
754
-
755
- handle.update(() => {
756
- return Automerge.clone(doc)
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
- return handle
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
@@ -33,6 +33,7 @@ export {
33
33
  parseAutomergeUrl,
34
34
  stringifyAutomergeUrl,
35
35
  interpretAsDocumentId,
36
+ documentIdToBinary,
36
37
  generateAutomergeUrl,
37
38
  encodeHeads,
38
39
  decodeHeads,
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: 1,
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>()
@@ -0,0 +1,4 @@
1
+ import { defineConfig, mergeConfig } from "vitest/config"
2
+ import rootConfig from "../../vitest.config"
3
+
4
+ export default mergeConfig(rootConfig, defineConfig({}))
@@ -1,14 +0,0 @@
1
- /** throttle( callback, rate )
2
- * Returns a throttle function with a build in debounce timer that runs after `wait` ms.
3
- *
4
- * Note that the args go inside the parameter and you should be careful not to
5
- * recreate the function on each usage. (In React, see useMemo().)
6
- *
7
- *
8
- * Example usage:
9
- * const callback = throttle((ev) => { doSomethingExpensiveOrOccasional() }, 100)
10
- * target.addEventListener('frequent-event', callback);
11
- *
12
- */
13
- export declare const throttle: <F extends (...args: Parameters<F>) => ReturnType<F>>(fn: F, rate: number) => (...args: Parameters<F>) => void;
14
- //# sourceMappingURL=debounce.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/helpers/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC1E,IAAI,CAAC,EACL,MAAM,MAAM,MAGK,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,SAMxC,CAAA"}
@@ -1,21 +0,0 @@
1
- /** throttle( callback, rate )
2
- * Returns a throttle function with a build in debounce timer that runs after `wait` ms.
3
- *
4
- * Note that the args go inside the parameter and you should be careful not to
5
- * recreate the function on each usage. (In React, see useMemo().)
6
- *
7
- *
8
- * Example usage:
9
- * const callback = throttle((ev) => { doSomethingExpensiveOrOccasional() }, 100)
10
- * target.addEventListener('frequent-event', callback);
11
- *
12
- */
13
- export const throttle = (fn, rate) => {
14
- let timeout;
15
- return function (...args) {
16
- clearTimeout(timeout);
17
- timeout = setTimeout(() => {
18
- fn(...args);
19
- }, rate);
20
- };
21
- };
@@ -1,25 +0,0 @@
1
- /** throttle( callback, rate )
2
- * Returns a throttle function with a build in debounce timer that runs after `wait` ms.
3
- *
4
- * Note that the args go inside the parameter and you should be careful not to
5
- * recreate the function on each usage. (In React, see useMemo().)
6
- *
7
- *
8
- * Example usage:
9
- * const callback = throttle((ev) => { doSomethingExpensiveOrOccasional() }, 100)
10
- * target.addEventListener('frequent-event', callback);
11
- *
12
- */
13
-
14
- export const throttle = <F extends (...args: Parameters<F>) => ReturnType<F>>(
15
- fn: F,
16
- rate: number
17
- ) => {
18
- let timeout: ReturnType<typeof setTimeout>
19
- return function (...args: Parameters<F>) {
20
- clearTimeout(timeout)
21
- timeout = setTimeout(() => {
22
- fn(...args)
23
- }, rate)
24
- }
25
- }