{"version":3,"file":"middleware.mjs","sources":["../../src/middleware.ts"],"sourcesContent":["import { ServerResponse } from 'node:http';\nimport { IncomingMessage } from 'node:http';\nimport * as path from 'node:path';\nimport { symbolicateFrames } from './symbolicator';\nimport { logger } from '@sentry/core';\nimport { PREFIX } from './prefix';\nimport { tryCatch } from './utils/tryCatch';\nimport { RsbuildConfig } from '@rsbuild/core';\nimport { getRawBody } from './utils/getRawBody';\n\nexport const SENTRY_SYMBOLICATE_ENDPOINT = '/__sentry__/symbolicate';\n\nexport type NextFunction = () => void;\n\nexport const createSentrySymbolicatorMiddleware = (config: RsbuildConfig) => {\n  if (!config.root) {\n    logger.warn(`${PREFIX} No project root path provided. Symbolication will not work.`);\n    return noopMiddleware;\n  }\n\n  const projectRootPath = config.root\n  const distPath = config.output?.distPath?.root ?? './'\n  const serverPublicPath = path.isAbsolute(distPath)\n    ? distPath\n    : path.join(projectRootPath, distPath);\n\n  return async (req: IncomingMessage, res: ServerResponse, next: NextFunction) => {\n    if (req.url?.startsWith(SENTRY_SYMBOLICATE_ENDPOINT)) {\n      try {\n        await processSymbolicateRequest({ req, res, projectRootPath, serverPublicPath });\n      } catch (error) {\n        logger.error(`${PREFIX} Error processing symbolicate request: ${error}`);\n        res.setHeader('Content-Type', 'application/json');\n        res.statusCode = 500;\n        res.end('{ \"error\": \"Internal Server Error\" }');\n      }\n    } else {\n      next();\n    }\n  };\n}\n\nexport const noopMiddleware = (_req: IncomingMessage, _res: ServerResponse, next: NextFunction) => {\n  next();\n};\n\nexport async function processSymbolicateRequest({\n  req,\n  res,\n  projectRootPath,\n  serverPublicPath,\n}: {\n  req: IncomingMessage,\n  res: ServerResponse,\n  projectRootPath?: string,\n  serverPublicPath?: string,\n}) {\n  const body = await getRawBody(req);\n  res.setHeader('Content-Type', 'application/json');\n\n  const { data, error } = tryCatch(() => JSON.parse(body));\n  if (error) {\n    logger.error(`${PREFIX} Error parsing symbolicate request body: ${body}\\nerror: ${error}`);\n    res.statusCode = 400;\n    res.end('{ \"error\": \"Bad Request\" }');\n    return;\n  }\n\n  logger.debug(`${PREFIX} Symbolicating ${data.frames.length} frames.`);\n  const { data: symbolicatedFrames, error: symbolicationError } = await tryCatch(() => symbolicateFrames({\n    frames: data.frames,\n    projectRootPath,\n    serverPublicPath,\n  }));\n  if (symbolicationError) {\n    logger.error(`${PREFIX} Error symbolicating frames: ${symbolicationError}`);\n    res.statusCode = 500;\n    res.end('{ \"error\": \"Internal Server Error\" }');\n    return;\n  }\n\n  res.end(JSON.stringify({ frames: symbolicatedFrames }));\n}\n"],"names":[],"mappings":"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"}