mirror of
https://github.com/beilunyang/moemail.git
synced 2025-09-27 03:46:03 +08:00
54 lines
1.3 KiB
TypeScript
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
|
|
}
|