71 lines
2.1 KiB
JavaScript
71 lines
2.1 KiB
JavaScript
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"
|
|
? 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 });
|
|
}
|
|
}
|