aboutsummaryrefslogtreecommitdiff
path: root/client-web/source/resource/file.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-10-03 12:45:24 +0200
committermetamuffin <metamuffin@disroot.org>2022-10-03 12:45:24 +0200
commit4d57f2dc4979177f9d074157b0d0767327d5fd67 (patch)
tree18f972626b4586b92f04a7805b3fb0d7d70cba95 /client-web/source/resource/file.ts
parentd8315a650e3a272d3e57408790bfd879a868c3e1 (diff)
downloadkeks-meet-4d57f2dc4979177f9d074157b0d0767327d5fd67.tar
keks-meet-4d57f2dc4979177f9d074157b0d0767327d5fd67.tar.bz2
keks-meet-4d57f2dc4979177f9d074157b0d0767327d5fd67.tar.zst
first code for file transfer
Diffstat (limited to 'client-web/source/resource/file.ts')
-rw-r--r--client-web/source/resource/file.ts69
1 files changed, 55 insertions, 14 deletions
diff --git a/client-web/source/resource/file.ts b/client-web/source/resource/file.ts
index b6629bc..c54abc8 100644
--- a/client-web/source/resource/file.ts
+++ b/client-web/source/resource/file.ts
@@ -1,18 +1,31 @@
-import { ediv } from "../helper.ts";
+import { ebutton, ediv, espan } from "../helper.ts";
import { LocalResource, ResourceHandlerDecl } from "./mod.ts";
export const resource_file: ResourceHandlerDecl = {
kind: "file",
- new_remote(info, _user, _enable) {
+ new_remote(info, user, enable) {
return {
info,
- el: ediv(),
- on_statechange(_s) { },
- on_enable(_track, _disable) {
- return {
- on_disable() {
-
+ el: ediv({},
+ espan(`File: ${JSON.stringify(info.label)}`),
+ ebutton("Download", {
+ onclick: self => {
+ enable()
+ self.disabled = true
}
+ })
+ ),
+ on_statechange(_s) { },
+ on_enable(channel, _disable) {
+ if (!(channel instanceof RTCDataChannel)) throw new Error("not a data channel");
+ channel.onopen = _ev => {
+ console.log(`${user.display_name}: channel open`);
+ }
+ channel.onerror = _ev => {
+ console.log(`${user.display_name}: channel error`);
+ }
+ channel.onclose = _ev => {
+ console.log(`${user.display_name}: channel closed`);
}
}
}
@@ -28,12 +41,40 @@ export function create_file_res(): Promise<LocalResource> {
if (!picker.files) return reject()
const f = picker.files.item(0)
if (!f) return reject()
- resolve({
- info: { kind: "file", id: Math.random().toString(), label: f.name, size: f.size },
- destroy() { /* TODO */ },
- el: ediv(),
- on_request(_user, _create_channel) { return _create_channel("TODO") }
- })
+ resolve(file_res_inner(f))
})
})
+}
+
+function file_res_inner(file: File): LocalResource {
+ const transfers_el = ediv({})
+ return {
+ info: { kind: "file", id: Math.random().toString(), label: file.name, size: file.size },
+ destroy() { },
+ el: ediv({ class: "file" },
+ espan(`Sharing file: ${JSON.stringify(file.name)}`),
+ transfers_el
+ ),
+ on_request(user, create_channel) {
+ const channel = create_channel()
+ const reader = file.stream().getReader()
+ console.log(`${user.display_name} started requested file`);
+ channel.onbufferedamountlow = async () => {
+ const { value: chunk, done } = await reader.read()
+ console.log(chunk, done);
+ channel.send(chunk)
+ if (!done) console.log("transfer done");
+ }
+ channel.onopen = _ev => {
+ console.log(`${user.display_name}: channel open`);
+ }
+ channel.onerror = _ev => {
+ console.log(`${user.display_name}: channel error`);
+ }
+ channel.onclose = _ev => {
+ console.log(`${user.display_name}: channel closed`);
+ }
+ return channel
+ }
+ }
} \ No newline at end of file