diff --git a/apps/remix/app/routes/api+/stripe.webhook.ts b/apps/remix/app/routes/api+/stripe.webhook.ts index 7be8bcc1b..6530125ff 100644 --- a/apps/remix/app/routes/api+/stripe.webhook.ts +++ b/apps/remix/app/routes/api+/stripe.webhook.ts @@ -3,5 +3,5 @@ import { stripeWebhookHandler } from '@documenso/ee/server-only/stripe/webhook/h import type { Route } from './+types/webhook.trigger'; export async function action({ request }: Route.ActionArgs) { - return stripeWebhookHandler(request); + return await stripeWebhookHandler(request); } diff --git a/apps/remix/server/router.ts b/apps/remix/server/router.ts index 40d6581fc..c75f6f65b 100644 --- a/apps/remix/server/router.ts +++ b/apps/remix/server/router.ts @@ -1,7 +1,5 @@ import { Hono } from 'hono'; -import { bodyLimit } from 'hono/body-limit'; import { contextStorage } from 'hono/context-storage'; -import { timeout } from 'hono/timeout'; import { tsRestHonoApp } from '@documenso/api/hono'; import { auth } from '@documenso/auth/server'; @@ -22,12 +20,6 @@ export interface HonoEnv { const app = new Hono(); -/** - * Global middleware limits. - */ -app.use(timeout(120000)); // Two minute timeout. -app.use(bodyLimit({ maxSize: 50 * 1024 * 1024 })); // 50mb size limit. - /** * Attach session and context to requests. */ diff --git a/packages/ee/server-only/stripe/webhook/handler.ts b/packages/ee/server-only/stripe/webhook/handler.ts index 32f0c8516..ce6e5b936 100644 --- a/packages/ee/server-only/stripe/webhook/handler.ts +++ b/packages/ee/server-only/stripe/webhook/handler.ts @@ -16,7 +16,7 @@ type StripeWebhookResponse = { message: string; }; -export const stripeWebhookHandler = async (req: Request) => { +export const stripeWebhookHandler = async (req: Request): Promise => { try { const isBillingEnabled = IS_BILLING_ENABLED(); @@ -51,17 +51,21 @@ export const stripeWebhookHandler = async (req: Request) => { ); } - // Todo: (RR7) I'm not sure about this. - const clonedReq = req.clone(); - const rawBody = await clonedReq.arrayBuffer(); - const body = Buffer.from(rawBody); + const payload = await req.text(); - // It was this: - // const body = await buffer(req); + if (!payload) { + return Response.json( + { + success: false, + message: 'No payload found in request', + } satisfies StripeWebhookResponse, + { status: 400 }, + ); + } - const event = stripe.webhooks.constructEvent(body, signature, webhookSecret); + const event = stripe.webhooks.constructEvent(payload, signature, webhookSecret); - await match(event.type) + return await match(event.type) .with('checkout.session.completed', async () => { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const session = event.data.object as Stripe.Checkout.Session;