fix(webhook): add health check

Signed-off-by: Innei <i@innei.in>
This commit is contained in:
Innei
2023-12-25 11:45:29 +08:00
parent 9f9789243b
commit 2621304f43

View File

@@ -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 }))
}
}