UNPKG

1.18 kBJavaScriptView Raw
1const teardownAbort = (token, map) => {
2 if (!token) {
3 return;
4 }
5
6 const val = map.get(token);
7 if (!val || --val.count) {
8 return;
9 }
10 map.delete(token);
11};
12
13const setupAbort = ({ abortToken, signal }, controller, map) => {
14 // if there is no token or signal, use Flighty abortController
15 if (!abortToken && !signal) {
16 return controller.signal;
17 }
18
19 // otherwise, use an abortController local to this request
20 let abortController = new AbortController();
21 if (abortToken) {
22 // allow to use a single token to cancel multiple requests
23 const mapValue = map.get(abortToken) || {
24 controller: abortController,
25 count: 0
26 };
27
28 mapValue.count++;
29 map.set(abortToken, mapValue);
30 abortController = mapValue.controller;
31 }
32
33 // the user has defined their own signal. We won't use it directly, but we'll listen to it
34 if (signal) {
35 signal.addEventListener("abort", () => abortController.abort());
36 }
37
38 // when the Flighty abortController aborts, also abort this request
39 controller.signal.addEventListener("abort", () => abortController.abort());
40 return abortController.signal;
41};
42
43export { setupAbort, teardownAbort };