# @jsenv/abort

> Help to write code compatible with abort signals

Latest version **4.3.1** (published 2025-03-11) · MIT license · 0 weekly downloads

## Install

```sh
npm install @jsenv/abort
pnpm add @jsenv/abort
yarn add @jsenv/abort
bun add @jsenv/abort
```

## Health

**Score 45/100 (D)** — status: stable.

Positive: esm support; no vulnerabilities; high maintenance score.

Warnings: low downloads; no types.

Negative: stale.

## Facts

| | |
|---|---|
| Version | 4.3.1 |
| Published | 2025-03-11 |
| First published | 2021-11-01 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM |
| Node | >=16.14.0 |
| Dependencies | 0 |
| Unpacked size | 18.5 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 36 |
| Author | dmail |
| Maintainers | jsenv-admin, dmail |

## Links

- npm: https://www.npmjs.com/package/@jsenv/abort
- Repository: https://github.com/jsenv/core
- Homepage: https://github.com/jsenv/core#readme
- Issues: https://github.com/jsenv/core/issues
- npm.io page: https://npm.io/package/@jsenv/abort

## Recent versions

- 4.3.1 (latest) — 2025-03-11
- 4.3.0 — 2024-01-12
- 4.2.4 — 2022-08-04
- 4.2.3 — 2022-06-21
- 4.2.2 — 2022-06-17
- 4.1.2 — 2021-12-03
- 4.1.1 — 2021-11-08
- 4.1.0 — 2021-11-08
- 4.0.0 — 2021-11-04
- 3.1.2 — 2021-11-03
- 3.1.1 — 2021-11-03
- 3.1.0 — 2021-11-03
- 3.0.0 — 2021-11-03
- 2.1.2 — 2021-11-02
- 2.1.1 — 2021-11-02
- … 4 more at https://npm.io/package/@jsenv/abort/versions

## README

# Abort [![npm package](https://img.shields.io/npm/v/@jsenv/abort.svg?logo=npm&label=package)](https://www.npmjs.com/package/@jsenv/abort)

Help to write code accepting an [abortSignal](https://nodejs.org/api/globals.html#class-abortsignal).

- Designed to cleanup by default (removing event listeners, clearing timeouts, ...)
- Allow to safely bypass max listeners warning when needed
  - Code can do 20 abortable fetch requests in parallel without warnings
- Manage multiple abort signals
  - Compose abort signals from multiple sources
  - Code can do differents things depending on which signal aborted the operation

# Example

_fetch_demo.mjs_

```js
import { customFetch } from "./fetch_custom.mjs";

const abortController = new AbortController();
const signal = abortController.signal;
process.on("warning", () => {
  abortController.abort();
});
await customFetch("http://example.com", { signal });
```

Code above pass an abort signal to `customFetch`.

Let's see how `"@jsenv/abort"` helps to manage the signal received.

_fetch_custom.mjs_

```js
import { Abort } from "@jsenv/abort"

export const customFetch = (
  url,
  { signal = new AbortController().signal } = {},
) => {
  // create an operation
  const fetchOperation = Abort.startOperation()

  // abort according to signal received in param
  fetchOperation.addAbortSignal(signal)

  // also abort on SIGINT
  const SIGINTAbortSource = fetchOperation.addAbortSource((abort) => {
    process.on("SIGINT", abort)
    return () => {
      process.removeListener("SIGINT", abort)
    }
  })

  // also abort after 5s
  const timeoutAbortSource = fetchOperation.timeout(5000)

  try {
    const response = await fetch(url, { signal: fetchOperation.signal })
    return response
  } catch (e) {
    if (Abort.isAbortError(e)) {
      if (SIGINTAbortSource.signal.aborted) {
        // aborted by SIGINT
      }
      if (timeoutAbortSource.signal.aborted) {
        // aborted by timeout
      }
      if (signal.aborted) {
        // aborted from outside
      }
    }
    throw e
  } finally {
    await fetchOperation.end()
  }
}
```

---
_Source: https://npm.io/package/@jsenv/abort · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
