Abort
Help to write code accepting an abortSignal.
- API cleanup things 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
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
import { Abort } from "@jsenv/abort"
export const customFetch = (
url,
{ signal = new AbortController().signal } = {},
) => {
const fetchOperation = Abort.startOperation()
fetchOperation.addAbortSignal(signal)
const SIGINTAbortSource = fetchOperation.addAbortSource((abort) => {
process.on("SIGINT", abort)
return () => {
process.removeListener("SIGINT", abort)
}
})
const timeoutAbortSource = fetchOperation.timeout(5000)
try {
const response = await fetch(url, { signal: fetchOperation.signal })
await fetchOperation.end()
return response
} catch (e) {
if (Abort.isAbortError(e)) {
if (SIGINTAbortSource.signal.aborted) {
}
if (timeoutAbortSource.signal.aborted) {
}
if (signal.aborted) {
}
}
throw e
}
}
Installation
npm install @jsenv/abort