{"version":3,"file":"trpc.js","sources":["../../src/trpc.ts"],"sourcesContent":["import { getClient, withIsolationScope } from './currentScopes';\nimport { captureException } from './exports';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from './semanticAttributes';\nimport { startSpanManual } from './tracing';\nimport { normalize } from './utils/normalize';\nimport { setNormalizationDepthOverrideHint } from './utils/normalizationHints';\n\ninterface SentryTrpcMiddlewareOptions {\n /** Whether to include procedure inputs in reported events. Defaults to `false`. */\n attachRpcInput?: boolean;\n forceTransaction?: boolean;\n}\n\nexport interface SentryTrpcMiddlewareArguments {\n path?: unknown;\n type?: unknown;\n next: () => T;\n rawInput?: unknown;\n getRawInput?: () => Promise;\n}\n\nconst trpcCaptureContext = { mechanism: { handled: false, type: 'auto.rpc.trpc.middleware' } };\n\nfunction captureIfError(nextResult: unknown): void {\n // TODO: Set span status based on what TRPCError was encountered\n if (\n typeof nextResult === 'object' &&\n nextResult !== null &&\n 'ok' in nextResult &&\n !nextResult.ok &&\n 'error' in nextResult\n ) {\n captureException(nextResult.error, trpcCaptureContext);\n }\n}\n\ntype SentryTrpcMiddleware = T extends Promise ? T : Promise;\n\n/**\n * Sentry tRPC middleware that captures errors and creates spans for tRPC procedures.\n */\nexport function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return async function (opts: SentryTrpcMiddlewareArguments): SentryTrpcMiddleware {\n const { path, type, next, rawInput, getRawInput } = opts;\n\n const client = getClient();\n const clientOptions = client?.getOptions();\n const dataCollection = client?.getDataCollectionOptions();\n\n const trpcContext: Record = {\n procedure_path: path,\n procedure_type: type,\n };\n\n setNormalizationDepthOverrideHint(\n trpcContext,\n 1 + // 1 for context.input + the normal normalization depth\n (clientOptions?.normalizeDepth ?? 5), // 5 is a sane depth\n );\n\n if (\n options.attachRpcInput !== undefined\n ? options.attachRpcInput\n : dataCollection?.httpBodies.includes('incomingRequest')\n ) {\n if (rawInput !== undefined) {\n trpcContext.input = normalize(rawInput);\n }\n\n if (getRawInput !== undefined && typeof getRawInput === 'function') {\n try {\n const rawRes = await getRawInput();\n\n trpcContext.input = normalize(rawRes);\n } catch {\n // noop\n }\n }\n }\n\n return withIsolationScope(scope => {\n scope.setContext('trpc', trpcContext);\n return startSpanManual(\n {\n name: `trpc/${path}`,\n op: 'rpc.server',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.rpc.trpc',\n },\n forceTransaction: !!options.forceTransaction,\n },\n async span => {\n try {\n const nextResult = await next();\n captureIfError(nextResult);\n span.end();\n return nextResult;\n } catch (e) {\n captureException(e, trpcCaptureContext);\n span.end();\n throw e;\n }\n },\n ) as SentryTrpcMiddleware;\n });\n };\n}\n"],"names":["captureException","getClient","setNormalizationDepthOverrideHint","normalize","withIsolationScope","startSpanManual","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"],"mappings":";;;;;;;;;AAqBA,MAAM,kBAAA,GAAqB,EAAE,SAAA,EAAW,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,4BAA2B,EAAE;AAE7F,SAAS,eAAe,UAAA,EAA2B;AAEjD,EAAA,IACE,OAAO,UAAA,KAAe,QAAA,IACtB,UAAA,KAAe,IAAA,IACf,IAAA,IAAQ,UAAA,IACR,CAAC,UAAA,CAAW,EAAA,IACZ,OAAA,IAAW,UAAA,EACX;AACA,IAAAA,0BAAA,CAAiB,UAAA,CAAW,OAAO,kBAAkB,CAAA;AAAA,EACvD;AACF;AAOO,SAAS,cAAA,CAAe,OAAA,GAAuC,EAAC,EAAG;AAGxE,EAAA,OAAO,eAAmB,IAAA,EAAiE;AACzF,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,aAAY,GAAI,IAAA;AAEpD,IAAA,MAAM,SAASC,uBAAA,EAAU;AACzB,IAAA,MAAM,aAAA,GAAgB,QAAQ,UAAA,EAAW;AACzC,IAAA,MAAM,cAAA,GAAiB,QAAQ,wBAAA,EAAyB;AAExD,IAAA,MAAM,WAAA,GAAuC;AAAA,MAC3C,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAAC,oDAAA;AAAA,MACE,WAAA;AAAA,MACA,CAAA;AAAA,OACG,eAAe,cAAA,IAAkB,CAAA;AAAA;AAAA,KACtC;AAEA,IAAA,IACE,OAAA,CAAQ,mBAAmB,MAAA,GACvB,OAAA,CAAQ,iBACR,cAAA,EAAgB,UAAA,CAAW,QAAA,CAAS,iBAAiB,CAAA,EACzD;AACA,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,WAAA,CAAY,KAAA,GAAQC,oBAAU,QAAQ,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,OAAO,WAAA,KAAgB,UAAA,EAAY;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AAEjC,UAAA,WAAA,CAAY,KAAA,GAAQA,oBAAU,MAAM,CAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAOC,iCAAmB,CAAA,KAAA,KAAS;AACjC,MAAA,KAAA,CAAM,UAAA,CAAW,QAAQ,WAAW,CAAA;AACpC,MAAA,OAAOC,qBAAA;AAAA,QACL;AAAA,UACE,IAAA,EAAM,QAAQ,IAAI,CAAA,CAAA;AAAA,UAClB,EAAA,EAAI,YAAA;AAAA,UACJ,UAAA,EAAY;AAAA,YACV,CAACC,mDAAgC,GAAG,OAAA;AAAA,YACpC,CAACC,mDAAgC,GAAG;AAAA,WACtC;AAAA,UACA,gBAAA,EAAkB,CAAC,CAAC,OAAA,CAAQ;AAAA,SAC9B;AAAA,QACA,OAAM,IAAA,KAAQ;AACZ,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,YAAA,cAAA,CAAe,UAAU,CAAA;AACzB,YAAA,IAAA,CAAK,GAAA,EAAI;AACT,YAAA,OAAO,UAAA;AAAA,UACT,SAAS,CAAA,EAAG;AACV,YAAAP,0BAAA,CAAiB,GAAG,kBAAkB,CAAA;AACtC,YAAA,IAAA,CAAK,GAAA,EAAI;AACT,YAAA,MAAM,CAAA;AAAA,UACR;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;;;;"}