summaryrefslogtreecommitdiff
path: root/client-web/source
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-10-28 23:25:24 +0200
committermetamuffin <metamuffin@disroot.org>2022-10-28 23:25:24 +0200
commit8040c863d7495b9a65e265f9917dc749ba28745e (patch)
treeb1280fcf29f530e61684031dbbc929b03c322e65 /client-web/source
parent014d16253a7d6d5b136158828c93e40b7aba8314 (diff)
downloadkeks-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.ts32
-rw-r--r--client-web/source/sw/download_stream.ts6
-rw-r--r--client-web/source/sw/worker.ts2
-rw-r--r--client-web/source/user/local.ts10
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 } })
}
}),
)