57 lines
2.4 KiB
JavaScript
57 lines
2.4 KiB
JavaScript
import { a as green, i as gray, n as bold, s as red } from "./_utils.mjs";
|
|
function wrapFetch(server) {
|
|
const fetchHandler = server.options.fetch;
|
|
const middleware = server.options.middleware || [];
|
|
return middleware.length === 0 ? fetchHandler : (request) => callMiddleware(request, fetchHandler, middleware, 0);
|
|
}
|
|
function callMiddleware(request, fetchHandler, middleware, index) {
|
|
if (index === middleware.length) return fetchHandler(request);
|
|
return middleware[index](request, () => callMiddleware(request, fetchHandler, middleware, index + 1));
|
|
}
|
|
const errorPlugin = (server) => {
|
|
const errorHandler = server.options.error;
|
|
if (!errorHandler) return;
|
|
server.options.middleware.unshift((_req, next) => {
|
|
try {
|
|
const res = next();
|
|
return res instanceof Promise ? res.catch((error) => errorHandler(error)) : res;
|
|
} catch (error) {
|
|
return errorHandler(error);
|
|
}
|
|
});
|
|
};
|
|
const gracefulShutdownPlugin = (server) => {
|
|
const config = server.options?.gracefulShutdown;
|
|
if (!globalThis.process?.on || config === false || config === void 0 && (process.env.CI || process.env.TEST)) return;
|
|
const gracefulTimeout = config === true || !config?.gracefulTimeout ? Number.parseInt(process.env.SERVER_SHUTDOWN_TIMEOUT || "") || 5 : config.gracefulTimeout;
|
|
let isClosing = false;
|
|
let isClosed = false;
|
|
const w = server.options.silent ? () => {} : process.stderr.write.bind(process.stderr);
|
|
const forceClose = async () => {
|
|
if (isClosed) return;
|
|
w(red("\x1B[2K\rForcibly closing connections...\n"));
|
|
isClosed = true;
|
|
await server.close(true);
|
|
};
|
|
const shutdown = async () => {
|
|
if (isClosing || isClosed) return;
|
|
setTimeout(() => {
|
|
globalThis.process.once("SIGINT", forceClose);
|
|
}, 100);
|
|
isClosing = true;
|
|
const closePromise = server.close();
|
|
for (let remaining = gracefulTimeout; remaining > 0; remaining--) {
|
|
w(gray(`\rStopping server gracefully (${remaining}s)... Press ${bold("Ctrl+C")} again to force close.`));
|
|
if (await Promise.race([closePromise.then(() => true), new Promise((r) => setTimeout(() => r(false), 1e3))])) {
|
|
w("\x1B[2K\r" + green("Server closed successfully.\n"));
|
|
isClosed = true;
|
|
return;
|
|
}
|
|
}
|
|
w("\x1B[2K\rGraceful shutdown timed out.\n");
|
|
await forceClose();
|
|
};
|
|
for (const sig of ["SIGINT", "SIGTERM"]) globalThis.process.on(sig, shutdown);
|
|
};
|
|
export { gracefulShutdownPlugin as n, wrapFetch as r, errorPlugin as t };
|