@observertc/client-monitor-js
Version:
ObserveRTC Client Integration Javascript Library
1 lines • 3.86 kB
JavaScript
import{fetchUserAgentData as e}from"./fetchUserAgentData";import{PeerConnectionMonitor as i}from"../monitors/PeerConnectionMonitor";import{watchMediaDevices as n}from"./watchMediaDevice";import{createLogger as t}from"../utils/logger";import{RtcPeerConnectionStatsCollector as o}from"../collectors/RtcPeerConnectionStatsCollector";import{MediasoupTransportStatsCollector as r}from"../collectors/MediasoupTransportStatsCollector";import{Firefox94StatsAdapter as s}from"../adapters/Firefox94StatsAdapter";import{FirefoxTransportStatsAdapter as a}from"../adapters/FirefoxTransportStatsAdapter";import{RtcPeerConnectionBinding as d}from"./RtcPeerConnectionBinding";import{MediasoupTransportBinding as c}from"./MediasoupTransportBinding";import{MediasoupDeviceBinding as p}from"./MediasoupDeviceBinding";const m=t("Sources");export class Sources{monitor;mediaDevicesAreWatched=!1;userAgentMetaDataSent=!1;userAgentStatsAdapterAdded=!1;mediasoupStatsAdapterAdded=!1;_peerConnectionBindings=new Map;_mediasoupTransportBindings=new Map;_mediasoupDeviceBindings=[];constructor(e){this.monitor=e}addRTCPeerConnection(e){if([...this._peerConnectionBindings.values()].find((i=>i.peerConnection===e.peerConnection)))return m.warn("RTCPeerConnection already exists in sources, not adding again");const{peerConnectionId:n=crypto.randomUUID(),peerConnection:t}=e,r=new i(n,new o(t,this.monitor),this.monitor),s=new d(t,r);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():m.warn("RTCPeerConnection not found in sources, cannot remove")}addMediasoupDevice(e){if(this._mediasoupDeviceBindings.find((i=>i.device===e)))return m.warn("Mediasoup device already exists in sources, not adding again"),this;const i=new p(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):(m.warn("Mediasoup device not found in sources, cannot remove"),this)}addMediasoupTransport(e){if(this._mediasoupTransportBindings.has(e.id))return m.warn(`Mediasoup transport (${e.id}) already exists in sources, not adding again`),this;const n={direction:e.direction},t=new i(e.id,new r(e,this.monitor),this.monitor,n),o=new c(e,t);return t.once("close",(()=>{this._mediasoupTransportBindings.delete(e.id)})),this._mediasoupTransportBindings.set(e.id,o),o.bind(),this._addPeerConnectionMonitor(t),this}removeMediasoupTransport(e){const i=this._mediasoupTransportBindings.get(e.id);return i?(i.unbind(),this._mediasoupTransportBindings.delete(e.id),this):(m.warn(`Mediasoup transport (${e.id}) not found in sources, cannot remove`),this)}fetchUserAgentData(){const i=e();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.mediaDevicesAreWatched=!0}catch(e){m.error("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 s),e.statsAdapters.add(new a)}}}