@observertc/client-monitor-js
Version:
ObserveRTC Client Integration Javascript Library
1 lines • 4.03 kB
JavaScript
import{fetchUserAgentData as e}from"./fetchUserAgentData";import{PeerConnectionMonitor as i}from"../monitors/PeerConnectionMonitor";import{watchMediaDevices as n}from"./watchMediaDevice";import{RtcPeerConnectionStatsCollector as t}from"../collectors/RtcPeerConnectionStatsCollector";import{MediasoupTransportStatsCollector as o}from"../collectors/MediasoupTransportStatsCollector";import{Firefox94StatsAdapter as r}from"../adapters/Firefox94StatsAdapter";import{FirefoxTransportStatsAdapter as s}from"../adapters/FirefoxTransportStatsAdapter";import{RtcPeerConnectionBinding as a}from"./RtcPeerConnectionBinding";import{MediasoupTransportBinding as d}from"./MediasoupTransportBinding";import{MediasoupDeviceBinding as c}from"./MediasoupDeviceBinding";const p="Sources";export class Sources{monitor;logger;mediaDevicesAreWatched=!1;userAgentMetaDataSent=!1;userAgentStatsAdapterAdded=!1;mediasoupStatsAdapterAdded=!1;_peerConnectionBindings=new Map;_mediasoupTransportBindings=new Map;_mediasoupDeviceBindings=[];constructor(e,i){this.monitor=e,this.logger=i}addRTCPeerConnection(e){if([...this._peerConnectionBindings.values()].find((i=>i.peerConnection===e.peerConnection)))return this.logger.warn(`[${p}]:`,"RTCPeerConnection already exists in sources, not adding again");const{peerConnectionId:n=crypto.randomUUID(),peerConnection:o}=e,r=new i(n,new t(o,this.monitor),this.monitor,this.logger),s=new a(o,r);s.bind(),r.once("close",(()=>{this._peerConnectionBindings.delete(n)})),this._peerConnectionBindings.set(n,s),this._addPeerConnectionMonitor(r)}removeRTCPeerConnection(e){const i=[...this._peerConnectionBindings.values()].find((i=>i.peerConnection===e));i?i.unbind():this.logger.warn(`[${p}]:`,"RTCPeerConnection not found in sources, cannot remove")}addMediasoupDevice(e){if(this._mediasoupDeviceBindings.find((i=>i.device===e)))return this.logger.warn(`[${p}]:`,"Mediasoup device already exists in sources, not adding again"),this;const i=new c(e,this);return this._mediasoupDeviceBindings.push(i),i.bind(),this}removeMediasoupDevice(e){const i=this._mediasoupDeviceBindings.find((i=>i.device===e));return i?(i.unbind(),this._mediasoupDeviceBindings=this._mediasoupDeviceBindings.filter((e=>e!==i)),this):(this.logger.warn(`[${p}]:`,"Mediasoup device not found in sources, cannot remove"),this)}addMediasoupTransport(e){if(this._mediasoupTransportBindings.has(e.id))return this.logger.warn(`[${p}]:`,`Mediasoup transport (${e.id}) already exists in sources, not adding again`),this;const n={direction:e.direction},t=new i(e.id,new o(e,this.monitor),this.monitor,this.logger,n),r=new d(e,t);return t.once("close",(()=>{this._mediasoupTransportBindings.delete(e.id)})),this._mediasoupTransportBindings.set(e.id,r),r.bind(),this._addPeerConnectionMonitor(t),this}removeMediasoupTransport(e){const i=this._mediasoupTransportBindings.get(e.id);return i?(i.unbind(),this._mediasoupTransportBindings.delete(e.id),this):(this.logger.warn(`[${p}]:`,`Mediasoup transport (${e.id}) not found in sources, cannot remove`),this)}fetchUserAgentData(){const i=e(this.logger);if(i){if(this.userAgentMetaDataSent||(this.monitor.addMetaData({type:"USER_AGENT_DATA",payload:{...i}}),this.userAgentMetaDataSent=!0),!this.userAgentStatsAdapterAdded&&(this.userAgentStatsAdapterAdded=!0,!this.monitor.browser&&i.browser)){const e=i.browser.name.toLowerCase();["chrome","firefox","safari","edge"].includes(e)?this.monitor.browser={name:e,version:i.browser?.version}:this.monitor.browser={name:"unknown",version:"unknown"}}return i}}watchNavigatorMediaDevices(){if(!this.mediaDevicesAreWatched)try{n(this.monitor,this.logger),this.mediaDevicesAreWatched=!0}catch(e){this.logger.error(`[${p}]:`,"Failed to watch media devices",e)}}_addPeerConnectionMonitor(e){this.monitor.addPeerConnectionMonitor(e),this.addStatsAdapters(e)}addStatsAdapters(e){if(this.monitor.browser)switch(this.monitor.browser.name){case"chrome":case"edge":case"opera":case"safari":case"unknown":break;case"firefox":e.statsAdapters.add(new r),e.statsAdapters.add(new s)}}}