44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
import { Agent, request } from "undici";
|
|
import { create as contentDisposition } from "content-disposition-header";
|
|
|
|
import { destroyInternalStream } from "./manage.js";
|
|
import { getHeaders, closeRequest, closeResponse, pipe } from "./shared.js";
|
|
|
|
const defaultAgent = new Agent();
|
|
|
|
export default async function (streamInfo, res) {
|
|
const abortController = new AbortController();
|
|
const shutdown = () => (
|
|
closeRequest(abortController),
|
|
closeResponse(res),
|
|
destroyInternalStream(streamInfo.urls)
|
|
);
|
|
|
|
try {
|
|
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
|
|
res.setHeader('Content-disposition', contentDisposition(streamInfo.filename));
|
|
|
|
const { body: stream, headers, statusCode } = await request(streamInfo.urls, {
|
|
headers: {
|
|
...getHeaders(streamInfo.service),
|
|
Range: streamInfo.range
|
|
},
|
|
signal: abortController.signal,
|
|
maxRedirections: 16,
|
|
dispatcher: defaultAgent,
|
|
});
|
|
|
|
res.status(statusCode);
|
|
|
|
for (const headerName of ['accept-ranges', 'content-type', 'content-length']) {
|
|
if (headers[headerName]) {
|
|
res.setHeader(headerName, headers[headerName]);
|
|
}
|
|
}
|
|
|
|
pipe(stream, res, shutdown);
|
|
} catch {
|
|
shutdown();
|
|
}
|
|
}
|