diff --git a/packages/config/src/orpc/viewer/middlewares.ts b/packages/config/src/orpc/viewer/middlewares.ts index 5359802d5..a8ccbfc1e 100644 --- a/packages/config/src/orpc/viewer/middlewares.ts +++ b/packages/config/src/orpc/viewer/middlewares.ts @@ -11,6 +11,21 @@ const webhookUrlPaths = [ "billingRouter/webhook", ]; +const expectedWhatsAppWebhookValidationErrors = [ + { + code: "UNAUTHORIZED", + message: "Invalid WhatsApp webhook secret", + }, + { + code: "UNAUTHORIZED", + message: "Invalid WhatsApp webhook signature", + }, + { + code: "BAD_REQUEST", + message: "Invalid WhatsApp webhook payload", + }, +]; + const sentryMiddleware = os.middleware(async ({ next, path }) => { try { return await next(); @@ -34,6 +49,8 @@ const sentryMiddleware = os.middleware(async ({ next, path }) => { }); const isUnknownError = (error: unknown, path: string) => { + if (isExpectedWhatsAppWebhookValidationError(error, path)) return false; + if ( error instanceof ORPCError && !error.code?.includes("INTERNAL_SERVER_ERROR") && @@ -44,6 +61,18 @@ const isUnknownError = (error: unknown, path: string) => { return true; }; +const isExpectedWhatsAppWebhookValidationError = ( + error: unknown, + path: string, +) => + path === "chatWhatsAppRouter/productionWebhookProcedure" && + error instanceof ORPCError && + expectedWhatsAppWebhookValidationErrors.some( + (expectedError) => + error.code === expectedError.code && + error.message === expectedError.message, + ); + const requireAuth = oo.spec( os.middleware(async ({ next, context }) => { const user = await context.authenticate();