54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
|
|
import { NextResponse } from 'next/server';
|
||
|
|
|
||
|
|
// Configuration - Update these URLs to match your actual services
|
||
|
|
const SERVICES = [
|
||
|
|
{ name: 'Website', url: 'https://www.akkolli.net' },
|
||
|
|
{ name: 'Gitea', url: 'https://code.akkolli.net' },
|
||
|
|
{ name: 'Nextcloud', url: 'http://localhost:6060' },
|
||
|
|
];
|
||
|
|
|
||
|
|
export const dynamic = 'force-dynamic';
|
||
|
|
|
||
|
|
export async function GET() {
|
||
|
|
const results = await Promise.all(
|
||
|
|
SERVICES.map(async (service) => {
|
||
|
|
const start = performance.now();
|
||
|
|
try {
|
||
|
|
// Set a short timeout (e.g., 5 seconds)
|
||
|
|
const controller = new AbortController();
|
||
|
|
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
||
|
|
|
||
|
|
const response = await fetch(service.url, {
|
||
|
|
method: 'HEAD',
|
||
|
|
signal: controller.signal,
|
||
|
|
cache: 'no-store',
|
||
|
|
});
|
||
|
|
|
||
|
|
clearTimeout(timeoutId);
|
||
|
|
|
||
|
|
const end = performance.now();
|
||
|
|
const latency = Math.round(end - start);
|
||
|
|
|
||
|
|
return {
|
||
|
|
name: service.name,
|
||
|
|
url: service.url,
|
||
|
|
status: response.ok ? 'up' : 'down',
|
||
|
|
latency: latency,
|
||
|
|
timestamp: new Date().toISOString(),
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
return {
|
||
|
|
name: service.name,
|
||
|
|
url: service.url,
|
||
|
|
status: 'down',
|
||
|
|
latency: 0,
|
||
|
|
timestamp: new Date().toISOString(),
|
||
|
|
error: 'Unreachable'
|
||
|
|
};
|
||
|
|
}
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
return NextResponse.json(results);
|
||
|
|
}
|