Added response events to the server

This commit is contained in:
WoLfulus
2020-10-17 13:26:24 -03:00
parent a74e0b72a8
commit 13285ff522
2 changed files with 86 additions and 2 deletions

View File

@@ -1,12 +1,76 @@
import logger from './logger';
import * as http from 'http';
import * as https from 'https';
import qs from 'qs';
import { URL } from 'url';
import { createTerminus, TerminusOptions } from '@godaddy/terminus';
import http from 'http';
import { Request } from 'express';
import logger from './logger';
import emitter from './emitter';
import database from './database';
import app from './app';
const server = http.createServer(app);
server.on('request', function(req: http.IncomingMessage & Request, res: http.ServerResponse) {
const startTime = process.hrtime();
const complete = once(function(finished: boolean) {
const elapsedTime = process.hrtime(startTime);
const elapsedNanoseconds = (elapsedTime[0] * 1e9) + elapsedTime[1];
const elapsedMilliseconds = elapsedNanoseconds / 1e6;
const previousIn = req.connection._metrics?.in || 0;
const previousOut = req.connection._metrics?.out || 0;
const metrics = {
in: req.connection.bytesRead - previousIn,
out: req.connection.bytesWritten - previousOut,
};
req.connection._metrics = {
in: req.connection.bytesRead,
out: req.connection.bytesWritten,
};
// Compatibility when supporting serving with certificates
let protocol = 'http';
if (server instanceof https.Server) {
protocol = 'https';
}
const url = new URL((req.originalUrl || req.url) as string, `${protocol}://${req.headers.host}`);
const query = url.search.startsWith('?') ? url.search.substr(1) : url.search;
const info = {
finished,
request: {
aborted: req.aborted,
completed: req.complete,
method: req.method,
uri: url.pathname,
url: url.href,
size: metrics.in,
query: qs.parse(query),
headers: req.headers,
},
response: {
status: res.statusCode,
size: metrics.out,
headers: res.getHeaders(),
},
ip: req.headers['x-forwarded-for'] || req.connection?.remoteAddress || req.socket?.remoteAddress,
duration: elapsedMilliseconds.toFixed(),
};
emitter.emitAsync('response', info).catch((err) => logger.warn(err));
});
res.once('finish', complete.bind(null, true));
res.once('close', complete.bind(null, false));
});
const terminusOptions: TerminusOptions = {
timeout: 1000,
signals: ['SIGINT', 'SIGTERM', 'SIGHUP'],
@@ -19,6 +83,17 @@ createTerminus(server, terminusOptions);
export default server;
function once(callback: Function): Function {
let triggered = false;
return function() {
if (triggered) {
return;
}
triggered = true;
callback(...arguments);
};
}
async function beforeShutdown() {
await emitter.emitAsync('server.stop.before', { server });

9
api/src/shims.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
declare module "http" {
}
declare module "net" {
interface Socket {
_metrics: any;
}
}