Skip to content

Commit

Permalink
feat(node): Capture internal server errors in trpc middleware (#9482)
Browse files Browse the repository at this point in the history
  • Loading branch information
lforst authored Nov 9, 2023
1 parent be44a21 commit 8b84905
Showing 1 changed file with 31 additions and 2 deletions.
33 changes: 31 additions & 2 deletions packages/node/src/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ interface TrpcMiddlewareArguments<T> {
* e.g. Express Request Handlers or Next.js SDK.
*/
export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) {
return function <T>({ path, type, next, rawInput }: TrpcMiddlewareArguments<T>): T {
return async function <T>({ path, type, next, rawInput }: TrpcMiddlewareArguments<T>): Promise<T> {
const hub = getCurrentHub();
const clientOptions = hub.getClient()?.getOptions();
const sentryTransaction = hub.getScope().getTransaction();
Expand All @@ -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;
}
};
}

Expand Down

0 comments on commit 8b84905

Please sign in to comment.