@apollo/server
Version:
Core engine for Apollo GraphQL server
54 lines • 2.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Stopper = void 0;
const https_1 = __importDefault(require("https"));
class Stopper {
server;
requestCountPerSocket = new Map();
stopped = false;
constructor(server) {
this.server = server;
server.on(server instanceof https_1.default.Server ? 'secureConnection' : 'connection', (socket) => {
this.requestCountPerSocket.set(socket, 0);
socket.once('close', () => this.requestCountPerSocket.delete(socket));
});
server.on('request', (req, res) => {
this.requestCountPerSocket.set(req.socket, (this.requestCountPerSocket.get(req.socket) ?? 0) + 1);
res.once('finish', () => {
const pending = (this.requestCountPerSocket.get(req.socket) ?? 0) - 1;
this.requestCountPerSocket.set(req.socket, pending);
if (this.stopped && pending === 0) {
req.socket.end();
}
});
});
}
async stop(hardDestroyAbortSignal) {
let gracefully = true;
await new Promise((resolve) => setImmediate(resolve));
this.stopped = true;
const onAbort = () => {
gracefully = false;
this.requestCountPerSocket.forEach((_, socket) => socket.end());
setImmediate(() => {
this.requestCountPerSocket.forEach((_, socket) => socket.destroy());
});
};
hardDestroyAbortSignal?.addEventListener('abort', onAbort);
const closePromise = new Promise((resolve) => this.server.close(() => {
hardDestroyAbortSignal?.removeEventListener('abort', onAbort);
resolve();
}));
this.requestCountPerSocket.forEach((requests, socket) => {
if (requests === 0)
socket.end();
});
await closePromise;
return gracefully;
}
}
exports.Stopper = Stopper;
//# sourceMappingURL=stoppable.js.map