blob: 02c5e1a9c3e4f8ea0c04fefca8e858afffc58780 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
export const streams = new Map<string, { readable: ReadableStream, size: number }>()
export function handle_download_request(path: string, event: FetchEvent) {
const stream = streams.get(path)
if (stream) {
streams.delete(path)
console.log(`-> stream response`);
event.respondWith(
new Response(
stream.readable,
{
headers: new Headers({
"content-type": "application/octet-stream; charset=utf-8", // TODO transmit and set accordingly
"content-security-policy": "default-src 'none'",
"content-length": `${stream.size}`,
})
}
)
)
}
event.respondWith(new Response("download failed", { status: 400, headers: new Headers({ "content-type": "text/plain" }) }))
}
export function port_to_readable(port: MessagePort): ReadableStream {
return new ReadableStream({
start(controller) {
console.log("ReadableStream started");
port.onmessage = event => {
if (event.data === "end") controller.close()
else if (event.data === "abort") controller.error("aborted")
else controller.enqueue(event.data)
}
},
cancel() { console.log("ReadableStream cancelled"); port.postMessage({ abort: true }) },
})
}
|