From eb618a4596a59c9ba8e6770d5d53bfd7f30285c9 Mon Sep 17 00:00:00 2001 From: CactusBlue Date: Wed, 26 Feb 2025 18:10:33 -0800 Subject: [PATCH] add timeout for sending test emails (#486) --- .../app/api/latest/internal/send-test-email/route.tsx | 11 ++++++++++- apps/backend/src/lib/emails.tsx | 2 +- packages/react/package.json | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/app/api/latest/internal/send-test-email/route.tsx b/apps/backend/src/app/api/latest/internal/send-test-email/route.tsx index 16b7ae479..c6ab6ed0d 100644 --- a/apps/backend/src/app/api/latest/internal/send-test-email/route.tsx +++ b/apps/backend/src/app/api/latest/internal/send-test-email/route.tsx @@ -3,6 +3,8 @@ import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler"; import * as schemaFields from "@stackframe/stack-shared/dist/schema-fields"; import { adaptSchema, adminAuthTypeSchema, emailSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; import { StackAssertionError, captureError } from "@stackframe/stack-shared/dist/utils/errors"; +import { timeout } from "@stackframe/stack-shared/dist/utils/promises"; +import { Result } from "@stackframe/stack-shared/dist/utils/results"; export const POST = createSmartRouteHandler({ metadata: { @@ -35,7 +37,7 @@ export const POST = createSmartRouteHandler({ }).defined(), }), handler: async ({ body, auth }) => { - const result = await sendEmailWithoutRetries({ + const resultOuter = await timeout(sendEmailWithoutRetries({ tenancyId: auth.tenancy.id, emailConfig: { type: 'standard', @@ -50,6 +52,13 @@ export const POST = createSmartRouteHandler({ to: body.recipient_email, subject: "Test Email from Stack Auth", text: "This is a test email from Stack Auth. If you successfully received this email, your email server configuration is working correctly.", + }), 10000); + + + const result = resultOuter.status === 'ok' ? resultOuter.data : Result.error({ + errorType: undefined, + rawError: undefined, + message: "Timed out while sending test email. Make sure the email server is running and accepting connections.", }); let errorMessage = result.status === 'error' ? result.error.message : undefined; diff --git a/apps/backend/src/lib/emails.tsx b/apps/backend/src/lib/emails.tsx index 9d1c84ce0..e11424a68 100644 --- a/apps/backend/src/lib/emails.tsx +++ b/apps/backend/src/lib/emails.tsx @@ -82,7 +82,7 @@ async function _sendEmailWithoutRetries(options: SendEmailOptions): Promise { await wait(5000); if (!finished) { - captureError("email-send-timeout", new StackAssertionError("Email send took longer than 8s; maybe the email service is too slow?", { + captureError("email-send-timeout", new StackAssertionError("Email send took longer than 5s; maybe the email service is too slow?", { config: options.emailConfig.type === 'shared' ? "shared" : pick(options.emailConfig, ['host', 'port', 'username', 'senderEmail', 'senderName']), to: options.to, subject: options.subject, diff --git a/packages/react/package.json b/packages/react/package.json index 0c68d28c5..14f9c6af1 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,7 +1,7 @@ { "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY", "name": "@stackframe/react", - "version": "2.7.18", + "version": "2.7.19", "sideEffects": false, "main": "./dist/index.js", "types": "./dist/index.d.ts",