From af3ab83d2b848787fd0bb219c9f719ce1db83efa Mon Sep 17 00:00:00 2001 From: Krishna Waske Date: Mon, 27 Apr 2026 18:15:02 +0530 Subject: [PATCH 1/2] feat: configurable webhook timeout Signed-off-by: Krishna Waske --- .env.demo | 2 ++ src/events/WebhookEvent.ts | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.env.demo b/.env.demo index 786570c4..9b01cb0d 100644 --- a/.env.demo +++ b/.env.demo @@ -68,6 +68,8 @@ OID4VP_AUTH_REQUEST_PROOF_REQUEST_EXPIRY=3600 APP_JSON_BODY_SIZE=5mb APP_URL_ENCODED_BODY_SIZE=5mb +# Webhook awaited expiry is in milliseconds +WEBHOOK_TIMEOUT_MS=10000 API_KEY=supersecret-that-too-16chars UPDATE_JWT_SECRET=false diff --git a/src/events/WebhookEvent.ts b/src/events/WebhookEvent.ts index 307bfb05..447fe063 100644 --- a/src/events/WebhookEvent.ts +++ b/src/events/WebhookEvent.ts @@ -2,12 +2,16 @@ import type { Logger } from '@credo-ts/core' import fetch from 'node-fetch' +const DEFAULT_TIMEOUT = 5000; + export const sendWebhookEvent = async ( webhookUrl: string, body: Record, logger: Logger, - timeoutMs = 5000, + timeoutMs: number = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '', 10) || DEFAULT_TIMEOUT, ): Promise => { + + console.log(`Sending webhook event to ${webhookUrl} with timeout of ${timeoutMs}ms`) // Abort the webhook send events if the request hangs-in for >5 secs // This can avoid failure of services due to bad webhook listners const controller = new AbortController() From d9c20403d08d3da9c66c4fad2ab4cb1ea9cf74b2 Mon Sep 17 00:00:00 2001 From: Krishna Waske Date: Tue, 28 Apr 2026 12:28:49 +0530 Subject: [PATCH 2/2] fix: handle negative values Signed-off-by: Krishna Waske --- src/events/WebhookEvent.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/events/WebhookEvent.ts b/src/events/WebhookEvent.ts index 447fe063..cdb4a353 100644 --- a/src/events/WebhookEvent.ts +++ b/src/events/WebhookEvent.ts @@ -8,14 +8,18 @@ export const sendWebhookEvent = async ( webhookUrl: string, body: Record, logger: Logger, - timeoutMs: number = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '', 10) || DEFAULT_TIMEOUT, + timeoutMs?: number, ): Promise => { - console.log(`Sending webhook event to ${webhookUrl} with timeout of ${timeoutMs}ms`) + const envTimeout = parseInt(process.env.WEBHOOK_TIMEOUT_MS ?? '', 10) + const candidateTimeout = timeoutMs ?? envTimeout + const resolvedTimeout = candidateTimeout > 0 ? candidateTimeout : DEFAULT_TIMEOUT + + logger.info(`Sending webhook event to ${webhookUrl} with timeout of ${resolvedTimeout}ms`) // Abort the webhook send events if the request hangs-in for >5 secs // This can avoid failure of services due to bad webhook listners const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), timeoutMs) + const timeout = setTimeout(() => controller.abort(), resolvedTimeout) try { await fetch(webhookUrl, {