aboutsummaryrefslogtreecommitdiff
path: root/client-web/source/sw/download.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client-web/source/sw/download.ts')
-rw-r--r--client-web/source/sw/download.ts36
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 }) },
+ })
+}