diff options
author | metamuffin <metamuffin@disroot.org> | 2022-09-07 11:14:42 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-09-07 11:14:42 +0200 |
commit | 61950198e3bf06555f48e8f51c882a4c3cce5128 (patch) | |
tree | a7701a44804d4a2a634f3410d400545ea82d1c45 /client-web/source/room.ts | |
parent | 832f48f29098cc6f840ade90db3b94efa67c6833 (diff) | |
download | keks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar keks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar.bz2 keks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar.zst |
REFACTOR! pt.1
Diffstat (limited to 'client-web/source/room.ts')
-rw-r--r-- | client-web/source/room.ts | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/client-web/source/room.ts b/client-web/source/room.ts new file mode 100644 index 0000000..f22cff1 --- /dev/null +++ b/client-web/source/room.ts @@ -0,0 +1,72 @@ +/// <reference lib="dom" /> + +import { log } from "./logger.ts"; +import { RemoteUser } from "./remote_user.ts"; +import { User } from "./user.ts"; +import { LocalUser } from "./local_user.ts"; +import { hex_id, parameter_string } from "./helper.ts"; +import { PacketS, PacketC } from "../../common/packets.d.ts"; + + +export class Room { + el: HTMLElement + name: string + users: Map<string, User> = new Map() + remote_users: Map<string, RemoteUser> = new Map() + local_user: LocalUser + websocket: WebSocket + + constructor(name: string) { + this.name = name + this.el = document.createElement("div") + this.el.classList.add("room") + this.websocket = new WebSocket(`${window.location.protocol.endsWith("s:") ? "wss" : "ws"}://${window.location.host}/signaling/${encodeURIComponent(name)}`) + this.websocket.onclose = () => this.websocket_close() + this.websocket.onopen = () => this.websocket_open() + this.websocket.onmessage = (ev) => { + this.websocket_message(JSON.parse(ev.data)) + } + this.local_user = new LocalUser(this, parameter_string("username", `guest-${hex_id()}`)) + } + + websocket_send(data: PacketS) { + log("ws", `-> ${data.receiver ?? "*"}`, data) + this.websocket.send(JSON.stringify(data)) + } + websocket_message(packet: PacketC) { + if (packet.join) { + log("*", `${this.name} ${packet.sender} joined`); + const ru = new RemoteUser(this, packet.sender) + this.local_user.add_initial_to_remote(ru) + if (!packet.stable) ru.offer() + this.users.set(packet.sender, ru) + this.remote_users.set(packet.sender, ru) + return + } + const sender = this.remote_users.get(packet.sender) + if (!sender) return console.warn(`unknown sender ${packet.sender}`) + if (packet.leave) { + log("*", `${this.name} ${packet.sender} left`); + sender.leave() + this.users.delete(packet.sender) + this.remote_users.delete(packet.sender) + return + } + if (!packet.data) return console.warn("dataless packet") + log("ws", `<- ${packet.sender}: `, packet.data); + if (packet.data.ice_candiate) sender.add_ice_candidate(packet.data.ice_candiate) + if (packet.data.offer) sender.on_offer(packet.data.offer) + if (packet.data.answer) sender.on_answer(packet.data.answer) + } + websocket_close() { + log("ws", "websocket closed"); + setTimeout(() => { + window.location.reload() + }, 1000) + } + websocket_open() { + log("ws", "websocket opened"); + this.websocket.send(this.local_user.name) + setInterval(() => this.websocket_send({}), 30000) // stupid workaround for nginx disconnection inactive connections + } +}
\ No newline at end of file |