flighty
Version:
Fetch wrapper. Polyfills optional. Aborts, retries, intercepts all in 5kb
48 lines (40 loc) • 1.26 kB
JavaScript
const teardownAbort = (token, map) => {
if (!token) {
return;
}
const val = map.get(token);
if (!val || --val.count) {
return;
}
map.delete(token);
};
const setupAbort = ({ abortToken, signal }, controller, map) => {
// if there is no token or signal, use Flighty abortController
if (!abortToken && !signal) {
return controller.signal;
}
// otherwise, use an abortController local to this request
let abortController = new AbortController();
if (abortToken) {
// allow to use a single token to cancel multiple requests
const mapValue = map.get(abortToken) || {
controller: abortController,
count: 0,
};
mapValue.count++;
map.set(abortToken, mapValue);
abortController = mapValue.controller;
}
// the user has defined their own signal. We won't use it directly, but we'll listen to it
if (signal) {
if (signal.aborted) {
abortController.abort();
} else {
signal.addEventListener('abort', () => abortController.abort());
}
}
// when the Flighty abortController aborts, also abort this request
controller.signal.addEventListener('abort', () => abortController.abort());
return abortController.signal;
};
export { setupAbort, teardownAbort };