summaryrefslogtreecommitdiff
path: root/client-web
diff options
context:
space:
mode:
Diffstat (limited to 'client-web')
-rw-r--r--client-web/source/local_user.ts4
-rw-r--r--client-web/source/remote_user.ts12
-rw-r--r--client-web/source/room.ts58
-rw-r--r--client-web/source/user.ts8
4 files changed, 40 insertions, 42 deletions
diff --git a/client-web/source/local_user.ts b/client-web/source/local_user.ts
index ca91a19..bfd9459 100644
--- a/client-web/source/local_user.ts
+++ b/client-web/source/local_user.ts
@@ -13,8 +13,8 @@ export class LocalUser extends User {
mic_gain?: GainNode
default_gain: number = parameter_number("mic_gain", 1)
- constructor(room: Room, name: string) {
- super(room, name)
+ constructor(room: Room, id: number, name: string) {
+ super(room, id, name)
this.el.classList.add("local")
this.local = true
this.create_controls()
diff --git a/client-web/source/remote_user.ts b/client-web/source/remote_user.ts
index a0fdeaf..6cc57a5 100644
--- a/client-web/source/remote_user.ts
+++ b/client-web/source/remote_user.ts
@@ -10,13 +10,13 @@ export class RemoteUser extends User {
peer: RTCPeerConnection
negotiation_busy = false
- constructor(room: Room, name: string) {
- super(room, name)
- log("usermodel", `added remote user: ${name}`)
+ constructor(room: Room, id: number, name: string) {
+ super(room, id, name)
+ log("usermodel", `added remote user: ${id} ${JSON.stringify(name)}`)
this.peer = new RTCPeerConnection(servers)
this.peer.onicecandidate = ev => {
if (!ev.candidate) return
- room.websocket_send({ ice_candiate: ev.candidate.toJSON(), receiver: this.name })
+ room.websocket_send({ relay: { recipient: this.id, message: { ice_candidate: ev.candidate.toJSON() } } })
}
this.peer.ontrack = ev => {
const t = ev.track
@@ -38,7 +38,7 @@ export class RemoteUser extends User {
await this.peer.setLocalDescription(offer_description)
const offer = { type: offer_description.type, sdp: offer_description.sdp }
log("webrtc", `sent offer: ${this.name}`, { a: offer })
- this.room.websocket_send({ receiver: this.name, offer })
+ this.room.websocket_send({ relay: { recipient: this.id, message: { offer } } })
}
async on_offer(offer: RTCSessionDescriptionInit) {
this.negotiation_busy = true
@@ -52,7 +52,7 @@ export class RemoteUser extends User {
await this.peer.setLocalDescription(answer_description)
const answer = { type: answer_description.type, sdp: answer_description.sdp }
log("webrtc", `sent answer: ${this.name}`, { a: answer })
- this.room.websocket_send({ receiver: this.name, answer })
+ this.room.websocket_send({ relay: { recipient: this.id, message: { answer } } })
this.negotiation_busy = false
}
async on_answer(answer: RTCSessionDescriptionInit) {
diff --git a/client-web/source/room.ts b/client-web/source/room.ts
index f22cff1..3ed7ddf 100644
--- a/client-web/source/room.ts
+++ b/client-web/source/room.ts
@@ -5,15 +5,15 @@ 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";
+import { ServerboundPacket, ClientboundPacket } 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
+ users: Map<number, User> = new Map()
+ remote_users: Map<number, RemoteUser> = new Map()
+ local_user!: LocalUser
websocket: WebSocket
constructor(name: string) {
@@ -26,37 +26,41 @@ export class Room {
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)
+ websocket_send(data: ServerboundPacket) {
+ log("ws", `-> ${data.relay?.recipient ?? "*"}`, 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)
+ websocket_message(packet: ClientboundPacket) {
+ log("ws", `<- ${packet.message?.sender ?? "control packet"}: `, packet);
+ if (packet.init) {
+ this.local_user = new LocalUser(this, packet.init.your_id, "...");
+ }
+ if (packet.client_join) {
+ const p = packet.client_join
+ log("*", `${this.name} ${p.id} joined`);
+ const ru = new RemoteUser(this, p.id, p.name)
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)
+ ru.offer()
+ this.users.set(p.id, ru)
+ this.remote_users.set(p.id, 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)
+ } else if (packet.client_leave) {
+ const p = packet.client_leave;
+ log("*", `${this.name} ${p.id} left`);
+ this.remote_users.get(p.id)!.leave()
+ this.users.delete(p.id)
+ this.remote_users.delete(p.id)
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)
+ if (packet.message) {
+ const p = packet.message;
+ const sender = this.remote_users.get(p.sender)!
+ if (p.message.ice_candidate) sender.add_ice_candidate(p.message.ice_candidate)
+ if (p.message.offer) sender.on_offer(p.message.offer)
+ if (p.message.answer) sender.on_answer(p.message.answer)
+ }
}
websocket_close() {
log("ws", "websocket closed");
diff --git a/client-web/source/user.ts b/client-web/source/user.ts
index bda875f..dbf2862 100644
--- a/client-web/source/user.ts
+++ b/client-web/source/user.ts
@@ -6,18 +6,13 @@ import { TrackHandle } from "./track_handle.ts";
export abstract class User {
- name: string
- room: Room
-
el: HTMLElement
local = false
protected tracks: Set<TrackHandle> = new Set()
- constructor(room: Room, name: string) {
- this.name = name
- this.room = room
+ constructor(public room: Room, public id: number, public name: string) {
this.el = document.createElement("div")
this.el.classList.add("user")
this.room.el.append(this.el)
@@ -60,7 +55,6 @@ export abstract class User {
if (this.local) media_el.muted = true
-
const el = document.createElement("div")
if (t.local) {
const end_button = document.createElement("button")