{"version":3,"sources":["../../src/elysia/plugin.ts"],"sourcesContent":["import { Context, Elysia, StatusMap, ValidationError } from \"elysia\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { ApitallyClient } from \"../common/client.js\";\nimport { consumerFromStringOrObject } from \"../common/consumerRegistry.js\";\nimport { parseContentLength } from \"../common/headers.js\";\nimport type { LogRecord } from \"../common/requestLogger.js\";\nimport { convertHeaders } from \"../common/requestLogger.js\";\nimport { CapturedResponse, captureResponse } from \"../common/response.js\";\nimport type { SpanHandle } from \"../common/spanCollector.js\";\nimport { ApitallyConfig, ApitallyConsumer } from \"../common/types.js\";\nimport { patchConsole, patchWinston } from \"../loggers/index.js\";\nimport { getAppInfo } from \"./utils.js\";\n\nconst START_TIME_SYMBOL = Symbol(\"apitally.startTime\");\nconst REQUEST_BODY_SYMBOL = Symbol(\"apitally.requestBody\");\nconst RESPONSE_SYMBOL = Symbol(\"apitally.response\");\nconst RESPONSE_PROMISE_SYMBOL = Symbol(\"apitally.responsePromise\");\nconst ERROR_SYMBOL = Symbol(\"apitally.error\");\nconst CLIENT_SYMBOL = Symbol(\"apitally.client\");\nconst REQUEST_SYMBOL = Symbol(\"apitally.request\");\nconst SPAN_HANDLE_SYMBOL = Symbol(\"apitally.spanHandle\");\n\ndeclare global {\n  interface Request {\n    [START_TIME_SYMBOL]?: number;\n    [REQUEST_BODY_SYMBOL]?: Buffer;\n    [RESPONSE_SYMBOL]?: Response;\n    [RESPONSE_PROMISE_SYMBOL]?: Promise<CapturedResponse>;\n    [ERROR_SYMBOL]?: Readonly<Error>;\n    [CLIENT_SYMBOL]?: ApitallyClient;\n    [SPAN_HANDLE_SYMBOL]?: SpanHandle;\n  }\n}\n\ntype ContextSet = Context[\"set\"] & {\n  [REQUEST_SYMBOL]?: Request;\n};\n\ninterface ApitallyContext {\n  consumer?: ApitallyConsumer | string;\n}\n\nexport default function apitallyPlugin(config: ApitallyConfig) {\n  const client = new ApitallyClient(config);\n  const logsContext = new AsyncLocalStorage<LogRecord[]>();\n\n  if (client.requestLogger.enabled && client.requestLogger.config.captureLogs) {\n    patchConsole(logsContext);\n    patchWinston(logsContext);\n  }\n\n  return (app: Elysia) => {\n    const handler = app[\"~adapter\"].handler;\n\n    if (!handler.mapResponse.name.startsWith(\"wrapped\")) {\n      const originalMapResponse = handler.mapResponse;\n      const originalMapCompactResponse = handler.mapCompactResponse;\n      const originalMapEarlyResponse = handler.mapEarlyResponse;\n\n      const captureMappedResponse = (\n        originalResponse: unknown,\n        mappedResponse: unknown,\n        set?: ContextSet,\n      ) => {\n        const request = set?.[REQUEST_SYMBOL];\n        if (\n          request instanceof Request &&\n          mappedResponse instanceof Response &&\n          !(RESPONSE_SYMBOL in request) &&\n          CLIENT_SYMBOL in request\n        ) {\n          if (typeof originalResponse === \"string\") {\n            // Preserve the response body value as Blob if the original response is a string,\n            // so that Bun adds a Content-Type header.\n            const responseBody = Buffer.from(originalResponse as string);\n            request[RESPONSE_SYMBOL] = mappedResponse;\n            request[RESPONSE_PROMISE_SYMBOL] = Promise.resolve({\n              body: responseBody,\n              size: responseBody.length,\n              completed: true,\n            });\n          } else {\n            // Otherwise capture the response using streaming\n            const client = request[CLIENT_SYMBOL]!;\n            const [newResponse, responsePromise] = captureResponse(\n              mappedResponse,\n              {\n                captureBody:\n                  client.requestLogger.enabled &&\n                  client.requestLogger.config.logResponseBody,\n                maxBodySize: client.requestLogger.maxBodySize,\n              },\n            );\n            request[RESPONSE_SYMBOL] = newResponse;\n            request[RESPONSE_PROMISE_SYMBOL] = responsePromise;\n            return newResponse;\n          }\n        }\n        return mappedResponse;\n      };\n\n      handler.mapResponse = function wrappedMapResponse(\n        response: unknown,\n        set: ContextSet,\n      ) {\n        const mappedResponse = originalMapResponse(response, set);\n        const newResponse = captureMappedResponse(\n          response,\n          mappedResponse,\n          set,\n        );\n        return newResponse;\n      };\n      handler.mapCompactResponse = function wrappedMapCompactResponse(\n        response: unknown,\n      ) {\n        const mappedResponse = originalMapCompactResponse(response);\n        const newResponse = captureMappedResponse(\n          response,\n          mappedResponse,\n          undefined,\n        );\n        return newResponse;\n      };\n      handler.mapEarlyResponse = function wrappedMapEarlyResponse(\n        response: unknown,\n        set: ContextSet,\n      ) {\n        const mappedResponse = originalMapEarlyResponse(response, set);\n        const newResponse = captureMappedResponse(\n          response,\n          mappedResponse,\n          set,\n        );\n        return newResponse;\n      };\n    }\n\n    return app\n      .decorate(\"apitally\", {} as ApitallyContext)\n      .onStart(() => {\n        const appInfo = getAppInfo(app, config.appVersion);\n        client.setStartupData(appInfo);\n        client.startSync();\n      })\n      .onStop(async () => {\n        await client.handleShutdown();\n      })\n      .onRequest(async ({ request, set }) => {\n        if (!client.isEnabled() || request.method.toUpperCase() === \"OPTIONS\") {\n          return;\n        }\n\n        request[CLIENT_SYMBOL] = client;\n        request[START_TIME_SYMBOL] = performance.now();\n        (set as ContextSet)[REQUEST_SYMBOL] = request;\n        logsContext.enterWith([]);\n\n        // Start span and enter the context for subsequent handlers\n        const spanHandle = client.spanCollector.startSpan();\n        request[SPAN_HANDLE_SYMBOL] = spanHandle;\n        spanHandle.enterContext();\n\n        // Capture request body\n        if (\n          client.requestLogger.enabled &&\n          client.requestLogger.config.logRequestBody\n        ) {\n          const contentType = request.headers.get(\"content-type\");\n          const requestSize =\n            parseContentLength(request.headers.get(\"content-length\")) ?? 0;\n\n          if (\n            client.requestLogger.isSupportedContentType(contentType) &&\n            requestSize <= client.requestLogger.maxBodySize\n          ) {\n            try {\n              request[REQUEST_BODY_SYMBOL] = Buffer.from(\n                await request.clone().arrayBuffer(),\n              );\n            } catch (error) {\n              // ignore\n            }\n          }\n        }\n      })\n      .onAfterResponse(async ({ request, set, route, apitally }) => {\n        if (!client.isEnabled() || request.method.toUpperCase() === \"OPTIONS\") {\n          return;\n        }\n\n        const startTime = request[START_TIME_SYMBOL];\n        const responseTime = startTime ? performance.now() - startTime : 0;\n\n        const spanHandle = request[SPAN_HANDLE_SYMBOL];\n        spanHandle?.setName(`${request.method} ${route}`);\n        const spans = spanHandle?.end();\n        const traceId = spanHandle?.traceId;\n\n        const requestBody = request[REQUEST_BODY_SYMBOL];\n        const requestSize =\n          parseContentLength(request.headers.get(\"content-length\")) ??\n          requestBody?.length;\n\n        let responsePromise = request[RESPONSE_PROMISE_SYMBOL];\n        let response = request[RESPONSE_SYMBOL];\n        const error = request[ERROR_SYMBOL];\n\n        if (\n          !response &&\n          error &&\n          \"toResponse\" in error &&\n          typeof error.toResponse === \"function\"\n        ) {\n          // Convert error to response\n          try {\n            response = error.toResponse() as Response;\n            const errorResponseBody = Buffer.from(await response.arrayBuffer());\n            responsePromise = Promise.resolve({\n              body: errorResponseBody,\n              size: errorResponseBody.length,\n              completed: true,\n            });\n          } catch (error) {\n            // ignore\n          }\n        }\n\n        const statusCode = response?.status ?? getStatusCode(set) ?? 200;\n\n        if (!response) {\n          // Create empty fake response for errors without the toResponse method\n          response = new Response(null, {\n            status: statusCode,\n            statusText: \"\",\n            headers: new Headers(),\n          });\n          responsePromise = Promise.resolve({\n            body: undefined,\n            size: 0,\n            completed: true,\n          });\n        }\n\n        const consumer = apitally.consumer\n          ? consumerFromStringOrObject(apitally.consumer)\n          : null;\n        client.consumerRegistry.addOrUpdateConsumer(consumer);\n\n        // Log request when response has been fully captured\n        responsePromise?.then(async (capturedResponse) => {\n          const responseHeaders = response?.headers ?? set.headers;\n          const responseSize = capturedResponse.completed\n            ? capturedResponse.size\n            : undefined;\n\n          client.requestCounter.addRequest({\n            consumer: consumer?.identifier,\n            method: request.method,\n            path: route,\n            statusCode,\n            responseTime,\n            requestSize,\n            responseSize,\n          });\n\n          if (client.requestLogger.enabled) {\n            const logs = logsContext.getStore();\n            client.requestLogger.logRequest(\n              {\n                timestamp: (Date.now() - responseTime) / 1000,\n                method: request.method,\n                path: route,\n                url: request.url,\n                headers: convertHeaders(\n                  Object.fromEntries(request.headers.entries()),\n                ),\n                size: requestSize,\n                consumer: consumer?.identifier,\n                body: requestBody,\n              },\n              {\n                statusCode,\n                responseTime: responseTime / 1000,\n                headers: convertHeaders(responseHeaders),\n                size: responseSize,\n                body: capturedResponse.body,\n              },\n              error,\n              logs,\n              spans,\n              traceId,\n            );\n          }\n        });\n\n        // Handle validation errors\n        if (\n          (statusCode === 400 || statusCode === 422) &&\n          error instanceof ValidationError\n        ) {\n          try {\n            const parsedMessage = JSON.parse(error.message);\n            client.validationErrorCounter.addValidationError({\n              consumer: consumer?.identifier,\n              method: request.method,\n              path: route,\n              loc:\n                (parsedMessage.on ?? \"\") + \".\" + (parsedMessage.property ?? \"\"),\n              msg: parsedMessage.message,\n              type: \"\",\n            });\n          } catch (error) {\n            // ignore\n          }\n        }\n\n        // Handle server errors\n        if (statusCode === 500 && error) {\n          client.serverErrorCounter.addServerError({\n            consumer: consumer?.identifier,\n            method: request.method,\n            path: route,\n            type: error.name,\n            msg: error.message,\n            traceback: error.stack || \"\",\n          });\n        }\n      })\n      .onError(({ request, error }) => {\n        if (client.isEnabled() && error instanceof Error) {\n          request[ERROR_SYMBOL] = error;\n        }\n      });\n  };\n}\n\nfunction getStatusCode(set: Context[\"set\"]) {\n  if (typeof set.status === \"number\") {\n    return set.status;\n  } else if (typeof set.status === \"string\") {\n    return StatusMap[set.status];\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,oBAA4D;AAC5D,8BAAkC;AAClC,6BAA4B;AAE5B,oBAA+B;AAC/B,8BAA2C;AAC3C,qBAAmC;AAEnC,2BAA+B;AAC/B,sBAAkD;AAGlD,qBAA2C;AAC3C,mBAA2B;AAE3B,MAAMA,oBAAoBC,uBAAO,oBAAA;AACjC,MAAMC,sBAAsBD,uBAAO,sBAAA;AACnC,MAAME,kBAAkBF,uBAAO,mBAAA;AAC/B,MAAMG,0BAA0BH,uBAAO,0BAAA;AACvC,MAAMI,eAAeJ,uBAAO,gBAAA;AAC5B,MAAMK,gBAAgBL,uBAAO,iBAAA;AAC7B,MAAMM,iBAAiBN,uBAAO,kBAAA;AAC9B,MAAMO,qBAAqBP,uBAAO,qBAAA;AAsBnB,SAAf,eAAuCQ,QAAsB;AAC3D,QAAMC,SAAS,IAAIC,6BAAeF,MAAAA;AAClC,QAAMG,cAAc,IAAIC,0CAAAA;AAExB,MAAIH,OAAOI,cAAcC,WAAWL,OAAOI,cAAcL,OAAOO,aAAa;AAC3EC,qCAAaL,WAAAA;AACbM,qCAAaN,WAAAA;EACf;AAEA,SAAO,CAACO,QAAAA;AACN,UAAMC,UAAUD,IAAI,UAAA,EAAYC;AAEhC,QAAI,CAACA,QAAQC,YAAYC,KAAKC,WAAW,SAAA,GAAY;AACnD,YAAMC,sBAAsBJ,QAAQC;AACpC,YAAMI,6BAA6BL,QAAQM;AAC3C,YAAMC,2BAA2BP,QAAQQ;AAEzC,YAAMC,wBAAwB,wBAC5BC,kBACAC,gBACAC,QAAAA;AAEA,cAAMC,UAAUD,2BAAMzB;AACtB,YACE0B,mBAAmBC,WACnBH,0BAA0BI,YAC1B,EAAEhC,mBAAmB8B,YACrB3B,iBAAiB2B,SACjB;AACA,cAAI,OAAOH,qBAAqB,UAAU;AAGxC,kBAAMM,eAAeC,OAAOC,KAAKR,gBAAAA;AACjCG,oBAAQ9B,eAAAA,IAAmB4B;AAC3BE,oBAAQ7B,uBAAAA,IAA2BmC,QAAQC,QAAQ;cACjDC,MAAML;cACNM,MAAMN,aAAaO;cACnBC,WAAW;YACb,CAAA;UACF,OAAO;AAEL,kBAAMlC,UAASuB,QAAQ3B,aAAAA;AACvB,kBAAM,CAACuC,aAAaC,eAAAA,QAAmBC,iCACrChB,gBACA;cACEiB,aACEtC,QAAOI,cAAcC,WACrBL,QAAOI,cAAcL,OAAOwC;cAC9BC,aAAaxC,QAAOI,cAAcoC;YACpC,CAAA;AAEFjB,oBAAQ9B,eAAAA,IAAmB0C;AAC3BZ,oBAAQ7B,uBAAAA,IAA2B0C;AACnC,mBAAOD;UACT;QACF;AACA,eAAOd;MACT,GAxC8B;AA0C9BX,cAAQC,cAAc,gCAAS8B,mBAC7BC,UACApB,KAAe;AAEf,cAAMD,iBAAiBP,oBAAoB4B,UAAUpB,GAAAA;AACrD,cAAMa,cAAchB,sBAClBuB,UACArB,gBACAC,GAAAA;AAEF,eAAOa;MACT,GAXsB;AAYtBzB,cAAQM,qBAAqB,gCAAS2B,0BACpCD,UAAiB;AAEjB,cAAMrB,iBAAiBN,2BAA2B2B,QAAAA;AAClD,cAAMP,cAAchB,sBAClBuB,UACArB,gBACAuB,MAAAA;AAEF,eAAOT;MACT,GAV6B;AAW7BzB,cAAQQ,mBAAmB,gCAAS2B,wBAClCH,UACApB,KAAe;AAEf,cAAMD,iBAAiBJ,yBAAyByB,UAAUpB,GAAAA;AAC1D,cAAMa,cAAchB,sBAClBuB,UACArB,gBACAC,GAAAA;AAEF,eAAOa;MACT,GAX2B;IAY7B;AAEA,WAAO1B,IACJqC,SAAS,YAAY,CAAC,CAAA,EACtBC,QAAQ,MAAA;AACP,YAAMC,cAAUC,yBAAWxC,KAAKV,OAAOmD,UAAU;AACjDlD,aAAOmD,eAAeH,OAAAA;AACtBhD,aAAOoD,UAAS;IAClB,CAAA,EACCC,OAAO,YAAA;AACN,YAAMrD,OAAOsD,eAAc;IAC7B,CAAA,EACCC,UAAU,OAAO,EAAEhC,SAASD,IAAG,MAAE;AAChC,UAAI,CAACtB,OAAOwD,UAAS,KAAMjC,QAAQkC,OAAOC,YAAW,MAAO,WAAW;AACrE;MACF;AAEAnC,cAAQ3B,aAAAA,IAAiBI;AACzBuB,cAAQjC,iBAAAA,IAAqBqE,mCAAYC,IAAG;AAC3CtC,UAAmBzB,cAAAA,IAAkB0B;AACtCrB,kBAAY2D,UAAU,CAAA,CAAE;AAGxB,YAAMC,aAAa9D,OAAO+D,cAAcC,UAAS;AACjDzC,cAAQzB,kBAAAA,IAAsBgE;AAC9BA,iBAAWG,aAAY;AAGvB,UACEjE,OAAOI,cAAcC,WACrBL,OAAOI,cAAcL,OAAOmE,gBAC5B;AACA,cAAMC,cAAc5C,QAAQ6C,QAAQC,IAAI,cAAA;AACxC,cAAMC,kBACJC,mCAAmBhD,QAAQ6C,QAAQC,IAAI,gBAAA,CAAA,KAAsB;AAE/D,YACErE,OAAOI,cAAcoE,uBAAuBL,WAAAA,KAC5CG,eAAetE,OAAOI,cAAcoC,aACpC;AACA,cAAI;AACFjB,oBAAQ/B,mBAAAA,IAAuBmC,OAAOC,KACpC,MAAML,QAAQkD,MAAK,EAAGC,YAAW,CAAA;UAErC,SAASC,OAAO;UAEhB;QACF;MACF;IACF,CAAA,EACCC,gBAAgB,OAAO,EAAErD,SAASD,KAAKuD,OAAOC,SAAQ,MAAE;AACvD,UAAI,CAAC9E,OAAOwD,UAAS,KAAMjC,QAAQkC,OAAOC,YAAW,MAAO,WAAW;AACrE;MACF;AAEA,YAAMqB,YAAYxD,QAAQjC,iBAAAA;AAC1B,YAAM0F,eAAeD,YAAYpB,mCAAYC,IAAG,IAAKmB,YAAY;AAEjE,YAAMjB,aAAavC,QAAQzB,kBAAAA;AAC3BgE,+CAAYmB,QAAQ,GAAG1D,QAAQkC,MAAM,IAAIoB,KAAAA;AACzC,YAAMK,QAAQpB,yCAAYqB;AAC1B,YAAMC,UAAUtB,yCAAYsB;AAE5B,YAAMC,cAAc9D,QAAQ/B,mBAAAA;AAC5B,YAAM8E,kBACJC,mCAAmBhD,QAAQ6C,QAAQC,IAAI,gBAAA,CAAA,MACvCgB,2CAAapD;AAEf,UAAIG,kBAAkBb,QAAQ7B,uBAAAA;AAC9B,UAAIgD,WAAWnB,QAAQ9B,eAAAA;AACvB,YAAMkF,QAAQpD,QAAQ5B,YAAAA;AAEtB,UACE,CAAC+C,YACDiC,SACA,gBAAgBA,SAChB,OAAOA,MAAMW,eAAe,YAC5B;AAEA,YAAI;AACF5C,qBAAWiC,MAAMW,WAAU;AAC3B,gBAAMC,oBAAoB5D,OAAOC,KAAK,MAAMc,SAASgC,YAAW,CAAA;AAChEtC,4BAAkBP,QAAQC,QAAQ;YAChCC,MAAMwD;YACNvD,MAAMuD,kBAAkBtD;YACxBC,WAAW;UACb,CAAA;QACF,SAASyC,QAAO;QAEhB;MACF;AAEA,YAAMa,cAAa9C,qCAAU+C,WAAUC,cAAcpE,GAAAA,KAAQ;AAE7D,UAAI,CAACoB,UAAU;AAEbA,mBAAW,IAAIjB,SAAS,MAAM;UAC5BgE,QAAQD;UACRG,YAAY;UACZvB,SAAS,IAAIwB,QAAAA;QACf,CAAA;AACAxD,0BAAkBP,QAAQC,QAAQ;UAChCC,MAAMa;UACNZ,MAAM;UACNE,WAAW;QACb,CAAA;MACF;AAEA,YAAM2D,WAAWf,SAASe,eACtBC,oDAA2BhB,SAASe,QAAQ,IAC5C;AACJ7F,aAAO+F,iBAAiBC,oBAAoBH,QAAAA;AAG5CzD,yDAAiB6D,KAAK,OAAOC,qBAAAA;AAC3B,cAAMC,mBAAkBzD,qCAAU0B,YAAW9C,IAAI8C;AACjD,cAAMgC,eAAeF,iBAAiBhE,YAClCgE,iBAAiBlE,OACjBY;AAEJ5C,eAAOqG,eAAeC,WAAW;UAC/BT,UAAUA,qCAAUU;UACpB9C,QAAQlC,QAAQkC;UAChB+C,MAAM3B;UACNW;UACAR;UACAV;UACA8B;QACF,CAAA;AAEA,YAAIpG,OAAOI,cAAcC,SAAS;AAChC,gBAAMoG,OAAOvG,YAAYwG,SAAQ;AACjC1G,iBAAOI,cAAcuG,WACnB;YACEC,YAAYC,KAAKjD,IAAG,IAAKoB,gBAAgB;YACzCvB,QAAQlC,QAAQkC;YAChB+C,MAAM3B;YACNiC,KAAKvF,QAAQuF;YACb1C,aAAS2C,qCACPC,OAAOC,YAAY1F,QAAQ6C,QAAQ8C,QAAO,CAAA,CAAA;YAE5ClF,MAAMsC;YACNuB,UAAUA,qCAAUU;YACpBxE,MAAMsD;UACR,GACA;YACEG;YACAR,cAAcA,eAAe;YAC7BZ,aAAS2C,qCAAeZ,eAAAA;YACxBnE,MAAMoE;YACNrE,MAAMmE,iBAAiBnE;UACzB,GACA4C,OACA8B,MACAvB,OACAE,OAAAA;QAEJ;MACF;AAGA,WACGI,eAAe,OAAOA,eAAe,QACtCb,iBAAiBwC,+BACjB;AACA,YAAI;AACF,gBAAMC,gBAAgBC,KAAKC,MAAM3C,MAAM4C,OAAO;AAC9CvH,iBAAOwH,uBAAuBC,mBAAmB;YAC/C5B,UAAUA,qCAAUU;YACpB9C,QAAQlC,QAAQkC;YAChB+C,MAAM3B;YACN6C,MACGN,cAAcO,MAAM,MAAM,OAAOP,cAAcQ,YAAY;YAC9DC,KAAKT,cAAcG;YACnBO,MAAM;UACR,CAAA;QACF,SAASnD,QAAO;QAEhB;MACF;AAGA,UAAIa,eAAe,OAAOb,OAAO;AAC/B3E,eAAO+H,mBAAmBC,eAAe;UACvCnC,UAAUA,qCAAUU;UACpB9C,QAAQlC,QAAQkC;UAChB+C,MAAM3B;UACNiD,MAAMnD,MAAM/D;UACZiH,KAAKlD,MAAM4C;UACXU,WAAWtD,MAAMuD,SAAS;QAC5B,CAAA;MACF;IACF,CAAA,EACCC,QAAQ,CAAC,EAAE5G,SAASoD,MAAK,MAAE;AAC1B,UAAI3E,OAAOwD,UAAS,KAAMmB,iBAAiByD,OAAO;AAChD7G,gBAAQ5B,YAAAA,IAAgBgF;MAC1B;IACF,CAAA;EACJ;AACF;AArSwB0D;AAuSxB,SAAS3C,cAAcpE,KAAmB;AACxC,MAAI,OAAOA,IAAImE,WAAW,UAAU;AAClC,WAAOnE,IAAImE;EACb,WAAW,OAAOnE,IAAImE,WAAW,UAAU;AACzC,WAAO6C,wBAAUhH,IAAImE,MAAM;EAC7B;AACF;AANSC;","names":["START_TIME_SYMBOL","Symbol","REQUEST_BODY_SYMBOL","RESPONSE_SYMBOL","RESPONSE_PROMISE_SYMBOL","ERROR_SYMBOL","CLIENT_SYMBOL","REQUEST_SYMBOL","SPAN_HANDLE_SYMBOL","config","client","ApitallyClient","logsContext","AsyncLocalStorage","requestLogger","enabled","captureLogs","patchConsole","patchWinston","app","handler","mapResponse","name","startsWith","originalMapResponse","originalMapCompactResponse","mapCompactResponse","originalMapEarlyResponse","mapEarlyResponse","captureMappedResponse","originalResponse","mappedResponse","set","request","Request","Response","responseBody","Buffer","from","Promise","resolve","body","size","length","completed","newResponse","responsePromise","captureResponse","captureBody","logResponseBody","maxBodySize","wrappedMapResponse","response","wrappedMapCompactResponse","undefined","wrappedMapEarlyResponse","decorate","onStart","appInfo","getAppInfo","appVersion","setStartupData","startSync","onStop","handleShutdown","onRequest","isEnabled","method","toUpperCase","performance","now","enterWith","spanHandle","spanCollector","startSpan","enterContext","logRequestBody","contentType","headers","get","requestSize","parseContentLength","isSupportedContentType","clone","arrayBuffer","error","onAfterResponse","route","apitally","startTime","responseTime","setName","spans","end","traceId","requestBody","toResponse","errorResponseBody","statusCode","status","getStatusCode","statusText","Headers","consumer","consumerFromStringOrObject","consumerRegistry","addOrUpdateConsumer","then","capturedResponse","responseHeaders","responseSize","requestCounter","addRequest","identifier","path","logs","getStore","logRequest","timestamp","Date","url","convertHeaders","Object","fromEntries","entries","ValidationError","parsedMessage","JSON","parse","message","validationErrorCounter","addValidationError","loc","on","property","msg","type","serverErrorCounter","addServerError","traceback","stack","onError","Error","apitallyPlugin","StatusMap"]}