async function verifySignature(secret: string, body: string, header: string): Promise<boolean> {
const encoder = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw', encoder.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false, ['verify']
)
const expected = header.replace('sha256=', '')
const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(body))
const actual = Array.from(new Uint8Array(sig))
.map(b => b.toString(16).padStart(2, '0')).join('')
return actual === expected
}