From d52d80eb2dc43aff86f5730fc40c099944ab42df Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 8 Nov 2023 09:05:56 +0000 Subject: [PATCH] feat(node): Capture internal server errors in trpc middleware --- packages/node/src/handlers.ts | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 868cf7d5a6b2..f080b00275dc 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -338,7 +338,7 @@ interface TrpcMiddlewareArguments { * e.g. Express Request Handlers or Next.js SDK. */ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { - return function ({ path, type, next, rawInput }: TrpcMiddlewareArguments): T { + return async function ({ path, type, next, rawInput }: TrpcMiddlewareArguments): Promise { const hub = getCurrentHub(); const clientOptions = hub.getClient()?.getOptions(); const sentryTransaction = hub.getScope().getTransaction(); @@ -358,7 +358,36 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { sentryTransaction.setContext('trpc', trpcContext); } - return next(); + function captureError(e: unknown): void { + captureException(e, scope => { + scope.addEventProcessor(event => { + addExceptionMechanism(event, { + handled: false, + }); + return event; + }); + + return scope; + }); + } + + try { + return await next(); + } catch (e: unknown) { + if (typeof e === 'object' && e) { + if ('code' in e) { + // Is likely TRPCError - we only want to capture internal server errors + if (e.code === 'INTERNAL_SERVER_ERROR') { + captureError(e); + } + } else { + // Is likely random error that bubbles up + captureError(e); + } + } + + throw e; + } }; }