{"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"sourcesContent":["import type { Integration, IntegrationFn } from '@sentry/core';\nimport { defineIntegration, extendIntegration, getClient } from '@sentry/core';\nimport { generateInstrumentOnce } from '@sentry/node-core';\nimport type { FastifyInstance, FastifyMinimal, FastifyReply, FastifyRequest } from './types';\nimport { FastifyInstrumentationV3 } from './v3/instrumentation';\nimport {\n fastifyIntegration as serverUtilsFastifyIntegration,\n instrumentFastify,\n handleFastifyError,\n} from '@sentry/server-utils';\n\ninterface FastifyIntegration extends Integration {\n getShouldHandleError: () => (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;\n // todo(v11): Remove this\n setShouldHandleError: (\n shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean,\n ) => void;\n}\n\n// oxlint-disable-next-line typescript/no-deprecated\nexport { instrumentFastify };\n\n/**\n * Options for the Fastify integration.\n *\n * `shouldHandleError` - Callback method deciding whether error should be captured and sent to Sentry\n *\n * @example\n *\n * ```javascript\n * Sentry.init({\n * integrations: [\n * Sentry.fastifyIntegration({\n * shouldHandleError(_error, _request, reply) {\n * return reply.statusCode >= 500;\n * },\n * });\n * },\n * });\n * ```\n *\n */\ninterface FastifyIntegrationOptions {\n /**\n * Callback method deciding whether error should be captured and sent to Sentry\n * This is used on Fastify v5 where Sentry handles errors in the diagnostics channel.\n * Fastify v3 and v4 use `setupFastifyErrorHandler` instead.\n *\n * @param error Captured Fastify error\n * @param request Fastify request (or any object containing at least method, routeOptions.url, and routerPath)\n * @param reply Fastify reply (or any object containing at least statusCode)\n *\n * @example\n *\n * If using TypeScript, you can cast the request and reply to get full type safety.\n *\n * ```typescript\n * import type { FastifyRequest, FastifyReply } from 'fastify';\n *\n * Sentry.fastifyIntegration({\n * shouldHandleError(error, minimalRequest, minimalReply) {\n * const request = minimalRequest as FastifyRequest;\n * const reply = minimalReply as FastifyReply;\n * return reply.statusCode >= 500;\n * },\n * });\n * ```\n */\n shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;\n}\n\ninterface FastifyHandlerOptions {\n /**\n * Callback method deciding whether error should be captured and sent to Sentry\n *\n * @param error Captured Fastify error\n * @param request Fastify request (or any object containing at least method, routeOptions.url, and routerPath)\n * @param reply Fastify reply (or any object containing at least statusCode)\n *\n * @deprecated Configure `shouldHandleError` on `fastifyIntegration()` rather than here, where it\n * applies to every supported Fastify version. This option will be removed in v11.\n *\n * @example\n *\n * ```javascript\n * Sentry.init({\n * integrations: [\n * Sentry.fastifyIntegration({\n * shouldHandleError(_error, _request, reply) {\n * return reply.statusCode >= 500;\n * },\n * }),\n * ],\n * });\n * ```\n */\n shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;\n}\n\nconst INTEGRATION_NAME = 'Fastify' as const;\n\nexport const instrumentFastifyV3 = generateInstrumentOnce(\n `${INTEGRATION_NAME}.v3`,\n () => new FastifyInstrumentationV3(),\n);\n\nfunction getFastifyIntegration(): FastifyIntegration | undefined {\n const client = getClient();\n if (!client) {\n return undefined;\n } else {\n return client.getIntegrationByName(INTEGRATION_NAME);\n }\n}\n\nconst _fastifyIntegration = ((options: Partial) => {\n const parentIntegration = serverUtilsFastifyIntegration(options) as FastifyIntegration;\n\n return extendIntegration(parentIntegration, {\n setupOnce() {\n instrumentFastifyV3();\n },\n });\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for [Fastify](https://fastify.dev/).\n *\n * If you also want to capture errors, you need to call `setupFastifyErrorHandler(app)` after you set up your Fastify server.\n *\n * For more information, see the [fastify documentation](https://docs.sentry.io/platforms/javascript/guides/fastify/).\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n *\n * Sentry.init({\n * integrations: [Sentry.fastifyIntegration()],\n * })\n * ```\n */\nexport const fastifyIntegration = defineIntegration((options: Partial = {}) =>\n _fastifyIntegration(options),\n);\n\n/**\n * Add an Fastify error handler to capture errors to Sentry.\n *\n * @param fastify The Fastify instance to which to add the error handler\n * @param options Configuration options for the handler\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n * const Fastify = require(\"fastify\");\n *\n * const app = Fastify();\n *\n * Sentry.setupFastifyErrorHandler(app);\n *\n * // Add your routes, etc.\n *\n * app.listen({ port: 3000 });\n * ```\n */\nexport function setupFastifyErrorHandler(fastify: FastifyMinimal, options?: Partial): void {\n // oxlint-disable-next-line typescript/no-deprecated\n if (options?.shouldHandleError) {\n // oxlint-disable-next-line typescript/no-deprecated\n getFastifyIntegration()?.setShouldHandleError(options.shouldHandleError);\n }\n\n const plugin = Object.assign(\n function (fastify: FastifyInstance, _options: unknown, done: () => void): void {\n fastify.addHook('onError', async (request, reply, error) => {\n // oxlint-disable-next-line typescript/no-deprecated\n handleFastifyError.call(handleFastifyError, error, request, reply, 'onError-hook');\n });\n done();\n },\n {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'sentry-fastify-error-handler',\n },\n );\n\n fastify.register(plugin);\n}\n"],"names":["serverUtilsFastifyIntegration","fastify"],"mappings":";;;;;;AAmGA,MAAM,gBAAA,GAAmB,SAAA;AAElB,MAAM,mBAAA,GAAsB,sBAAA;AAAA,EACjC,GAAG,gBAAgB,CAAA,GAAA,CAAA;AAAA,EACnB,MAAM,IAAI,wBAAA;AACZ;AAEA,SAAS,qBAAA,GAAwD;AAC/D,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,MAAA,CAAO,qBAAqB,gBAAgB,CAAA;AAAA,EACrD;AACF;AAEA,MAAM,mBAAA,IAAuB,CAAC,OAAA,KAAgD;AAC5E,EAAA,MAAM,iBAAA,GAAoBA,qBAA8B,OAAO,CAAA;AAE/D,EAAA,OAAO,kBAAkB,iBAAA,EAAmB;AAAA,IAC1C,SAAA,GAAY;AACV,MAAA,mBAAA,EAAoB;AAAA,IACtB;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAkBO,MAAM,kBAAA,GAAqB,iBAAA;AAAA,EAAkB,CAAC,OAAA,GAA8C,EAAC,KAClG,oBAAoB,OAAO;AAC7B;AAsBO,SAAS,wBAAA,CAAyB,SAAyB,OAAA,EAAgD;AAEhH,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAE9B,IAAA,qBAAA,EAAsB,EAAG,oBAAA,CAAqB,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAAA,IACpB,SAAUC,QAAAA,EAA0B,QAAA,EAAmB,IAAA,EAAwB;AAC7E,MAAAA,SAAQ,OAAA,CAAQ,SAAA,EAAW,OAAO,OAAA,EAAS,OAAO,KAAA,KAAU;AAE1D,QAAA,kBAAA,CAAmB,IAAA,CAAK,kBAAA,EAAoB,KAAA,EAAO,OAAA,EAAS,OAAO,cAAc,CAAA;AAAA,MACnF,CAAC,CAAA;AACD,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,IACA;AAAA,MACE,iBAAC,MAAA,CAAO,GAAA,CAAI,eAAe,CAAC,GAAG,IAAA;AAAA,MAC/B,iBAAC,MAAA,CAAO,GAAA,CAAI,sBAAsB,CAAC,GAAG;AAAA;AACxC,GACF;AAEA,EAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AACzB;;;;"}