req-disconnect-signal
v1.0.0
Published
Tiny AbortSignal adapters for HTTP request disconnects.
Downloads
14
Maintainers
Readme
req-disconnect-signal
Tiny AbortSignal adapters for HTTP request disconnects.
Cancel background tasks (like database queries or downstream API calls) when a client closes their browser, navigates away, or loses connection before the response finishes.
Install
npm install req-disconnect-signal[!NOTE] Requires Node.js 18.17+
Usage
Plain Node HTTP
import http from 'node:http';
import { disconnectSignal } from 'req-disconnect-signal';
http.createServer(async (req, res) => {
const signal = disconnectSignal(req, res);
try {
const result = await doWork({ signal });
res.setHeader('content-type', 'application/json');
res.end(JSON.stringify(result));
} catch (error) {
if (signal.aborted) return;
res.statusCode = 500;
res.end('internal error');
}
});Express
import express from 'express';
import { express as requestDisconnectSignal } from 'req-disconnect-signal';
const app = express();
app.use(requestDisconnectSignal());
app.get('/search', async (req, res) => {
const result = await runSearch({ signal: req.signal });
res.json(result);
});Fastify
import Fastify from 'fastify';
import { fastify as requestDisconnectSignal } from 'req-disconnect-signal';
const app = Fastify();
app.addHook('onRequest', requestDisconnectSignal());
app.get('/search', async (request) => {
return runSearch({ signal: request.signal });
});Koa
import Koa from 'koa';
import { koa as requestDisconnectSignal } from 'req-disconnect-signal';
const app = new Koa();
app.use(requestDisconnectSignal());
app.use(async (ctx) => {
ctx.body = await runSearch({ signal: ctx.signal });
});API
disconnectSignal(req, res?)
Returns an AbortSignal that triggers when the response closes before finishing.
(Note: If Node eventually ships a native req.signal, this package will reuse it if present.)
express(options?)
Express middleware. Exposes the signal on req.signal.
fastify(options?)
Fastify hook. Exposes the signal on request.signal.
koa(options?)
Koa middleware. Exposes the signal on ctx.signal, ctx.req.signal, and ctx.request.signal.
Options
All framework adapters accept an options object to customize the property name:
// Exposes the signal as req.abortSignal instead of req.signal
app.use(requestDisconnectSignal({ property: 'abortSignal' }));Notes
- Normal, successful request completion does not abort the signal.
- Ships with both ESM and CommonJS exports.
- Zero dependencies.
License
MIT
