55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { workerConfig } from '@/uptime.config'
|
|
import { NextRequest } from 'next/server'
|
|
import { CompactedMonitorStateWrapper, getFromStore } from '@/worker/src/store'
|
|
|
|
export const runtime = 'edge'
|
|
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'GET, OPTIONS',
|
|
'Access-Control-Allow-Headers': 'Content-Type',
|
|
}
|
|
|
|
export default async function handler(req: NextRequest): Promise<Response> {
|
|
const compactedState = new CompactedMonitorStateWrapper(
|
|
await getFromStore(process.env as any, 'state')
|
|
)
|
|
|
|
if (compactedState.data.lastUpdate === 0) {
|
|
return new Response(JSON.stringify({ error: 'No data available' }), {
|
|
status: 500,
|
|
headers,
|
|
})
|
|
}
|
|
|
|
let monitors: any = {}
|
|
|
|
for (let monitor of workerConfig.monitors) {
|
|
const lastIncident = compactedState.getIncident(
|
|
monitor.id,
|
|
compactedState.incidentLen(monitor.id) - 1
|
|
)
|
|
|
|
const isUp = lastIncident?.end !== null
|
|
const latency = compactedState.getLastLatency(monitor.id)
|
|
monitors[monitor.id] = {
|
|
up: isUp,
|
|
latency: latency.ping,
|
|
location: latency.loc,
|
|
message: isUp ? 'OK' : lastIncident?.error[lastIncident.error.length - 1],
|
|
}
|
|
}
|
|
|
|
let ret = {
|
|
up: compactedState.data.overallUp,
|
|
down: compactedState.data.overallDown,
|
|
updatedAt: compactedState.data.lastUpdate,
|
|
monitors: monitors,
|
|
}
|
|
|
|
return new Response(JSON.stringify(ret), {
|
|
headers,
|
|
})
|
|
}
|