| 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); |
| } |
| } |
|
|
| |
| 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 }); |
| } |
| } |
|
|