@hacksore/rtcmulticonnection
Version:
RTCMultiConnection is a WebRTC JavaScript wrapper library runs top over RTCPeerConnection API to support all possible peer-to-peer features.
2 lines (1 loc) • 32 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});exports.RTCMultiConnection=function(e){forceOptions=forceOptions||{useDefaultDevices:!0},e.channel=e.sessionid=(roomid||location.href.replace(/\/|:|#|\?|\$|\^|%|\.|`|~|!|\+|@|\[|\||]|\|*. /g,"").split("\n").join("").split("\r").join(""))+"";var o=new MultiPeers(e),n={};function t(o){if(e.socketAutoReConnect=!0,e.socket)o&&o(e.socket);else{if("undefined"==typeof SocketConnection)if("undefined"!=typeof FirebaseConnection)window.SocketConnection=FirebaseConnection;else{if("undefined"==typeof PubNubConnection)throw"SocketConnection.js seems missed.";window.SocketConnection=PubNubConnection}new SocketConnection(e,(function(n){o&&o(e.socket)}))}}function i(n,t){e.socket.emit("join-room",{sessionid:e.sessionid,session:e.session,mediaConstraints:e.mediaConstraints,sdpConstraints:e.sdpConstraints,streams:a(),extra:e.extra,password:void 0!==e.password&&"object"!=typeof e.password?e.password:""},(function(i,s){if(!0===i){if(e.enableLogs&&console.log("isRoomJoined: ",i," roomid: ",e.sessionid),e.peers[e.sessionid])return;o.onNegotiationNeeded(n)}!1===i&&e.enableLogs&&console.warn("isRoomJoined: ",s," roomid: ",e.sessionid),t(i,e.sessionid,s)}))}function s(o){e.enableLogs&&console.log("Sending open-room signal to socket.io"),e.waitingForLocalMedia=!1,e.socket.emit("open-room",{sessionid:e.sessionid,session:e.session,mediaConstraints:e.mediaConstraints,sdpConstraints:e.sdpConstraints,streams:a(),extra:e.extra,identifier:e.publicRoomIdentifier,password:void 0!==e.password&&"object"!=typeof e.password?e.password:""},(function(n,t){!0===n&&(e.enableLogs&&console.log("isRoomOpened: ",n," roomid: ",e.sessionid),o(n,e.sessionid)),!1===n&&(e.enableLogs&&console.warn("isRoomOpened: ",t," roomid: ",e.sessionid),o(n,e.sessionid,t))}))}function a(){try{return e.streamEvents.selectAll("local").map((function(e){return{streamid:e.streamid,tracks:e.stream.getTracks().length}}))}catch(e){return[]}}function r(n,t){if(e.dontCaptureUserMedia||n.isDataOnly)t();else{n.localPeerSdpConstraints.OfferToReceiveAudio&&e.mediaConstraints.audio,n.localPeerSdpConstraints.OfferToReceiveVideo&&e.mediaConstraints.video;var i=n.session||e.session;i.oneway&&"two-way"!==i.audio&&"two-way"!==i.video&&"two-way"!==i.screen?t():(i.oneway&&i.audio&&"two-way"===i.audio&&(i={audio:!0}),(i.audio||i.video||i.screen)&&(i.screen?"Edge"===DetectRTC.browser.name?navigator.getDisplayMedia({video:!0,audio:isAudioPlusTab(e)}).then((function(n){n.isScreen=!0,o.onGettingLocalMedia(n),!i.audio&&!i.video||isAudioPlusTab(e)?t(n):e.invokeGetUserMedia(null,t)}),(function(e){console.error("Unable to capture screen on Edge. HTTPs and version 17+ is required.")})):e.invokeGetUserMedia({audio:isAudioPlusTab(e),video:!0,isScreen:!0},!i.audio&&!i.video||isAudioPlusTab(e)?t:e.invokeGetUserMedia(null,t)):(i.audio||i.video)&&e.invokeGetUserMedia(null,t,i)))}}function d(o,n){o?(n.audio&&getTracks(o,"audio").forEach((function(e){e.applyConstraints(n.audio)})),n.video&&getTracks(o,"video").forEach((function(e){e.applyConstraints(n.video)}))):e.enableLogs&&console.error("No stream to applyConstraints.")}function c(n,t,i){t?o.replaceTrack(n,t,i):e.peers.getAllParticipants().forEach((function(e){o.replaceTrack(n,e,i)}))}o.onGettingLocalMedia=function(o,t){if(t=t||function(){},n[o.streamid])t();else{n[o.streamid]=!0;try{o.type="local"}catch(e){}e.setStreamEndHandler(o),getRMCMediaElement(o,(function(n){n.id=o.streamid,n.muted=!0,n.volume=0,-1===e.attachStreams.indexOf(o)&&e.attachStreams.push(o),"undefined"!=typeof StreamsHandler&&StreamsHandler.setHandlers(o,!0,e);var i=0===o.getAudioTracks().filter((function(e){return e.enabled})).length;e.streamEvents[o.streamid]={stream:o,type:"local",mediaElement:n,userid:e.userid,extra:e.extra,streamid:o.streamid,isAudioMuted:i};try{setHarkEvents(e,e.streamEvents[o.streamid]),setMuteHandlers(e,e.streamEvents[o.streamid]),e.onstream(e.streamEvents[o.streamid])}catch(e){}t()}),e)}},o.onGettingRemoteMedia=function(o,n){try{o.type="remote"}catch(e){}e.setStreamEndHandler(o,"remote-stream"),getRMCMediaElement(o,(function(t){t.id=o.streamid,"undefined"!=typeof StreamsHandler&&StreamsHandler.setHandlers(o,!1,e),e.streamEvents[o.streamid]={stream:o,type:"remote",userid:n,extra:e.peers[n]?e.peers[n].extra:{},mediaElement:t,streamid:o.streamid},setMuteHandlers(e,e.streamEvents[o.streamid]),e.onstream(e.streamEvents[o.streamid])}),e)},o.onRemovingRemoteMedia=function(o,n){var t=e.streamEvents[o.streamid];t||(t={stream:o,type:"remote",userid:n,extra:e.peers[n]?e.peers[n].extra:{},streamid:o.streamid,mediaElement:e.streamEvents[o.streamid]?e.streamEvents[o.streamid].mediaElement:null}),e.peersBackup[t.userid]&&(t.extra=e.peersBackup[t.userid].extra),e.onstreamended(t),delete e.streamEvents[o.streamid]},o.onNegotiationNeeded=function(o,n,i){i=i||function(){};var s={remoteUserId:n=n||o.remoteUserId,message:o=o||"",sender:e.userid};o.remoteUserId&&o.message&&o.sender&&(s=o),t((function(){e.socket.emit(e.socketMessageEvent,s,i)}))},o.onUserLeft=function(o){e.deletePeer(o)},o.disconnectWith=function(o,n){e.socket&&e.socket.emit("disconnect-with",o,n||function(){}),e.deletePeer(o)},e.socketOptions={transport:"polling"},e.openOrJoin=function(o,n){n=n||function(){},e.checkPresence(o,(function(o,t){if(o){e.sessionid=t;var a,d,c=!!e.session.oneway,u=isData(e.session);d={OfferToReceiveAudio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.sdpConstraints.mandatory.OfferToReceiveVideo},a={OfferToReceiveAudio:c?!!e.session.audio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:c?!!e.session.video||!!e.session.screen:e.sdpConstraints.mandatory.OfferToReceiveVideo};var l={remoteUserId:e.sessionid,message:{newParticipationRequest:!0,isOneWay:c,isDataOnly:u,localPeerSdpConstraints:a,remotePeerSdpConstraints:d},sender:e.userid};r(l.message,(function(){i(l,n)}))}else e.waitingForLocalMedia=!0,e.isInitiator=!0,e.sessionid=t||e.sessionid,isData(e.session)?s(n):e.captureUserMedia((function(){s(n)}))}))},e.waitingForLocalMedia=!1,e.open=function(o,n){n=n||function(){},e.waitingForLocalMedia=!0,e.isInitiator=!0,e.sessionid=o||e.sessionid,t((function(){isData(e.session)?s(n):e.captureUserMedia((function(){s(n)}))}))},e.peersBackup={},e.deletePeer=function(o){if(o&&e.peers[o]){var n={userid:o,extra:e.peers[o]?e.peers[o].extra:{}};if(e.peersBackup[n.userid]&&(n.extra=e.peersBackup[n.userid].extra),e.onleave(n),e.peers[o]){e.peers[o].streams.forEach((function(e){e.stop()}));var t=e.peers[o].peer;if(t&&"closed"!==t.iceConnectionState)try{t.close()}catch(e){}e.peers[o]&&(e.peers[o].peer=null,delete e.peers[o])}}},e.rejoin=function(o){if(!e.isInitiator&&o&&Object.keys(o).length){var n={};e.peers[o.remoteUserId]&&(n=e.peers[o.remoteUserId].extra,e.deletePeer(o.remoteUserId)),o&&o.remoteUserId&&(e.join(o.remoteUserId),e.onReConnecting({userid:o.remoteUserId,extra:n}))}},e.join=function(o,n){e.sessionid=!!o&&(o.sessionid||o.remoteUserId||o)||e.sessionid,e.sessionid+="";var s=!1,a=!1,d=!1,c=!1;if(o&&o.session||!o||"string"==typeof o){var u=o&&o.session||e.session;d=!!u.oneway,c=isData(u),a={OfferToReceiveAudio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.sdpConstraints.mandatory.OfferToReceiveVideo},s={OfferToReceiveAudio:d?!!e.session.audio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:d?!!e.session.video||!!e.session.screen:e.sdpConstraints.mandatory.OfferToReceiveVideo}}var l=function(){};"function"==typeof(n=n||{})&&(l=n,n={}),void 0!==n.localPeerSdpConstraints&&(s=n.localPeerSdpConstraints),void 0!==n.remotePeerSdpConstraints&&(a=n.remotePeerSdpConstraints),void 0!==n.isOneWay&&(d=n.isOneWay),void 0!==n.isDataOnly&&(c=n.isDataOnly);var m={remoteUserId:e.sessionid,message:{newParticipationRequest:!0,isOneWay:d,isDataOnly:c,localPeerSdpConstraints:s,remotePeerSdpConstraints:a},sender:e.userid};return r(m.message,(function(){t((function(){i(m,l)}))})),m},e.publicRoomIdentifier="",e.getUserMedia=e.captureUserMedia=function(n,t){n=n||function(){};var i=t||e.session;e.dontCaptureUserMedia||isData(i)?n():(i.audio||i.video||i.screen)&&(i.screen?"Edge"===DetectRTC.browser.name?navigator.getDisplayMedia({video:!0,audio:isAudioPlusTab(e)}).then((function(s){if(s.isScreen=!0,o.onGettingLocalMedia(s),!i.audio&&!i.video||isAudioPlusTab(e))n(s);else{var a={};for(var r in i)"screen"!==r&&(a[r]=i[r]);e.invokeGetUserMedia(t,n,a)}}),(function(e){console.error("Unable to capture screen on Edge. HTTPs and version 17+ is required.")})):e.invokeGetUserMedia({audio:isAudioPlusTab(e),video:!0,isScreen:!0},(function(o){if(!i.audio&&!i.video||isAudioPlusTab(e))n(o);else{var s={};for(var a in i)"screen"!==a&&(s[a]=i[a]);e.invokeGetUserMedia(t,n,s)}})):(i.audio||i.video)&&e.invokeGetUserMedia(t,n,i))},e.onbeforeunload=function(n,t){e.closeBeforeUnload&&(e.peers.getAllParticipants().forEach((function(n){o.onNegotiationNeeded({userLeft:!0},n),e.peers[n]&&e.peers[n].peer&&e.peers[n].peer.close(),delete e.peers[n]})),t||e.closeSocket(),e.isInitiator=!1)},window.ignoreBeforeUnload?e.closeBeforeUnload=!1:(e.closeBeforeUnload=!0,window.addEventListener("beforeunload",e.onbeforeunload,!1)),e.userid=getRandomString(),e.changeUserId=function(o,n){n=n||function(){},e.userid=o||getRandomString(),e.socket.emit("changed-uuid",e.userid,n)},e.extra={},e.attachStreams=[],e.session={audio:!0,video:!0},e.enableFileSharing=!1,e.bandwidth={screen:!1,audio:!1,video:!1},e.codecs={audio:"opus",video:"VP9"},e.processSdp=function(o){return isUnifiedPlanSupportedDefault()||"Safari"===DetectRTC.browser.name?o:("VP8"===e.codecs.video.toUpperCase()&&(o=CodecsHandler.preferCodec(o,"vp8")),"VP9"===e.codecs.video.toUpperCase()&&(o=CodecsHandler.preferCodec(o,"vp9")),"H264"===e.codecs.video.toUpperCase()&&(o=CodecsHandler.preferCodec(o,"h264")),"G722"===e.codecs.audio&&(o=CodecsHandler.removeNonG722(o)),"Firefox"===DetectRTC.browser.name||((e.bandwidth.video||e.bandwidth.screen)&&(o=CodecsHandler.setApplicationSpecificBandwidth(o,e.bandwidth,!!e.session.screen)),e.bandwidth.video&&(o=CodecsHandler.setVideoBitrates(o,{min:8*e.bandwidth.video*1024,max:8*e.bandwidth.video*1024})),e.bandwidth.audio&&(o=CodecsHandler.setOpusAttributes(o,{maxaveragebitrate:8*e.bandwidth.audio*1024,maxplaybackrate:8*e.bandwidth.audio*1024,stereo:1,maxptime:3}))),o)},"undefined"!=typeof CodecsHandler&&(e.BandwidthHandler=e.CodecsHandler=CodecsHandler),e.mediaConstraints={audio:{mandatory:{},optional:e.bandwidth.audio?[{bandwidth:8*e.bandwidth.audio*1024||1048576}]:[]},video:{mandatory:{},optional:e.bandwidth.video?[{bandwidth:8*e.bandwidth.video*1024||1048576},{facingMode:"user"}]:[{facingMode:"user"}]}},"Firefox"===DetectRTC.browser.name&&(e.mediaConstraints={audio:!0,video:!0}),forceOptions.useDefaultDevices||DetectRTC.isMobileDevice||DetectRTC.load((function(){var o,n;if(DetectRTC.MediaDevices.forEach((function(t){"audioinput"===t.kind&&!1!==e.mediaConstraints.audio&&(o=t),"videoinput"===t.kind&&!1!==e.mediaConstraints.video&&(n=t)})),o){if("Firefox"===DetectRTC.browser.name)return void(!0!==e.mediaConstraints.audio?e.mediaConstraints.audio.deviceId=o.id:e.mediaConstraints.audio={deviceId:o.id});1==e.mediaConstraints.audio&&(e.mediaConstraints.audio={mandatory:{},optional:[]}),e.mediaConstraints.audio.optional||(e.mediaConstraints.audio.optional=[]);var t=[{sourceId:o.id}];e.mediaConstraints.audio.optional=t.concat(e.mediaConstraints.audio.optional)}if(n){if("Firefox"===DetectRTC.browser.name)return void(!0!==e.mediaConstraints.video?e.mediaConstraints.video.deviceId=n.id:e.mediaConstraints.video={deviceId:n.id});1==e.mediaConstraints.video&&(e.mediaConstraints.video={mandatory:{},optional:[]}),e.mediaConstraints.video.optional||(e.mediaConstraints.video.optional=[]);t=[{sourceId:n.id}];e.mediaConstraints.video.optional=t.concat(e.mediaConstraints.video.optional)}})),e.sdpConstraints={mandatory:{OfferToReceiveAudio:!0,OfferToReceiveVideo:!0},optional:[{VoiceActivityDetection:!1}]},e.sdpSemantics=null,e.iceCandidatePoolSize=null,e.bundlePolicy=null,e.rtcpMuxPolicy=null,e.iceTransportPolicy=null,e.optionalArgument={optional:[{DtlsSrtpKeyAgreement:!0},{googImprovedWifiBwe:!0},{googScreencastMinBitrate:300},{googIPv6:!0},{googDscp:!0},{googCpuUnderuseThreshold:55},{googCpuOveruseThreshold:85},{googSuspendBelowMinBitrate:!0},{googCpuOveruseDetection:!0}],mandatory:{}},e.iceServers=IceServersHandler.getIceServers(e),e.candidates={host:!0,stun:!0,turn:!0},e.iceProtocols={tcp:!0,udp:!0},e.onopen=function(o){e.enableLogs&&console.info("Data connection has been opened between you & ",o.userid)},e.onclose=function(o){e.enableLogs&&console.warn("Data connection has been closed between you & ",o.userid)},e.onerror=function(o){e.enableLogs&&console.error(o.userid,"data-error",o)},e.onmessage=function(o){e.enableLogs&&console.debug("data-message",o.userid,o.data)},e.send=function(o,n){e.peers.send(o,n)},e.close=e.disconnect=e.leave=function(){e.onbeforeunload(!1,!0)},e.closeEntireSession=function(o){o=o||function(){},e.socket.emit("close-entire-session",(function n(){e.getAllParticipants().length?setTimeout(n,100):(e.onEntireSessionClosed({sessionid:e.sessionid,userid:e.userid,extra:e.extra}),e.changeUserId(null,(function(){e.close(),o()})))}))},e.onEntireSessionClosed=function(o){e.enableLogs&&console.info("Entire session is closed: ",o.sessionid,o.extra)},e.onstream=function(o){var n=e.videosContainer;n.insertBefore(o.mediaElement,n.firstChild);var t=o.mediaElement.play();void 0===t?setTimeout((function(){o.mediaElement.play()}),2e3):t.catch((function(){})).then((function(){setTimeout((function(){o.mediaElement.play()}),2e3)}))},e.onstreamended=function(e){e.mediaElement||(e.mediaElement=document.getElementById(e.streamid)),e.mediaElement&&e.mediaElement.parentNode&&e.mediaElement.parentNode.removeChild(e.mediaElement)},e.direction="many-to-many",e.removeStream=function(o,n){var t;e.attachStreams.forEach((function(e){e.id===o&&(t=e)})),t?(e.peers.getAllParticipants().forEach((function(o){if(!n||o===n){var i=e.peers[o];try{i.peer.removeStream(t)}catch(e){}}})),e.renegotiate()):console.warn("No such stream exist.",o)},e.addStream=function(n,t){if(n.getTracks)return-1===e.attachStreams.indexOf(n)&&(n.streamid||(n.streamid=n.id),e.attachStreams.push(n)),void e.renegotiate(t);function i(o){n.streamCallback&&n.streamCallback(o),e.renegotiate(t)}isData(n)?e.renegotiate(t):(n.audio||n.video||n.screen)&&(n.screen?"Edge"===DetectRTC.browser.name?navigator.getDisplayMedia({video:!0,audio:isAudioPlusTab(e)}).then((function(t){t.isScreen=!0,o.onGettingLocalMedia(t),!n.audio&&!n.video||isAudioPlusTab(e)?i(t):e.invokeGetUserMedia(null,(function(e){i(e)}))}),(function(e){console.error("Unable to capture screen on Edge. HTTPs and version 17+ is required.")})):e.invokeGetUserMedia({audio:isAudioPlusTab(e),video:!0,isScreen:!0},(function(o){!n.audio&&!n.video||isAudioPlusTab(e)?i(o):e.invokeGetUserMedia(null,(function(e){i(e)}))})):(n.audio||n.video)&&e.invokeGetUserMedia(null,i))},e.invokeGetUserMedia=function(n,t,i){i||(i=e.session),n||(n=e.mediaConstraints),getUserMediaHandler({onGettingLocalMedia:function(e){var i=n.video;i&&(i.mediaSource||i.mozMediaSource||i.mandatory&&i.mandatory.chromeMediaSource)&&(e.isScreen=!0),e.isScreen||(e.isVideo=!!getTracks(e,"video").length,e.isAudio=!e.isVideo&&getTracks(e,"audio").length),o.onGettingLocalMedia(e,(function(){"function"==typeof t&&t(e)}))},onLocalMediaError:function(e,n){o.onLocalMediaError(e,n)},localMediaConstraints:n||{audio:!!i.audio&&n.audio,video:!!i.video&&n.video}})},e.applyConstraints=function(o,n){if(MediaStreamTrack&&MediaStreamTrack.prototype.applyConstraints){var t;if(n)return e.streamEvents[n]&&(t=e.streamEvents[n].stream),void d(t,o);e.attachStreams.forEach((function(e){d(e,o)}))}else alert("track.applyConstraints is NOT supported in your browser.")},e.replaceTrack=function(n,t,i){if(n=n||{},RTCPeerConnection.prototype.getSenders)if(n instanceof MediaStreamTrack)c(n,t,i);else{if(n instanceof MediaStream)return getTracks(n,"video").length&&c(getTracks(n,"video")[0],t,!0),void(getTracks(n,"audio").length&&c(getTracks(n,"audio")[0],t,!1));if(isData(n))throw"connection.replaceTrack requires audio and/or video and/or screen.";(n.audio||n.video||n.screen)&&(n.screen?"Edge"===DetectRTC.browser.name?navigator.getDisplayMedia({video:!0,audio:isAudioPlusTab(e)}).then((function(t){t.isScreen=!0,o.onGettingLocalMedia(t),!n.audio&&!n.video||isAudioPlusTab(e)?s(t):e.invokeGetUserMedia(null,s)}),(function(e){console.error("Unable to capture screen on Edge. HTTPs and version 17+ is required.")})):e.invokeGetUserMedia({audio:isAudioPlusTab(e),video:!0,isScreen:!0},!n.audio&&!n.video||isAudioPlusTab(e)?s:e.invokeGetUserMedia(null,s)):(n.audio||n.video)&&e.invokeGetUserMedia(null,s))}else e.addStream(n);function s(o){e.replaceTrack(o,t,i||n.video||n.screen)}},e.resetTrack=function(o,n){o||(o=e.getAllParticipants()),"string"==typeof o&&(o=[o]),o.forEach((function(o){var t=e.peers[o].peer;void 0!==n&&!0!==n||!t.lastVideoTrack||e.replaceTrack(t.lastVideoTrack,o,!0),void 0!==n&&!1!==n||!t.lastAudioTrack||e.replaceTrack(t.lastAudioTrack,o,!1)}))},e.renegotiate=function(n){n?o.renegotiatePeer(n):e.peers.getAllParticipants().forEach((function(e){o.renegotiatePeer(e)}))},e.setStreamEndHandler=function(o,n){if(o&&o.addEventListener&&(n=!!n,!o.alreadySetEndHandler)){o.alreadySetEndHandler=!0;var t="ended";"oninactive"in o&&(t="inactive"),o.addEventListener(t,(function(){if(o.idInstance&¤tUserMediaRequest.remove(o.idInstance),!n){var t=[];e.attachStreams.forEach((function(e){e.id!=o.id&&t.push(e)})),e.attachStreams=t}var i=e.streamEvents[o.streamid];if(i||(i={stream:o,streamid:o.streamid,type:n?"remote":"local",userid:e.userid,extra:e.extra,mediaElement:e.streamEvents[o.streamid]?e.streamEvents[o.streamid].mediaElement:null}),n&&e.peers[i.userid]){var s=e.peers[i.userid].peer;t=[];s.getRemoteStreams().forEach((function(e){e.id!=o.id&&t.push(e)})),e.peers[i.userid].streams=t}i.userid===e.userid&&"remote"===i.type||(e.peersBackup[i.userid]&&(i.extra=e.peersBackup[i.userid].extra),e.onstreamended(i),delete e.streamEvents[o.streamid])}),!1)}},e.onMediaError=function(o,n){e.enableLogs&&console.error(o,n)},e.autoCloseEntireSession=!1,e.filesContainer=e.videosContainer=document.body||document.documentElement,e.isInitiator=!1,e.shareFile=o.shareFile,"undefined"!=typeof FileProgressBarHandler&&FileProgressBarHandler.handle(e),"undefined"!=typeof TranslationHandler&&TranslationHandler.handle(e),e.token=getRandomString,e.onNewParticipant=function(o,n){e.acceptParticipationRequest(o,n)},e.acceptParticipationRequest=function(e,n){n.successCallback&&(n.successCallback(),delete n.successCallback),o.createNewPeer(e,n)},"undefined"!=typeof StreamsHandler&&(e.StreamsHandler=StreamsHandler),e.onleave=function(e){},e.invokeSelectFileDialog=function(e){var o=new FileSelector;o.accept="*.*",o.selectSingleFile(e)},e.onmute=function(e){if(e&&e.mediaElement)if("both"===e.muteType||"video"===e.muteType){e.mediaElement.src=null;var o=e.mediaElement.pause();void 0!==o?o.then((function(){e.mediaElement.poster=e.snapshot||"https://cdn.webrtc-experiment.com/images/muted.png"})):e.mediaElement.poster=e.snapshot||"https://cdn.webrtc-experiment.com/images/muted.png"}else"audio"===e.muteType&&(e.mediaElement.muted=!0)},e.onunmute=function(e){e&&e.mediaElement&&e.stream&&("both"===e.unmuteType||"video"===e.unmuteType?(e.mediaElement.poster=null,e.mediaElement.srcObject=e.stream,e.mediaElement.play()):"audio"===e.unmuteType&&(e.mediaElement.muted=!1))},e.onExtraDataUpdated=function(o){o.status="online",e.onUserStatusChanged(o,!0)},e.getAllParticipants=function(o){return e.peers.getAllParticipants(o)},"undefined"!=typeof StreamsHandler&&(StreamsHandler.onSyncNeeded=function(n,t,i){e.peers.getAllParticipants().forEach((function(e){o.onNegotiationNeeded({streamid:n,action:t,streamSyncNeeded:!0,type:i||"both"},e)}))}),e.connectSocket=function(e){t(e)},e.closeSocket=function(){try{io.sockets={}}catch(e){}e.socket&&("function"==typeof e.socket.disconnect&&e.socket.disconnect(),"function"==typeof e.socket.resetProps&&e.socket.resetProps(),e.socket=null)},e.getSocket=function(o){return!o&&e.enableLogs&&console.warn("getSocket.callback paramter is required."),o=o||function(){},e.socket?o(e.socket):t((function(){o(e.socket)})),e.socket},e.getRemoteStreams=o.getRemoteStreams;var u=["selectFirst","selectAll","forEach"];if(e.streamEvents={selectFirst:function(o){return e.streamEvents.selectAll(o)[0]},selectAll:function(o){o||(o={local:!0,remote:!0,isScreen:!0,isAudio:!0,isVideo:!0}),"local"==o&&(o={local:!0}),"remote"==o&&(o={remote:!0}),"screen"==o&&(o={isScreen:!0}),"audio"==o&&(o={isAudio:!0}),"video"==o&&(o={isVideo:!0});var n=[];return Object.keys(e.streamEvents).forEach((function(t){var i=e.streamEvents[t];if(-1===u.indexOf(t)){var s=!0;o.local&&"local"===i.type&&(s=!1),o.remote&&"remote"===i.type&&(s=!1),o.isScreen&&i.stream.isScreen&&(s=!1),o.isVideo&&i.stream.isVideo&&(s=!1),o.isAudio&&i.stream.isAudio&&(s=!1),o.userid&&i.userid===o.userid&&(s=!1),!1===s&&n.push(i)}})),n}},e.socketURL="@@socketURL",e.socketMessageEvent="@@socketMessageEvent",e.socketCustomEvent="@@socketCustomEvent",e.DetectRTC=DetectRTC,e.setCustomSocketEvent=function(o){o&&(e.socketCustomEvent=o),e.socket&&e.socket.emit("set-custom-socket-event-listener",e.socketCustomEvent)},e.getNumberOfBroadcastViewers=function(o,n){e.socket&&o&&n&&e.socket.emit("get-number-of-users-in-specific-broadcast",o,n)},e.onNumberOfBroadcastViewersUpdated=function(o){e.enableLogs&&e.isInitiator&&console.info("Number of broadcast (",o.broadcastId,") viewers",o.numberOfBroadcastViewers)},e.onUserStatusChanged=function(o,n){e.enableLogs&&!n&&console.info(o.userid,o.status)},e.getUserMediaHandler=getUserMediaHandler,e.multiPeersHandler=o,e.enableLogs=!0,e.setCustomSocketHandler=function(e){"undefined"!=typeof SocketConnection&&(SocketConnection=e)},e.chunkSize=4e4,e.maxParticipantsAllowed=1e3,e.disconnectWith=o.disconnectWith,e.checkPresence=function(o,n){o=o||e.sessionid,"SSEConnection"!==SocketConnection.name?e.socket?e.socket.emit("check-presence",o+"",(function(o,t,i){e.enableLogs&&console.log("checkPresence.isRoomExist: ",o," roomid: ",t),n(o,t,i)})):e.connectSocket((function(){e.checkPresence(o,n)})):SSEConnection.checkPresence(o,(function(o,t,i){if(!e.socket)return o||(e.userid=t),void e.connectSocket((function(){n(o,t,i)}));n(o,t)}))},e.onReadyForOffer=function(o,n){e.multiPeersHandler.createNewPeer(o,n)},e.setUserPreferences=function(o){return e.dontAttachStream&&(o.dontAttachLocalStream=!0),e.dontGetRemoteStream&&(o.dontGetRemoteStream=!0),o},e.updateExtraData=function(){e.socket.emit("extra-data-updated",e.extra)},e.enableScalableBroadcast=!1,e.maxRelayLimitPerUser=3,e.dontCaptureUserMedia=!1,e.dontAttachStream=!1,e.dontGetRemoteStream=!1,e.onReConnecting=function(o){e.enableLogs&&console.info("ReConnecting with",o.userid,"...")},e.beforeAddingStream=function(e){return e},e.beforeRemovingStream=function(e){return e},"undefined"!=typeof isChromeExtensionAvailable&&(e.checkIfChromeExtensionAvailable=isChromeExtensionAvailable),"undefined"!=typeof isFirefoxExtensionAvailable&&(e.checkIfChromeExtensionAvailable=isFirefoxExtensionAvailable),"undefined"!=typeof getChromeExtensionStatus&&(e.getChromeExtensionStatus=getChromeExtensionStatus),e.modifyScreenConstraints=function(e){return e},e.onPeerStateChanged=function(o){e.enableLogs&&-1!==o.iceConnectionState.search(/closed|failed/gi)&&console.error("Peer connection is closed between you & ",o.userid,o.extra,"state:",o.iceConnectionState)},e.isOnline=!0,listenEventHandler("online",(function(){e.isOnline=!0})),listenEventHandler("offline",(function(){e.isOnline=!1})),e.isLowBandwidth=!1,navigator&&navigator.connection&&navigator.connection.type&&(e.isLowBandwidth=-1!==navigator.connection.type.toString().toLowerCase().search(/wifi|cell/g),e.isLowBandwidth)){if(e.bandwidth={audio:!1,video:!1,screen:!1},e.mediaConstraints.audio&&e.mediaConstraints.audio.optional&&e.mediaConstraints.audio.optional.length){var l=[];e.mediaConstraints.audio.optional.forEach((function(e){void 0===e.bandwidth&&l.push(e)})),e.mediaConstraints.audio.optional=l}if(e.mediaConstraints.video&&e.mediaConstraints.video.optional&&e.mediaConstraints.video.optional.length){l=[];e.mediaConstraints.video.optional.forEach((function(e){void 0===e.bandwidth&&l.push(e)})),e.mediaConstraints.video.optional=l}}e.getExtraData=function(o,n){if(!o)throw"remoteUserId is required.";if("function"!=typeof n)return e.peers[o]?e.peers[o].extra:e.peersBackup[o]?e.peersBackup[o].extra:{};e.socket.emit("get-remote-user-extra-data",o,(function(e,o,t){n(e,o,t)}))},forceOptions.autoOpenOrJoin&&e.openOrJoin(e.sessionid),e.onUserIdAlreadyTaken=function(o,n){e.close(),e.closeSocket(),e.isInitiator=!1,e.userid=e.token(),e.join(e.sessionid),e.enableLogs&&console.warn("Userid already taken.",o,"Your new userid:",e.userid)},e.trickleIce=!0,e.version="@@version",e.onSettingLocalDescription=function(o){e.enableLogs&&console.info("Set local description for remote user",o.userid)},e.resetScreen=function(){sourceId=null,DetectRTC&&DetectRTC.screen&&delete DetectRTC.screen.sourceId,currentUserMediaRequest={streams:[],mutex:!1,queueRequests:[]}},e.autoCreateMediaElement=!0,e.password=null,e.setPassword=function(o,n){n=n||function(){},e.socket?e.socket.emit("set-password",o,n):(e.password=o,n(!0,e.sessionid,null))},e.onSocketDisconnect=function(o){e.enableLogs&&console.warn("socket.io connection is closed")},e.onSocketError=function(o){e.enableLogs&&console.warn("socket.io connection is failed")},e.errors={ROOM_NOT_AVAILABLE:"Room not available",INVALID_PASSWORD:"Invalid password",USERID_NOT_AVAILABLE:"User ID does not exist",ROOM_PERMISSION_DENIED:"Room permission denied",ROOM_FULL:"Room full",DID_NOT_JOIN_ANY_ROOM:"Did not join any room yet",INVALID_SOCKET:"Invalid socket",PUBLIC_IDENTIFIER_MISSING:"publicRoomIdentifier is required",INVALID_ADMIN_CREDENTIAL:"Invalid username or password attempted"}},exports.SocketConnection=function(e,o){function n(e){return!e.audio&&!e.video&&!e.screen&&e.data}var t="";t+="?userid="+e.userid,t+="&sessionid="+e.sessionid,t+="&msgEvent="+e.socketMessageEvent,t+="&socketCustomEvent="+e.socketCustomEvent,t+="&autoCloseEntireSession="+!!e.autoCloseEntireSession,!0===e.session.broadcast&&(t+="&oneToMany=true"),t+="&maxParticipantsAllowed="+e.maxParticipantsAllowed,e.enableScalableBroadcast&&(t+="&enableScalableBroadcast=true",t+="&maxRelayLimitPerUser="+(e.maxRelayLimitPerUser||2)),t+="&extra="+JSON.stringify(e.extra||{}),e.socketCustomParameters&&(t+=e.socketCustomParameters);try{io.sockets={}}catch(e){}if(e.socketURL||(e.socketURL="/"),"/"!=e.socketURL.substr(e.socketURL.length-1,1))throw'"socketURL" MUST end with a slash.';e.enableLogs&&("/"==e.socketURL?console.info("socket.io url is: ",location.origin+"/"):console.info("socket.io url is: ",e.socketURL));try{e.socket=io.connect(e.socketURL+t,e.socketOptions)}catch(e){console.error(e)}var i=e.multiPeersHandler;function s(o,n){e.peersBackup[o]||(e.peersBackup[o]={userid:o,extra:{}}),e.peersBackup[o].extra=n}e.socket.on("extra-data-updated",(function(o,n){e.peers[o]&&(e.peers[o].extra=n,e.onExtraDataUpdated({userid:o,extra:n}),s(o,n))})),e.socket.on(e.socketMessageEvent,(function o(t){if(t.remoteUserId==e.userid)if(e.peers[t.sender]&&e.peers[t.sender].extra!=t.message.extra&&(e.peers[t.sender].extra=t.extra,e.onExtraDataUpdated({userid:t.sender,extra:t.extra}),s(t.sender,t.extra)),t.message.streamSyncNeeded&&e.peers[t.sender]){var a=e.streamEvents[t.message.streamid];if(!a||!a.stream)return;var r=t.message.action;if("ended"===r||"inactive"===r||"stream-removed"===r)return e.peersBackup[a.userid]&&(a.extra=e.peersBackup[a.userid].extra),void e.onstreamended(a);var d="both"!=t.message.type?t.message.type:null;"function"==typeof a.stream[r]&&a.stream[r](d)}else if("dropPeerConnection"!==t.message){if(t.message.allParticipants)return-1===t.message.allParticipants.indexOf(t.sender)&&t.message.allParticipants.push(t.sender),void t.message.allParticipants.forEach((function(o){i[e.peers[o]?"renegotiatePeer":"createNewPeer"](o,{localPeerSdpConstraints:{OfferToReceiveAudio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.sdpConstraints.mandatory.OfferToReceiveVideo},remotePeerSdpConstraints:{OfferToReceiveAudio:e.session.oneway?!!e.session.audio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.session.oneway?!!e.session.video||!!e.session.screen:e.sdpConstraints.mandatory.OfferToReceiveVideo},isOneWay:!!e.session.oneway||"one-way"===e.direction,isDataOnly:n(e.session)})}));if(t.message.newParticipant){if(t.message.newParticipant==e.userid)return;if(e.peers[t.message.newParticipant])return;i.createNewPeer(t.message.newParticipant,t.message.userPreferences||{localPeerSdpConstraints:{OfferToReceiveAudio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.sdpConstraints.mandatory.OfferToReceiveVideo},remotePeerSdpConstraints:{OfferToReceiveAudio:e.session.oneway?!!e.session.audio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.session.oneway?!!e.session.video||!!e.session.screen:e.sdpConstraints.mandatory.OfferToReceiveVideo},isOneWay:!!e.session.oneway||"one-way"===e.direction,isDataOnly:n(e.session)})}else if(t.message.readyForOffer&&(e.attachStreams.length&&(e.waitingForLocalMedia=!1),e.waitingForLocalMedia))setTimeout((function(){o(t)}),1);else if(t.message.newParticipationRequest&&t.sender!==e.userid){e.peers[t.sender]&&e.deletePeer(t.sender);var c={extra:t.extra||{},localPeerSdpConstraints:t.message.remotePeerSdpConstraints||{OfferToReceiveAudio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.sdpConstraints.mandatory.OfferToReceiveVideo},remotePeerSdpConstraints:t.message.localPeerSdpConstraints||{OfferToReceiveAudio:e.session.oneway?!!e.session.audio:e.sdpConstraints.mandatory.OfferToReceiveAudio,OfferToReceiveVideo:e.session.oneway?!!e.session.video||!!e.session.screen:e.sdpConstraints.mandatory.OfferToReceiveVideo},isOneWay:void 0!==t.message.isOneWay?t.message.isOneWay:!!e.session.oneway||"one-way"===e.direction,isDataOnly:void 0!==t.message.isDataOnly?t.message.isDataOnly:n(e.session),dontGetRemoteStream:void 0!==t.message.isOneWay?t.message.isOneWay:!!e.session.oneway||"one-way"===e.direction,dontAttachLocalStream:!!t.message.dontGetRemoteStream,connectionDescription:t,successCallback:function(){}};e.onNewParticipant(t.sender,c)}else{if(t.message.changedUUID&&e.peers[t.message.oldUUID]&&(e.peers[t.message.newUUID]=e.peers[t.message.oldUUID],delete e.peers[t.message.oldUUID]),t.message.userLeft)return i.onUserLeft(t.sender),void(t.message.autoCloseEntireSession&&e.leave());i.addNegotiatedMessage(t.message,t.sender)}}else e.deletePeer(t.sender)}));var a=!1;e.socket.resetProps=function(){a=!1},e.socket.on("connect",(function(){a||(a=!0,e.enableLogs&&console.info("socket.io connection is opened."),setTimeout((function(){e.socket.emit("extra-data-updated",e.extra)}),1e3),o&&o(e.socket))})),e.socket.on("disconnect",(function(o){e.onSocketDisconnect(o)})),e.socket.on("error",(function(o){e.onSocketError(o)})),e.socket.on("user-disconnected",(function(o){o!==e.userid&&(e.onUserStatusChanged({userid:o,status:"offline",extra:e.peers[o]&&e.peers[o].extra||{}}),e.deletePeer(o))})),e.socket.on("user-connected",(function(o){o!==e.userid&&e.onUserStatusChanged({userid:o,status:"online",extra:e.peers[o]&&e.peers[o].extra||{}})})),e.socket.on("closed-entire-session",(function(o,n){e.leave(),e.onEntireSessionClosed({sessionid:o,userid:o,extra:n})})),e.socket.on("userid-already-taken",(function(o,n){e.onUserIdAlreadyTaken(o,n)})),e.socket.on("logs",(function(o){e.enableLogs&&console.debug("server-logs",o)})),e.socket.on("number-of-broadcast-viewers-updated",(function(o){e.onNumberOfBroadcastViewersUpdated(o)})),e.socket.on("set-isInitiator-true",(function(o){o==e.sessionid&&(e.isInitiator=!0)}))};