diff options
author | MetaMuffin <metamuffin@yandex.com> | 2021-08-06 08:58:38 +0200 |
---|---|---|
committer | MetaMuffin <metamuffin@yandex.com> | 2021-08-06 08:58:38 +0200 |
commit | 9a44e9370cb3398bb4bb08a4a85f1d303a90031f (patch) | |
tree | c0aa05cf58e99642703d8dc9266f5d292dbefbe2 /source/client | |
parent | 4475fb02925c04ba19cb9ec8b99110e4e74c3acb (diff) | |
download | keks-meet-9a44e9370cb3398bb4bb08a4a85f1d303a90031f.tar keks-meet-9a44e9370cb3398bb4bb08a4a85f1d303a90031f.tar.bz2 keks-meet-9a44e9370cb3398bb4bb08a4a85f1d303a90031f.tar.zst |
a
Diffstat (limited to 'source/client')
-rw-r--r-- | source/client/local_user.ts | 34 | ||||
-rw-r--r-- | source/client/remote_user.ts | 62 |
2 files changed, 96 insertions, 0 deletions
diff --git a/source/client/local_user.ts b/source/client/local_user.ts new file mode 100644 index 0000000..10a87b7 --- /dev/null +++ b/source/client/local_user.ts @@ -0,0 +1,34 @@ +import { RemoteUser } from "./remote_user"; +import { Room } from "./room"; +import { User } from "./user"; + + +export class LocalUser extends User { + constructor(room: Room, name: string) { + super(room, name) + this.get_streams() + } + + async get_streams() { + const user_media = await window.navigator.mediaDevices.getUserMedia({ audio: true, video: true }) + await new Promise<void>(r => setTimeout(() => r(), 3000)) + for (const t of user_media.getTracks()) { + this.add_track(t) + } + } + + add_tracks_to_remote(u: RemoteUser) { + this.stream.forEach(t => { + u.peer.addTrack(t, new MediaStream()) + }) + } + + add_track(t: MediaStreamTrack) { + this.update_view() + this.stream.push(t) + this.room.remote_users.forEach(u => { + u.peer.addTrack(t) + }) + } + +}
\ No newline at end of file diff --git a/source/client/remote_user.ts b/source/client/remote_user.ts new file mode 100644 index 0000000..f859dd9 --- /dev/null +++ b/source/client/remote_user.ts @@ -0,0 +1,62 @@ +import { log } from "./logger" +import { Room } from "./room" +import { User } from "./user" + + + +export class RemoteUser extends User { + peer: RTCPeerConnection + + constructor(room: Room, name: string) { + super(room, name) + this.peer = new RTCPeerConnection() + this.peer.onicecandidate = ev => { + if (!ev.candidate) return + room.websocket_send({ ice_candiate: ev.candidate.toJSON(), receiver: this.name }) + } + this.peer.ontrack = ev => { + log("media", "remote track", ev.streams) + if (!ev.streams.length) return console.warn("no remote tracks") + ev.streams.forEach(s => s.getTracks().forEach(t => { + if (this.stream.find(u => u.id == t.id)) return + this.stream.push(t) + this.update_view() + })) + } + } + + async offer() { + 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", offer) + this.room.websocket_send({ receiver: this.name, offer }) + } + async on_offer(offer: RTCSessionDescriptionInit) { + log("webrtc", "got offer", 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", answer) + this.room.websocket_send({ receiver: this.name, answer }) + } + async on_answer(answer: RTCSessionDescriptionInit) { + log("webrtc", "got answer", answer) + const answer_description = new RTCSessionDescription(answer) + await this.peer.setRemoteDescription(answer_description) + } + + add_ice_candidate(candidate: RTCIceCandidateInit) { + this.peer.addIceCandidate(new RTCIceCandidate(candidate)) + } + + leave() { + this.peer.close() + this.room.el.removeChild(this.el) + } +}
\ No newline at end of file |