forked from muaz-khan/getStats
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetStats.min.js
14 lines (10 loc) · 20.6 KB
/
getStats.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'use strict';
// Last time updated: 2025-01-29 4:14:33 PM UTC
// _______________
// getStats v1.2.0
// Open-Sourced: https://github.com/muaz-khan/getStats
// --------------------------------------------------
// Muaz Khan - www.MuazKhan.com
// MIT License - www.WebRTC-Experiment.com/licence
// --------------------------------------------------
var getStats=function(mediaStreamTrack,callback,interval){(that="undefined"!=typeof global?global:null)&&"undefined"==typeof window&&"undefined"!=typeof global&&(global.navigator={userAgent:"Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45",getUserMedia:function(){}},global.console||(global.console={}),void 0!==global.console.log&&void 0!==global.console.error||(global.console.error=global.console.log=global.console.log||function(){console.log(arguments)}),"undefined"==typeof document&&(that.document={documentElement:{appendChild:function(){return""}}},document.createElement=document.captureStream=document.mozCaptureStream=function(){var obj={getContext:function(){return obj},play:function(){},pause:function(){},drawImage:function(){},toDataURL:function(){return""}};return obj},that.HTMLVideoElement=function(){}),"undefined"==typeof location&&(that.location={protocol:"file:",href:"",hash:""}),"undefined"==typeof screen&&(that.screen={width:0,height:0}),"undefined"==typeof URL&&(that.URL={createObjectURL:function(){return""},revokeObjectURL:function(){return""}}),"undefined"==typeof MediaStreamTrack&&(that.MediaStreamTrack=function(){}),void 0===RTCPeerConnection&&(that.RTCPeerConnection=function(){}),that.window=global);var RTCPeerConnection=window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,that=("undefined"==typeof MediaStreamTrack&&(MediaStreamTrack={}),((navigator.connection||{}).type||"unknown").toString().toLowerCase()),getStatsResult={encryption:"sha-256",audio:{send:{tracks:[],codecs:[],streams:0},recv:{tracks:[],codecs:[],streams:0},bytesSent:0,bytesReceived:0,packetsLost:0},video:{send:{tracks:[],codecs:[],streams:0},recv:{tracks:[],codecs:[],streams:0},bytesSent:0,bytesReceived:0,latency:0,packetsLost:0},bandwidth:{systemBandwidth:0,sentPerSecond:0,encodedPerSecond:0,helper:{audioBytesSent:0,videoBytestSent:0},speed:0},results:{},connectionType:{systemNetworkType:that,systemIpAddress:"192.168.1.2",local:{candidateType:[],transport:[],ipAddress:[],networkType:[]},remote:{candidateType:[],transport:[],ipAddress:[],networkType:[]}},resolutions:{send:{width:0,height:0},recv:{width:0,height:0}},internal:{bandwidth:{prevBytesReceived:0},audio:{send:{},recv:{}},video:{send:{},recv:{}},candidates:{},getSendrecvType:function(result){var sendrecvType=result.id.split("_").pop();return"isRemote"in result?(!0===result.isRemote&&(sendrecvType="recv"),!1===result.isRemote&&(sendrecvType="send")):sendrecvType="outbound"===(result=result.type.split("-")[0])?"send":"inbound"===result?"recv":null,sendrecvType}},nomore:function(){nomore=!0}};let getStatsParser={checkIfOfferer:function(result){"googLibjingleSession"===result.type&&(getStatsResult.isOfferer=result.googInitiator)}},getCodecResult=(results,codecId)=>results.find(result=>"codec"===result.type&&result.id===codecId),getCodecName=mimeType=>mimeType&&mimeType.split("/")[1],getRtpResult=(results,directionType,kind)=>results.find(r=>r.type===directionType&&r.kind===kind);let isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var peer=this;if(!(arguments[0]instanceof RTCPeerConnection))throw"1st argument is not instance of RTCPeerConnection.";peer=arguments[0],arguments[1]instanceof MediaStreamTrack&&(callback=arguments[2],interval=arguments[3]);var nomore=!1;getStatsParser.datachannel=function(result){"datachannel"===result.type&&(getStatsResult.datachannel={state:result.state})},getStatsParser.googCertificate=function(result){var transportResult;"certificate"==result.type&&((transportResult=getStatsResult.results.find(r=>"transport"===r.type)).localCertificateId===result.id&&(getStatsResult.encryption=result.fingerprintAlgorithm,getStatsResult.encryptionLocal=result.fingerprintAlgorithm),transportResult.remoteCertificateId===result.id)&&(getStatsResult.encryptionRemote=result.fingerprintAlgorithm)},getStatsParser.checkAudioTracks=function(result){var sendrecvType,rtpResult,remoteRtpResult,bytes,kilobytes,codecResult;"audio"===result.kind&&result.remoteId&&(sendrecvType=getStatsResult.internal.getSendrecvType(result))&&(rtpResult=getRtpResult(getStatsResult.results,result.type,"audio"))&&(remoteRtpResult=getStatsResult.results.find(r=>r.id===result.remoteId)||{},codecResult=getCodecResult(getStatsResult.results,rtpResult.codecId))&&(codecResult=getCodecName(codecResult.mimeType)||"opus",-1===getStatsResult.audio[sendrecvType].codecs.indexOf(codecResult)&&getStatsResult.audio[sendrecvType].codecs.push(codecResult),result.bytesSent&&(getStatsResult.internal.audio[sendrecvType].prevBytesSent||(getStatsResult.internal.audio[sendrecvType].prevBytesSent=result.bytesSent),bytes=result.bytesSent-getStatsResult.internal.audio[sendrecvType].prevBytesSent,getStatsResult.internal.audio[sendrecvType].prevBytesSent=result.bytesSent,getStatsResult.audio[sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult.audio.bytesSent=kilobytes),result.bytesReceived&&(getStatsResult.internal.audio[sendrecvType].prevBytesReceived||(getStatsResult.internal.audio[sendrecvType].prevBytesReceived=result.bytesReceived),bytes=result.bytesReceived-getStatsResult.internal.audio[sendrecvType].prevBytesReceived,getStatsResult.internal.audio[sendrecvType].prevBytesReceived=result.bytesReceived,getStatsResult.audio.bytesReceived=kilobytes=bytes/1024),result.trackIdentifier&&-1===getStatsResult.audio[sendrecvType].tracks.indexOf(result.trackIdentifier)&&getStatsResult.audio[sendrecvType].tracks.push(result.trackIdentifier),getStatsResult.audio[sendrecvType].totalRoundTripTime=remoteRtpResult.totalRoundTripTime||0,getStatsResult.audio[sendrecvType].jitter=remoteRtpResult.jitter||0,getStatsResult.audio[sendrecvType].jitterBufferDelay=remoteRtpResult.jitterBufferDelay||0,getStatsResult.audio[sendrecvType].packetsLost=("inbound-rtp"===result.type?rtpResult:remoteRtpResult).packetsLost,getStatsResult.audio[sendrecvType].packetsReceived="inbound-rtp"===result.type?rtpResult.packetsReceived:0,remoteRtpResult.totalRoundTripTime&&(getStatsResult.audio.latency=remoteRtpResult.totalRoundTripTime),Number.isInteger(rtpResult.packetsLost))&&(getStatsResult.internal.audio.prevPacketsLost||(getStatsResult.internal.audio.prevPacketsLost=rtpResult.packetsLost),codecResult=rtpResult.packetsLost-getStatsResult.internal.audio.prevPacketsLost,getStatsResult.internal.audio.prevPacketsLost=rtpResult.packetsLost,getStatsResult.audio.packetsLost=codecResult,getStatsResult.audio.packetsLost<0)&&(getStatsResult.audio.packetsLost=0)},getStatsParser.checkVideoTracks=function(result){var sendrecvType,rtpResult,remoteRtpResult,bytes,kilobytes,codecResult;"video"===result.kind&&(sendrecvType=getStatsResult.internal.getSendrecvType(result))&&(rtpResult=getRtpResult(getStatsResult.results,result.type,"video"))&&(remoteRtpResult=getStatsResult.results.find(r=>r.id===result.remoteId)||{},codecResult=getCodecResult(getStatsResult.results,rtpResult.codecId))&&(codecResult=getCodecName(codecResult.mimeType)||"VP8",-1===getStatsResult.video[sendrecvType].codecs.indexOf(codecResult)&&getStatsResult.video[sendrecvType].codecs.push(codecResult),result.bytesSent&&(getStatsResult.internal.video[sendrecvType].prevBytesSent||(getStatsResult.internal.video[sendrecvType].prevBytesSent=result.bytesSent),bytes=result.bytesSent-getStatsResult.internal.video[sendrecvType].prevBytesSent,getStatsResult.internal.video[sendrecvType].prevBytesSent=result.bytesSent,getStatsResult.video[sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult.video.bytesSent=kilobytes),result.bytesReceived&&(getStatsResult.internal.video[sendrecvType].prevBytesReceived||(getStatsResult.internal.video[sendrecvType].prevBytesReceived=result.bytesReceived),bytes=result.bytesReceived-getStatsResult.internal.video[sendrecvType].prevBytesReceived,getStatsResult.internal.video[sendrecvType].prevBytesReceived=result.bytesReceived,getStatsResult.video[sendrecvType].bytesReceived=kilobytes=bytes/1024,getStatsResult.video.bytesReceived=kilobytes),rtpResult.frameHeight&&result.frameWidth&&(getStatsResult.resolutions[sendrecvType].width=result.frameHeight,getStatsResult.resolutions[sendrecvType].height=result.frameHeight),result.trackIdentifier&&-1===getStatsResult.video[sendrecvType].tracks.indexOf(result.trackIdentifier)&&getStatsResult.video[sendrecvType].tracks.push(result.trackIdentifier),result.framesPerSecond&&(getStatsResult.video[sendrecvType].framesPerSecond=result.framesPerSecond),Number.isInteger(result.framesSent)&&(getStatsResult.internal.video[sendrecvType].prevFramesSent||(getStatsResult.internal.video[sendrecvType].prevFramesSent=result.framesSent),codecResult=result.framesSent-getStatsResult.internal.video[sendrecvType].prevFramesSent,getStatsResult.internal.video[sendrecvType].prevFramesSent=result.framesSent,getStatsResult.video[sendrecvType].framesSent=codecResult),getStatsResult.video[sendrecvType].totalRoundTripTime=remoteRtpResult.totalRoundTripTime||0,getStatsResult.video[sendrecvType].jitter=remoteRtpResult.jitter||0,getStatsResult.video[sendrecvType].jitterBufferDelay=remoteRtpResult.jitterBufferDelay||0,getStatsResult.video[sendrecvType].packetsLost=("inbound-rtp"===result.type?rtpResult:remoteRtpResult).packetsLost,getStatsResult.video[sendrecvType].packetsReceived="inbound-rtp"===result.type?rtpResult.packetsReceived:0,remoteRtpResult.totalRoundTripTime&&(getStatsResult.video.latency=remoteRtpResult.totalRoundTripTime),Number.isInteger(rtpResult.packetsLost))&&(getStatsResult.video.packetsLost=rtpResult.packetsLost)},getStatsParser.bweforvideo=function(result){"candidate-pair"===result.type&&(getStatsResult.bandwidth.availableSendBandwidth=result.availableOutgoingBitrate||0),"outbound-rtp"===result.type&&(getStatsResult.bandwidth.transmitBitrate=result.headerBytesSent+result.bytesSent||0,getStatsResult.bandwidth.bucketDelay=0<result.packetsSent?result.totalPacketSendDelay/result.packetsSent:0,getStatsResult.bandwidth.targetEncBitrate=result.targetBitrate,getStatsResult.bandwidth.actualEncBitrate=result.bytesSent-result.retransmittedBytesSent,getStatsResult.bandwidth.retransmitBitrate=result.retransmittedBytesSent)},getStatsParser.candidatePair=function(result){var transportResult,localCandidateResult,localCandidate,remoteCandidate;isSafari||"googCandidatePair"!==result.type&&"candidate-pair"!==result.type&&"local-candidate"!==result.type&&"remote-candidate"!==result.type||(transportResult=getStatsResult.results.find(result=>"transport"===result.type),localCandidateResult=getStatsResult.results.find(result=>"local-candidate"===result.type),transportResult&&transportResult.selectedCandidatePairId===result.id&&(Object.keys(getStatsResult.internal.candidates).forEach(function(cid){cid=getStatsResult.internal.candidates[cid];cid.id===result.localCandidateId&&(getStatsResult.connectionType.local.candidateType=cid.candidateType,getStatsResult.connectionType.local.ipAddress=cid.ipAddress,getStatsResult.connectionType.local.networkType=cid.networkType,getStatsResult.connectionType.local.transport=cid.transport),cid.id===result.remoteCandidateId&&(getStatsResult.connectionType.remote.candidateType=cid.candidateType,getStatsResult.connectionType.remote.ipAddress=cid.ipAddress,getStatsResult.connectionType.remote.networkType=cid.networkType,getStatsResult.connectionType.remote.transport=cid.transport)}),getStatsResult.connectionType.transport=localCandidateResult.protocol,(localCandidate=getStatsResult.internal.candidates[result.localCandidateId])&&localCandidate.ipAddress&&(getStatsResult.connectionType.systemIpAddress=localCandidate.ipAddress),remoteCandidate=getStatsResult.internal.candidates[result.remoteCandidateId])&&remoteCandidate.ipAddress&&(getStatsResult.connectionType.systemIpAddress=remoteCandidate.ipAddress),"candidate-pair"===result.type&&!0===result.selected&&!0===result.nominated&&"succeeded"===result.state&&(localCandidate=getStatsResult.internal.candidates[result.remoteCandidateId],remoteCandidate=getStatsResult.internal.candidates[result.remoteCandidateId]),"local-candidate"===result.type&&(getStatsResult.connectionType.local.candidateType=result.candidateType,getStatsResult.connectionType.local.ipAddress=result.adress,getStatsResult.connectionType.local.networkType=result.networkType,getStatsResult.connectionType.local.transport=result.protocol),"remote-candidate"===result.type&&(getStatsResult.connectionType.remote.candidateType=result.candidateType,getStatsResult.connectionType.remote.ipAddress=result.adress,getStatsResult.connectionType.remote.networkType=result.networkType,getStatsResult.connectionType.remote.transport=result.protocol))};var LOCAL_candidateType={},LOCAL_transport={},LOCAL_ipAddress={},LOCAL_networkType={},REMOTE_candidateType=(getStatsParser.localcandidate=function(result){var resultIpAddress;"localcandidate"!==result.type&&"local-candidate"!==result.type||result.id&&(LOCAL_candidateType[result.id]||(LOCAL_candidateType[result.id]=[]),LOCAL_transport[result.id]||(LOCAL_transport[result.id]=[]),LOCAL_ipAddress[result.id]||(LOCAL_ipAddress[result.id]=[]),LOCAL_networkType[result.id]||(LOCAL_networkType[result.id]=[]),result.candidateType&&-1===LOCAL_candidateType[result.id].indexOf(result.candidateType)&&LOCAL_candidateType[result.id].push(result.candidateType),result.protocol&&-1===LOCAL_transport[result.id].indexOf(result.protocol)&&LOCAL_transport[result.id].push(result.protocol),resultIpAddress=result.address+":"+result.port,result.address&&-1===LOCAL_ipAddress[result.id].indexOf(resultIpAddress)&&LOCAL_ipAddress[result.id].push(resultIpAddress),result.networkType&&-1===LOCAL_networkType[result.id].indexOf(result.networkType)&&LOCAL_networkType[result.id].push(result.networkType),getStatsResult.internal.candidates[result.id]={candidateType:LOCAL_candidateType[result.id],ipAddress:LOCAL_ipAddress[result.id],portNumber:result.port,networkType:LOCAL_networkType[result.id],priority:result.priority,transport:LOCAL_transport[result.id],timestamp:result.timestamp,id:result.id,type:result.type},getStatsResult.connectionType.local.candidateType=LOCAL_candidateType[result.id],getStatsResult.connectionType.local.ipAddress=LOCAL_ipAddress[result.id],getStatsResult.connectionType.local.networkType=LOCAL_networkType[result.id],getStatsResult.connectionType.local.transport=LOCAL_transport[result.id])},{}),REMOTE_transport={},REMOTE_ipAddress={},REMOTE_networkType={},SSRC=(getStatsParser.remotecandidate=function(result){var resultIpAddress;"remotecandidate"!==result.type&&"remote-candidate"!==result.type||result.id&&(REMOTE_candidateType[result.id]||(REMOTE_candidateType[result.id]=[]),REMOTE_transport[result.id]||(REMOTE_transport[result.id]=[]),REMOTE_ipAddress[result.id]||(REMOTE_ipAddress[result.id]=[]),REMOTE_networkType[result.id]||(REMOTE_networkType[result.id]=[]),result.candidateType&&-1===REMOTE_candidateType[result.id].indexOf(result.candidateType)&&REMOTE_candidateType[result.id].push(result.candidateType),result.protocol&&-1===REMOTE_transport[result.id].indexOf(result.protocol)&&REMOTE_transport[result.id].push(result.protocol),resultIpAddress=result.address+":"+result.port,result.address&&-1===REMOTE_ipAddress[result.id].indexOf(resultIpAddress)&&REMOTE_ipAddress[result.id].push(resultIpAddress),result.networkType&&-1===REMOTE_networkType[result.id].indexOf(result.networkType)&&REMOTE_networkType[result.id].push(result.networkType),getStatsResult.internal.candidates[result.id]={candidateType:REMOTE_candidateType[result.id],ipAddress:REMOTE_ipAddress[result.id],portNumber:result.port,networkType:REMOTE_networkType[result.id],priority:result.priority,transport:REMOTE_transport[result.id],timestamp:result.timestamp,id:result.id,type:result.type},getStatsResult.connectionType.remote.candidateType=REMOTE_candidateType[result.id],getStatsResult.connectionType.remote.ipAddress=REMOTE_ipAddress[result.id],getStatsResult.connectionType.remote.networkType=REMOTE_networkType[result.id],getStatsResult.connectionType.remote.transport=REMOTE_transport[result.id])},getStatsParser.dataSentReceived=function(result){"remote-inbound-rtp"===result.type||"video"!==result.kind&&"audio"!==result.kind||(result.bytesSent&&(getStatsResult[result.kind].bytesSent=parseInt(result.bytesSent)),result.bytesReceived&&(getStatsResult[result.kind].bytesReceived=parseInt(result.bytesReceived)))},getStatsParser.inboundrtp=function(result){var kind,sendrecvType,bytes,kilobytes;isSafari&&"inbound-rtp"===result.type&&(kind=result.kind||"audio",sendrecvType=result.isRemote?"recv":"send")&&(result.bytesSent&&(getStatsResult.internal[kind][sendrecvType].prevBytesSent||(getStatsResult.internal[kind][sendrecvType].prevBytesSent=result.bytesSent),bytes=result.bytesSent-getStatsResult.internal[kind][sendrecvType].prevBytesSent,getStatsResult.internal[kind][sendrecvType].prevBytesSent=result.bytesSent,getStatsResult[kind][sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult[kind].bytesSent=kilobytes),result.bytesReceived)&&(getStatsResult.internal[kind][sendrecvType].prevBytesReceived||(getStatsResult.internal[kind][sendrecvType].prevBytesReceived=result.bytesReceived),bytes=result.bytesReceived-getStatsResult.internal[kind][sendrecvType].prevBytesReceived,getStatsResult.internal[kind][sendrecvType].prevBytesReceived=result.bytesReceived,getStatsResult[kind][sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult[kind].bytesReceived=kilobytes)},getStatsParser.outboundrtp=function(result){var kind,sendrecvType,bytes,kilobytes;isSafari&&"outbound-rtp"===result.type&&(kind=result.kind||"audio",sendrecvType=result.isRemote?"recv":"send")&&(result.bytesSent&&(getStatsResult.internal[kind][sendrecvType].prevBytesSent||(getStatsResult.internal[kind][sendrecvType].prevBytesSent=result.bytesSent),bytes=result.bytesSent-getStatsResult.internal[kind][sendrecvType].prevBytesSent,getStatsResult.internal[kind][sendrecvType].prevBytesSent=result.bytesSent,getStatsResult[kind][sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult[kind].bytesSent=kilobytes),result.bytesReceived)&&(getStatsResult.internal[kind][sendrecvType].prevBytesReceived||(getStatsResult.internal[kind][sendrecvType].prevBytesReceived=result.bytesReceived),bytes=result.bytesReceived-getStatsResult.internal[kind][sendrecvType].prevBytesReceived,getStatsResult.internal[kind][sendrecvType].prevBytesReceived=result.bytesReceived,getStatsResult[kind][sendrecvType].bytesSent=kilobytes=bytes/1024,getStatsResult[kind].bytesReceived=kilobytes)},getStatsParser.track=function(result){var sendrecvType;isSafari&&"track"===result.type&&(sendrecvType=!0===result.remoteSource?"send":"recv",result.frameWidth)&&result.frameHeight&&(getStatsResult.resolutions[sendrecvType].width=result.frameWidth,getStatsResult.resolutions[sendrecvType].height=result.frameHeight)},{audio:{send:[],recv:[]},video:{send:[],recv:[]}});getStatsParser.ssrc=function(result){var rtpResult;"video"!==result.kind&&"audio"!==result.kind||"inbound-rtp"!==result.type&&"outbound-rtp"!==result.type||(rtpResult=getRtpResult(getStatsResult.results,result.type,result.kind))&&getCodecResult(getStatsResult.results,rtpResult.codecId)&&(-1===SSRC[result.kind][rtpResult="outbound-rtp"===result.type?"send":"recv"].indexOf(result.ssrc)&&SSRC[result.kind][rtpResult].push(result.ssrc),getStatsResult[result.kind][rtpResult].streams=SSRC[result.kind][rtpResult].length)},function getStatsLooper(){var cb;cb=function(results){if(results&&results.forEach){(getStatsResult.results=results).forEach(function(result){Object.keys(getStatsParser).forEach(function(key){if("function"==typeof getStatsParser[key])try{getStatsParser[key](result)}catch(e){console.error(e.message,e.stack,e)}})});try{-1!==peer.iceConnectionState.search(/failed|closed|disconnected/gi)&&(nomore=!0)}catch(e){nomore=!0}!0===nomore&&(getStatsResult.datachannel&&(getStatsResult.datachannel.state="close"),getStatsResult.ended=!0),getStatsResult.audio&&getStatsResult.video&&(getStatsResult.bandwidth.speed=getStatsResult.audio.bytesSent-getStatsResult.bandwidth.helper.audioBytesSent+(getStatsResult.video.bytesSent-getStatsResult.bandwidth.helper.videoBytesSent),getStatsResult.bandwidth.helper.audioBytesSent=getStatsResult.audio.bytesSent,getStatsResult.bandwidth.helper.videoBytesSent=getStatsResult.video.bytesSent),callback(getStatsResult),nomore||null!=typeof interval&&interval&&setTimeout(getStatsLooper,interval||1e3)}},peer.getStats(window.mediaStreamTrack||null).then(function(res){var items=[];res.forEach(function(r){items.push(r)}),cb(items)}).catch(cb)}()};"undefined"!=typeof module&&(module.exports=getStats),"function"==typeof define&&define.amd&&define("getStats",[],function(){return getStats});