Socket
Socket
Sign inDemoInstall

node-abort-controller

Package Overview
Dependencies
0
Maintainers
2
Versions
13
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    node-abort-controller

AbortController for Node based on EventEmitter


Version published
Weekly downloads
9.7M
increased by0.68%
Maintainers
2
Install size
16.5 kB
Created
Weekly downloads
 

Package description

What is node-abort-controller?

The node-abort-controller package is an implementation of the AbortController interface, which provides a way to abort one or more Web requests as and when desired. It is commonly used to cancel fetch requests or other asynchronous tasks that can be aborted.

What are node-abort-controller's main functionalities?

Creating an AbortController instance

This feature allows you to create a new instance of AbortController. You can then use the 'signal' property to pass the abort signal to functions that accept it.

const AbortController = require('node-abort-controller');
const controller = new AbortController();
const { signal } = controller;

Aborting a fetch request

This code sample demonstrates how to use the AbortController to abort an ongoing fetch request. The fetch request is initiated with the abort signal, and if the request is aborted, it will throw an 'AbortError'.

const fetch = require('node-fetch');
const controller = new AbortController();
const { signal } = controller;

fetch('https://example.com', { signal })
  .then(response => response.json())
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Fetch aborted');
    } else {
      console.error('Fetch error:', err);
    }
  });

// Abort the request
controller.abort();

Using AbortController with async/await

This example shows how to use AbortController with async/await syntax. A fetch request is made, and if it is not completed within 5 seconds, the AbortController is used to abort the request.

const fetch = require('node-fetch');
const AbortController = require('node-abort-controller');

async function fetchData(url) {
  const controller = new AbortController();
  const { signal } = controller;
  setTimeout(() => controller.abort(), 5000); // Abort after 5 seconds

  try {
    const response = await fetch(url, { signal });
    return await response.json();
  } catch (err) {
    if (err.name === 'AbortError') {
      console.log('Fetch aborted');
    } else {
      throw err;
    }
  }
}

fetchData('https://example.com').catch(console.error);

Other packages similar to node-abort-controller

Readme

Source

node-abort-controller

AbortController Polyfill for Node.JS based on EventEmitter for Node v14.6.x and below.

Are you using Node 14.7.0 or above? You don't need this! Node has AbortController and AbortSignal as builtin globals. In Node versions >=14.7.0 and <15.4.0 you can access the experimental implementation using --experimental-abortcontroller.

Example Usage

Timing out fetch

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);

Re-usable fetch function with a built in timeout

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;
};

Why would I need this?

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 ...

NodeJS library only supports Node 16 or above

You don't need this library! AbortController is now built into nodeJS . Use that instead.

Web Application running only in modern browsers

You don't need a library! Close this tab. Uninstall this package.

Web Application running in modern browsers AND NodeJS (such as a server side rendered JS app)

Use this package and node-fetch. It is minimally what you need.

Web Application supporting legacy browsers AND NOT NodeJS

Use abort-controller and whatwg-fetch. These are more complete polyfills that will work in all browser environments.

Web Application supporting legacy browsers AND NodeJS

Use abort-controller and cross-fetch. Same as above, except cross-fetch will polyfill correctly in both the browser and node.js

NodeJS Library being consumed by other applications and using fetch internally

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.

Goals

With the above guide in mind, this library has a very specific set of goals:

  1. Provide a minimal polyfill in node.js
  2. 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.

Prior Art

Thank you @mysticatea for https://github.com/mysticatea/abort-controller. It is a fantastic AbortController polyfill and ideal for many use cases.

Keywords

FAQs

Last updated on 26 Jan 2023

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc