From 72f30976f18f6d7ecc3cb1f035a1775fb88c7bc1 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Thu, 7 Dec 2023 16:37:30 +0000 Subject: [PATCH 1/2] fix(node): Capture errors in tRPC middleware --- packages/node/src/handlers.ts | 38 +++++++++++++---------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 83f23ccaec7c..dfe23d08df55 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -351,36 +351,26 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { sentryTransaction.setContext('trpc', trpcContext); } - function shouldCaptureError(e: unknown): boolean { - if (typeof e === 'object' && e && 'code' in e) { - // Is likely TRPCError - we only want to capture internal server errors - return e.code === 'INTERNAL_SERVER_ERROR'; - } else { - // Is likely random error that bubbles up - return true; + function captureIfError(nextResult: { ok: false; error?: Error } | { ok: true }): void { + if (!nextResult.ok) { + captureException(nextResult.error, { mechanism: { handled: false } }); } } - function handleErrorCase(e: unknown): void { - if (shouldCaptureError(e)) { - captureException(e, { mechanism: { handled: false } }); - } - } - - let maybePromiseResult; - - try { - maybePromiseResult = next(); - } catch (e) { - handleErrorCase(e); - throw e; - } + const maybePromiseResult = next(); if (isThenable(maybePromiseResult)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - Promise.resolve(maybePromiseResult).then(null, e => { - handleErrorCase(e); - }); + Promise.resolve(maybePromiseResult).then( + nextResult => { + captureIfError(nextResult as any); + }, + () => { + // noop + }, + ); + } else { + captureIfError(maybePromiseResult as any); } // We return the original promise just to be safe. From 8e581876c4dfe912f305812b9e8591ccdfc2202c Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Mon, 11 Dec 2023 10:03:54 +0000 Subject: [PATCH 2/2] . --- packages/node/src/handlers.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index dfe23d08df55..3160c77b416a 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -353,11 +353,17 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { function captureIfError(nextResult: { ok: false; error?: Error } | { ok: true }): void { if (!nextResult.ok) { - captureException(nextResult.error, { mechanism: { handled: false } }); + captureException(nextResult.error, { mechanism: { handled: false, data: { function: 'trpcMiddleware' } } }); } } - const maybePromiseResult = next(); + let maybePromiseResult; + try { + maybePromiseResult = next(); + } catch (e) { + captureException(e, { mechanism: { handled: false, data: { function: 'trpcMiddleware' } } }); + throw e; + } if (isThenable(maybePromiseResult)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access @@ -365,8 +371,8 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { nextResult => { captureIfError(nextResult as any); }, - () => { - // noop + e => { + captureException(e, { mechanism: { handled: false, data: { function: 'trpcMiddleware' } } }); }, ); } else {