summaryrefslogtreecommitdiff
path: root/client-web/source/sw/download.ts
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 }) },
    })
}