178 lines
5.4 KiB
TypeScript
178 lines
5.4 KiB
TypeScript
// =====================================================
|
|
// 基於 IP 的連線清理 API
|
|
// =====================================================
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import { smartIPPool } from '@/lib/smart-ip-connection-pool';
|
|
import { smartIPDetector } from '@/lib/smart-ip-detector';
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { action, targetIP } = body;
|
|
// 使用智能 IP 偵測器
|
|
const ipDetection = smartIPDetector.detectClientIP(request);
|
|
const clientIP = ipDetection.detectedIP;
|
|
|
|
console.log('🎯 智能 IP 偵測結果:', {
|
|
detectedIP: clientIP,
|
|
confidence: ipDetection.confidence,
|
|
source: ipDetection.source,
|
|
isPublicIP: ipDetection.isPublicIP,
|
|
allCandidates: ipDetection.allCandidates
|
|
});
|
|
|
|
// 設置客戶端 IP
|
|
smartIPPool.setClientIP(clientIP);
|
|
|
|
switch (action) {
|
|
case 'cleanup-current':
|
|
// 清理當前 IP 的連線
|
|
console.log(`🧹 收到清理當前 IP 連線請求: ${clientIP}`);
|
|
const cleanupResult = await smartIPPool.cleanupCurrentIPConnections();
|
|
|
|
return NextResponse.json({
|
|
success: cleanupResult.success,
|
|
message: cleanupResult.message,
|
|
data: {
|
|
clientIP,
|
|
killedCount: cleanupResult.killedCount
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
case 'cleanup-specific':
|
|
// 清理指定 IP 的連線
|
|
if (!targetIP) {
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: '缺少目標 IP 參數'
|
|
}, { status: 400 });
|
|
}
|
|
|
|
console.log(`🧹 收到清理指定 IP 連線請求: ${targetIP}`);
|
|
const specificCleanupResult = await smartIPPool.cleanupIPConnections(targetIP);
|
|
|
|
return NextResponse.json({
|
|
success: specificCleanupResult.success,
|
|
message: specificCleanupResult.message,
|
|
data: {
|
|
targetIP,
|
|
killedCount: specificCleanupResult.killedCount
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
case 'cleanup-local':
|
|
// 清理本地追蹤的連線
|
|
console.log('🧹 收到清理本地連線請求');
|
|
const localCleanupCount = smartIPPool.cleanupLocalConnections();
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: `已清理 ${localCleanupCount} 個本地追蹤的連線`,
|
|
data: {
|
|
clientIP,
|
|
cleanedCount: localCleanupCount
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
default:
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: '無效的操作參數',
|
|
availableActions: ['cleanup-current', 'cleanup-specific', 'cleanup-local']
|
|
}, { status: 400 });
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ IP 清理 API 錯誤:', error);
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: 'IP 清理失敗',
|
|
details: error instanceof Error ? error.message : '未知錯誤'
|
|
}, { status: 500 });
|
|
}
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const action = searchParams.get('action') || 'status';
|
|
const targetIP = searchParams.get('ip');
|
|
// 使用智能 IP 偵測器
|
|
const ipDetection = smartIPDetector.detectClientIP(request);
|
|
const clientIP = ipDetection.detectedIP;
|
|
|
|
// 設置客戶端 IP
|
|
smartIPPool.setClientIP(clientIP);
|
|
|
|
switch (action) {
|
|
case 'status':
|
|
// 獲取當前 IP 的連線狀態
|
|
const currentIPStatus = await smartIPPool.getCurrentIPConnections();
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: '連線狀態獲取成功',
|
|
data: {
|
|
detectedIP: clientIP,
|
|
...currentIPStatus
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
case 'status-specific':
|
|
// 獲取指定 IP 的連線狀態
|
|
if (!targetIP) {
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: '缺少目標 IP 參數'
|
|
}, { status: 400 });
|
|
}
|
|
|
|
const specificIPStatus = await smartIPPool.getIPConnections(targetIP);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: '指定 IP 連線狀態獲取成功',
|
|
data: {
|
|
targetIP,
|
|
...specificIPStatus
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
case 'local-stats':
|
|
// 獲取本地連線統計
|
|
const localStats = smartIPPool.getLocalConnectionStats();
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: '本地連線統計獲取成功',
|
|
data: {
|
|
detectedIP: clientIP,
|
|
...localStats
|
|
},
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
default:
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: '無效的操作參數',
|
|
availableActions: ['status', 'status-specific', 'local-stats']
|
|
}, { status: 400 });
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ IP 清理 GET API 錯誤:', error);
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: '獲取連線狀態失敗',
|
|
details: error instanceof Error ? error.message : '未知錯誤'
|
|
}, { status: 500 });
|
|
}
|
|
}
|