UNPKG

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
"use strict"; 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