Files
vps-panel/src/lib/ping.ts
T

44 lines
1.4 KiB
TypeScript

import { Site } from './config'
import { insertPingLog, getLastLog } from './appDb'
import { sendStatusAlert } from './notify'
export async function pingSite(site: Site): Promise<{
status: 'up' | 'down' | 'degraded'
ms: number
code: number | null
error: string | null
}> {
const start = Date.now()
const controller = new AbortController()
const timer = setTimeout(() => controller.abort(), 10000)
try {
const res = await fetch(site.url, {
signal: controller.signal,
headers: { 'User-Agent': 'VPSPanel/1.0' },
})
clearTimeout(timer)
const ms = Date.now() - start
const status = res.ok ? (ms > 3000 ? 'degraded' : 'up') : 'down'
return { status, ms, code: res.status, error: null }
} catch (e: unknown) {
clearTimeout(timer)
const ms = Date.now() - start
const isTimeout = e instanceof Error && e.name === 'AbortError'
return { status: 'down', ms, code: null, error: isTimeout ? 'Timeout' : (e instanceof Error ? e.message : 'Hata') }
}
}
export async function pingAndLog(site: Site) {
const previous = await getLastLog(site.id)
const result = await pingSite(site)
await insertPingLog({ site_id: site.id, ...result })
// Durum değişti mi? → bildirim gönder
if (previous && previous.status !== result.status) {
sendStatusAlert(site.name, site.url, previous.status, result.status, result.ms).catch(() => {})
}
return result
}