diff options
Diffstat (limited to 'client-web/source/resource/file.ts')
-rw-r--r-- | client-web/source/resource/file.ts | 69 |
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 |