44 lines
1.4 KiB
TypeScript
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
|
|
}
|