UptimeFlare/pages/api/data.ts

55 lines
1.6 KiB
TypeScript

import { maintenances, workerConfig } from '@/uptime.config'
import { MonitorState } from '@/types/config'
import { NextRequest } from 'next/server'
export const runtime = 'edge'
export default async function handler(req: NextRequest): Promise<Response> {
const { UPTIMEFLARE_STATE } = process.env as unknown as {
UPTIMEFLARE_STATE: KVNamespace
}
const stateStr = await UPTIMEFLARE_STATE?.get('state')
if (!stateStr) {
return new Response(JSON.stringify({ error: 'No data available' }), {
status: 500,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
},
})
}
const state = JSON.parse(stateStr) as unknown as MonitorState
let monitors: any = {}
for (let monitor of workerConfig.monitors) {
const isUp = state.incident[monitor.id].slice(-1)[0].end !== undefined
monitors[monitor.id] = {
up: isUp,
latency: state.latency[monitor.id].recent.slice(-1)[0].ping,
location: state.latency[monitor.id].recent.slice(-1)[0].loc,
message: isUp ? 'OK' : state.incident[monitor.id].slice(-1)[0].error.slice(-1)[0],
}
}
let ret = {
up: state.overallUp,
down: state.overallDown,
updatedAt: state.lastUpdate,
monitors,
maintenances,
}
return new Response(JSON.stringify(ret), {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
},
})
}