{"version":3,"sources":["../../src/express/middleware.ts"],"sourcesContent":["import type { Express, NextFunction, Request, Response, Router } from \"express\";\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 { getPackageVersion } from \"../common/packageVersions.js\";\nimport type { LogRecord } from \"../common/requestLogger.js\";\nimport { convertBody, convertHeaders } from \"../common/requestLogger.js\";\nimport {\n  ApitallyConfig,\n  ApitallyConsumer,\n  StartupData,\n  ValidationError,\n} from \"../common/types.js\";\nimport {\n  patchConsole,\n  patchNestLogger,\n  patchPinoLogger,\n  patchWinston,\n} from \"../loggers/index.js\";\nimport {\n  formatRegExpRoutePath,\n  getEndpoints,\n  getRouterInfo,\n  parseExpressPath,\n  parseExpressPathRegExp,\n  stripExpressPathParamRegex,\n} from \"./utils.js\";\n\ndeclare module \"express\" {\n  interface Request {\n    apitallyConsumer?: ApitallyConsumer | string | null;\n    consumerIdentifier?: ApitallyConsumer | string | null; // For backwards compatibility\n  }\n}\n\nexport function useApitally(\n  app: Express | Router,\n  config: ApitallyConfig & { basePath?: string },\n) {\n  const client = new ApitallyClient(config);\n  const middleware = getMiddleware(app, client);\n  app.use(middleware);\n\n  const setStartupData = (attempt: number = 1) => {\n    const appInfo = getAppInfo(app, config.basePath, config.appVersion);\n    if (appInfo.paths.length > 0 || attempt >= 10) {\n      client.setStartupData(appInfo);\n      client.startSync();\n    } else {\n      setTimeout(() => setStartupData(attempt + 1), 500);\n    }\n  };\n  setTimeout(() => setStartupData(), 500);\n}\n\nfunction getMiddleware(app: Express | Router, client: ApitallyClient) {\n  let errorHandlerConfigured = false;\n  const logsContext = new AsyncLocalStorage<LogRecord[]>();\n\n  if (client.requestLogger.config.captureLogs) {\n    patchConsole(logsContext);\n    patchWinston(logsContext);\n    patchNestLogger(logsContext);\n  }\n\n  return async (req: Request, res: Response, next: NextFunction) => {\n    if (!client.isEnabled() || req.method.toUpperCase() === \"OPTIONS\") {\n      next();\n      return;\n    }\n\n    if (!errorHandlerConfigured) {\n      // Add error handling middleware to the bottom of the stack when handling the first request\n      app.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n        res.locals.serverError = err;\n        next(err);\n      });\n      errorHandlerConfigured = true;\n    }\n\n    if (client.requestLogger.config.captureLogs && \"log\" in req) {\n      await patchPinoLogger((req as any).log, logsContext);\n    }\n\n    logsContext.run([], () => {\n      try {\n        const startTime = performance.now();\n\n        const originalSend = res.send;\n        res.send = (body) => {\n          const contentType = res.get(\"content-type\");\n          if (client.requestLogger.isSupportedContentType(contentType)) {\n            res.locals.body = body;\n          }\n          return originalSend.call(res, body);\n        };\n\n        const spanHandle = client.spanCollector.startSpan();\n        spanHandle.runInContext(() => {\n          res.once(\"finish\", () => {\n            try {\n              const responseTime = performance.now() - startTime;\n              const path = getRoutePath(req);\n\n              spanHandle.setName(`${req.method} ${path}`);\n              const spans = spanHandle.end();\n              const traceId = spanHandle.traceId;\n\n              const consumer = getConsumer(req);\n              client.consumerRegistry.addOrUpdateConsumer(consumer);\n\n              const requestSize = parseContentLength(req.get(\"content-length\"));\n              const responseSize = parseContentLength(\n                res.get(\"content-length\"),\n              );\n\n              if (path) {\n                client.requestCounter.addRequest({\n                  consumer: consumer?.identifier,\n                  method: req.method,\n                  path,\n                  statusCode: res.statusCode,\n                  responseTime: responseTime,\n                  requestSize,\n                  responseSize,\n                });\n\n                if (\n                  (res.statusCode === 400 || res.statusCode === 422) &&\n                  res.locals.body\n                ) {\n                  let jsonBody: any;\n                  try {\n                    jsonBody = JSON.parse(res.locals.body);\n                  } catch {\n                    // Ignore\n                  }\n                  if (jsonBody) {\n                    const validationErrors: ValidationError[] = [];\n                    if (validationErrors.length === 0) {\n                      validationErrors.push(\n                        ...extractExpressValidatorErrors(jsonBody),\n                      );\n                    }\n                    if (validationErrors.length === 0) {\n                      validationErrors.push(\n                        ...extractCelebrateErrors(jsonBody),\n                      );\n                    }\n                    if (validationErrors.length === 0) {\n                      validationErrors.push(\n                        ...extractNestValidationErrors(jsonBody),\n                      );\n                    }\n                    validationErrors.forEach((error) => {\n                      client.validationErrorCounter.addValidationError({\n                        consumer: consumer?.identifier,\n                        method: req.method,\n                        path,\n                        ...error,\n                      });\n                    });\n                  }\n                }\n\n                if (res.statusCode === 500 && res.locals.serverError) {\n                  const serverError = res.locals.serverError as Error;\n                  client.serverErrorCounter.addServerError({\n                    consumer: consumer?.identifier,\n                    method: req.method,\n                    path,\n                    type: serverError.name,\n                    msg: serverError.message,\n                    traceback: serverError.stack || \"\",\n                  });\n                }\n              }\n\n              if (client.requestLogger.enabled) {\n                const logs = logsContext.getStore();\n                client.requestLogger.logRequest(\n                  {\n                    timestamp: Date.now() / 1000,\n                    method: req.method,\n                    path,\n                    url: `${req.protocol}://${req.host}${req.originalUrl}`,\n                    headers: convertHeaders(req.headers),\n                    size: requestSize,\n                    consumer: consumer?.identifier,\n                    body: convertBody(req.body, req.get(\"content-type\")),\n                  },\n                  {\n                    statusCode: res.statusCode,\n                    responseTime: responseTime / 1000,\n                    headers: convertHeaders(res.getHeaders()),\n                    size: responseSize,\n                    body: convertBody(res.locals.body, res.get(\"content-type\")),\n                  },\n                  res.locals.serverError,\n                  logs,\n                  spans,\n                  traceId,\n                );\n              }\n            } catch (error) {\n              client.logger.error(\n                \"Error while logging request in Apitally middleware\",\n                { request: req, response: res, error },\n              );\n            }\n          });\n\n          res.once(\"close\", () => {\n            spanHandle.end();\n          });\n\n          next();\n        });\n      } catch (error) {\n        client.logger.error(\"Error in Apitally middleware\", {\n          request: req,\n          response: res,\n          error,\n        });\n      }\n    });\n  };\n}\n\nfunction getRoutePath(req: Request) {\n  if (!req.route) {\n    return;\n  }\n  // req.route.path can be a string, a RegExp, or an array of either\n  let routePath: unknown = req.route.path;\n  if (Array.isArray(routePath)) {\n    routePath = routePath.find((p) => typeof p === \"string\") ?? routePath[0];\n  }\n  if (typeof routePath === \"string\") {\n    routePath = stripExpressPathParamRegex(routePath);\n  } else if (routePath instanceof RegExp) {\n    routePath = formatRegExpRoutePath(routePath);\n  }\n  if (typeof routePath !== \"string\") {\n    return;\n  }\n  if (req.baseUrl) {\n    const routerInfo = getRouterInfo(req.app);\n    if (routerInfo.stack) {\n      const routerPath = getRouterPath(routerInfo.stack, req.baseUrl);\n      return routePath === \"/\" ? routerPath : routerPath + routePath;\n    }\n  }\n  return routePath;\n}\n\nfunction getRouterPath(stack: any[], baseUrl: string) {\n  const routerPaths: string[] = [];\n  while (stack && stack.length > 0) {\n    const routerLayer = stack.find(\n      (layer) =>\n        layer.name === \"router\" &&\n        layer.path &&\n        (baseUrl.startsWith(layer.path) || layer.regexp?.test(baseUrl)),\n    );\n    if (routerLayer) {\n      if (\n        routerLayer.regexp &&\n        routerLayer.keys &&\n        routerLayer.keys.length > 0\n      ) {\n        const parsedPath = parseExpressPathRegExp(\n          routerLayer.regexp,\n          routerLayer.keys,\n        );\n        routerPaths.push(\"/\" + parsedPath);\n      } else if (\n        routerLayer.params &&\n        Object.keys(routerLayer.params).length > 0\n      ) {\n        const parsedPath = parseExpressPath(\n          routerLayer.path,\n          routerLayer.params,\n        );\n        routerPaths.push(parsedPath);\n      } else {\n        routerPaths.push(routerLayer.path);\n      }\n      stack = routerLayer.handle?.stack;\n      baseUrl = baseUrl.slice(routerLayer.path.length);\n    } else {\n      break;\n    }\n  }\n  return routerPaths.filter((path) => path !== \"/\").join(\"\");\n}\n\nexport function setConsumer(\n  req: Request,\n  consumer: ApitallyConsumer | string | null | undefined,\n) {\n  req.apitallyConsumer = consumer || undefined;\n}\n\nfunction getConsumer(req: Request) {\n  if (req.apitallyConsumer) {\n    return consumerFromStringOrObject(req.apitallyConsumer);\n  } else if (req.consumerIdentifier) {\n    // For backwards compatibility\n    process.emitWarning(\n      \"The consumerIdentifier property on the request object is deprecated. Use apitallyConsumer instead.\",\n      \"DeprecationWarning\",\n    );\n    return consumerFromStringOrObject(req.consumerIdentifier);\n  }\n  return null;\n}\n\nfunction extractExpressValidatorErrors(responseBody: any) {\n  try {\n    const errors: ValidationError[] = [];\n    if (\n      responseBody &&\n      responseBody.errors &&\n      Array.isArray(responseBody.errors)\n    ) {\n      responseBody.errors.forEach((error: any) => {\n        if (error.location && error.path && error.msg && error.type) {\n          errors.push({\n            loc: `${error.location}.${error.path}`,\n            msg: error.msg,\n            type: error.type,\n          });\n        }\n      });\n    }\n    return errors;\n  } catch (error) {\n    return [];\n  }\n}\n\nfunction extractCelebrateErrors(responseBody: any) {\n  try {\n    const errors: ValidationError[] = [];\n    if (responseBody && responseBody.validation) {\n      Object.values(responseBody.validation).forEach((error: any) => {\n        if (\n          error.source &&\n          error.keys &&\n          Array.isArray(error.keys) &&\n          error.message\n        ) {\n          error.keys.forEach((key: string) => {\n            errors.push({\n              loc: `${error.source}.${key}`,\n              msg: subsetJoiMessage(error.message, key),\n              type: \"\",\n            });\n          });\n        }\n      });\n    }\n    return errors;\n  } catch (error) {\n    return [];\n  }\n}\n\nfunction extractNestValidationErrors(responseBody: any) {\n  try {\n    const errors: ValidationError[] = [];\n    if (responseBody && Array.isArray(responseBody.message)) {\n      responseBody.message.forEach((message: any) => {\n        errors.push({\n          loc: \"\",\n          msg: message,\n          type: \"\",\n        });\n      });\n    }\n    return errors;\n  } catch (error) {\n    return [];\n  }\n}\n\nfunction subsetJoiMessage(message: string, key: string) {\n  const messageWithKey = message\n    .split(\". \")\n    .find((message) => message.includes(`\"${key}\"`));\n  return messageWithKey ? messageWithKey : message;\n}\n\nfunction getAppInfo(\n  app: Express | Router,\n  basePath?: string,\n  appVersion?: string,\n): StartupData {\n  const versions: Array<[string, string]> = [\n    [\"nodejs\", process.version.replace(/^v/, \"\")],\n  ];\n  const expressVersion = getPackageVersion(\"express\");\n  const nestjsVersion = getPackageVersion(\"@nestjs/core\");\n  const apitallyVersion = getPackageVersion(\"../..\");\n  if (expressVersion) {\n    versions.push([\"express\", expressVersion]);\n  }\n  if (nestjsVersion) {\n    versions.push([\"nestjs\", nestjsVersion]);\n  }\n  if (apitallyVersion) {\n    versions.push([\"apitally\", apitallyVersion]);\n  }\n  if (appVersion) {\n    versions.push([\"app\", appVersion]);\n  }\n  return {\n    paths: getEndpoints(app, basePath || \"\"),\n    versions: Object.fromEntries(versions),\n    client: \"js:express\",\n  };\n}\n"],"mappings":"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","names":["useApitally","app","config","client","ApitallyClient","middleware","getMiddleware","use","setStartupData","attempt","appInfo","getAppInfo","basePath","appVersion","paths","length","startSync","setTimeout","errorHandlerConfigured","logsContext","AsyncLocalStorage","requestLogger","captureLogs","patchConsole","patchWinston","patchNestLogger","req","res","next","isEnabled","method","toUpperCase","err","locals","serverError","patchPinoLogger","log","run","startTime","performance","now","originalSend","send","body","contentType","get","isSupportedContentType","call","spanHandle","spanCollector","startSpan","runInContext","once","responseTime","path","getRoutePath","setName","spans","end","traceId","consumer","getConsumer","consumerRegistry","addOrUpdateConsumer","requestSize","parseContentLength","responseSize","requestCounter","addRequest","identifier","statusCode","jsonBody","JSON","parse","validationErrors","push","extractExpressValidatorErrors","extractCelebrateErrors","extractNestValidationErrors","forEach","error","validationErrorCounter","addValidationError","serverErrorCounter","addServerError","type","name","msg","message","traceback","stack","enabled","logs","getStore","logRequest","timestamp","Date","url","protocol","host","originalUrl","headers","convertHeaders","size","convertBody","getHeaders","logger","request","response","route","routePath","Array","isArray","find","p","stripExpressPathParamRegex","RegExp","formatRegExpRoutePath","baseUrl","routerInfo","getRouterInfo","routerPath","getRouterPath","routerPaths","routerLayer","layer","_a","startsWith","regexp","test","keys","parsedPath","parseExpressPathRegExp","params","Object","parseExpressPath","handle","slice","filter","join","setConsumer","apitallyConsumer","undefined","consumerFromStringOrObject","consumerIdentifier","process","emitWarning","responseBody","errors","location","loc","validation","values","source","key","subsetJoiMessage","messageWithKey","split","includes","versions","version","replace","expressVersion","getPackageVersion","nestjsVersion","apitallyVersion","getEndpoints","fromEntries"]}