diff options
author | metamuffin <metamuffin@disroot.org> | 2022-09-09 13:03:48 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-09-09 13:03:48 +0200 |
commit | 0d4102fc2decaf2e1136bc55a261a9e85488791b (patch) | |
tree | 4c0eaef68c2785b0fca903f78e89bcb643642d0a /client-web/source/user/mod.ts | |
parent | e9aa676207be6e1b11863778deddba59109d88fb (diff) | |
download | keks-meet-0d4102fc2decaf2e1136bc55a261a9e85488791b.tar keks-meet-0d4102fc2decaf2e1136bc55a261a9e85488791b.tar.bz2 keks-meet-0d4102fc2decaf2e1136bc55a261a9e85488791b.tar.zst |
move files
Diffstat (limited to 'client-web/source/user/mod.ts')
-rw-r--r-- | client-web/source/user/mod.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/client-web/source/user/mod.ts b/client-web/source/user/mod.ts new file mode 100644 index 0000000..6cb8715 --- /dev/null +++ b/client-web/source/user/mod.ts @@ -0,0 +1,75 @@ +/// <reference lib="dom" /> + +import { log } from "../logger.ts" +import { Room } from "../room.ts" +import { TrackHandle } from "../track_handle.ts"; + + +export abstract class User { + protected el: HTMLElement + public local = false + public name?: string + protected tracks: Set<TrackHandle> = new Set() + + constructor(public room: Room, public id: number) { + this.el = document.createElement("div") + this.el.classList.add("user") + this.room.el.append(this.el) + this.setup_view() + } + + add_track(t: TrackHandle) { + this.tracks.add(t) + this.create_track_element(t) + t.addEventListener("ended", () => { + log("media", "track ended", t) + this.tracks.delete(t) + }) + t.addEventListener("mute", () => { + log("media", "track muted", t) + }) + t.addEventListener("unmute", () => { + log("media", "track unmuted", t) + }) + } + + get display_name() { return this.name ?? `guest (${this.id})` } + + setup_view() { + const info_el = document.createElement("div") + info_el.classList.add("info") + const name_el = document.createElement("span") + name_el.textContent = this.display_name + name_el.classList.add("name") + info_el.append(name_el) + this.el.append(info_el) + } + + create_track_element(t: TrackHandle) { + const is_video = t.kind == "video" + const media_el = is_video ? document.createElement("video") : document.createElement("audio") + const stream = new MediaStream([t.track]) + media_el.srcObject = stream + media_el.classList.add("media") + media_el.autoplay = true + media_el.controls = true + + if (this.local) media_el.muted = true + + const el = document.createElement("div") + if (t.local) { + const end_button = document.createElement("button") + end_button.textContent = "End" + end_button.addEventListener("click", () => { + t.end() + }) + el.append(end_button) + } + el.append(media_el) + this.el.append(el) + t.addEventListener("ended", () => { + media_el.srcObject = null + el.remove() + }) + } +}
\ No newline at end of file |