console/scripts/templates/runify-next.ts
2023-08-03 11:58:21 +00:00

74 lines
1.9 KiB
JavaScript

#!/usr/bin/env node
process.on('SIGTERM', () => process.exit(0));
process.on('SIGINT', () => process.exit(0));
const { createServer } = require('node:http');
const { randomUUID } = require('node:crypto');
const { AsyncLocalStorage } = require('node:async_hooks');
const { parse } = require('node:url');
const next = require('next');
const requestIdAsyncLocalStorage = new AsyncLocalStorage();
const loggerHandler = require('pino-http')({
redact: ['headers', 'req.headers', 'res.headers'],
quietReqLogger: true,
autoLogging: {
ignore(req) {
const isHealthCheck = req.url.startsWith('/api/health');
if (isHealthCheck) {
return true;
}
const isApi = req.url.startsWith('/api');
const isAuth = req.url.startsWith('/auth');
return !isApi && !isAuth;
},
},
genReqId(req, res) {
const existingID = req.id ?? req.headers['x-request-id'];
if (existingID) {
return existingID;
}
const id = 'gen-' + randomUUID();
res.setHeader('x-request-id', id);
return id;
},
mixin() {
const reqId = requestIdAsyncLocalStorage.getStore();
if (reqId) {
return { reqId };
}
return {};
},
});
const logger = loggerHandler.logger;
// server-logger.ts will reuse this logger instance
globalThis.logger = logger;
// <-- additionalRequire -->
const port = parseInt(process.env.PORT);
const hostname = '0.0.0.0';
const app = next({ dev: false, hostname, conf: {}, port, dir: __dirname });
const handle = app.getRequestHandler();
app
.prepare()
.then(() => {
createServer((req, res) => {
loggerHandler(req, res);
const parsedUrl = parse(req.url, true);
requestIdAsyncLocalStorage.run(req.id, () => {
handle(req, res, parsedUrl);
});
}).listen(port);
logger.info(`Server listening at http://${hostname}:${port}`);
})
.catch(error => {
logger.error(error);
process.exit(1);
});