From 2621304f433368ba279985109d7e5fd378969307 Mon Sep 17 00:00:00 2001 From: Innei Date: Mon, 25 Dec 2023 11:45:29 +0800 Subject: [PATCH] fix(webhook): add health check Signed-off-by: Innei --- packages/webhook/src/handler.ts | 68 ++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/packages/webhook/src/handler.ts b/packages/webhook/src/handler.ts index 177142d6..01e8c390 100644 --- a/packages/webhook/src/handler.ts +++ b/packages/webhook/src/handler.ts @@ -20,35 +20,51 @@ export const createHandler = (options: CreateHandlerOptions): Handler => { const { secret } = options const handler: Handler = async function (req, res) { - const signature = req.headers['x-webhook-signature'] - assert(typeof signature === 'string', 'X-Webhook-Signature must be string') - const event = req.headers['x-webhook-event'] - const signature256 = req.headers['x-webhook-signature256'] - assert( - typeof signature256 === 'string', - 'X-Webhook-Signature256 must be string', - ) + try { + const signature = req.headers['x-webhook-signature'] + assert( + typeof signature === 'string', + 'X-Webhook-Signature must be string', + ) + const event = req.headers['x-webhook-event'] + const signature256 = req.headers['x-webhook-signature256'] + assert( + typeof signature256 === 'string', + 'X-Webhook-Signature256 must be string', + ) - const obj = (req as any).body || (await parseJSONFromRequest(req)) - const stringifyPayload = JSON.stringify(obj) - const isValid = - verifyWebhook(secret, stringifyPayload, signature256 as string) && - verifyWebhookSha1(secret, stringifyPayload, signature as string) + const obj = (req as any).body || (await parseJSONFromRequest(req)) + const stringifyPayload = JSON.stringify(obj) + const isValid = + verifyWebhook(secret, stringifyPayload, signature256 as string) && + verifyWebhookSha1(secret, stringifyPayload, signature as string) + if (isValid) { + if (event === 'health_check') { + res.statusCode = 200 + res.setHeader('Content-Type', 'application/json') + res.end(JSON.stringify({ ok: 1 })) + return + } - if (isValid) { - handler.emitter.emit(event as BusinessEvents, obj) - handler.emitter.emit('*', { - type: event, - payload: obj, - }) - res.statusCode = 200 - res.end() - } else { - console.error('revice a invalidate webhook payload', req.headers) - handler.emitter.emit('error', new Error('invalidate signature')) + handler.emitter.emit(event as BusinessEvents, obj) + handler.emitter.emit('*', { + type: event, + payload: obj, + }) + res.statusCode = 200 + res.setHeader('Content-Type', 'application/json') + res.end(JSON.stringify({ ok: 1 })) + } else { + console.error('revice a invalidate webhook payload', req.headers) + handler.emitter.emit('error', new Error('invalidate signature')) - res.statusCode = 400 - res.end('invalidate signature') + res.statusCode = 400 + res.setHeader('Content-Type', 'application/json') + res.end(JSON.stringify({ ok: 0, message: 'Invalid Signature' })) + } + } catch (err) { + res.statusCode = 500 + res.end(JSON.stringify({ ok: 0, message: err.message })) } }