{"version":3,"file":"wrapApiHandlerWithSentryVercelCrons.js","sources":["../../../../src/common/pages-router-instrumentation/wrapApiHandlerWithSentryVercelCrons.ts"],"sourcesContent":["import { _INTERNAL_safeDateNow, captureCheckIn } from '@sentry/core';\nimport type { NextApiRequest } from 'next';\nimport type { VercelCronsConfig } from '../types';\n\ntype EdgeRequest = {\n nextUrl: URL;\n headers: Headers;\n};\n\n/**\n * Wraps a function with Sentry crons instrumentation by automatically sending check-ins for the given Vercel crons config.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrapApiHandlerWithSentryVercelCrons any>(\n handler: F,\n vercelCronsConfig: VercelCronsConfig,\n): F {\n return new Proxy(handler, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n apply: (originalFunction, thisArg, args: any[]) => {\n if (!args?.[0]) {\n return originalFunction.apply(thisArg, args);\n }\n\n const [req] = args as [NextApiRequest | EdgeRequest];\n\n let maybePromiseResult;\n const cronsKey = 'nextUrl' in req ? req.nextUrl.pathname : req.url;\n const userAgentHeader = 'nextUrl' in req ? req.headers.get('user-agent') : req.headers['user-agent'];\n\n if (\n !vercelCronsConfig || // do nothing if vercel crons config is missing\n !userAgentHeader?.includes('vercel-cron') // do nothing if endpoint is not called from vercel crons\n ) {\n return originalFunction.apply(thisArg, args);\n }\n\n const vercelCron = vercelCronsConfig.find(vercelCron => vercelCron.path === cronsKey);\n\n if (!vercelCron?.path || !vercelCron.schedule) {\n return originalFunction.apply(thisArg, args);\n }\n\n const monitorSlug = vercelCron.path;\n\n const checkInId = captureCheckIn(\n {\n monitorSlug,\n status: 'in_progress',\n },\n {\n maxRuntime: 60 * 12, // (minutes) so 12 hours - just a very high arbitrary number since we don't know the actual duration of the users cron job\n schedule: {\n type: 'crontab',\n value: vercelCron.schedule,\n },\n },\n );\n\n const startTime = _INTERNAL_safeDateNow() / 1000;\n\n const handleErrorCase = (): void => {\n captureCheckIn({\n checkInId,\n monitorSlug,\n status: 'error',\n duration: _INTERNAL_safeDateNow() / 1000 - startTime,\n });\n };\n\n try {\n maybePromiseResult = originalFunction.apply(thisArg, args);\n } catch (e) {\n handleErrorCase();\n throw e;\n }\n\n if (typeof maybePromiseResult === 'object' && maybePromiseResult !== null && 'then' in maybePromiseResult) {\n Promise.resolve(maybePromiseResult).then(\n () => {\n captureCheckIn({\n checkInId,\n monitorSlug,\n status: 'ok',\n duration: _INTERNAL_safeDateNow() / 1000 - startTime,\n });\n },\n () => {\n handleErrorCase();\n },\n );\n\n // It is very important that we return the original promise here, because Next.js attaches various properties\n // to that promise and will throw if they are not on the returned value.\n return maybePromiseResult;\n } else {\n captureCheckIn({\n checkInId,\n monitorSlug,\n status: 'ok',\n duration: _INTERNAL_safeDateNow() / 1000 - startTime,\n });\n return maybePromiseResult;\n }\n },\n });\n}\n"],"names":[],"mappings":"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"}