Skip to content

Commit

Permalink
Ref: extracting helpers, organizing.
Browse files Browse the repository at this point in the history
  • Loading branch information
RobinTail committed Sep 18, 2024
1 parent 394ef96 commit 448f497
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 29 deletions.
22 changes: 22 additions & 0 deletions src/graceful-helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import http from "node:http";
import type { Socket } from "node:net";
import type { TLSSocket } from "node:tls";

export const hasResponse = (
socket: Socket,
): socket is typeof socket & { _httpMessage: http.ServerResponse } =>
"_httpMessage" in socket &&
socket._httpMessage instanceof http.ServerResponse;

export const hasHttpServer = (
socket: Socket,
): socket is typeof socket & { server: http.Server } =>
"server" in socket && socket.server instanceof http.Server;

export const isEncrypted = (socket: Socket): socket is TLSSocket =>
"encrypted" in socket &&
typeof socket.encrypted === "boolean" &&
socket.encrypted;

export const weAreClosed: http.RequestListener = ({}, res) =>
void (!res.headersSent && res.setHeader("connection", "close"));
42 changes: 13 additions & 29 deletions src/graceful-shutdown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,13 @@ import http from "node:http";
import https from "node:https";
import { setInterval } from "node:timers/promises";
import type { Socket } from "node:net";
import type { TLSSocket } from "node:tls";
import type { ActualLogger } from "./logger-helpers";

const hasResponse = (
socket: Socket,
): socket is typeof socket & { _httpMessage: http.ServerResponse } =>
"_httpMessage" in socket &&
socket._httpMessage instanceof http.ServerResponse;

const hasHttpServer = (
socket: Socket,
): socket is typeof socket & { server: http.Server } =>
"server" in socket && socket.server instanceof http.Server;

const isEncrypted = (socket: Socket): socket is TLSSocket =>
"encrypted" in socket &&
typeof socket.encrypted === "boolean" &&
socket.encrypted;

const weAreClosed: http.RequestListener = ({}, res) =>
void (!res.headersSent && res.setHeader("connection", "close"));
import {
hasHttpServer,
hasResponse,
isEncrypted,
weAreClosed,
} from "./graceful-helpers";

export const monitor = ({
server,
Expand All @@ -33,9 +19,15 @@ export const monitor = ({
timeout?: number;
logger?: ActualLogger;
}) => {
let pending: Promise<void> | undefined;
const sockets = new Set<Socket>();
const destroy = (socket: Socket) => void sockets.delete(socket.destroy());

let pending: Promise<void> | undefined;
const disconnect = (socket: Socket) =>
void (hasResponse(socket)
? !socket._httpMessage.headersSent &&
socket._httpMessage.setHeader("connection", "close")
: destroy(socket));

const watch = (socket: Socket) =>
void (pending
Expand All @@ -51,14 +43,6 @@ export const monitor = ({
void server.close((error) => (error ? reject(error) : resolve())),
);

const destroy = (socket: Socket) => void sockets.delete(socket.destroy());

const disconnect = (socket: Socket) =>
void (hasResponse(socket)
? !socket._httpMessage.headersSent &&
socket._httpMessage.setHeader("connection", "close")
: destroy(socket));

const workflow = async () => {
server.on("request", weAreClosed);
logger?.info("Graceful shutdown", { sockets: sockets.size, timeout });
Expand Down

0 comments on commit 448f497

Please sign in to comment.