AbortController Polyfill for Node.JS based on EventEmitter for Node v14 and below.
Are you using Node 16 or above? You don't need this! Node has AbortController
and AbortSignal
as builtin globals
import fetch from "node-fetch";
import { AbortController } from "node-abort-controller";
const controller = new AbortController();
const signal = controller.signal;
await fetch("https:/www.google.com", { signal });
// Abort fetch after 500ms. Effectively a timeout
setTimeout(() => controller.abort(), 500);
import { AbortController } from "node-abort-controller";
import fetch from "node-fetch";
const fetchWithTimeout = async (url = "") => {
const controller = new AbortController();
const { signal } = controller;
const timeout = setTimeout(() => {
controller.abort();
}, 5000);
const request = await fetch(url, { signal });
clearTimeout(timeout);
const result = await req.json();
return result;
};
You might not need to! Generally speaking, there are three environments your JavaScript code can run in:
- Node
- Modern Browsers (Not Internet Explorer)
- Legacy Browsers (Mostly Internet Explorer)
For modern JS APIs, each environment would ideally get a polyfill:
- only if it needs one
- specific to the platform.
In practice, this is hard. Tooling such as webpack and browserify are great at making sure stuff works out of the box in all environments. But it is quite easy to fail on both points above. In all likelyhood, you end up shipping less than ideal polyfills on platforms that don't even need them. So what is a developer to do? In the case of fetch
and AbortController
I've done the work for you. This is a guide to that work.
If you are building a ...
You don't need this library! AbortController
is now built into nodeJS . Use that instead.
You don't need a library! Close this tab. Uninstall this package.
Use this package and node-fetch. It is minimally what you need.
Use abort-controller and whatwg-fetch. These are more complete polyfills that will work in all browser environments.
Use abort-controller and cross-fetch. Same as above, except cross-fetch will polyfill correctly in both the browser and node.js
Use this package and node-fetch. It is the smallest and least opinionated combination for your end users. Application developers targeting Internet Exploer will need to polyfill AbortController
and fetch
on their own. But your library won't be forcing unecessary polyfills on developers who only target modern browsers.
With the above guide in mind, this library has a very specific set of goals:
- Provide a minimal polyfill in node.js
- Do not provide a polyfill in any browser environment
This is the ideal for library authors who use fetch
and AbortController
internally and target both browser and node developers.
Thank you @mysticatea for https://github.com/mysticatea/abort-controller. It is a fantastic AbortController
polyfill and ideal for many use cases.