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