summaryrefslogtreecommitdiff
path: root/client-web/source/remote_user.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-09-07 11:14:42 +0200
committermetamuffin <metamuffin@disroot.org>2022-09-07 11:14:42 +0200
commit61950198e3bf06555f48e8f51c882a4c3cce5128 (patch)
treea7701a44804d4a2a634f3410d400545ea82d1c45 /client-web/source/remote_user.ts
parent832f48f29098cc6f840ade90db3b94efa67c6833 (diff)
downloadkeks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar
keks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar.bz2
keks-meet-61950198e3bf06555f48e8f51c882a4c3cce5128.tar.zst
REFACTOR! pt.1
Diffstat (limited to 'client-web/source/remote_user.ts')
-rw-r--r--client-web/source/remote_user.ts74
1 files changed, 74 insertions, 0 deletions
diff --git a/client-web/source/remote_user.ts b/client-web/source/remote_user.ts
new file mode 100644
index 0000000..a0fdeaf
--- /dev/null
+++ b/client-web/source/remote_user.ts
@@ -0,0 +1,74 @@
+/// <reference lib="dom" />
+
+import { servers } from "./index.ts"
+import { log } from "./logger.ts"
+import { Room } from "./room.ts"
+import { TrackHandle } from "./track_handle.ts";
+import { User } from "./user.ts"
+
+export class RemoteUser extends User {
+ peer: RTCPeerConnection
+ negotiation_busy = false
+
+ constructor(room: Room, name: string) {
+ super(room, name)
+ log("usermodel", `added remote user: ${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 })
+ }
+ this.peer.ontrack = ev => {
+ const t = ev.track
+ log("media", `remote track: ${this.name}`, t)
+ this.add_track(new TrackHandle(t))
+ }
+ this.peer.onnegotiationneeded = async () => {
+ log("webrtc", `negotiation needed: ${this.name}`)
+ while (this.negotiation_busy) {
+ await new Promise<void>(r => setTimeout(() => r(), 100))
+ }
+ this.offer()
+ }
+ }
+
+ async offer() {
+ this.negotiation_busy = true
+ const offer_description = await this.peer.createOffer()
+ 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 })
+ }
+ async on_offer(offer: RTCSessionDescriptionInit) {
+ this.negotiation_busy = true
+ log("webrtc", `got offer: ${this.name}`, { a: offer })
+ const offer_description = new RTCSessionDescription(offer)
+ await this.peer.setRemoteDescription(offer_description)
+ this.answer()
+ }
+ async answer() {
+ const answer_description = await this.peer.createAnswer()
+ 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.negotiation_busy = false
+ }
+ async on_answer(answer: RTCSessionDescriptionInit) {
+ log("webrtc", `got answer: ${this.name}`, { a: answer })
+ const answer_description = new RTCSessionDescription(answer)
+ await this.peer.setRemoteDescription(answer_description)
+ this.negotiation_busy = false
+ }
+
+ add_ice_candidate(candidate: RTCIceCandidateInit) {
+ this.peer.addIceCandidate(new RTCIceCandidate(candidate))
+ }
+
+ leave() {
+ log("usermodel", `remove remote user: ${this.name}`)
+ this.peer.close()
+ this.room.el.removeChild(this.el)
+ }
+} \ No newline at end of file