9router / src /app /api /proxy-pools /[id] /test /route.js
2api
feat: configurable stream stall timeout + per-provider UI
88c4c60
Raw
History Blame Contribute Delete
2.22 kB
import { NextResponse } from "next/server";
import { getProxyPoolById, updateProxyPool } from "@/models";
import { testProxyUrl } from "@/lib/network/proxyTest";
import { fetch as undiciFetch } from "undici";
async function testVercelRelay(relayUrl, timeoutMs = 10000) {
const controller = new AbortController();
const startedAt = Date.now();
const timer = setTimeout(() => controller.abort(), timeoutMs);
try {
const res = await undiciFetch(relayUrl, {
method: "GET",
headers: {
"x-relay-target": "https://httpbin.org",
"x-relay-path": "/get",
},
signal: controller.signal,
});
return {
ok: res.ok,
status: res.status,
statusText: res.statusText,
elapsedMs: Date.now() - startedAt,
};
} catch (err) {
return {
ok: false,
status: 500,
error: err?.name === "AbortError" ? "Relay test timed out" : (err?.message || String(err)),
};
} finally {
clearTimeout(timer);
}
}
// POST /api/proxy-pools/[id]/test - Test proxy pool entry
export async function POST(request, { params }) {
try {
const { id } = await params;
const proxyPool = await getProxyPoolById(id);
if (!proxyPool) {
return NextResponse.json({ error: "Proxy pool not found" }, { status: 404 });
}
const result = proxyPool.type === "vercel" || proxyPool.type === "cloudflare" || proxyPool.type === "deno"
? await testVercelRelay(proxyPool.proxyUrl)
: await testProxyUrl({ proxyUrl: proxyPool.proxyUrl });
const now = new Date().toISOString();
await updateProxyPool(id, {
testStatus: result.ok ? "active" : "error",
lastTestedAt: now,
lastError: result.ok ? null : (result.error || `Proxy test failed with status ${result.status}`),
isActive: result.ok,
});
return NextResponse.json({
ok: result.ok,
status: result.status,
statusText: result.statusText || null,
error: result.error || null,
elapsedMs: result.elapsedMs || 0,
testedAt: now,
});
} catch (error) {
console.log("Error testing proxy pool:", error);
return NextResponse.json({ error: "Failed to test proxy pool" }, { status: 500 });
}
}