网盘代理内存泄漏优化

This commit is contained in:
mtvpls
2026-04-26 21:29:22 +08:00
parent 1ccfb9cdce
commit a769642924
2 changed files with 149 additions and 51 deletions
+51 -2
View File
@@ -33,6 +33,10 @@ export async function GET(request: NextRequest) {
const { url, headers } = await getBaiduDirectPlayUrl(session.meta, file.fid, cookie); const { url, headers } = await getBaiduDirectPlayUrl(session.meta, file.fid, cookie);
const range = request.headers.get('range'); const range = request.headers.get('range');
const abortController = new AbortController();
const timeoutId = setTimeout(() => abortController.abort(), 300000);
try {
const upstream = await fetch(url, { const upstream = await fetch(url, {
headers: { headers: {
...headers, ...headers,
@@ -40,8 +44,11 @@ export async function GET(request: NextRequest) {
...(range ? { Range: range } : {}), ...(range ? { Range: range } : {}),
}, },
cache: 'no-store', cache: 'no-store',
signal: abortController.signal,
}); });
clearTimeout(timeoutId);
if (!upstream.ok || !upstream.body) { if (!upstream.ok || !upstream.body) {
return NextResponse.json( return NextResponse.json(
{ error: `百度网盘视频代理失败 (${upstream.status})` }, { error: `百度网盘视频代理失败 (${upstream.status})` },
@@ -57,10 +64,52 @@ export async function GET(request: NextRequest) {
}); });
responseHeaders.set('Cache-Control', 'private, no-store'); responseHeaders.set('Cache-Control', 'private, no-store');
return new Response(upstream.body, { const { readable, writable } = new TransformStream();
status: range && upstream.headers.get('content-range') ? 206 : 200, const reader = upstream.body.getReader();
void (async () => {
const writer = writable.getWriter();
try {
let streamDone = false;
while (!streamDone) {
const { done, value } = await reader.read();
if (done) {
streamDone = true;
} else {
await writer.write(value);
}
}
} catch {
try {
await reader.cancel();
} catch {
void 0;
}
} finally {
try {
reader.releaseLock();
} catch {
void 0;
}
try {
await writer.close();
} catch {
void 0;
}
}
})();
return new Response(readable, {
status: range && upstream.headers.get('content-range') ? 206 : upstream.status,
headers: responseHeaders, headers: responseHeaders,
}); });
} catch (error) {
clearTimeout(timeoutId);
if (error instanceof Error && error.name === 'AbortError') {
return NextResponse.json({ error: '百度网盘代理超时' }, { status: 504 });
}
throw error;
}
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
{ error: error instanceof Error ? error.message : '百度网盘代理失败' }, { error: error instanceof Error ? error.message : '百度网盘代理失败' },
+51 -2
View File
@@ -59,14 +59,21 @@ export async function GET(request: NextRequest) {
} }
const range = request.headers.get('range'); const range = request.headers.get('range');
const abortController = new AbortController();
const timeoutId = setTimeout(() => abortController.abort(), 300000);
try {
const upstream = await fetch(selected.url, { const upstream = await fetch(selected.url, {
headers: { headers: {
...getQuarkPlayHeaders(cookie), ...getQuarkPlayHeaders(cookie),
...(range ? { Range: range } : {}), ...(range ? { Range: range } : {}),
}, },
cache: 'no-store', cache: 'no-store',
signal: abortController.signal,
}); });
clearTimeout(timeoutId);
if (!upstream.ok || !upstream.body) { if (!upstream.ok || !upstream.body) {
return NextResponse.json( return NextResponse.json(
{ error: `夸克视频代理失败 (${upstream.status})` }, { error: `夸克视频代理失败 (${upstream.status})` },
@@ -82,10 +89,52 @@ export async function GET(request: NextRequest) {
}); });
responseHeaders.set('Cache-Control', 'private, no-store'); responseHeaders.set('Cache-Control', 'private, no-store');
return new Response(upstream.body, { const { readable, writable } = new TransformStream();
status: range && upstream.headers.get('content-range') ? 206 : 200, const reader = upstream.body.getReader();
void (async () => {
const writer = writable.getWriter();
try {
let streamDone = false;
while (!streamDone) {
const { done, value } = await reader.read();
if (done) {
streamDone = true;
} else {
await writer.write(value);
}
}
} catch {
try {
await reader.cancel();
} catch {
void 0;
}
} finally {
try {
reader.releaseLock();
} catch {
void 0;
}
try {
await writer.close();
} catch {
void 0;
}
}
})();
return new Response(readable, {
status: range && upstream.headers.get('content-range') ? 206 : upstream.status,
headers: responseHeaders, headers: responseHeaders,
}); });
} catch (error) {
clearTimeout(timeoutId);
if (error instanceof Error && error.name === 'AbortError') {
return NextResponse.json({ error: '夸克网盘代理超时' }, { status: 504 });
}
throw error;
}
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
{ error: error instanceof Error ? error.message : '夸克网盘代理失败' }, { error: error instanceof Error ? error.message : '夸克网盘代理失败' },