@owlrelay/webhook
Version:
OwlRelay Webhook utilities
1 lines • 5.57 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/signature.ts","../src/webhooks.models.ts","../src/webhook.services.ts"],"sourcesContent":["export function arrayBufferToBase64(arrayBuffer: ArrayBuffer) {\n return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));\n}\n\nexport function base64ToArrayBuffer(base64: string) {\n return new Uint8Array(atob(base64).split('').map(char => char.charCodeAt(0))).buffer;\n}\n\nexport async function signBody({\n bodyBuffer,\n secret,\n}: {\n bodyBuffer: ArrayBuffer;\n secret: string;\n}) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const key = await crypto.subtle.importKey('raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);\n\n const signature = await crypto.subtle.sign('HMAC', key, bodyBuffer);\n const signatureBase64 = arrayBufferToBase64(signature);\n\n return { signature: signatureBase64 };\n}\n\nexport async function verifySignature({\n bodyBuffer,\n signature: base64Signature,\n secret,\n}: {\n bodyBuffer: ArrayBuffer;\n signature: string;\n secret: string;\n}): Promise<boolean> {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const key = await crypto.subtle.importKey('raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);\n\n const signatureBuffer = base64ToArrayBuffer(base64Signature);\n\n return crypto.subtle.verify('HMAC', key, signatureBuffer, bodyBuffer);\n}\n","import type { Email } from './types';\n\nexport function serializeEmailForWebhook({ email }: { email: Email }) {\n const body = new FormData();\n const { attachments = [], ...rest } = email;\n\n body.append('email', JSON.stringify(rest));\n\n for (const attachment of attachments ?? []) {\n body.append('attachments[]', new File([attachment.content], attachment.filename ?? 'file', { type: attachment.mimeType }));\n }\n\n return { body };\n}\n","import type { Email } from './types';\nimport { fetch, type Fetch } from 'ofetch';\nimport { signBody } from './signature';\nimport { serializeEmailForWebhook } from './webhooks.models';\n\nexport async function triggerWebhook({\n email,\n webhookUrl,\n webhookSecret,\n httpClient = fetch,\n}: {\n email: Email;\n webhookUrl: string;\n webhookSecret?: string | null;\n httpClient?: Fetch;\n}) {\n const { body } = serializeEmailForWebhook({ email });\n const bodyResponse = new Response(body);\n\n const headers = Object.fromEntries(bodyResponse.headers.entries());\n const bodyBuffer = await bodyResponse.arrayBuffer();\n\n if (webhookSecret) {\n const { signature } = await signBody({ bodyBuffer, secret: webhookSecret });\n headers['X-Signature'] = signature;\n }\n\n const response = await httpClient(\n webhookUrl,\n {\n method: 'POST',\n body: bodyBuffer,\n headers: {\n 'User-Agent': 'owlrelay-webhook-client',\n ...headers,\n },\n },\n );\n\n return response;\n}\n"],"names":[],"mappings":"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"}