@zukhruf/single-flight 0.3.14 → 0.3.15

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/flight.d.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  export declare class Flight<T> {
3
3
  #private;
4
4
  constructor(work: (abandoned: AbortSignal) => Promise<T>);
5
- /** Settles as the work settled. */
6
- get ended(): Promise<T>;
5
+ /** The outcome of the work, once it ended. Never rejects. */
6
+ get ended(): Promise<PromiseSettledResult<Awaited<T>>>;
7
7
  /** Aborts when every caller cancelled its wait before the flight ended. */
8
8
  get abandoned(): AbortSignal;
9
9
  /** Waits for the flight for one caller, until it ends or `signal` aborts. */
@@ -1 +1 @@
1
- {"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,qBAAa,MAAM,CAAC,CAAC;;gBAMP,IAAI,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;IAOxD,mCAAmC;IACnC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAEtB;IAED,2EAA2E;IAC3E,IAAI,SAAS,IAAI,WAAW,CAE3B;IAED,6EAA6E;IAC7E,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;CAWlD"}
1
+ {"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,qBAAa,MAAM,CAAC,CAAC;;gBAOP,IAAI,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;IAMxD,6DAA6D;IAC7D,IAAI,KAAK,IAAI,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAErD;IAED,2EAA2E;IAC3E,IAAI,SAAS,IAAI,WAAW,CAE3B;IAED,6EAA6E;IACvE,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;CAcxD"}
package/dist/flight.js CHANGED
@@ -1,23 +1,24 @@
1
- import { untilAborted } from '@zukhruf/async';
1
+ import { Latch, untilAborted } from '@zukhruf/async';
2
2
  /** One run of the work for a key in this process. Every caller that joins it gets how it ended. */
3
3
  export class Flight {
4
- #ended = Promise.withResolvers();
4
+ /** Opens with the outcome of the work. An error is data here, so the latch never rejects; each caller throws it. */
5
+ #ended = new Latch();
5
6
  #abandoned = new AbortController();
6
7
  /** The callers that wait for the flight now. */
7
8
  #waiting = 0;
8
9
  constructor(work) {
9
- Promise.try(work, this.#abandoned.signal).then(this.#ended.resolve, this.#ended.reject);
10
+ void Promise.allSettled([Promise.try(work, this.#abandoned.signal)]).then(([outcome]) => this.#ended.open(outcome));
10
11
  }
11
- /** Settles as the work settled. */
12
+ /** The outcome of the work, once it ended. Never rejects. */
12
13
  get ended() {
13
- return this.#ended.promise;
14
+ return this.#ended.wait();
14
15
  }
15
16
  /** Aborts when every caller cancelled its wait before the flight ended. */
16
17
  get abandoned() {
17
18
  return this.#abandoned.signal;
18
19
  }
19
20
  /** Waits for the flight for one caller, until it ends or `signal` aborts. */
20
- wait(signal) {
21
+ async wait(signal) {
21
22
  this.#waiting++;
22
23
  const leave = () => {
23
24
  this.#waiting--;
@@ -25,9 +26,13 @@ export class Flight {
25
26
  this.#abandoned.abort();
26
27
  };
27
28
  signal?.addEventListener('abort', leave, { once: true });
28
- const stopListening = () => signal?.removeEventListener('abort', leave);
29
- this.#ended.promise.then(stopListening, stopListening);
30
- return untilAborted(this.#ended.promise, signal);
29
+ void this.#ended
30
+ .wait()
31
+ .then(() => signal?.removeEventListener('abort', leave));
32
+ const outcome = await untilAborted(this.#ended.wait(), signal);
33
+ if (outcome.status === 'rejected')
34
+ throw outcome.reason;
35
+ return outcome.value;
31
36
  }
32
37
  }
33
38
  //# sourceMappingURL=flight.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flight.js","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,mGAAmG;AACnG,MAAM,OAAO,MAAM;IACR,MAAM,GAAG,OAAO,CAAC,aAAa,EAAK,CAAC;IACpC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAC5C,gDAAgD;IAChD,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAY,IAA4C;QACtD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CACnB,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,2EAA2E;IAC3E,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,MAA+B;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnD,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACvD,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACF"}
1
+ {"version":3,"file":"flight.js","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAErD,mGAAmG;AACnG,MAAM,OAAO,MAAM;IACjB,oHAAoH;IAC3G,MAAM,GAAG,IAAI,KAAK,EAAoC,CAAC;IACvD,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAC5C,gDAAgD;IAChD,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAY,IAA4C;QACtD,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CACvE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CACzC,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,2EAA2E;IAC3E,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,MAA+B;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnD,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,MAAM;aACb,IAAI,EAAE;aACN,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,OAAO,CAAC,MAAM,CAAC;QACxD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;CACF"}
@@ -29,7 +29,7 @@ export class SingleFlight {
29
29
  if (this.#flights.get(key) === flight)
30
30
  this.#flights.delete(key);
31
31
  };
32
- flight.ended.then(leave, leave);
32
+ void flight.ended.then(leave);
33
33
  // In the same step as the abort, so no caller joins a flight that nobody
34
34
  // waits for (Go issue 22724: a new lookup joined a cancelled one).
35
35
  flight.abandoned.addEventListener('abort', leave, { once: true });
@@ -1 +1 @@
1
- {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,uEAAuE;AACvE,MAAM,OAAO,YAAY;IACvB,mGAAmG;IAC1F,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEjD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CACP,GAAW,EACX,IAA4C,EAC5C,EAAE,MAAM,EAAE,MAAM,KAAiB,EAAE;QAEnC,qEAAqE;QACrE,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC;QACxC,IAAI,MAAM;YAAE,MAAM,EAAE,EAAE,CAAC;QACvB,uEAAuE;QACvE,yCAAyC;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,IAA4C;QAC9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,uEAAuE;AACvE,MAAM,OAAO,YAAY;IACvB,mGAAmG;IAC1F,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEjD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CACP,GAAW,EACX,IAA4C,EAC5C,EAAE,MAAM,EAAE,MAAM,KAAiB,EAAE;QAEnC,qEAAqE;QACrE,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC;QACxC,IAAI,MAAM;YAAE,MAAM,EAAE,EAAE,CAAC;QACvB,uEAAuE;QACvE,yCAAyC;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,IAA4C;QAC9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zukhruf/single-flight",
3
- "version": "0.3.14",
3
+ "version": "0.3.15",
4
4
  "description": "Callers of one key share the run already in flight, in one process or across processes, and get its outcome instead of a busy error.",
5
5
  "license": "MIT",
6
6
  "repository": {