diff options
Diffstat (limited to 'client-web/source/sw/download.ts')
-rw-r--r-- | client-web/source/sw/download.ts | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/client-web/source/sw/download.ts b/client-web/source/sw/download.ts new file mode 100644 index 0000000..02c5e1a --- /dev/null +++ b/client-web/source/sw/download.ts @@ -0,0 +1,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 }) }, + }) +} |