@automerge/automerge-repo 2.0.0-beta.1 → 2.0.0-beta.2

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.
@@ -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":"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"}
package/dist/Repo.js CHANGED
@@ -290,7 +290,6 @@ export class Repo extends EventEmitter {
290
290
  }
291
291
  findWithProgress(id, options = {}) {
292
292
  const { signal } = options;
293
- const abortPromise = abortable(signal);
294
293
  const { documentId, heads } = isValidAutomergeUrl(id)
295
294
  ? parseAutomergeUrl(id)
296
295
  : { documentId: interpretAsDocumentId(id), heads: undefined };
@@ -358,7 +357,7 @@ export class Repo extends EventEmitter {
358
357
  };
359
358
  progressSignal.notify(initial);
360
359
  // Start the loading process
361
- void this.#loadDocumentWithProgress(id, documentId, handle, progressSignal, abortPromise);
360
+ void this.#loadDocumentWithProgress(id, documentId, handle, progressSignal, signal ? abortable(new Promise(() => { }), signal) : new Promise(() => { }));
362
361
  const result = {
363
362
  ...initial,
364
363
  peek: progressSignal.peek,
@@ -421,6 +420,10 @@ export class Repo extends EventEmitter {
421
420
  }
422
421
  async find(id, options = {}) {
423
422
  const { allowableStates = ["ready"], signal } = options;
423
+ // Check if already aborted
424
+ if (signal?.aborted) {
425
+ throw new Error("Operation aborted");
426
+ }
424
427
  const progress = this.findWithProgress(id, { signal });
425
428
  if ("subscribe" in progress) {
426
429
  this.#registerHandleWithSubsystems(progress.handle);
@@ -488,19 +491,16 @@ export class Repo extends EventEmitter {
488
491
  id, options = {}) {
489
492
  const documentId = interpretAsDocumentId(id);
490
493
  const { allowableStates, signal } = options;
491
- return Promise.race([
492
- (async () => {
493
- const handle = await this.#loadDocument(documentId);
494
- if (!allowableStates) {
495
- await handle.whenReady([READY, UNAVAILABLE]);
496
- if (handle.state === UNAVAILABLE && !signal?.aborted) {
497
- throw new Error(`Document ${id} is unavailable`);
498
- }
494
+ return abortable((async () => {
495
+ const handle = await this.#loadDocument(documentId);
496
+ if (!allowableStates) {
497
+ await handle.whenReady([READY, UNAVAILABLE]);
498
+ if (handle.state === UNAVAILABLE && !signal?.aborted) {
499
+ throw new Error(`Document ${id} is unavailable`);
499
500
  }
500
- return handle;
501
- })(),
502
- abortable(signal),
503
- ]);
501
+ }
502
+ return handle;
503
+ })(), signal);
504
504
  }
505
505
  delete(
506
506
  /** The url or documentId of the handle to delete */
@@ -1,35 +1,32 @@
1
1
  /**
2
- * Creates a promise that rejects when the signal is aborted.
2
+ * Wraps a Promise and causes it to reject when the signal is aborted.
3
3
  *
4
4
  * @remarks
5
- * This utility creates a promise that rejects when the provided AbortSignal is aborted.
6
- * It's designed to be used with Promise.race() to make operations abortable.
5
+ * This utility wraps a Promise and rejects when the provided AbortSignal is aborted.
6
+ * It's designed to make Promise awaits abortable.
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
10
  * const controller = new AbortController();
11
11
  *
12
12
  * try {
13
- * const result = await Promise.race([
14
- * fetch('https://api.example.com/data'),
15
- * abortable(controller.signal)
16
- * ]);
13
+ * const result = await abortable(fetch('https://api.example.com/data'), controller.signal);
14
+ * // Meanwhile, to abort in concurrent code before the above line returns: controller.abort();
17
15
  * } catch (err) {
18
16
  * if (err.name === 'AbortError') {
19
17
  * console.log('The operation was aborted');
20
18
  * }
21
19
  * }
22
20
  *
23
- * // Later, to abort:
24
- * controller.abort();
25
21
  * ```
26
22
  *
23
+ * @param p - A Promise to wrap
27
24
  * @param signal - An AbortSignal that can be used to abort the operation
28
- * @param cleanup - Optional cleanup function that will be called if aborted
29
- * @returns A promise that rejects with AbortError when the signal is aborted
30
- * @throws {DOMException} With name "AbortError" when aborted
25
+ * @returns A wrapper Promise that rejects with AbortError if the signal is aborted
26
+ * before the promise p settles, and settles as p settles otherwise
27
+ * @throws {DOMException} With name "AbortError" if aborted before p settles
31
28
  */
32
- export declare function abortable(signal?: AbortSignal, cleanup?: () => void): Promise<never>;
29
+ export declare function abortable<T>(p: Promise<T>, signal: AbortSignal | undefined): Promise<T>;
33
30
  /**
34
31
  * Include this type in an options object to pass an AbortSignal to a function.
35
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/helpers/abortable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,SAAS,CACvB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,MAAM,IAAI,GACnB,OAAO,CAAC,KAAK,CAAC,CAmBhB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB"}
1
+ {"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/helpers/abortable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,wBAAgB,SAAS,CAAC,CAAC,EACzB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB"}
@@ -1,45 +1,47 @@
1
1
  /**
2
- * Creates a promise that rejects when the signal is aborted.
2
+ * Wraps a Promise and causes it to reject when the signal is aborted.
3
3
  *
4
4
  * @remarks
5
- * This utility creates a promise that rejects when the provided AbortSignal is aborted.
6
- * It's designed to be used with Promise.race() to make operations abortable.
5
+ * This utility wraps a Promise and rejects when the provided AbortSignal is aborted.
6
+ * It's designed to make Promise awaits abortable.
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
10
  * const controller = new AbortController();
11
11
  *
12
12
  * try {
13
- * const result = await Promise.race([
14
- * fetch('https://api.example.com/data'),
15
- * abortable(controller.signal)
16
- * ]);
13
+ * const result = await abortable(fetch('https://api.example.com/data'), controller.signal);
14
+ * // Meanwhile, to abort in concurrent code before the above line returns: controller.abort();
17
15
  * } catch (err) {
18
16
  * if (err.name === 'AbortError') {
19
17
  * console.log('The operation was aborted');
20
18
  * }
21
19
  * }
22
20
  *
23
- * // Later, to abort:
24
- * controller.abort();
25
21
  * ```
26
22
  *
23
+ * @param p - A Promise to wrap
27
24
  * @param signal - An AbortSignal that can be used to abort the operation
28
- * @param cleanup - Optional cleanup function that will be called if aborted
29
- * @returns A promise that rejects with AbortError when the signal is aborted
30
- * @throws {DOMException} With name "AbortError" when aborted
25
+ * @returns A wrapper Promise that rejects with AbortError if the signal is aborted
26
+ * before the promise p settles, and settles as p settles otherwise
27
+ * @throws {DOMException} With name "AbortError" if aborted before p settles
31
28
  */
32
- export function abortable(signal, cleanup) {
33
- if (signal?.aborted) {
34
- throw new DOMException("Operation aborted", "AbortError");
35
- }
36
- if (!signal) {
37
- return new Promise(() => { }); // Never resolves
38
- }
39
- return new Promise((_, reject) => {
40
- signal.addEventListener("abort", () => {
41
- cleanup?.();
42
- reject(new DOMException("Operation aborted", "AbortError"));
29
+ export function abortable(p, signal) {
30
+ let settled = false;
31
+ return new Promise((resolve, reject) => {
32
+ signal?.addEventListener("abort", () => {
33
+ if (!settled) {
34
+ reject(new DOMException("Operation aborted", "AbortError"));
35
+ }
43
36
  }, { once: true });
37
+ p.then(result => {
38
+ resolve(result);
39
+ })
40
+ .catch(error => {
41
+ reject(error);
42
+ })
43
+ .finally(() => {
44
+ settled = true;
45
+ });
44
46
  });
45
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automerge/automerge-repo",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.2",
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": "561e9142496d89cf34ad78cb72b27329990cae07"
62
+ "gitHead": "70b1423aad5595782bb1ed6cfe21244e2693e226"
63
63
  }
package/src/Repo.ts CHANGED
@@ -432,8 +432,6 @@ export class Repo extends EventEmitter<RepoEvents> {
432
432
  options: AbortOptions = {}
433
433
  ): FindProgressWithMethods<T> | FindProgress<T> {
434
434
  const { signal } = options
435
- const abortPromise = abortable(signal)
436
-
437
435
  const { documentId, heads } = isValidAutomergeUrl(id)
438
436
  ? parseAutomergeUrl(id)
439
437
  : { documentId: interpretAsDocumentId(id), heads: undefined }
@@ -514,7 +512,7 @@ export class Repo extends EventEmitter<RepoEvents> {
514
512
  documentId,
515
513
  handle,
516
514
  progressSignal,
517
- abortPromise
515
+ signal ? abortable(new Promise(() => {}), signal) : new Promise(() => {})
518
516
  )
519
517
 
520
518
  const result = {
@@ -597,6 +595,12 @@ export class Repo extends EventEmitter<RepoEvents> {
597
595
  options: RepoFindOptions & AbortOptions = {}
598
596
  ): Promise<DocHandle<T>> {
599
597
  const { allowableStates = ["ready"], signal } = options
598
+
599
+ // Check if already aborted
600
+ if (signal?.aborted) {
601
+ throw new Error("Operation aborted")
602
+ }
603
+
600
604
  const progress = this.findWithProgress<T>(id, { signal })
601
605
 
602
606
  if ("subscribe" in progress) {
@@ -669,7 +673,7 @@ export class Repo extends EventEmitter<RepoEvents> {
669
673
  const documentId = interpretAsDocumentId(id)
670
674
  const { allowableStates, signal } = options
671
675
 
672
- return Promise.race([
676
+ return abortable(
673
677
  (async () => {
674
678
  const handle = await this.#loadDocument<T>(documentId)
675
679
  if (!allowableStates) {
@@ -680,8 +684,8 @@ export class Repo extends EventEmitter<RepoEvents> {
680
684
  }
681
685
  return handle
682
686
  })(),
683
- abortable(signal),
684
- ])
687
+ signal
688
+ )
685
689
  }
686
690
 
687
691
  delete(
@@ -1,55 +1,56 @@
1
1
  /**
2
- * Creates a promise that rejects when the signal is aborted.
2
+ * Wraps a Promise and causes it to reject when the signal is aborted.
3
3
  *
4
4
  * @remarks
5
- * This utility creates a promise that rejects when the provided AbortSignal is aborted.
6
- * It's designed to be used with Promise.race() to make operations abortable.
5
+ * This utility wraps a Promise and rejects when the provided AbortSignal is aborted.
6
+ * It's designed to make Promise awaits abortable.
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
10
  * const controller = new AbortController();
11
11
  *
12
12
  * try {
13
- * const result = await Promise.race([
14
- * fetch('https://api.example.com/data'),
15
- * abortable(controller.signal)
16
- * ]);
13
+ * const result = await abortable(fetch('https://api.example.com/data'), controller.signal);
14
+ * // Meanwhile, to abort in concurrent code before the above line returns: controller.abort();
17
15
  * } catch (err) {
18
16
  * if (err.name === 'AbortError') {
19
17
  * console.log('The operation was aborted');
20
18
  * }
21
19
  * }
22
20
  *
23
- * // Later, to abort:
24
- * controller.abort();
25
21
  * ```
26
22
  *
23
+ * @param p - A Promise to wrap
27
24
  * @param signal - An AbortSignal that can be used to abort the operation
28
- * @param cleanup - Optional cleanup function that will be called if aborted
29
- * @returns A promise that rejects with AbortError when the signal is aborted
30
- * @throws {DOMException} With name "AbortError" when aborted
25
+ * @returns A wrapper Promise that rejects with AbortError if the signal is aborted
26
+ * before the promise p settles, and settles as p settles otherwise
27
+ * @throws {DOMException} With name "AbortError" if aborted before p settles
31
28
  */
32
- export function abortable(
33
- signal?: AbortSignal,
34
- cleanup?: () => void
35
- ): Promise<never> {
36
- if (signal?.aborted) {
37
- throw new DOMException("Operation aborted", "AbortError")
38
- }
39
29
 
40
- if (!signal) {
41
- return new Promise(() => {}) // Never resolves
42
- }
43
-
44
- return new Promise((_, reject) => {
45
- signal.addEventListener(
30
+ export function abortable<T>(
31
+ p: Promise<T>,
32
+ signal: AbortSignal | undefined
33
+ ): Promise<T> {
34
+ let settled = false
35
+ return new Promise((resolve, reject) => {
36
+ signal?.addEventListener(
46
37
  "abort",
47
38
  () => {
48
- cleanup?.()
49
- reject(new DOMException("Operation aborted", "AbortError"))
39
+ if (!settled) {
40
+ reject(new DOMException("Operation aborted", "AbortError"))
41
+ }
50
42
  },
51
43
  { once: true }
52
44
  )
45
+ p.then(result => {
46
+ resolve(result)
47
+ })
48
+ .catch(error => {
49
+ reject(error)
50
+ })
51
+ .finally(() => {
52
+ settled = true
53
+ })
53
54
  })
54
55
  }
55
56