aboutsummaryrefslogtreecommitdiff
path: root/source/client
diff options
context:
space:
mode:
authorMetaMuffin <metamuffin@yandex.com>2021-08-06 08:58:38 +0200
committerMetaMuffin <metamuffin@yandex.com>2021-08-06 08:58:38 +0200
commit9a44e9370cb3398bb4bb08a4a85f1d303a90031f (patch)
treec0aa05cf58e99642703d8dc9266f5d292dbefbe2 /source/client
parent4475fb02925c04ba19cb9ec8b99110e4e74c3acb (diff)
downloadkeks-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.ts34
-rw-r--r--source/client/remote_user.ts62
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