apitally
Version:
Simple API monitoring & analytics for REST APIs built with Express, Fastify, NestJS, AdonisJS, Hono, H3, Elysia, Hapi, and Koa.
132 lines • 6.34 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var middleware_exports = {};
__export(middleware_exports, {
default: () => ApitallyMiddleware
});
module.exports = __toCommonJS(middleware_exports);
var import_node_perf_hooks = require("node:perf_hooks");
var import_consumerRegistry = require("../common/consumerRegistry.js");
var import_headers = require("../common/headers.js");
var import_requestLogger = require("../common/requestLogger.js");
const _ApitallyMiddleware = class _ApitallyMiddleware {
async handle(ctx, next) {
const client = await ctx.containerResolver.make("apitallyClient");
const logsContext = await ctx.containerResolver.make("apitallyLogsContext");
if (!client.isEnabled() || ctx.request.method().toUpperCase() === "OPTIONS") {
await next();
return;
}
return logsContext.run([], async () => {
var _a, _b;
const path = (_a = ctx.route) == null ? void 0 : _a.pattern;
const timestamp = Date.now() / 1e3;
const startTime = import_node_perf_hooks.performance.now();
await next();
const responseTime = import_node_perf_hooks.performance.now() - startTime;
const requestSize = (0, import_headers.parseContentLength)(ctx.request.header("content-length"));
const requestContentType = (_b = ctx.request.header("content-type")) == null ? void 0 : _b.toString();
let responseStatus = ctx.response.getStatus();
let responseHeaders = ctx.response.getHeaders();
let responseSize;
let responseContentType;
const consumer = ctx.apitallyConsumer ? (0, import_consumerRegistry.consumerFromStringOrObject)(ctx.apitallyConsumer) : null;
client.consumerRegistry.addOrUpdateConsumer(consumer);
const onWriteHead = /* @__PURE__ */ __name((statusCode, headers) => {
var _a2;
responseStatus = statusCode;
responseHeaders = headers;
responseSize = (0, import_headers.parseContentLength)(headers["content-length"]);
responseContentType = (_a2 = headers["content-type"]) == null ? void 0 : _a2.toString();
if (path) {
client.requestCounter.addRequest({
consumer: consumer == null ? void 0 : consumer.identifier,
method: ctx.request.method(),
path,
statusCode: responseStatus,
responseTime,
requestSize,
responseSize
});
if (responseStatus === 422 && ctx.apitallyError && "code" in ctx.apitallyError && "messages" in ctx.apitallyError && ctx.apitallyError.code === "E_VALIDATION_ERROR" && Array.isArray(ctx.apitallyError.messages)) {
ctx.apitallyError.messages.forEach((message) => {
client.validationErrorCounter.addValidationError({
consumer: consumer == null ? void 0 : consumer.identifier,
method: ctx.request.method(),
path,
loc: message.field,
msg: message.message,
type: message.rule
});
});
}
if (responseStatus === 500 && ctx.apitallyError) {
client.serverErrorCounter.addServerError({
consumer: consumer == null ? void 0 : consumer.identifier,
method: ctx.request.method(),
path,
type: ctx.apitallyError.name,
msg: ctx.apitallyError.message,
traceback: ctx.apitallyError.stack || ""
});
}
}
}, "onWriteHead");
const originalWriteHead = ctx.response.response.writeHead;
ctx.response.response.writeHead = (...args) => {
originalWriteHead.apply(ctx.response.response, args);
onWriteHead(args[0], typeof args[1] === "string" ? args[2] : args[1]);
return ctx.response.response;
};
if (client.requestLogger.enabled) {
const logs = logsContext.getStore();
const onEnd = /* @__PURE__ */ __name((chunk) => {
const requestBody = client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) ? ctx.request.raw() : void 0;
const responseBody = client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType) ? chunk : void 0;
client.requestLogger.logRequest({
timestamp,
method: ctx.request.method(),
path,
url: ctx.request.completeUrl(true),
headers: (0, import_requestLogger.convertHeaders)(ctx.request.headers()),
size: requestSize,
consumer: consumer == null ? void 0 : consumer.identifier,
body: requestBody ? Buffer.from(requestBody) : void 0
}, {
statusCode: responseStatus,
responseTime: responseTime / 1e3,
headers: (0, import_requestLogger.convertHeaders)(responseHeaders),
size: responseSize,
body: responseBody ? Buffer.from(responseBody) : void 0
}, ctx.apitallyError, logs);
}, "onEnd");
const originalEnd = ctx.response.response.end;
ctx.response.response.end = (...args) => {
originalEnd.apply(ctx.response.response, args);
onEnd(typeof args[0] !== "function" ? args[0] : void 0);
return ctx.response.response;
};
}
});
}
};
__name(_ApitallyMiddleware, "ApitallyMiddleware");
let ApitallyMiddleware = _ApitallyMiddleware;
//# sourceMappingURL=middleware.cjs.map