aboutsummaryrefslogtreecommitdiff
path: root/source/client/room.ts
diff options
context:
space:
mode:
Diffstat (limited to 'source/client/room.ts')
-rw-r--r--source/client/room.ts53
1 files changed, 53 insertions, 0 deletions
diff --git a/source/client/room.ts b/source/client/room.ts
new file mode 100644
index 0000000..100f6cf
--- /dev/null
+++ b/source/client/room.ts
@@ -0,0 +1,53 @@
+import { CSPacket, SCPacket} from "./types";
+import { User } from "./user";
+
+
+export class Room {
+ el: HTMLElement
+ name: string
+ users: Map<string, User> = new Map()
+ websocket: WebSocket
+ local_user: User
+
+ constructor(name: string) {
+ this.name = name
+ this.el = document.createElement("div")
+
+ this.websocket = new WebSocket(`ws://${window.location.host}/room/${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))
+ }
+ // const name = prompt() ?? "nameless user"
+ const uname = Math.random().toString()
+ this.local_user = new User(this, uname, true)
+ }
+
+ websocket_send(data: CSPacket) {
+ this.websocket.send(JSON.stringify(data))
+ }
+ websocket_message(packet: SCPacket) {
+ console.log("websocket message", packet);
+ if (packet.join) {
+ this.users.set(packet.sender, new User(this, packet.sender))
+ return
+ }
+ const sender = this.users.get(packet.sender)
+ if (!sender) return console.warn(`unknown sender ${packet.sender}`)
+ if (packet.leave) {
+ sender.leave()
+ this.users.delete(packet.sender)
+ return
+ }
+
+ if (packet.data.ice_candiate) sender.add_ice_candidate(packet.data.ice_candiate)
+ }
+ websocket_close() {
+ console.log("websocket closed");
+ }
+ websocket_open() {
+ console.log("websocket opened");
+ this.websocket.send(this.local_user.name)
+ }
+} \ No newline at end of file