diff options
author | metamuffin <metamuffin@disroot.org> | 2022-10-28 23:25:24 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-10-28 23:25:24 +0200 |
commit | 8040c863d7495b9a65e265f9917dc749ba28745e (patch) | |
tree | b1280fcf29f530e61684031dbbc929b03c322e65 /client-web/source | |
parent | 014d16253a7d6d5b136158828c93e40b7aba8314 (diff) | |
download | keks-meet-8040c863d7495b9a65e265f9917dc749ba28745e.tar keks-meet-8040c863d7495b9a65e265f9917dc749ba28745e.tar.bz2 keks-meet-8040c863d7495b9a65e265f9917dc749ba28745e.tar.zst |
cancel download correctly
Diffstat (limited to 'client-web/source')
-rw-r--r-- | client-web/source/resource/file.ts | 32 | ||||
-rw-r--r-- | client-web/source/sw/download_stream.ts | 6 | ||||
-rw-r--r-- | client-web/source/sw/worker.ts | 2 | ||||
-rw-r--r-- | client-web/source/user/local.ts | 10 |
4 files changed, 38 insertions, 12 deletions
diff --git a/client-web/source/resource/file.ts b/client-web/source/resource/file.ts index 97da70b..20886cb 100644 --- a/client-web/source/resource/file.ts +++ b/client-web/source/resource/file.ts @@ -56,6 +56,8 @@ export const resource_file: ResourceHandlerDecl = { } ); + let finished = false + channel.onopen = _ev => { log("dc", `${user.display_name}: channel open`); } @@ -64,12 +66,23 @@ export const resource_file: ResourceHandlerDecl = { } channel.onclose = _ev => { log("dc", `${user.display_name}: channel closed`); - download.close() + if (!finished) { + log({ warn: true, scope: "dc" }, "transfer failed"); + download.abort() + } else { + download.close() + } reset() } channel.onmessage = ev => { - // console.log(ev.data); - download.write(ev.data) + const data: Blob | string = ev.data + if (typeof data == "string") { + if (data == "end") { + finished = true + } + } else { + download.write(data as Blob) + } } } } @@ -92,9 +105,12 @@ export function create_file_res(): Promise<LocalResource> { function file_res_inner(file: File): LocalResource { const transfers_el = ediv({}) + const transfers_abort = new Set<() => void>() return { info: { kind: "file", id: Math.random().toString(), label: file.name, size: file.size }, - destroy() { }, + destroy() { + transfers_abort.forEach(abort => abort()) + }, el: ediv({ class: "file" }, espan(`Sharing file: ${JSON.stringify(file.name)}`), transfers_el @@ -111,18 +127,21 @@ function file_res_inner(file: File): LocalResource { let position = 0 const finish = async () => { + channel.send("end") while (channel.bufferedAmount) { display.status = `Draining buffers… (buffer: ${channel.bufferedAmount})` await sleep(10) } display.status = "Waiting for the channel to close…" - return channel.close() + channel.close() } const feed = async () => { const { value: chunk, done }: { value?: Uint8Array, done: boolean } = await reader.read() if (done) return await finish() if (!chunk) return console.warn("no chunk"); position += chunk.length + // bad spec: https://www.rfc-editor.org/rfc/rfc8831#name-transferring-user-data-on-a + // see https://github.com/webrtc-rs/webrtc/pull/304 for (let i = 0; i < chunk.length; i += MAX_CHUNK_SIZE) { channel.send(chunk.slice(i, Math.min(i + MAX_CHUNK_SIZE, chunk.length))) } @@ -135,6 +154,7 @@ function file_res_inner(file: File): LocalResource { await feed() } } + const abort_cb = () => { channel.close(); } channel.onbufferedamountlow = () => feed_until_full() channel.onopen = _ev => { display.status = "Buffering…" @@ -150,7 +170,9 @@ function file_res_inner(file: File): LocalResource { channel.onclose = _ev => { log("dc", `${user.display_name}: channel closed`); transfers_el.removeChild(display.el) + transfers_abort.delete(abort_cb) } + transfers_abort.add(abort_cb) return channel } } diff --git a/client-web/source/sw/download_stream.ts b/client-web/source/sw/download_stream.ts index 0ba6289..52d9fad 100644 --- a/client-web/source/sw/download_stream.ts +++ b/client-web/source/sw/download_stream.ts @@ -4,7 +4,7 @@ import { SW } from "./init.ts" function FallbackStreamDownload(size: number, filename?: string, progress?: (position: number) => void) { log({ scope: "*", warn: true }, "downloading to memory because serviceworker is not available") let position = 0 - const buffer = new Uint8Array(size) + let buffer = new Uint8Array(size) return { close() { const a = document.createElement("a") @@ -12,6 +12,7 @@ function FallbackStreamDownload(size: number, filename?: string, progress?: (pos a.download = filename ?? "file" a.click() }, + abort() { buffer = new Uint8Array(); /* have fun gc */ }, write(chunk: Blob) { const reader = new FileReader(); reader.onload = function (event) { @@ -57,6 +58,9 @@ export function StreamDownload({ size, filename, cancel, progress }: { close() { port1.postMessage("end") }, + abort() { + port1.postMessage("abort") + }, write(chunk: Blob) { const reader = new FileReader(); reader.onload = function (event) { diff --git a/client-web/source/sw/worker.ts b/client-web/source/sw/worker.ts index 327aba0..94db220 100644 --- a/client-web/source/sw/worker.ts +++ b/client-web/source/sw/worker.ts @@ -39,7 +39,7 @@ function port_to_readable(port: MessagePort): ReadableStream { start(controller) { console.log("ReadableStream started"); port.onmessage = event => { - if (event.data === "end") { controller.close() } + if (event.data === "end") controller.close() else if (event.data === "abort") controller.error("aborted") else controller.enqueue(event.data) } diff --git a/client-web/source/user/local.ts b/client-web/source/user/local.ts index 29a9d54..8899d26 100644 --- a/client-web/source/user/local.ts +++ b/client-web/source/user/local.ts @@ -8,7 +8,7 @@ import { log } from "../logger.ts"; import { RemoteUser } from "./remote.ts"; import { Room } from "../room.ts"; -import { ChatMessage, ProvideInfo } from "../../../common/packets.d.ts"; +import { ChatMessage } from "../../../common/packets.d.ts"; import { User } from "./mod.ts"; import { create_camera_res, create_mic_res, create_screencast_res } from "../resource/track.ts"; import { LocalResource } from "../resource/mod.ts"; @@ -58,9 +58,9 @@ export class LocalUser extends User { } add_resource(r: LocalResource) { - this.resources.set(r.info.id, r) + const provide = r.info + this.resources.set(provide.id, r) this.el.append(r.el) - const provide: ProvideInfo = r.info this.room.signaling.send_relay({ provide }) r.el.append( @@ -68,8 +68,8 @@ export class LocalUser extends User { onclick: () => { r.destroy() this.el.removeChild(r.el); - this.resources.delete(r.info.id) - this.room.signaling.send_relay({ provide_stop: { id: r.info.id } }) + this.resources.delete(provide.id) + this.room.signaling.send_relay({ provide_stop: { id: provide.id } }) } }), ) |