Files
moemail/app/lib/webhook.ts
2024-12-18 01:59:34 +08:00

54 lines
1.3 KiB
TypeScript

import { WEBHOOK_CONFIG } from "@/config"
export interface EmailMessage {
emailId: string
messageId: string
fromAddress: string
subject: string
content: string
html: string
receivedAt: string
toAddress: string
}
export interface WebhookPayload {
event: typeof WEBHOOK_CONFIG.EVENTS[keyof typeof WEBHOOK_CONFIG.EVENTS]
data: EmailMessage
}
export async function callWebhook(url: string, payload: WebhookPayload) {
let lastError: Error | null = null
for (let i = 0; i < WEBHOOK_CONFIG.MAX_RETRIES; i++) {
try {
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), WEBHOOK_CONFIG.TIMEOUT)
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Webhook-Event": payload.event,
},
body: JSON.stringify(payload.data),
signal: controller.signal,
})
clearTimeout(timeoutId)
if (response.ok) {
return true
}
lastError = new Error(`HTTP error! status: ${response.status}`)
} catch (error) {
lastError = error as Error
if (i < WEBHOOK_CONFIG.MAX_RETRIES - 1) {
await new Promise(resolve => setTimeout(resolve, WEBHOOK_CONFIG.RETRY_DELAY))
}
}
}
throw lastError
}