usc-rtc-client 1.1.3 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +1 -2
- package/dist/index.js +1 -2
- package/package.json +9 -8
- package/dist/index.d.ts +0 -0
- package/dist/index.esm.d.ts +0 -0
- package/dist/index.esm.js.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
function e(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}var t,i,n,s,r;!function(e){e.bye="bye",e.stream="stream",e.reInvite="reInvite",e.localAudioChange="localAudioChange",e.localVideoChange="localVideoChange",e.localStreamChange="localStreamChange"}(t||(t={})),function(e){e.connected="connected",e.disconnected="disconnected",e.invite="invite"}(i||(i={})),function(e){e.PTTInfo="PTTInfo",e.FPREInfo="FPREInfo",e.IMSInfo="IMSInfo",e.ERROR="error",e.SPEAKER="speaker",e.TALKING="talking",e.ACTIVE_GROUP="activeGroup",e.JOIN_INFO="joinInfo"}(n||(n={})),function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(s||(s={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(r||(r={}));const o=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const l=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},h=()=>{d=!1},u=()=>{d=!0};var v,f,p;function m(){}function g(){g.init.call(this)}function k(e){return void 0===e._maxListeners?g.defaultMaxListeners:e._maxListeners}function y(e,t,i){if(t)e.call(i);else for(var n=e.length,s=L(e,n),r=0;r<n;++r)s[r].call(i)}function C(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=L(e,s),o=0;o<s;++o)r[o].call(i,n)}function T(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=L(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function b(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=L(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function w(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=L(e,s),o=0;o<s;++o)r[o].apply(i,n)}function S(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new m,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=k(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function E(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function _(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function L(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}m.prototype=Object.create(null),g.EventEmitter=g,g.usingDomains=!1,g.prototype.domain=void 0,g.prototype._events=void 0,g.prototype._maxListeners=void 0,g.defaultMaxListeners=10,g.init=function(){this.domain=null,g.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new m,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},g.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},g.prototype.getMaxListeners=function(){return k(this)},g.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:y(i,l,this);break;case 2:C(i,l,this,arguments[1]);break;case 3:T(i,l,this,arguments[1],arguments[2]);break;case 4:b(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];w(i,l,this,s)}return!0},g.prototype.addListener=function(e,t){return S(this,e,t,!1)},g.prototype.on=g.prototype.addListener,g.prototype.prependListener=function(e,t){return S(this,e,t,!0)},g.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,E(this,e,t)),this},g.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,E(this,e,t)),this},g.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new m:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new m,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},g.prototype.off=function(e,t){return this.removeListener(e,t)},g.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new m,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new m:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new m,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},g.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},g.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):_.call(e,t)},g.prototype.listenerCount=_,g.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class R extends g{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{ideal:1920},height:{ideal:1080},frameRate:{ideal:20,max:30},aspectRatio:{ideal:16/9}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(e){var i;this.emit(t.localVideoChange,{from:this.videoTrack,to:e}),this.videoTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.videoTrack,e)),this.videoTrack=e}setAudioTrack(e){var i;this.emit(t.localAudioChange,{from:this.audioTrack,to:e}),this.audioTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.audioTrack,e)),this.audioTrack=e}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(t){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(e.getAudioTracks()[0]),this.setVideoTrack(e.getVideoTracks()[0]),this.renderLocalStreamToContainer(t)}))}useAudio(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:t},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:t},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(l("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(l("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class I extends R{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>l("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{l("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>l("datachannel",e))),e.addEventListener("icecandidateerror",(e=>l("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>l("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>l("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>l("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>l("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(t,i){return e(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let e=this.peerConnection.getSenders().find((e=>{var i;return(null===(i=e.track)||void 0===i?void 0:i.kind)===(null==t?void 0:t.kind)}));void 0!==e&&this.peerConnection.removeTrack(e)}void 0!==i&&(i.onended=e=>l("local track end",e),i.onmute=e=>{l("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{l("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(t),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(t.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(t.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){l("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let r=RTCRtpReceiver.getCapabilities("audio");null!==r&&this.audioCodecs.push(...r.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=class{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:t})}))}createAnswer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:t})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}!function(e){e[e.timeout=408]="timeout",e[e.reject=488]="reject",e[e.busy=486]="busy",e[e.notfound=404]="notfound",e[e.notAllowedMedia=415]="notAllowedMedia",e[e.ok=200]="ok"}(v||(v={}));class x extends I{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);e.answer(v.reject,i,t,this.sessionId),this.destory()}acceptCall(){return e(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:n}=yield this.createAnswer();e.answer(v.ok,i,t,this.sessionId,n)}}))}pickNewConnection(){return e(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(t){var i;return e(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,t)}))}}!function(e){e.audio="audio",e.video="video",e.audioVideo="audioVideo",e.unknown="unknown"}(f||(f={}));class M extends x{constructor(){super(...arguments),this.responseCallType=f.unknown}start(){return e(this,void 0,void 0,(function*(){let[e,t]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),i=yield this.createOffer(),{status:n,sdp:s}=yield e.invite(t,this.sessionId,i.sdp);n===v.ok&&(yield this.setAnswer(s));const r=s.split("\r\n"),o=r.find((e=>e.startsWith("m=audio"))),a=r.find((e=>e.startsWith("m=video")));return this.responseCallType=o&&a?f.audioVideo:o?f.audio:a?f.video:f.unknown,n}))}addRemote(e){this.remoteNumber=e}}class N{constructor(e,t,i,n){this.req=e,this.seq=N.seqNum++,this.from=t,this.to=i,this.registerid=`${N.random}@${t}`,void 0!==n&&Object.assign(this,n)}}N.random=String(Date.now()),N.seqNum=0,function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(p||(p={}));var G=null;try{var P="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");G=P.Worker}catch(e){}function V(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:"");return function(e){return new G(o,Object.assign({},e,{eval:!0}))}}function W(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,r=i.length;s<r;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var Z="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var A,O,Y,j=(A="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGYsYT17fSxuPXt0aW1lb3V0OjVlMyx0aW1lb3V0T2JqOm51bGwscmVzZXQoKXtyZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRPYmopLHRoaXN9LHJlZ2lzdGVyKCl7MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KFJlZ2lzdGVyKSl9LHNlbmRPbmxpbmUoKXsxPT09ZS5yZWFkeVN0YXRlJiZlLnNlbmQoSlNPTi5zdHJpbmdpZnkoYSkpfSxzdGFydCgpe3RoaXMudGltZW91dE9iaj1zZXRJbnRlcnZhbCgoKCk9Pnt0aGlzLnNlbmRPbmxpbmUoKX0pLHRoaXMudGltZW91dCl9fTtsZXQgbz0yO3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGZ1bmN0aW9uKHMpe2NvbnN0IGk9cy5kYXRhO3N3aXRjaChpLmNtZCl7Y2FzZSJjb25maWciOk9iamVjdC5hc3NpZ24oYSxpLmhlYXJ0QmVhdCx7c2VxOm8rK30pLG4udGltZW91dD0xZTMqaS5oZWFydFRpbWV8fDVlMzticmVhaztjYXNlInN0YXJ0IjpzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJ3ZWJXb3JrZXIiLGRhdGE6IuWQr+WKqHdlYldvcmtlciJ9KSxyKGkudXJsKTticmVhaztjYXNlInN0b3AiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KGkuZGF0YSkpfX0pLCExKTtjb25zdCByPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe2kodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXtpKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KSxuLnJlc2V0KCkuc3RhcnQoKX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gaShzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxyKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",O=null,Y=!1,Z?V(A,O,Y):function(e,t,i){var n;return function(s){return n=n||W(e,t,i),new Worker(n,s)}}(A,O,Y));class U extends g{constructor(e,t,i){super(),this.server=e,this.ws=new j,this.configHeartBeat(t,i)}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return l("websocket recive message ",i),void this.emit(p.message,i);case"open":return l("websocket connected ",this.server),void this.emit(p.connected)}}}configHeartBeat(e,t){l("websocket heartBeat",e),l("websocket heartTime ",t),this.ws.postMessage({cmd:"config",heartBeat:e,heartTime:t})}initWebsocket(){this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){l("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class X extends g{constructor(e,t,i,n){super(),this.activeServer="",this.server=e,this.localNumber=t,this.expireTime=i,this.heartTime=n,super.setMaxListeners(0)}testWs(t){return e(this,void 0,void 0,(function*(){return t.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return e(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new U(this.activeServer,new N(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime}),this.heartTime);n.on(p.connected,(()=>{this.socketWorker=n,this.onConnected(),e()})),n.on(p.disconnected,(e=>{this.socketWorker=void 0,this.onDisConnected(e),i("socketWorker connecion failed")})),n.on(p.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socketWorker)throw new Error("socketWorker is closed");this.socketWorker.sendMessage(e)}destory(){void 0!==this.socketWorker&&(this.unRegister(),this.socketWorker.close(),this.socketWorker=void 0)}}class K extends X{constructor(){super(...arguments),this.asyncProducer=new Map}sendRespondableMessage(t){return e(this,void 0,void 0,(function*(){return this.sendMessage(t),new Promise((e=>this.asyncProducer.set(t.seq,e)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(e){this.asyncProducer.clear(),this.emit(i.disconnected,e)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class D extends K{register(){return e(this,void 0,void 0,(function*(){let e=new N(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new N(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new N(s.MESSAGE_TYPE_INVITE,this.localNumber,t,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new N(s.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendMessage(new N(s.MESSAGE_TYPE_INFO,this.localNumber,t,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function q(){}function z(){z.init.call(this)}function F(e){return void 0===e._maxListeners?z.defaultMaxListeners:e._maxListeners}function H(e,t,i){if(t)e.call(i);else for(var n=e.length,s=ne(e,n),r=0;r<n;++r)s[r].call(i)}function J(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=ne(e,s),o=0;o<s;++o)r[o].call(i,n)}function B(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=ne(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function $(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=ne(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function Q(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=ne(e,s),o=0;o<s;++o)r[o].apply(i,n)}function ee(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new q,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=F(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function te(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function ie(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function ne(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}q.prototype=Object.create(null),z.EventEmitter=z,z.usingDomains=!1,z.prototype.domain=void 0,z.prototype._events=void 0,z.prototype._maxListeners=void 0,z.defaultMaxListeners=10,z.init=function(){this.domain=null,z.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new q,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},z.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},z.prototype.getMaxListeners=function(){return F(this)},z.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:H(i,l,this);break;case 2:J(i,l,this,arguments[1]);break;case 3:B(i,l,this,arguments[1],arguments[2]);break;case 4:$(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];Q(i,l,this,s)}return!0},z.prototype.addListener=function(e,t){return ee(this,e,t,!1)},z.prototype.on=z.prototype.addListener,z.prototype.prependListener=function(e,t){return ee(this,e,t,!0)},z.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,te(this,e,t)),this},z.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,te(this,e,t)),this},z.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new q:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new q,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},z.prototype.off=function(e,t){return this.removeListener(e,t)},z.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new q,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new q:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new q,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},z.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},z.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):ie.call(e,t)},z.prototype.listenerCount=ie,z.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const se="error",re="speaker",oe="talking",ae="activeGroup",ce="joinInfo",de="disConnected",le={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},he="connected",ue="disconnected",ve="message",fe=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},pe=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class me extends z{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{fe("websocket connected ",this.server),this.emit(he)},this.ws.onclose=()=>{fe("websocket disconnected ",this.server),this.ws=void 0,this.emit(ue)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);fe("websocket recive message ",t),this.emit(ve,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){fe("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class ge extends z{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return pe("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new me(this.server);i.on(he,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(ue,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit(de),t("socket connecion failed")})),i.on(ve,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){fe(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,fe(`${this.speaker}正在说话`),this.emit(re,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,fe(`加入组${this.activeGroup}`)):(this.activeGroup="",pe(le[n.code]),this.emit(se,le[n.code])),this.emit(ae,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,fe(`talking:${this.talking}`),this.emit(oe,this.talking)),14===t&&(this.speaker="",fe(`${this.speaker}停止说话`),this.emit(re,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};fe(`${e}进入组`),this.emit(ce,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit(ae,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,fe(`talking:${this.talking}`),this.emit(oe,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class ke extends D{constructor(e){let t=e.expireTime||ke.defaultExpireTime;super(e.server,e.localNumber,t,e.heartTime||5),this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return e(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new ge(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on(ae,(e=>{this.emit(ae,e)})),e.on(re,(e=>{this.emit(re,e)})),e.on(oe,(e=>{this.emit(oe,e)})),e.on(ce,(e=>{this.emit(ce,e)})),e.on(de,(e=>{this.emit(de,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){}onDisConnected(){super.onDisConnected()}}ke.defaultExpireTime=60;class ye extends x{constructor(e,t,i,n,s){super(e,t,i),this.callType=f.unknown,this.inviteSeq=s,this.inviteOffer=n;const r=n.split("\r\n"),o=r.find((e=>e.startsWith("m=audio"))),a=r.find((e=>e.startsWith("m=video")));this.callType=o&&a?f.audioVideo:o?f.audio:a?f.video:f.unknown}}class Ce extends ke{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new M(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(e){var o;let{req:a}=e;if(a===s.MESSAGE_TYPE_INVITE){let t=new ye(this,e.cid,e.from,e.sdp,e.seq);this.allSession.push(t),this.emit(i.invite,t)}else if(a===s.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((t=>t.sessionId==e.cid));void 0!==i&&(i.inviteSeq=e.seq,i.inviteOffer=e.sdp,i.acceptCall(),i.emit(t.reInvite,i))}else if(a===s.MESSAGE_TYPE_ICE)null===(o=this.allSession.find((t=>t.sessionId===e.cid)))||void 0===o||o.reciveIceRequest(e);else if(a===s.MESSAGE_TYPE_BYE){let i=this.allSession.find((t=>t.sessionId===e.cid));void 0!==i&&(i.emit(t.bye),i.destory(!1))}a==r.FPRE&&this.emit(n.FPREInfo,e),a==r.IMS&&this.emit(n.IMSInfo,e)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}const Te=t=>e(void 0,void 0,void 0,(function*(){let e=new Ce(t);yield e.reConnect(),yield e.initPttClient().catch((e=>{console.error(e)})),N.random=String(Date.now());let i=yield e.register();return i.status===v.ok?e:(e.destory(),Promise.reject(i))})),be=()=>e(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})}));export{n as PTTEvent,f as RtcCalledType,Ce as RtcClient,i as RtcClientEvent,v as RtcInviteStatus,t as RtcSessionEvent,be as authDevice,Te as createRtcClient,h as disableLog,u as enableLog,o as releaseStreamFromContainer,a as renderStreamToContainer};
|
|
2
|
-
//# sourceMappingURL=index.esm.js.map
|
|
1
|
+
function e(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}var t,i,n,s,r;"function"==typeof SuppressedError&&SuppressedError,function(e){e.bye="bye",e.stream="stream",e.reInvite="reInvite",e.localAudioChange="localAudioChange",e.localVideoChange="localVideoChange",e.localStreamChange="localStreamChange"}(t||(t={})),function(e){e.connected="connected",e.disconnected="disconnected",e.invite="invite"}(i||(i={})),function(e){e.PTTInfo="PTTInfo",e.FPREInfo="FPREInfo",e.IMSInfo="IMSInfo",e.ERROR="error",e.SPEAKER="speaker",e.TALKING="talking",e.ACTIVE_GROUP="activeGroup",e.JOIN_INFO="joinInfo"}(n||(n={})),function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(s||(s={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(r||(r={}));const o=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const l=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},h=()=>{d=!1},u=()=>{d=!0};class v{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}var f,p,m;function g(){}function k(){k.init.call(this)}function y(e){return void 0===e._maxListeners?k.defaultMaxListeners:e._maxListeners}function C(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new g,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=y(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function T(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function b(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function w(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}g.prototype=Object.create(null),k.EventEmitter=k,k.usingDomains=!1,k.prototype.domain=void 0,k.prototype._events=void 0,k.prototype._maxListeners=void 0,k.defaultMaxListeners=10,k.init=function(){this.domain=null,k.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new g,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},k.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},k.prototype.getMaxListeners=function(){return y(this)},k.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=w(e,n),r=0;r<n;++r)s[r].call(i)}(i,l,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=w(e,s),o=0;o<s;++o)r[o].call(i,n)}(i,l,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=w(e,r),a=0;a<r;++a)o[a].call(i,n,s)}(i,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=w(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=w(e,s),o=0;o<s;++o)r[o].apply(i,n)}(i,l,this,s)}return!0},k.prototype.addListener=function(e,t){return C(this,e,t,!1)},k.prototype.on=k.prototype.addListener,k.prototype.prependListener=function(e,t){return C(this,e,t,!0)},k.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,T(this,e,t)),this},k.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,T(this,e,t)),this},k.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new g:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new g,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},k.prototype.off=function(e,t){return this.removeListener(e,t)},k.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new g,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new g:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new g,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},k.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},k.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):b.call(e,t)},k.prototype.listenerCount=b,k.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class S extends k{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{ideal:1920},height:{ideal:1080},frameRate:{ideal:20,max:30},aspectRatio:{ideal:16/9}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(e){var i;this.emit(t.localVideoChange,{from:this.videoTrack,to:e}),this.videoTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.videoTrack,e)),this.videoTrack=e}setAudioTrack(e){var i;this.emit(t.localAudioChange,{from:this.audioTrack,to:e}),this.audioTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.audioTrack,e)),this.audioTrack=e}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(t){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(e.getAudioTracks()[0]),this.setVideoTrack(e.getVideoTracks()[0]),this.renderLocalStreamToContainer(t)}))}useAudio(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:t},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:t},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(l("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(l("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class E extends S{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>l("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{l("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>l("datachannel",e))),e.addEventListener("icecandidateerror",(e=>l("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>l("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>l("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>l("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>l("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(t,i){return e(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let e=this.peerConnection.getSenders().find((e=>{var i;return(null===(i=e.track)||void 0===i?void 0:i.kind)===(null==t?void 0:t.kind)}));void 0!==e&&this.peerConnection.removeTrack(e)}void 0!==i&&(i.onended=e=>l("local track end",e),i.onmute=e=>{l("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{l("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(t),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(t.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(t.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){l("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let r=RTCRtpReceiver.getCapabilities("audio");null!==r&&this.audioCodecs.push(...r.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=v.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:t})}))}createAnswer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:t})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}!function(e){e[e.timeout=408]="timeout",e[e.reject=488]="reject",e[e.busy=486]="busy",e[e.notfound=404]="notfound",e[e.notAllowedMedia=415]="notAllowedMedia",e[e.ok=200]="ok"}(f||(f={}));class _ extends E{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);e.answer(f.reject,i,t,this.sessionId),this.destory()}acceptCall(){return e(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:n}=yield this.createAnswer();e.answer(f.ok,i,t,this.sessionId,n)}}))}pickNewConnection(){return e(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(t){var i;return e(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,t)}))}}!function(e){e.audio="audio",e.video="video",e.audioVideo="audioVideo",e.unknown="unknown"}(p||(p={}));class L extends _{constructor(){super(...arguments),this.responseCallType=p.unknown}start(){return e(this,void 0,void 0,(function*(){let[e,t]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),i=yield this.createOffer(),{status:n,sdp:s}=yield e.invite(t,this.sessionId,i.sdp);if(n===f.ok){yield this.setAnswer(s);const e=s.split("\r\n"),t=e.find((e=>e.startsWith("m=audio"))),i=e.find((e=>e.startsWith("m=video")));this.responseCallType=t&&i?p.audioVideo:t?p.audio:i?p.video:p.unknown}return n}))}addRemote(e){this.remoteNumber=e}}class I{constructor(e,t,i,n){this.req=e,this.seq=0,this.from=t,this.to=i,this.registerid=`${I.random}@${t}`,void 0!==n&&Object.assign(this,n)}}I.random=String(Date.now()),function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(m||(m={}));var R=null;try{var N="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");R=N.Worker}catch(e){}function M(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:"");return function(e){return new R(o,Object.assign({},e,{eval:!0}))}}function x(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,r=i.length;s<r;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var G="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var P,V,A,O=(P="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGYsYT17fSxuPXt0aW1lb3V0OjVlMyx0aW1lb3V0T2JqOm51bGwscmVzZXQoKXtyZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRPYmopLHRoaXN9LHNlbmRPbmxpbmUoKXsxPT09ZS5yZWFkeVN0YXRlJiZlLnNlbmQoSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbihhLHtzZXE6KythLnNlcX0pKSl9LHN0YXJ0KCl7dGhpcy50aW1lb3V0T2JqPXNldEludGVydmFsKCgoKT0+e3RoaXMuc2VuZE9ubGluZSgpfSksdGhpcy50aW1lb3V0KX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGZ1bmN0aW9uKHMpe2NvbnN0IHI9cy5kYXRhO3N3aXRjaChyLmNtZCl7Y2FzZSJjb25maWciOk9iamVjdC5hc3NpZ24oYSxyLmhlYXJ0QmVhdCksbi50aW1lb3V0PTFlMypyLmhlYXJ0VGltZXx8NWUzO2JyZWFrO2Nhc2Uic3RhcnQiOnNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5ZCv5Yqod2ViV29ya2VyIn0pLG8oci51cmwpO2JyZWFrO2Nhc2UiY2xvc2UiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KHIuZGF0YSkpfX0pLCExKTtjb25zdCBvPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe3IodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXtyKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KSxuLnJlc2V0KCkuc3RhcnQoKX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gcihzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxvKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",V=null,A=!1,G?M(P,V,A):function(e,t,i){var n;return function(s){return n=n||x(e,t,i),new Worker(n,s)}}(P,V,A));class Y extends k{constructor(e,t,i){super(),this.server=e,this.ws=new O,this.configHeartBeat(t,i)}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return l("websocket recive message ",i),void this.emit(m.message,i);case"open":return l("websocket connected ",this.server),void this.emit(m.connected)}}}configHeartBeat(e,t){l("websocket heartBeat",e),l("websocket heartTime ",t),this.ws.postMessage({cmd:"config",heartBeat:e,heartTime:t})}initWebsocket(){this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){l("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class W extends k{constructor(e,t,i,n){super(),this.activeServer="",this.server=e,this.localNumber=t,this.expireTime=i,this.heartTime=n,super.setMaxListeners(0)}testWs(t){return e(this,void 0,void 0,(function*(){return t.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return e(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new Y(this.activeServer,new I(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime}),this.heartTime);n.on(m.connected,(()=>{this.socketWorker=n,this.onConnected(),e()})),n.on(m.disconnected,(e=>{this.socketWorker=void 0,this.onDisConnected(e),i("socketWorker connecion failed")})),n.on(m.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socketWorker)throw new Error("socketWorker is closed");this.socketWorker.sendMessage(e)}destory(){void 0!==this.socketWorker&&(this.unRegister(),this.socketWorker.close(),this.socketWorker=void 0)}}class Z extends W{constructor(){super(...arguments),this.asyncProducer=new Map}sendRespondableMessage(t){return e(this,void 0,void 0,(function*(){return this.sendMessage(t),new Promise((e=>this.asyncProducer.set(t.seq,e)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(e){this.asyncProducer.clear(),this.emit(i.disconnected,e)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class U extends Z{register(){return e(this,void 0,void 0,(function*(){let e=new I(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new I(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new I(s.MESSAGE_TYPE_INVITE,this.localNumber,t,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new I(s.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendMessage(new I(s.MESSAGE_TYPE_INFO,this.localNumber,t,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function j(){}function X(){X.init.call(this)}function D(e){return void 0===e._maxListeners?X.defaultMaxListeners:e._maxListeners}function K(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new j,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=D(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function q(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function F(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function z(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}j.prototype=Object.create(null),X.EventEmitter=X,X.usingDomains=!1,X.prototype.domain=void 0,X.prototype._events=void 0,X.prototype._maxListeners=void 0,X.defaultMaxListeners=10,X.init=function(){this.domain=null,X.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new j,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},X.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},X.prototype.getMaxListeners=function(){return D(this)},X.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=z(e,n),r=0;r<n;++r)s[r].call(i)}(i,l,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=z(e,s),o=0;o<s;++o)r[o].call(i,n)}(i,l,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=z(e,r),a=0;a<r;++a)o[a].call(i,n,s)}(i,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=z(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=z(e,s),o=0;o<s;++o)r[o].apply(i,n)}(i,l,this,s)}return!0},X.prototype.addListener=function(e,t){return K(this,e,t,!1)},X.prototype.on=X.prototype.addListener,X.prototype.prependListener=function(e,t){return K(this,e,t,!0)},X.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,q(this,e,t)),this},X.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,q(this,e,t)),this},X.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new j:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new j,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},X.prototype.off=function(e,t){return this.removeListener(e,t)},X.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new j,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new j:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new j,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},X.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},X.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):F.call(e,t)},X.prototype.listenerCount=F,X.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const H="error",J="speaker",B="talking",$="activeGroup",Q="joinInfo",ee="disConnected",te={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},ie="connected",ne="disconnected",se="message",re=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},oe=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class ae extends X{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{re("websocket connected ",this.server),this.emit(ie)},this.ws.onclose=()=>{re("websocket disconnected ",this.server),this.ws=void 0,this.emit(ne)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);re("websocket recive message ",t),this.emit(se,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){re("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class ce extends X{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return oe("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new ae(this.server);i.on(ie,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(ne,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit(ee),t("socket connecion failed")})),i.on(se,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){re(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,re(`${this.speaker}正在说话`),this.emit(J,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,re(`加入组${this.activeGroup}`)):(this.activeGroup="",oe(te[n.code]),this.emit(H,te[n.code])),this.emit($,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,re(`talking:${this.talking}`),this.emit(B,this.talking)),14===t&&(this.speaker="",re(`${this.speaker}停止说话`),this.emit(J,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};re(`${e}进入组`),this.emit(Q,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit($,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,re(`talking:${this.talking}`),this.emit(B,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class de extends U{constructor(e){let t=e.expireTime||de.defaultExpireTime;super(e.server,e.localNumber,t,e.heartTime||5),this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return e(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new ce(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on($,(e=>{this.emit($,e)})),e.on(J,(e=>{this.emit(J,e)})),e.on(B,(e=>{this.emit(B,e)})),e.on(Q,(e=>{this.emit(Q,e)})),e.on(ee,(e=>{this.emit(ee,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){}onDisConnected(){super.onDisConnected()}}de.defaultExpireTime=60;class le extends _{constructor(e,t,i,n,s){super(e,t,i),this.callType=p.unknown,this.inviteSeq=s,this.inviteOffer=n;const r=n.split("\r\n"),o=r.find((e=>e.startsWith("m=audio"))),a=r.find((e=>e.startsWith("m=video")));this.callType=o&&a?p.audioVideo:o?p.audio:a?p.video:p.unknown}}class he extends de{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new L(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(e){var o;let{req:a}=e;if(a===s.MESSAGE_TYPE_INVITE){let t=new le(this,e.cid,e.from,e.sdp,e.seq);this.allSession.push(t),this.emit(i.invite,t)}else if(a===s.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((t=>t.sessionId==e.cid));void 0!==i&&(i.inviteSeq=e.seq,i.inviteOffer=e.sdp,i.acceptCall(),i.emit(t.reInvite,i))}else if(a===s.MESSAGE_TYPE_ICE)null===(o=this.allSession.find((t=>t.sessionId===e.cid)))||void 0===o||o.reciveIceRequest(e);else if(a===s.MESSAGE_TYPE_BYE){let i=this.allSession.find((t=>t.sessionId===e.cid));void 0!==i&&(i.emit(t.bye),i.destory(!1))}a==r.FPRE&&this.emit(n.FPREInfo,e),a==r.IMS&&this.emit(n.IMSInfo,e)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}const ue=t=>e(void 0,void 0,void 0,(function*(){let e=new he(t);yield e.reConnect(),yield e.initPttClient().catch((e=>{console.error(e)})),I.random=String(Date.now());let i=yield e.register();return i.status===f.ok?e:(e.destory(),Promise.reject(i))})),ve=()=>e(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})}));export{n as PTTEvent,p as RtcCalledType,he as RtcClient,i as RtcClientEvent,f as RtcInviteStatus,t as RtcSessionEvent,ve as authDevice,ue as createRtcClient,h as disableLog,u as enableLog,o as releaseStreamFromContainer,a as renderStreamToContainer};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UscRtc={})}(this,(function(e){"use strict";function t(e,t,i,n){return new(i||(i=Promise))((function(s,o){function r(e){try{c(n.next(e))}catch(e){o(e)}}function a(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}c((n=n.apply(e,t||[])).next())}))}var i,n,s,o,r;e.RtcSessionEvent=void 0,(i=e.RtcSessionEvent||(e.RtcSessionEvent={})).bye="bye",i.stream="stream",i.reInvite="reInvite",i.localAudioChange="localAudioChange",i.localVideoChange="localVideoChange",i.localStreamChange="localStreamChange",e.RtcClientEvent=void 0,(n=e.RtcClientEvent||(e.RtcClientEvent={})).connected="connected",n.disconnected="disconnected",n.invite="invite",e.PTTEvent=void 0,(s=e.PTTEvent||(e.PTTEvent={})).PTTInfo="PTTInfo",s.FPREInfo="FPREInfo",s.IMSInfo="IMSInfo",s.ERROR="error",s.SPEAKER="speaker",s.TALKING="talking",s.ACTIVE_GROUP="activeGroup",s.JOIN_INFO="joinInfo",function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(o||(o={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(r||(r={}));const a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const l=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};var h,u,v;function p(){}function f(){f.init.call(this)}function m(e){return void 0===e._maxListeners?f.defaultMaxListeners:e._maxListeners}function g(e,t,i){if(t)e.call(i);else for(var n=e.length,s=E(e,n),o=0;o<n;++o)s[o].call(i)}function k(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=E(e,s),r=0;r<s;++r)o[r].call(i,n)}function y(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=E(e,o),a=0;a<o;++a)r[a].call(i,n,s)}function T(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=E(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}function C(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=E(e,s),r=0;r<s;++r)o[r].apply(i,n)}function b(e,t,i,n){var s,o,r,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((o=e._events)?(o.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),o=e._events),r=o[t]):(o=e._events=new p,e._eventsCount=0),r){if("function"==typeof r?r=o[t]=n?[i,r]:[r,i]:n?r.unshift(i):r.push(i),!r.warned&&(s=m(e))&&s>0&&r.length>s){r.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+r.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=r.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else r=o[t]=i,++e._eventsCount;return e}function w(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function S(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function E(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}p.prototype=Object.create(null),f.EventEmitter=f,f.usingDomains=!1,f.prototype.domain=void 0,f.prototype._events=void 0,f.prototype._maxListeners=void 0,f.defaultMaxListeners=10,f.init=function(){this.domain=null,f.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new p,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},f.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},f.prototype.getMaxListeners=function(){return m(this)},f.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:g(i,l,this);break;case 2:k(i,l,this,arguments[1]);break;case 3:y(i,l,this,arguments[1],arguments[2]);break;case 4:T(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];C(i,l,this,s)}return!0},f.prototype.addListener=function(e,t){return b(this,e,t,!1)},f.prototype.on=f.prototype.addListener,f.prototype.prependListener=function(e,t){return b(this,e,t,!0)},f.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,w(this,e,t)),this},f.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,w(this,e,t)),this},f.prototype.removeListener=function(e,t){var i,n,s,o,r;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new p:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,o=i.length;o-- >0;)if(i[o]===t||i[o].listener&&i[o].listener===t){r=i[o].listener,s=o;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new p,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,r||t)}return this},f.prototype.off=function(e,t){return this.removeListener(e,t)},f.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new p,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new p:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),o=0;o<s.length;++o)"removeListener"!==(n=s[o])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new p,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},f.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},f.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):S.call(e,t)},f.prototype.listenerCount=S,f.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class R extends f{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{ideal:1920},height:{ideal:1080},frameRate:{ideal:20,max:30},aspectRatio:{ideal:16/9}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(t){var i;this.emit(e.RtcSessionEvent.localVideoChange,{from:this.videoTrack,to:t}),this.videoTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.videoTrack,t)),this.videoTrack=t}setAudioTrack(t){var i;this.emit(e.RtcSessionEvent.localAudioChange,{from:this.audioTrack,to:t}),this.audioTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.audioTrack,t)),this.audioTrack=t}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(e){return t(this,void 0,void 0,(function*(){let t=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(t.getAudioTracks()[0]),this.setVideoTrack(t.getVideoTracks()[0]),this.renderLocalStreamToContainer(e)}))}useAudio(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:e},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:e},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(l("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(l("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class _ extends R{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>l("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{l("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>l("datachannel",e))),e.addEventListener("icecandidateerror",(e=>l("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>l("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>l("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>l("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>l("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(e,i){return t(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let t=this.peerConnection.getSenders().find((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.kind)===(null==e?void 0:e.kind)}));void 0!==t&&this.peerConnection.removeTrack(t)}void 0!==i&&(i.onended=e=>l("local track end",e),i.onmute=e=>{l("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{l("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(e),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(e.RtcSessionEvent.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(e.RtcSessionEvent.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){l("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let o=RTCRtpReceiver.getCapabilities("audio");null!==o&&this.audioCodecs.push(...o.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=class{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:e})}))}createAnswer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:e})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}e.RtcInviteStatus=void 0,(h=e.RtcInviteStatus||(e.RtcInviteStatus={}))[h.timeout=408]="timeout",h[h.reject=488]="reject",h[h.busy=486]="busy",h[h.notfound=404]="notfound",h[h.notAllowedMedia=415]="notAllowedMedia",h[h.ok=200]="ok";class L extends _{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);t.answer(e.RtcInviteStatus.reject,n,i,this.sessionId),this.destory()}acceptCall(){return t(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:s}=yield this.createAnswer();t.answer(e.RtcInviteStatus.ok,n,i,this.sessionId,s)}}))}pickNewConnection(){return t(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(e){var i;return t(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,e)}))}}e.RtcCalledType=void 0,(u=e.RtcCalledType||(e.RtcCalledType={})).audio="audio",u.video="video",u.audioVideo="audioVideo",u.unknown="unknown";class I extends L{constructor(){super(...arguments),this.responseCallType=e.RtcCalledType.unknown}start(){return t(this,void 0,void 0,(function*(){let[t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),n=yield this.createOffer(),{status:s,sdp:o}=yield t.invite(i,this.sessionId,n.sdp);s===e.RtcInviteStatus.ok&&(yield this.setAnswer(o));const r=o.split("\r\n"),a=r.find((e=>e.startsWith("m=audio"))),c=r.find((e=>e.startsWith("m=video")));return this.responseCallType=a&&c?e.RtcCalledType.audioVideo:a?e.RtcCalledType.audio:c?e.RtcCalledType.video:e.RtcCalledType.unknown,s}))}addRemote(e){this.remoteNumber=e}}class x{constructor(e,t,i,n){this.req=e,this.seq=x.seqNum++,this.from=t,this.to=i,this.registerid=`${x.random}@${t}`,void 0!==n&&Object.assign(this,n)}}x.random=String(Date.now()),x.seqNum=0,function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(v||(v={}));var M=null;try{var N="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");M=N.Worker}catch(e){}function G(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),o=s.indexOf("\n",10)+1,r=s.substring(o)+(n?"//# sourceMappingURL="+n:"");return function(e){return new M(r,Object.assign({},e,{eval:!0}))}}function P(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,o=i.length;s<o;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),o=s.indexOf("\n",10)+1,r=s.substring(o)+(n?"//# sourceMappingURL="+n:""),a=new Blob([r],{type:"application/javascript"});return URL.createObjectURL(a)}var V="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var W,Z,A,O=(W="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGYsYT17fSxuPXt0aW1lb3V0OjVlMyx0aW1lb3V0T2JqOm51bGwscmVzZXQoKXtyZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRPYmopLHRoaXN9LHJlZ2lzdGVyKCl7MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KFJlZ2lzdGVyKSl9LHNlbmRPbmxpbmUoKXsxPT09ZS5yZWFkeVN0YXRlJiZlLnNlbmQoSlNPTi5zdHJpbmdpZnkoYSkpfSxzdGFydCgpe3RoaXMudGltZW91dE9iaj1zZXRJbnRlcnZhbCgoKCk9Pnt0aGlzLnNlbmRPbmxpbmUoKX0pLHRoaXMudGltZW91dCl9fTtsZXQgbz0yO3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGZ1bmN0aW9uKHMpe2NvbnN0IGk9cy5kYXRhO3N3aXRjaChpLmNtZCl7Y2FzZSJjb25maWciOk9iamVjdC5hc3NpZ24oYSxpLmhlYXJ0QmVhdCx7c2VxOm8rK30pLG4udGltZW91dD0xZTMqaS5oZWFydFRpbWV8fDVlMzticmVhaztjYXNlInN0YXJ0IjpzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJ3ZWJXb3JrZXIiLGRhdGE6IuWQr+WKqHdlYldvcmtlciJ9KSxyKGkudXJsKTticmVhaztjYXNlInN0b3AiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KGkuZGF0YSkpfX0pLCExKTtjb25zdCByPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe2kodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXtpKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KSxuLnJlc2V0KCkuc3RhcnQoKX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gaShzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxyKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",Z=null,A=!1,V?G(W,Z,A):function(e,t,i){var n;return function(s){return n=n||P(e,t,i),new Worker(n,s)}}(W,Z,A));class Y extends f{constructor(e,t,i){super(),this.server=e,this.ws=new O,this.configHeartBeat(t,i)}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return l("websocket recive message ",i),void this.emit(v.message,i);case"open":return l("websocket connected ",this.server),void this.emit(v.connected)}}}configHeartBeat(e,t){l("websocket heartBeat",e),l("websocket heartTime ",t),this.ws.postMessage({cmd:"config",heartBeat:e,heartTime:t})}initWebsocket(){this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){l("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class j extends f{constructor(e,t,i,n){super(),this.activeServer="",this.server=e,this.localNumber=t,this.expireTime=i,this.heartTime=n,super.setMaxListeners(0)}testWs(e){return t(this,void 0,void 0,(function*(){return e.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return t(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new Y(this.activeServer,new x(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime}),this.heartTime);n.on(v.connected,(()=>{this.socketWorker=n,this.onConnected(),e()})),n.on(v.disconnected,(e=>{this.socketWorker=void 0,this.onDisConnected(e),i("socketWorker connecion failed")})),n.on(v.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socketWorker)throw new Error("socketWorker is closed");this.socketWorker.sendMessage(e)}destory(){void 0!==this.socketWorker&&(this.unRegister(),this.socketWorker.close(),this.socketWorker=void 0)}}class U extends j{constructor(){super(...arguments),this.asyncProducer=new Map}sendRespondableMessage(e){return t(this,void 0,void 0,(function*(){return this.sendMessage(e),new Promise((t=>this.asyncProducer.set(e.seq,t)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(t){this.asyncProducer.clear(),this.emit(e.RtcClientEvent.disconnected,t)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class X extends U{register(){return t(this,void 0,void 0,(function*(){let e=new x(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new x(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new x(o.MESSAGE_TYPE_INVITE,this.localNumber,e,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new x(o.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendMessage(new x(o.MESSAGE_TYPE_INFO,this.localNumber,e,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function K(){}function D(){D.init.call(this)}function q(e){return void 0===e._maxListeners?D.defaultMaxListeners:e._maxListeners}function z(e,t,i){if(t)e.call(i);else for(var n=e.length,s=te(e,n),o=0;o<n;++o)s[o].call(i)}function F(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=te(e,s),r=0;r<s;++r)o[r].call(i,n)}function H(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=te(e,o),a=0;a<o;++a)r[a].call(i,n,s)}function J(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=te(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}function B(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=te(e,s),r=0;r<s;++r)o[r].apply(i,n)}function $(e,t,i,n){var s,o,r,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((o=e._events)?(o.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),o=e._events),r=o[t]):(o=e._events=new K,e._eventsCount=0),r){if("function"==typeof r?r=o[t]=n?[i,r]:[r,i]:n?r.unshift(i):r.push(i),!r.warned&&(s=q(e))&&s>0&&r.length>s){r.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+r.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=r.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else r=o[t]=i,++e._eventsCount;return e}function Q(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function ee(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function te(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}K.prototype=Object.create(null),D.EventEmitter=D,D.usingDomains=!1,D.prototype.domain=void 0,D.prototype._events=void 0,D.prototype._maxListeners=void 0,D.defaultMaxListeners=10,D.init=function(){this.domain=null,D.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new K,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},D.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},D.prototype.getMaxListeners=function(){return q(this)},D.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:z(i,l,this);break;case 2:F(i,l,this,arguments[1]);break;case 3:H(i,l,this,arguments[1],arguments[2]);break;case 4:J(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];B(i,l,this,s)}return!0},D.prototype.addListener=function(e,t){return $(this,e,t,!1)},D.prototype.on=D.prototype.addListener,D.prototype.prependListener=function(e,t){return $(this,e,t,!0)},D.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,Q(this,e,t)),this},D.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,Q(this,e,t)),this},D.prototype.removeListener=function(e,t){var i,n,s,o,r;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new K:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,o=i.length;o-- >0;)if(i[o]===t||i[o].listener&&i[o].listener===t){r=i[o].listener,s=o;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new K,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,r||t)}return this},D.prototype.off=function(e,t){return this.removeListener(e,t)},D.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new K,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new K:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),o=0;o<s.length;++o)"removeListener"!==(n=s[o])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new K,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},D.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},D.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):ee.call(e,t)},D.prototype.listenerCount=ee,D.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const ie="error",ne="speaker",se="talking",oe="activeGroup",re="joinInfo",ae="disConnected",ce={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},de="connected",le="disconnected",he="message",ue=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},ve=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class pe extends D{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{ue("websocket connected ",this.server),this.emit(de)},this.ws.onclose=()=>{ue("websocket disconnected ",this.server),this.ws=void 0,this.emit(le)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);ue("websocket recive message ",t),this.emit(he,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){ue("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class fe extends D{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return ve("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new pe(this.server);i.on(de,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(le,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit(ae),t("socket connecion failed")})),i.on(he,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){ue(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,ue(`${this.speaker}正在说话`),this.emit(ne,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,ue(`加入组${this.activeGroup}`)):(this.activeGroup="",ve(ce[n.code]),this.emit(ie,ce[n.code])),this.emit(oe,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,ue(`talking:${this.talking}`),this.emit(se,this.talking)),14===t&&(this.speaker="",ue(`${this.speaker}停止说话`),this.emit(ne,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};ue(`${e}进入组`),this.emit(re,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit(oe,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,ue(`talking:${this.talking}`),this.emit(se,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class me extends X{constructor(e){let t=e.expireTime||me.defaultExpireTime;super(e.server,e.localNumber,t,e.heartTime||5),this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return t(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new fe(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on(oe,(e=>{this.emit(oe,e)})),e.on(ne,(e=>{this.emit(ne,e)})),e.on(se,(e=>{this.emit(se,e)})),e.on(re,(e=>{this.emit(re,e)})),e.on(ae,(e=>{this.emit(ae,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){}onDisConnected(){super.onDisConnected()}}me.defaultExpireTime=60;class ge extends L{constructor(t,i,n,s,o){super(t,i,n),this.callType=e.RtcCalledType.unknown,this.inviteSeq=o,this.inviteOffer=s;const r=s.split("\r\n"),a=r.find((e=>e.startsWith("m=audio"))),c=r.find((e=>e.startsWith("m=video")));this.callType=a&&c?e.RtcCalledType.audioVideo:a?e.RtcCalledType.audio:c?e.RtcCalledType.video:e.RtcCalledType.unknown}}class ke extends me{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new I(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(t){var i;let{req:n}=t;if(n===o.MESSAGE_TYPE_INVITE){let i=new ge(this,t.cid,t.from,t.sdp,t.seq);this.allSession.push(i),this.emit(e.RtcClientEvent.invite,i)}else if(n===o.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((e=>e.sessionId==t.cid));void 0!==i&&(i.inviteSeq=t.seq,i.inviteOffer=t.sdp,i.acceptCall(),i.emit(e.RtcSessionEvent.reInvite,i))}else if(n===o.MESSAGE_TYPE_ICE)null===(i=this.allSession.find((e=>e.sessionId===t.cid)))||void 0===i||i.reciveIceRequest(t);else if(n===o.MESSAGE_TYPE_BYE){let i=this.allSession.find((e=>e.sessionId===t.cid));void 0!==i&&(i.emit(e.RtcSessionEvent.bye),i.destory(!1))}n==r.FPRE&&this.emit(e.PTTEvent.FPREInfo,t),n==r.IMS&&this.emit(e.PTTEvent.IMSInfo,t)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}e.RtcClient=ke,e.authDevice=()=>t(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})})),e.createRtcClient=i=>t(void 0,void 0,void 0,(function*(){let t=new ke(i);yield t.reConnect(),yield t.initPttClient().catch((e=>{console.error(e)})),x.random=String(Date.now());let n=yield t.register();return n.status===e.RtcInviteStatus.ok?t:(t.destory(),Promise.reject(n))})),e.disableLog=()=>{d=!1},e.enableLog=()=>{d=!0},e.releaseStreamFromContainer=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},e.renderStreamToContainer=a,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UscRtc={})}(this,(function(e){"use strict";function t(e,t,i,n){return new(i||(i=Promise))((function(s,o){function r(e){try{c(n.next(e))}catch(e){o(e)}}function a(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}c((n=n.apply(e,t||[])).next())}))}var i,n,s,o,r;"function"==typeof SuppressedError&&SuppressedError,e.RtcSessionEvent=void 0,(i=e.RtcSessionEvent||(e.RtcSessionEvent={})).bye="bye",i.stream="stream",i.reInvite="reInvite",i.localAudioChange="localAudioChange",i.localVideoChange="localVideoChange",i.localStreamChange="localStreamChange",e.RtcClientEvent=void 0,(n=e.RtcClientEvent||(e.RtcClientEvent={})).connected="connected",n.disconnected="disconnected",n.invite="invite",e.PTTEvent=void 0,(s=e.PTTEvent||(e.PTTEvent={})).PTTInfo="PTTInfo",s.FPREInfo="FPREInfo",s.IMSInfo="IMSInfo",s.ERROR="error",s.SPEAKER="speaker",s.TALKING="talking",s.ACTIVE_GROUP="activeGroup",s.JOIN_INFO="joinInfo",function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(o||(o={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(r||(r={}));const a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const l=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class h{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}var u,v,p;function f(){}function m(){m.init.call(this)}function g(e){return void 0===e._maxListeners?m.defaultMaxListeners:e._maxListeners}function k(e,t,i,n){var s,o,r,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((o=e._events)?(o.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),o=e._events),r=o[t]):(o=e._events=new f,e._eventsCount=0),r){if("function"==typeof r?r=o[t]=n?[i,r]:[r,i]:n?r.unshift(i):r.push(i),!r.warned&&(s=g(e))&&s>0&&r.length>s){r.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+r.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=r.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else r=o[t]=i,++e._eventsCount;return e}function y(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function T(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function C(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}f.prototype=Object.create(null),m.EventEmitter=m,m.usingDomains=!1,m.prototype.domain=void 0,m.prototype._events=void 0,m.prototype._maxListeners=void 0,m.defaultMaxListeners=10,m.init=function(){this.domain=null,m.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new f,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},m.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},m.prototype.getMaxListeners=function(){return g(this)},m.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=C(e,n),o=0;o<n;++o)s[o].call(i)}(i,l,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=C(e,s),r=0;r<s;++r)o[r].call(i,n)}(i,l,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=C(e,o),a=0;a<o;++a)r[a].call(i,n,s)}(i,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=C(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=C(e,s),r=0;r<s;++r)o[r].apply(i,n)}(i,l,this,s)}return!0},m.prototype.addListener=function(e,t){return k(this,e,t,!1)},m.prototype.on=m.prototype.addListener,m.prototype.prependListener=function(e,t){return k(this,e,t,!0)},m.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,y(this,e,t)),this},m.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,y(this,e,t)),this},m.prototype.removeListener=function(e,t){var i,n,s,o,r;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new f:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,o=i.length;o-- >0;)if(i[o]===t||i[o].listener&&i[o].listener===t){r=i[o].listener,s=o;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new f,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,r||t)}return this},m.prototype.off=function(e,t){return this.removeListener(e,t)},m.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new f,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new f:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),o=0;o<s.length;++o)"removeListener"!==(n=s[o])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new f,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},m.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},m.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):T.call(e,t)},m.prototype.listenerCount=T,m.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class b extends m{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{ideal:1920},height:{ideal:1080},frameRate:{ideal:20,max:30},aspectRatio:{ideal:16/9}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(t){var i;this.emit(e.RtcSessionEvent.localVideoChange,{from:this.videoTrack,to:t}),this.videoTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.videoTrack,t)),this.videoTrack=t}setAudioTrack(t){var i;this.emit(e.RtcSessionEvent.localAudioChange,{from:this.audioTrack,to:t}),this.audioTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.audioTrack,t)),this.audioTrack=t}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(e){return t(this,void 0,void 0,(function*(){let t=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(t.getAudioTracks()[0]),this.setVideoTrack(t.getVideoTracks()[0]),this.renderLocalStreamToContainer(e)}))}useAudio(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:e},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:e},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(l("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(l("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class w extends b{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>l("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{l("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>l("datachannel",e))),e.addEventListener("icecandidateerror",(e=>l("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>l("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>l("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>l("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>l("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(e,i){return t(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let t=this.peerConnection.getSenders().find((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.kind)===(null==e?void 0:e.kind)}));void 0!==t&&this.peerConnection.removeTrack(t)}void 0!==i&&(i.onended=e=>l("local track end",e),i.onmute=e=>{l("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{l("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(e),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(e.RtcSessionEvent.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(e.RtcSessionEvent.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){l("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let o=RTCRtpReceiver.getCapabilities("audio");null!==o&&this.audioCodecs.push(...o.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=h.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:e})}))}createAnswer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:e})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}e.RtcInviteStatus=void 0,(u=e.RtcInviteStatus||(e.RtcInviteStatus={}))[u.timeout=408]="timeout",u[u.reject=488]="reject",u[u.busy=486]="busy",u[u.notfound=404]="notfound",u[u.notAllowedMedia=415]="notAllowedMedia",u[u.ok=200]="ok";class S extends w{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);t.answer(e.RtcInviteStatus.reject,n,i,this.sessionId),this.destory()}acceptCall(){return t(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:s}=yield this.createAnswer();t.answer(e.RtcInviteStatus.ok,n,i,this.sessionId,s)}}))}pickNewConnection(){return t(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(e){var i;return t(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,e)}))}}e.RtcCalledType=void 0,(v=e.RtcCalledType||(e.RtcCalledType={})).audio="audio",v.video="video",v.audioVideo="audioVideo",v.unknown="unknown";class E extends S{constructor(){super(...arguments),this.responseCallType=e.RtcCalledType.unknown}start(){return t(this,void 0,void 0,(function*(){let[t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),n=yield this.createOffer(),{status:s,sdp:o}=yield t.invite(i,this.sessionId,n.sdp);if(s===e.RtcInviteStatus.ok){yield this.setAnswer(o);const t=o.split("\r\n"),i=t.find((e=>e.startsWith("m=audio"))),n=t.find((e=>e.startsWith("m=video")));this.responseCallType=i&&n?e.RtcCalledType.audioVideo:i?e.RtcCalledType.audio:n?e.RtcCalledType.video:e.RtcCalledType.unknown}return s}))}addRemote(e){this.remoteNumber=e}}class R{constructor(e,t,i,n){this.req=e,this.seq=0,this.from=t,this.to=i,this.registerid=`${R.random}@${t}`,void 0!==n&&Object.assign(this,n)}}R.random=String(Date.now()),function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(p||(p={}));var _=null;try{var L="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");_=L.Worker}catch(e){}function I(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),o=s.indexOf("\n",10)+1,r=s.substring(o)+(n?"//# sourceMappingURL="+n:"");return function(e){return new _(r,Object.assign({},e,{eval:!0}))}}function M(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,o=i.length;s<o;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),o=s.indexOf("\n",10)+1,r=s.substring(o)+(n?"//# sourceMappingURL="+n:""),a=new Blob([r],{type:"application/javascript"});return URL.createObjectURL(a)}var N="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var x,P,G,V=(x="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGYsYT17fSxuPXt0aW1lb3V0OjVlMyx0aW1lb3V0T2JqOm51bGwscmVzZXQoKXtyZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRPYmopLHRoaXN9LHNlbmRPbmxpbmUoKXsxPT09ZS5yZWFkeVN0YXRlJiZlLnNlbmQoSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbihhLHtzZXE6KythLnNlcX0pKSl9LHN0YXJ0KCl7dGhpcy50aW1lb3V0T2JqPXNldEludGVydmFsKCgoKT0+e3RoaXMuc2VuZE9ubGluZSgpfSksdGhpcy50aW1lb3V0KX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGZ1bmN0aW9uKHMpe2NvbnN0IHI9cy5kYXRhO3N3aXRjaChyLmNtZCl7Y2FzZSJjb25maWciOk9iamVjdC5hc3NpZ24oYSxyLmhlYXJ0QmVhdCksbi50aW1lb3V0PTFlMypyLmhlYXJ0VGltZXx8NWUzO2JyZWFrO2Nhc2Uic3RhcnQiOnNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5ZCv5Yqod2ViV29ya2VyIn0pLG8oci51cmwpO2JyZWFrO2Nhc2UiY2xvc2UiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KHIuZGF0YSkpfX0pLCExKTtjb25zdCBvPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe3IodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXtyKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KSxuLnJlc2V0KCkuc3RhcnQoKX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gcihzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxvKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",P=null,G=!1,N?I(x,P,G):function(e,t,i){var n;return function(s){return n=n||M(e,t,i),new Worker(n,s)}}(x,P,G));class A extends m{constructor(e,t,i){super(),this.server=e,this.ws=new V,this.configHeartBeat(t,i)}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return l("websocket recive message ",i),void this.emit(p.message,i);case"open":return l("websocket connected ",this.server),void this.emit(p.connected)}}}configHeartBeat(e,t){l("websocket heartBeat",e),l("websocket heartTime ",t),this.ws.postMessage({cmd:"config",heartBeat:e,heartTime:t})}initWebsocket(){this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){l("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class O extends m{constructor(e,t,i,n){super(),this.activeServer="",this.server=e,this.localNumber=t,this.expireTime=i,this.heartTime=n,super.setMaxListeners(0)}testWs(e){return t(this,void 0,void 0,(function*(){return e.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return t(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new A(this.activeServer,new R(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime}),this.heartTime);n.on(p.connected,(()=>{this.socketWorker=n,this.onConnected(),e()})),n.on(p.disconnected,(e=>{this.socketWorker=void 0,this.onDisConnected(e),i("socketWorker connecion failed")})),n.on(p.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socketWorker)throw new Error("socketWorker is closed");this.socketWorker.sendMessage(e)}destory(){void 0!==this.socketWorker&&(this.unRegister(),this.socketWorker.close(),this.socketWorker=void 0)}}class Y extends O{constructor(){super(...arguments),this.asyncProducer=new Map}sendRespondableMessage(e){return t(this,void 0,void 0,(function*(){return this.sendMessage(e),new Promise((t=>this.asyncProducer.set(e.seq,t)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(t){this.asyncProducer.clear(),this.emit(e.RtcClientEvent.disconnected,t)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class W extends Y{register(){return t(this,void 0,void 0,(function*(){let e=new R(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new R(o.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new R(o.MESSAGE_TYPE_INVITE,this.localNumber,e,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new R(o.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendMessage(new R(o.MESSAGE_TYPE_INFO,this.localNumber,e,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function Z(){}function U(){U.init.call(this)}function j(e){return void 0===e._maxListeners?U.defaultMaxListeners:e._maxListeners}function X(e,t,i,n){var s,o,r,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((o=e._events)?(o.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),o=e._events),r=o[t]):(o=e._events=new Z,e._eventsCount=0),r){if("function"==typeof r?r=o[t]=n?[i,r]:[r,i]:n?r.unshift(i):r.push(i),!r.warned&&(s=j(e))&&s>0&&r.length>s){r.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+r.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=r.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else r=o[t]=i,++e._eventsCount;return e}function D(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function K(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function q(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}Z.prototype=Object.create(null),U.EventEmitter=U,U.usingDomains=!1,U.prototype.domain=void 0,U.prototype._events=void 0,U.prototype._maxListeners=void 0,U.defaultMaxListeners=10,U.init=function(){this.domain=null,U.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new Z,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},U.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},U.prototype.getMaxListeners=function(){return j(this)},U.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=q(e,n),o=0;o<n;++o)s[o].call(i)}(i,l,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=q(e,s),r=0;r<s;++r)o[r].call(i,n)}(i,l,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=q(e,o),a=0;a<o;++a)r[a].call(i,n,s)}(i,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=q(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=q(e,s),r=0;r<s;++r)o[r].apply(i,n)}(i,l,this,s)}return!0},U.prototype.addListener=function(e,t){return X(this,e,t,!1)},U.prototype.on=U.prototype.addListener,U.prototype.prependListener=function(e,t){return X(this,e,t,!0)},U.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,D(this,e,t)),this},U.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,D(this,e,t)),this},U.prototype.removeListener=function(e,t){var i,n,s,o,r;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new Z:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,o=i.length;o-- >0;)if(i[o]===t||i[o].listener&&i[o].listener===t){r=i[o].listener,s=o;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new Z,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,r||t)}return this},U.prototype.off=function(e,t){return this.removeListener(e,t)},U.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new Z,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new Z:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),o=0;o<s.length;++o)"removeListener"!==(n=s[o])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new Z,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},U.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},U.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):K.call(e,t)},U.prototype.listenerCount=K,U.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const F="error",z="speaker",H="talking",J="activeGroup",B="joinInfo",$="disConnected",Q={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},ee="connected",te="disconnected",ie="message",ne=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},se=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class oe extends U{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{ne("websocket connected ",this.server),this.emit(ee)},this.ws.onclose=()=>{ne("websocket disconnected ",this.server),this.ws=void 0,this.emit(te)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);ne("websocket recive message ",t),this.emit(ie,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){ne("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class re extends U{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return se("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new oe(this.server);i.on(ee,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(te,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit($),t("socket connecion failed")})),i.on(ie,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){ne(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,ne(`${this.speaker}正在说话`),this.emit(z,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,ne(`加入组${this.activeGroup}`)):(this.activeGroup="",se(Q[n.code]),this.emit(F,Q[n.code])),this.emit(J,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,ne(`talking:${this.talking}`),this.emit(H,this.talking)),14===t&&(this.speaker="",ne(`${this.speaker}停止说话`),this.emit(z,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};ne(`${e}进入组`),this.emit(B,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit(J,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,ne(`talking:${this.talking}`),this.emit(H,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class ae extends W{constructor(e){let t=e.expireTime||ae.defaultExpireTime;super(e.server,e.localNumber,t,e.heartTime||5),this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return t(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new re(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on(J,(e=>{this.emit(J,e)})),e.on(z,(e=>{this.emit(z,e)})),e.on(H,(e=>{this.emit(H,e)})),e.on(B,(e=>{this.emit(B,e)})),e.on($,(e=>{this.emit($,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){}onDisConnected(){super.onDisConnected()}}ae.defaultExpireTime=60;class ce extends S{constructor(t,i,n,s,o){super(t,i,n),this.callType=e.RtcCalledType.unknown,this.inviteSeq=o,this.inviteOffer=s;const r=s.split("\r\n"),a=r.find((e=>e.startsWith("m=audio"))),c=r.find((e=>e.startsWith("m=video")));this.callType=a&&c?e.RtcCalledType.audioVideo:a?e.RtcCalledType.audio:c?e.RtcCalledType.video:e.RtcCalledType.unknown}}class de extends ae{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new E(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(t){var i;let{req:n}=t;if(n===o.MESSAGE_TYPE_INVITE){let i=new ce(this,t.cid,t.from,t.sdp,t.seq);this.allSession.push(i),this.emit(e.RtcClientEvent.invite,i)}else if(n===o.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((e=>e.sessionId==t.cid));void 0!==i&&(i.inviteSeq=t.seq,i.inviteOffer=t.sdp,i.acceptCall(),i.emit(e.RtcSessionEvent.reInvite,i))}else if(n===o.MESSAGE_TYPE_ICE)null===(i=this.allSession.find((e=>e.sessionId===t.cid)))||void 0===i||i.reciveIceRequest(t);else if(n===o.MESSAGE_TYPE_BYE){let i=this.allSession.find((e=>e.sessionId===t.cid));void 0!==i&&(i.emit(e.RtcSessionEvent.bye),i.destory(!1))}n==r.FPRE&&this.emit(e.PTTEvent.FPREInfo,t),n==r.IMS&&this.emit(e.PTTEvent.IMSInfo,t)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}e.RtcClient=de,e.authDevice=()=>t(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})})),e.createRtcClient=i=>t(void 0,void 0,void 0,(function*(){let t=new de(i);yield t.reConnect(),yield t.initPttClient().catch((e=>{console.error(e)})),R.random=String(Date.now());let n=yield t.register();return n.status===e.RtcInviteStatus.ok?t:(t.destory(),Promise.reject(n))})),e.disableLog=()=>{d=!1},e.enableLog=()=>{d=!0},e.releaseStreamFromContainer=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},e.renderStreamToContainer=a,Object.defineProperty(e,"__esModule",{value:!0})}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "usc-rtc-client",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"description": "usc rtc client",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,21 +18,22 @@
|
|
|
18
18
|
"author": "",
|
|
19
19
|
"license": "ISC",
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@rollup/plugin-commonjs": "^22.0.
|
|
21
|
+
"@rollup/plugin-commonjs": "^22.0.2",
|
|
22
22
|
"@rollup/plugin-node-resolve": "^13.3.0",
|
|
23
|
-
"@types/events": "^3.0.
|
|
24
|
-
"@types/pako": "^1.0.
|
|
23
|
+
"@types/events": "^3.0.3",
|
|
24
|
+
"@types/pako": "^1.0.7",
|
|
25
25
|
"nodejs-websocket": "^1.7.2",
|
|
26
|
-
"rollup": "^2.
|
|
26
|
+
"rollup": "^2.79.1",
|
|
27
27
|
"rollup-plugin-polyfill-node": "^0.9.0",
|
|
28
28
|
"rollup-plugin-terser": "^7.0.2",
|
|
29
29
|
"rollup-plugin-ts": "^2.0.7",
|
|
30
30
|
"rollup-plugin-web-worker-loader": "^1.6.1",
|
|
31
|
-
"
|
|
31
|
+
"tslib": "^2.6.3",
|
|
32
|
+
"typescript": "^4.9.5"
|
|
32
33
|
},
|
|
33
34
|
"dependencies": {
|
|
34
|
-
"nanoid": "^3.3.
|
|
35
|
-
"pako": "^2.0
|
|
35
|
+
"nanoid": "^3.3.7",
|
|
36
|
+
"pako": "^2.1.0",
|
|
36
37
|
"usc-ptt-sdk": "^1.0.5"
|
|
37
38
|
}
|
|
38
39
|
}
|
package/dist/index.d.ts
DELETED
|
File without changes
|
package/dist/index.esm.d.ts
DELETED
|
File without changes
|
package/dist/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/session/RtcSessionEvent.ts","../src/client/RtcClientEvent.ts","../src/message/SingalMessageType.ts","../src/peer/StreamUtil.ts","../src/log/Logger.ts","../src/session/RtcInviteStatus.ts","../src/session/RtcCalledTyped.ts","../src/websocket/RtcWebSocketEvent.ts","../src/peer/LocalStreamHandler.ts","../src/peer/RTCPeerConnectionHandler.ts","../src/session/UscRtcProtocol.ts","../src/session/RtcAbstractSession.ts","../src/session/RtcSession.ts","../src/message/SignalMessage.ts","../src/websocket/RtcWebSocket.ts","../src/websocket/RtcSocketServerHandler.ts","../src/client/RtcSignalServer.ts","../src/client/RtcSignalApi.ts","../node_modules/usc-ptt-sdk/dist/index.js","../src/client/RtcClientBase.ts","../src/session/RtcCalledSession.ts","../src/client/RtcClient.ts","../node_modules/nanoid/index.browser.js","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcSessionEvent {\n //接收到bye请求\n bye = \"bye\",\n //接收到远程的流信息\n stream = \"stream\",\n //会话过程中修改视频流会触发重建invite\n reInvite = \"reInvite\",\n //本地音频流发生变化,流的变化以及是否启用的变化都会触发\n localAudioChange = \"localAudioChange\",\n //本地视频流发生变化,流的变化以及是否启用的变化都会触发\n localVideoChange = \"localVideoChange\",\n //本地流发生变化\n localStreamChange = \"localStreamChange\"\n}","export enum RtcClientEvent {\n connected = \"connected\", //the socket is connected to the server\n\n disconnected = \"disconnected\", //the socket is dis connected to the server\n\n invite = \"invite\",//somebody call you\n}\nexport enum PTTEvent {\n PTTInfo = \"PTTInfo\",\n FPREInfo = 'FPREInfo',\n IMSInfo = \"IMSInfo\",\n ERROR = 'error',\n SPEAKER = 'speaker',\n TALKING = 'talking',\n ACTIVE_GROUP = 'activeGroup',\n JOIN_INFO = 'joinInfo',\n // SERVER_CLOSE = 'serverClose',\n // SERVER_ERROR = 'serverError',\n // DISCONNECTED = 'disConnected'\n\n}","/**\n * 信令服务器的消息头\n * @author xiechanglei\n */\nexport enum SignalMessageType {\n MESSAGE_TYPE_REGISTER = \"REGISTER\",//注册\n MESSAGE_TYPE_INVITE = \"INVITE\",//邀请会话\n MESSAGE_TYPE_REINVITE = \"reINVITE\",//邀请会话\n MESSAGE_TYPE_ICE = \"ICE\",//ice探测消息发送\n MESSAGE_TYPE_INFO = \"INFO\",\n MESSAGE_TYPE_BYE = \"BYE\",//挂断\n}\n\nexport enum PttMessageType {\n FPRE = 'fpre',\n IMS = 'ims',\n PTT_QUERY_ONLINE_USER = \"15\",//在线用户查询\n PTT_ANSWER_ONLINE_USER = \"115\",//服务响应在线用户列表\n PTT_QUERY_INFO = \"16\",//群组在线用户查询通知\n PTT_QUERY_INFO_CONFIRM = \"116\",//确认消息\n}","/**\n * 销毁dom上渲染的流\n */\nexport const releaseStreamFromContainer = (container?: HTMLVideoElement | HTMLAudioElement) => {\n if (container !== undefined) {\n container.pause()\n container.removeAttribute(\"src\")\n container.removeAttribute(\"srcObject\")\n }\n}\n/**\n * 将流渲染到dom上\n */\nexport const renderStreamToContainer = (stream?: MediaStream, container?: HTMLVideoElement | HTMLAudioElement) => {\n if (stream !== undefined && container !== undefined) {\n container.srcObject = stream\n container.play()\n }\n}\n\n/**\n * 关闭流\n */\nexport const closeStreamAndTrack = (stream: MediaStream) => {\n stream.onaddtrack = null;\n stream.onremovetrack = null;\n stream.getTracks().forEach(track => {\n stream?.removeTrack(track)\n track.onended = null\n track.onmute = null\n track.onunmute = null\n track.stop()\n })\n}","//是否打印日志\nlet logAble = false\n//是否在网页上显示日志\n\nexport const log = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const error = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const disableLog = () => {\n logAble = false\n}\n\nexport const enableLog = () => {\n logAble = true\n}","export enum RtcInviteStatus {\n timeout = 408,\n reject = 488,\n busy = 486,\n notfound = 404,\n notAllowedMedia = 415,//不允许的媒体类型,目前至少包好一个音频媒体流\n ok = 200\n}","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcCalledType {\n //接收到bye请求\n audio = \"audio\",//音频呼叫\n video = \"video\",//视频呼叫\n audioVideo = \"audioVideo\",//音视频呼叫\n unknown = \"unknown\"//未知\n}","export enum RtcWebSocketEvent {\n connected = \"connected\",// the socket is connected\n disconnected = \"disconnected\", // the socket is dis connected\n message = \"message\" //收到消息\n}","import { renderStreamToContainer } from './StreamUtil';\nimport { RtcSessionEvent } from '../session/RtcSessionEvent';\nimport EventEmitter from 'events'\nimport { log } from '../log/Logger'\n\n\n\n/**\n * devicechange 设备输入变化\n */\nexport default abstract class LocalStreamHandler extends EventEmitter {\n constructor() {\n super()\n // ...........................................................................\n super.setMaxListeners(0)\n }\n //本地流媒体\n audioTrack: MediaStreamTrack | undefined\n videoTrack: MediaStreamTrack | undefined\n localMediaStream: MediaStream | undefined = new MediaStream()\n //https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings\n videoConstrains = { width: { ideal: 1920 }, height: { ideal: 1080 }, frameRate: { ideal: 20, max: 30 }, aspectRatio: { ideal: 16 / 9 } }\n audioConstrants = { noiseSuppression: true, echoCancellation: true, autoGainControl: true }\n\n /**\n * 释放track\n */\n releaseTrack(track: MediaStreamTrack | undefined) {\n if (track !== undefined) {\n this.localMediaStream?.removeTrack(track)\n track.stop()\n }\n }\n\n /**\n * 注册设备变化事件,记得组件销毁的时候remove\n */\n addDeviceChangeListener(listener: any) {\n navigator.mediaDevices.addEventListener(\"devicechange\", listener)\n }\n removeDeviceChangeListener(listener: any) {\n navigator.mediaDevices.removeEventListener(\"devicechange\", listener)\n }\n\n /**\n * 设置本地视频输入流\n */\n setVideoTrack(videoTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localVideoChange, { from: this.videoTrack, to: videoTrack })\n if (this.videoTrack !== videoTrack) {\n this.localMediaStream?.addTrack(videoTrack)\n this.localTractChange(this.videoTrack, videoTrack)\n }\n this.videoTrack = videoTrack\n }\n\n\n /**\n * 设置本地音頻输入流\n */\n setAudioTrack(audioTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localAudioChange, { from: this.audioTrack, to: audioTrack })\n if (this.audioTrack !== audioTrack) {\n this.localMediaStream?.addTrack(audioTrack)\n this.localTractChange(this.audioTrack, audioTrack)\n }\n this.audioTrack = audioTrack\n }\n\n abstract localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined): void\n\n /**\n * 将流渲染到dom上\n */\n renderLocalStreamToContainer(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n renderStreamToContainer(this.localMediaStream, container)\n }\n\n /**\n * 获取所有的输入设备源\n */\n async getAllInputResource() {\n let all = await navigator.mediaDevices.enumerateDevices();\n return { audio: all.filter(res => res.kind === \"audioinput\"), video: all.filter(res => res.kind === \"videoinput\") }\n }\n\n /**\n * 使用默认的音视频输入源\n */\n async useDefaultDevice(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n let constraints = { audio: true, video: true }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n this.setVideoTrack(stream.getVideoTracks()[0])\n this.renderLocalStreamToContainer(container)\n }\n /**\n * 设置本地音频输入流\n * https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia\n * @param deviceId 设备id,如果为空,表示使用默认输入设备\n */\n async useAudio(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: { ...this.audioConstrants }, video: false } : { video: false, audio: { deviceId, ...this.audioConstrants } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n return stream.getAudioTracks()[0] //modify by jzg 此处需要返回该媒体流对象, 防止在获取流媒体过程中收到挂断请求, 导致流媒体没释放\n }\n\n /**\n * 使用设备视频流\n */\n async useDeviceVideo(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: false, video: { ...this.videoConstrains } } : { audio: false, video: { deviceId, ...this.videoConstrains } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n\n /**\n * 使用桌面视频流\n */\n async useDeskTopVideo() {\n let stream = await navigator.mediaDevices.getDisplayMedia({ video: { ...this.videoConstrains }, audio: false })\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n /**\n * 禁用本地音频输入\n */\n disableAudio() {\n if (this.audioTrack !== undefined && this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = false\n this.setAudioTrack(this.audioTrack)\n }\n }\n /**\n * 启用本地音频输入\n */\n enableAudio() {\n if (this.audioTrack !== undefined && !this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = true\n this.setAudioTrack(this.audioTrack)\n }\n }\n\n /**\n * 禁用本地视频输入\n */\n disableVideo() {\n if (this.videoTrack !== undefined && this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = false\n this.setVideoTrack(this.videoTrack)\n }\n\n }\n\n /**\n * 启用本地视频输入\n */\n enableVideo() {\n if (this.videoTrack !== undefined && !this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = true\n this.setVideoTrack(this.videoTrack)\n }\n }\n\n close() {\n this.releaseTrack(this.audioTrack)\n this.releaseTrack(this.videoTrack)\n this.audioTrack = undefined\n this.videoTrack = undefined\n this.localMediaStream = undefined\n }\n}\n","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { log, error } from '../log/Logger'\nimport { UscRtcProtocol } from '../session/UscRtcProtocol'\nimport LocalStreamHandler from './LocalStreamHandler'\nimport { closeStreamAndTrack } from './StreamUtil';\n\n/**\n * 链接流程\n * https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling\n * TODO 1.音频呼叫\n * TODO 2.会话的过程中切换流\n */\nexport default abstract class RTCPeerConnectionHandler extends LocalStreamHandler {\n //peers\n peerConnection?: RTCPeerConnection\n\n //custorm codec\n videoCodecs: RTCRtpCodecCapability[] = []\n audioCodecs: RTCRtpCodecCapability[] = []\n audioReciveCodecs: RTCRtpCodecCapability[] = []\n remoteStream?: MediaStream\n emitStreamTimeout?: NodeJS.Timeout;\n constructor() {\n super()\n this.preferCodec()\n this.peerConnection = this.buildConnection()\n }\n\n /**生成一个peerconnection */\n buildConnection() {\n //指定dtls 证书\n // let cert = await RTCPeerConnection.generateCertificate({\n // name: 'RSASSA-PKCS1-v1_5',\n // hash: 'SHA-256',\n // modulusLength: 2048,\n // publicExponent: new Uint8Array([1, 0, 1])\n // })\n // this.peerConnection = new RTCPeerConnection({ certificates: [cert] });\n let peerConnection = new RTCPeerConnection()\n peerConnection.addEventListener(\"connectionstatechange\", (e) => log(\"connectionstatechange\", e))\n peerConnection.addEventListener(\"icecandidate\", (e) => { log(\"icecandidate\", e); this.onIceCandidate(e) })\n peerConnection.addEventListener(\"datachannel\", (e) => log(\"datachannel\", e))\n peerConnection.addEventListener(\"icecandidateerror\", (e) => log(\"icecandidateerror\", e))\n peerConnection.addEventListener(\"iceconnectionstatechange\", (e) => log(\"iceconnectionstatechange\", e))\n peerConnection.addEventListener(\"icegatheringstatechange\", (e) => log(\"icegatheringstatechange\", e))\n peerConnection.addEventListener(\"negotiationneeded\", (e) => log(\"negotiationneeded\", e))\n peerConnection.addEventListener(\"signalingstatechange\", (e) => log(\"signalingstatechange\", e))\n peerConnection.addEventListener(\"track\", (e) => this.reciveTrack(e))\n return peerConnection\n }\n\n\n\n //当流本地的流发生变化的时候,判断当前是否处于会话状态,从而进行处理\n async localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined) {\n if (this.remoteStream !== undefined && this.peerConnection !== undefined) {//如果处于会话过程中,那么判断之前的sender是否含有该类型的流,如果存在那么就替换,如果不存在,重新发offer\n if (next !== undefined) { //修改流\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === next.kind)\n if (prevSender !== undefined) {\n prevSender.replaceTrack(next)\n } else {\n //TODO\n //reoffer 重发offer的时候是三个sender? 然后再peerConnection.removetrack\n }\n } else { //删除流,如果原先存在对应类型的流,直接stop?还是reoffer\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === prev?.kind)\n if (prevSender !== undefined) {\n this.peerConnection.removeTrack(prevSender)\n }\n }\n }\n\n //TODO \n if (next !== undefined) {\n next.onended = (e) => log(\"local track end\", e)\n next.onmute = (e) => {\n log(\"local mute\", e)\n this.emitLocalStreamChange()\n }\n next.onunmute = (e) => {\n log(\"local unmute\", e)\n this.emitLocalStreamChange()\n }\n }\n\n this.releaseTrack(prev)\n this.emitLocalStreamChange()\n }\n\n /**\n * 是否处于会议当中\n */\n isInMeeting() {\n return this.remoteStream !== undefined\n }\n\n hasRemoteVideo(strem?: MediaStream) {\n return strem?.getVideoTracks().some(track => track.muted === false && track.readyState === \"live\") ?? false\n }\n\n\n emitLocalStreamChange() {\n this.emit(RtcSessionEvent.localStreamChange, { audioOnly: !this.hasRemoteVideo(this.localMediaStream), stream: this.localMediaStream })\n }\n\n /**\n * 通知用户远程的流发生了变化\n */\n emitRemoteStreamChange() {\n this.emit(RtcSessionEvent.stream, { audioOnly: !this.hasRemoteVideo(this.remoteStream), stream: this.remoteStream })\n }\n\n /**\n * 做个100ms的延时来缓冲流的变化\n */\n trigerStreamChange(timeout: number = 100) {\n if (this.emitStreamTimeout !== undefined) {\n clearTimeout(this.emitStreamTimeout)\n }\n this.emitStreamTimeout = setTimeout(() => {\n this.emitRemoteStreamChange()\n this.emitStreamTimeout = undefined\n }, timeout)\n }\n\n /**\n * 接受track时候的处理事件\n */\n reciveTrack(e: RTCTrackEvent) {\n log(\"recive track\", e)\n if (this.remoteStream === undefined) {\n this.remoteStream = new MediaStream()\n }\n e.track.addEventListener(\"ended\", () => this.trigerStreamChange())\n e.track.addEventListener(\"mute\", () => this.trigerStreamChange(3000))\n e.track.addEventListener(\"unmute\", () => this.trigerStreamChange(10))\n this.remoteStream.addTrack(e.track)\n this.trigerStreamChange()\n }\n\n\n abstract onIceCandidate(e: RTCPeerConnectionIceEvent): any;\n /**\n * use custorm codec , \n * default is H264/PCMA,\n * TODO 火狐浏览器没有RTCRtpSender.getCapabilities相关方法,是否在createoffer之后进行sdp协议处理来适配编码工作\n * @param videoCodec \n * @param audioCodec \n */\n preferCodec(videoCodec = \"H264\", audioCodec = \"PCMA\") {\n this.videoCodecs = []\n let senderVideoCapabilities = RTCRtpSender.getCapabilities(\"video\")\n if (senderVideoCapabilities !== null) {\n this.videoCodecs.push(...senderVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n let reciverVideoCapabilities = RTCRtpReceiver.getCapabilities(\"video\")\n if (reciverVideoCapabilities !== null) {\n this.videoCodecs.push(...reciverVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n this.audioCodecs = []\n let senderAudioCapabilities = RTCRtpSender.getCapabilities(\"audio\")\n if (senderAudioCapabilities !== null) {\n this.audioCodecs.push(...senderAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n let reciverAudioCapabilities = RTCRtpReceiver.getCapabilities(\"audio\")\n if (reciverAudioCapabilities !== null) {\n this.audioCodecs.push(...reciverAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n }\n\n trackIsInPeerConnection(track: MediaStreamTrack) {\n return this.peerConnection?.getSenders().some(sender => sender.track?.id === track.id) ?? false\n }\n /**\n * 将本地的track更新到peereonnection 中\n * 只接受流:没有本地stream rtcPeerConnection.addTransceiver(\"video\", {direction: \"recvonly\"});rtcPeerConnection.addTransceiver(\"audio\", {direction: \"recvonly\"});\n * recvonly/sendonly/sendrecv/inactive\n * \n */\n updateTracks() {\n if (this.peerConnection === undefined || this.peerConnection.signalingState === 'closed') {\n throw new Error(\"session is closed !\")\n }\n if (this.audioTrack === undefined && this.videoCodecs === undefined) {\n throw new Error(\"no input found\")\n }\n\n //这里addtrack不指定stream,接收的地方就得ontrack,指定stream,表示由RTCPeerConnection 接管流的管理\n if (this.audioTrack !== undefined && !this.trackIsInPeerConnection(this.audioTrack)) {\n try {\n this.peerConnection.addTrack(this.audioTrack)\n } catch (error) {\n }\n }\n if (this.videoTrack !== undefined && !this.trackIsInPeerConnection(this.videoTrack)) {\n try {\n this.peerConnection.addTrack(this.videoTrack)\n } catch (error) {\n }\n }\n //修改视频编码\n try {\n this.peerConnection.getTransceivers().forEach(transceiver => {\n if (transceiver.sender.track !== null) {\n if (transceiver.sender.track.kind === \"video\") {\n transceiver.setCodecPreferences([...this.videoCodecs])\n } else if (transceiver.sender.track.kind === \"audio\") {\n transceiver.setCodecPreferences([...this.audioCodecs])\n }\n }\n })\n } catch (errorMessage) {\n error(\"preferCodec error\", errorMessage, this.audioCodecs, this.videoCodecs)\n }\n }\n\n\n /**\n * create and format offer\n */\n async createOffer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let offer = await this.peerConnection.createOffer()\n offer = UscRtcProtocol.formatOffer(offer)\n await this.peerConnection.setLocalDescription(offer)\n return offer\n }\n\n /**\n * set offer \n */\n async setOffer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"offer\", sdp })\n }\n\n /**\n * create answer\n */\n async createAnswer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let answer = await this.peerConnection.createAnswer()\n this.peerConnection.setLocalDescription(answer)\n return answer\n }\n\n /**\n * set answer\n */\n async setAnswer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"answer\", sdp })\n }\n\n\n /**\n * set ice candidate\n * @param ice \n */\n setRemoteIce(ice: RTCIceCandidateInit) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n let candidate = new RTCIceCandidate(ice)\n this.peerConnection.addIceCandidate(candidate)\n }\n\n /**\n * 关闭链接\n */\n closeConnection(peerConnection: RTCPeerConnection) {\n peerConnection.close()\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onsignalingstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n peerConnection.onnegotiationneeded = null;\n peerConnection.onicecandidateerror = null;\n peerConnection.ondatachannel = null;\n peerConnection.onconnectionstatechange = null\n\n }\n\n /**\n * 销毁会话\n */\n close() {\n super.close()\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)\n this.peerConnection = undefined\n }\n if (this.remoteStream !== undefined) {\n closeStreamAndTrack(this.remoteStream)\n }\n }\n}","/**\n * usc webrtc 协议格式\n */\n\nexport class UscRtcProtocol {\n static formatOffer(offer: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n let { sdp } = offer\n if (sdp === undefined) {\n throw new Error(\"offer sdp is empty\")\n }\n sdp = sdp.split(\"\\r\\n\").filter(lines => lines.indexOf(\"a=group:BUNDLE\") === -1).join(\"\\r\\n\")\n offer.sdp = sdp\n return offer\n }\n}","import { closeStreamAndTrack } from \"src/peer/StreamUtil\"\nimport { RtcClient } from \"../client/RtcClient\"\nimport RTCPeerConnectionHandler from \"../peer/RTCPeerConnectionHandler\"\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\n\nexport abstract class RtcAbstractSession extends RTCPeerConnectionHandler {\n sessionId: string\n //隶属的rtcclient\n rtcClient: RtcClient | undefined\n //远端号码\n remoteNumber: string | undefined\n //invite的seq\n inviteSeq?: number\n //offer\n inviteOffer?: string\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string | undefined) {\n super()\n this.sessionId = sessionId\n this.rtcClient = rtcClient\n this.remoteNumber = remoteNumber\n }\n\n reciveIceRequest({ ice }: any) {\n this.setRemoteIce(JSON.parse(ice))\n }\n\n\n //获取远端主叫号码\n getRemoteNumber(): string | undefined {\n return this.remoteNumber\n }\n\n\n /**\n * ice candidate is trigger after createoffer or createanswer\n */\n onIceCandidate(e: RTCPeerConnectionIceEvent) {\n // if (e && e.candidate) {\n // this.rtcClient.ice(this.remoteNumber, this.sessionId, e.candidate)\n // }\n }\n\n /**\n * 销毁会话\n */\n destory(isSendBye: boolean = true) {\n this.removeAllListeners()\n if (this.rtcClient !== undefined) {\n if (this.remoteNumber !== undefined) {\n if (isSendBye)\n this.rtcClient.sendBye(this.remoteNumber, this.sessionId)\n this.remoteNumber = undefined\n }\n this.rtcClient.removeSession(this)\n }\n this.rtcClient = undefined\n super.close()\n }\n\n\n //拒绝会话\n rejectCall() {\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n rtcClient.answer(RtcInviteStatus.reject, inviteSeq, remoteNumber, this.sessionId)\n this.destory()\n }\n\n //接受会话,不过在这之前应该使用对应接口准备好本地的流(switchToUserMedia/switchToDeviceMedia)\n async acceptCall() {\n if (this.inviteOffer !== undefined) {\n await this.setOffer(this.inviteOffer)\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n let { sdp } = await this.createAnswer()\n rtcClient.answer(RtcInviteStatus.ok, inviteSeq, remoteNumber, this.sessionId, sdp)\n }\n }\n\n /**\n * 当同一个会议又收到offer的时候,尝试重新做一个链接,\n * 直接setoffer服务端有一些问题,使用此方案来处理一下,看看是否可行\n */\n async pickNewConnection() {\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)//关闭connection\n }\n this.peerConnection = this.buildConnection()\n if (this.remoteStream !== undefined) {//当前处于会话过程中\n closeStreamAndTrack(this.remoteStream)//关闭远程的流\n this.remoteStream = undefined\n this.acceptCall()\n }\n }\n\n checkIsNotUndefined(...x: any[]) {\n for (const item of x) {\n if (item === undefined) {\n throw new Error(`someone is undefined`)\n }\n }\n return x\n }\n\n //发送dtmf消息\n async sendDtmf(dtmf: string): Promise<any> {\n this.rtcClient?.sendDtmf(this.remoteNumber!, this.sessionId, dtmf)\n }\n}","import { RtcAbstractSession } from './RtcAbstractSession'\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\nimport { RtcCalledType } from './RtcCalledTyped';\n\n/**\n * Rtc 会话对象封装\n * 流程:\n * 1.创建会话\n * 1.(选择本地流/添加被叫用户)\n * 2.发送请求\n * 3.接受响应\n * 4.开始会话,被拒绝(结束会话)\n * 5.被挂断,主动挂断(结束会话)\n * 6.用户掉线\n */\nexport class RtcSession extends RtcAbstractSession {\n\n responseCallType: RtcCalledType = RtcCalledType.unknown\n /**\n * 开始会话\n */\n async start() {\n let [rtcClient, remoteNumber] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber)\n let offer = await this.createOffer()\n let { status, sdp } = await rtcClient.invite(remoteNumber, this.sessionId, offer.sdp)\n if (status === RtcInviteStatus.ok) {\n await this.setAnswer(sdp);\n }\n\n const lines = sdp.split(\"\\r\\n\") as string[]\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.responseCallType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n return status\n }\n\n /**\n * 添加会话用户\n */\n addRemote(remoteNumber: string) {\n this.remoteNumber = remoteNumber\n }\n}","import { SignalMessageType } from \"./SingalMessageType\"\n\n//消息体\nexport class SignalMessage {\n static random: string = String(Date.now())\n static seqNum: number = 0\n /**\n * 请求类型\n */\n req: SignalMessageType\n /**\n * 每次请求序列号增加1,后端设计如此\n * 导致前端websocket通道无法复用,对于每个账号都使用单独的websocket\n */\n seq: number\n\n /**\n * 信令发送方\n */\n from: string\n\n /**\n * 信令接收方 \n */\n to: string\n\n /**\n * 注册id,后端设计如此,注册成功之后,心跳注册registerid的不变,如果是新的注册,比如断网之后重新连接上,registerid要改变\n */\n registerid: string\n\n constructor(req: SignalMessageType, from: string, to: string, data?: Object) {\n this.req = req\n this.seq = SignalMessage.seqNum++\n this.from = from\n this.to = to\n this.registerid = `${SignalMessage.random}@${from}`\n if (data !== undefined) {\n Object.assign(this, data)\n }\n }\n}","import { log } from '../log/Logger'\nimport { EventEmitter } from \"events\"\nimport { RtcWebSocketEvent } from \"./RtcWebSocketEvent\"\nimport SocketWorker from 'web-worker:./worker.js'\nimport { SignalMessage } from \"../message/SignalMessage\"\n/**\n * 对websocket进行封装\n */\nexport class RtcWebSocket extends EventEmitter {\n /**\n * signal server address\n */\n server: string\n /**\n * websocket client\n */\n ws: Worker\n\n constructor(server: string, heartBeat: SignalMessage, heartTime: number) {\n super()\n this.server = server\n this.ws = new SocketWorker()\n this.configHeartBeat(heartBeat, heartTime)\n }\n\n /**\n * connect to the websocket server\n */\n connect() {\n this.initWebsocket()\n this.ws.onmessage = (e: any) => {\n const { type, data } = e.data\n switch (type) {\n case 'webSocket':\n log(\"websocket recive message \", data)\n this.emit(RtcWebSocketEvent.message, data)\n return;\n case 'open':\n log(\"websocket connected \", this.server)\n this.emit(RtcWebSocketEvent.connected)\n return\n }\n }\n }\n\n configHeartBeat(heartBeat: SignalMessage, heartTime: number) {\n log(\"websocket heartBeat\", heartBeat)\n log(\"websocket heartTime \", heartTime)\n\n this.ws.postMessage({ cmd: 'config', heartBeat, heartTime })\n }\n\n initWebsocket() {\n // 连接socket\n this.ws.postMessage({ cmd: 'start', url: this.server })\n }\n\n send(data: Object) {\n this.ws.postMessage({ cmd: 'msg', data })\n }\n\n\n /**\n * 主动断开websocket,不会触发重连机制\n */\n close(): void {\n this.ws.postMessage({ cmd: 'close' })\n }\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n log(\"websocket send message \", message)\n if (message !== undefined && this.ws !== undefined) {\n this.ws.postMessage({ cmd: 'msg', data: message })\n }\n }\n}","import { EventEmitter } from 'events'\nimport { RtcWebSocketEvent } from './RtcWebSocketEvent'\nimport { RtcWebSocket } from \"./RtcWebSocket\"\nimport { SignalMessage } from '../message/SignalMessage'\nimport { SignalMessageType } from '../message/SingalMessageType'\n\n/**\n * 内部持有一个websocket,并且对websocket进行管理,对外提供发送消息的接口以及相关事件\n */\nexport abstract class RtcSocketServerHandler extends EventEmitter {\n // local sip number\n localNumber: string\n\n //register signal message expire time (seconds)\n expireTime: number\n heartTime: number\n\n socketWorker?: RtcWebSocket\n server: string | string[]\n activeServer: string = ''\n\n // constructor(server: string, localNumber: string, expireTime: number, heartTime: number) {\n // super(server, localNumber, expireTime, heartTime)\n // }\n constructor(server: string, localNumber: string, expireTime: number, heartTime: number) {\n super()\n this.server = server\n this.localNumber = localNumber\n this.expireTime = expireTime\n this.heartTime = heartTime\n super.setMaxListeners(0)\n }\n\n\n abstract onReviceMessage(data: any): any\n\n abstract onConnected(): any\n\n abstract onDisConnected(e: CloseEvent): any\n abstract unRegister(): void\n\n /**\n * 测试可用的websocket地址\n */\n async testWs(addrs: string[]) {\n return addrs.reduce((pre, cur) => {\n return pre.then((av) => Promise.resolve(av), (av) => new Promise((resolve, reject) => {\n const socketWorker = new WebSocket(cur)\n socketWorker.onopen = () => {\n av.push(cur)\n socketWorker.close()\n resolve(av)\n }\n socketWorker.onclose = () => {\n reject(av)\n }\n }))\n\n }, Promise.reject([])).then((av) => Promise.resolve(av), (av) => Promise.resolve(av))\n }\n\n /**\n * 修改/设置 websocket地址\n */\n async reConnect(): Promise<void> {\n this.destory()\n let server: string[] = []\n if (this.server !== undefined) {\n if (typeof this.server === 'string') {\n server = [this.server]\n } else {\n server = this.server\n }\n }\n const useWs = await this.testWs(server)\n return new Promise((resolve, reject) => {\n if (useWs.length > 0) {\n this.activeServer = useWs[0]\n let socketWorker = new RtcWebSocket(this.activeServer, new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime }), this.heartTime)\n socketWorker.on(RtcWebSocketEvent.connected, () => {\n this.socketWorker = socketWorker\n this.onConnected()\n resolve()\n })\n socketWorker.on(RtcWebSocketEvent.disconnected, (e: CloseEvent) => {\n this.socketWorker = undefined\n this.onDisConnected(e)\n reject(\"socketWorker connecion failed\")\n })\n socketWorker.on(RtcWebSocketEvent.message, (data) => this.onReviceMessage(data))\n socketWorker.connect()\n } else {\n reject(\"server is empty\")\n }\n })\n }\n\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n if (this.socketWorker !== undefined) {\n this.socketWorker.sendMessage(message)\n } else {\n throw new Error(\"socketWorker is closed\")\n }\n }\n\n\n //销毁socket\n destory() {\n if (this.socketWorker !== undefined) {\n this.unRegister()\n this.socketWorker.close()\n this.socketWorker = undefined\n }\n // this.removeAllListeners()\n }\n}","import { SignalMessage } from './../message/SignalMessage';\nimport { RtcSocketServerHandler } from \"../websocket/RtcSocketServerHandler\"\nimport { RtcClientEvent } from './RtcClientEvent';\n\n/**\n * rtc 信令服务器,用来处理信令消息,以及按照协议获取信令的返回结果\n */\nexport abstract class RtcSignalServer extends RtcSocketServerHandler {\n // promise request \n asyncProducer: Map<number, Function> = new Map<number, Function>()\n\n /**\n * 发送需要回应消息的信令消息\n */\n async sendRespondableMessage(message: SignalMessage): Promise<any> {\n this.sendMessage(message)\n return new Promise((resolve) => this.asyncProducer.set(message.seq, resolve))\n }\n\n /**\n * 获取异步回调\n */\n getAsyncResolve(seq: number): Function | undefined {\n let analyzer = this.asyncProducer.get(seq)\n if (analyzer !== undefined) {\n this.asyncProducer.delete(seq)\n }\n return analyzer\n }\n\n //连接断开\n onDisConnected(e?: CloseEvent) {\n //清空异步等待\n this.asyncProducer.clear()\n //事件上报\n this.emit(RtcClientEvent.disconnected, e)\n }\n\n //invoke on message reviced\n onReviceMessage(data: any) {\n let { status, seq } = data\n if (status !== undefined) {\n this.getAsyncResolve(seq)?.call(undefined, data)\n } else {\n this.processMessage(data)\n }\n }\n\n\n abstract processMessage(data: any): any\n}","import { RtcInviteStatus } from './../session/RtcInviteStatus'\nimport { SignalMessageType } from \"../message/SingalMessageType\"\nimport { SignalMessage } from \"../message/SignalMessage\"\nimport { RtcSignalServer } from \"./RtcSignalServer\"\n\n/**\n * 信令请求Api\n */\nexport abstract class RtcSignalApi extends RtcSignalServer {\n\n /**\n * send register message to the server\n */\n async register(): Promise<any> {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime })\n return this.sendRespondableMessage(message)\n }\n\n unRegister(): void {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": 0 })\n this.sendMessage(message)\n }\n\n /**\n * send a invite request to user\n * @param user the remote user who you want invite \n * @param cid the session id\n * @param sdp sdp content\n * @returns \n */\n async invite(user: string, cid: string, sdp?: string): Promise<any> {\n return this.sendRespondableMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INVITE, this.localNumber, user, { cid, sdp }))\n }\n\n /**\n * send a ice request to user\n * @param user the remote user\n * @param cid session id\n * @param ice ice message\n * @returns \n */\n sendIce(user: string, cid: string, ice: RTCIceCandidate) {\n // return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_ICE, this.localNumber, user, { cid, ice: JSON.stringify(ice) }))\n }\n\n /**\n * send bye message\n * @param user the remote user\n * @param cid session id\n */\n sendBye(user: string, cid: string) {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_BYE, this.localNumber, user, { cid }))\n }\n\n /**\n * answer message\n * @param status answer status\n * @param seq the seq number from offer\n * @param to the remote offer user\n * @param cid session id\n * @param sdp sdp content\n */\n answer(status: RtcInviteStatus, seq: number, to: string, cid: string, sdp?: string) {\n this.sendMessage({ status, seq, from: to, to: this.localNumber, cid, sdp })\n }\n\n //PTT相关接口\n /**\n * answer message\n * @param xd_oper ptt infoType\n * @param xd_name the groupId\n * @param user the ptt user number\n */\n sendPttMessage(data: any) {\n this.sendMessage(data)\n }\n\n //发送dtmf\n async sendDtmf(user: string, cid: string, dtmf: string): Promise<any> {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INFO, this.localNumber, user, { cid, info: { msg: \"dtmf\", dtmf: dtmf } }))\n }\n\n}","var domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active ) ;\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n \n// Alias for removeListener added in NodeJS 10.0\n// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener\nEventEmitter.prototype.off = function(type, listener){\n return this.removeListener(type, listener);\n};\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nconst clientEvent = {\r\n ERROR:'error',\r\n SPEAKER:'speaker',\r\n TALKING:'talking',\r\n ACTIVE_GROUP:'activeGroup',\r\n JOIN_INFO:'joinInfo',\r\n SERVER_CLOSE:'serverClose',\r\n SERVER_ERROR:'serverError',\r\n DISCONNECTED:'disConnected'\r\n};\n\nconst pttErrorCode = {\r\n 400: '消息不符规范',\r\n 401: '验证不通过',\r\n 403: '无权利操作',\r\n 404: '不存在该用户',\r\n 415: '错误参数',\r\n 405: '无法操作',\r\n 424: '不存在XD群',\r\n 425: '管理员没有',\r\n 426: '已存在管理员',\r\n 427: '以前被拒绝过,或者删除过',\r\n 428: '超出所配置的下属管理员的数量',\r\n 429: '群内无用户',\r\n 430: '管理员的索引号冲突',\r\n 431: '还有子管理员存在',\r\n};\n\nconst PttWebSocketEvent = {\r\n connected : \"connected\",// the socket is connected\r\n disconnected : \"disconnected\", // the socket is dis connected\r\n message : \"message\" //收到消息\r\n};\n\n//是否打印日志\r\nlet logAble = true;\r\n//是否在网页上显示日志\r\n\r\nconst log = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst error = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst disableLog = () => {\r\n logAble = false;\r\n};\r\n\r\nconst enableLog = () => {\r\n logAble = true;\r\n};\n\n/**\r\n * 对websocket进行封装\r\n */\r\nclass PttWebSocket extends EventEmitter {\r\n server = ''\r\n ws = null\r\n\r\n constructor(server) {\r\n super();\r\n this.server = server;\r\n }\r\n\r\n /**\r\n * connect to the websocket server\r\n */\r\n connect() {\r\n this.ws = new WebSocket(this.server);\r\n this.ws.onopen = () => {\r\n log(\"websocket connected \", this.server);\r\n this.emit(PttWebSocketEvent.connected);\r\n };\r\n this.ws.onclose = () => {\r\n log(\"websocket disconnected \", this.server);\r\n this.ws = undefined;\r\n this.emit(PttWebSocketEvent.disconnected);\r\n };\r\n this.ws.onmessage = ({ data }) => {\r\n let message = JSON.parse(data);\r\n log(\"websocket recive message \", message);\r\n this.emit(PttWebSocketEvent.message, message);\r\n };\r\n }\r\n\r\n\r\n /**\r\n * 主动断开websocket,不会触发重连机制\r\n */\r\n close() {\r\n if (this.ws !== undefined) {\r\n this.ws.close();\r\n this.ws = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 发送消息\r\n */\r\n sendMessage(message) {\r\n log(\"websocket send message \", message);\r\n if (message !== undefined && this.ws !== undefined && this.ws.readyState === 1) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n}\n\n// import PttSocketServerHandler from '../websocket/PttSocketServerHandler.js'\r\nclass PttClient extends EventEmitter{\r\n socket = undefined\r\n timer = undefined\r\n waitinggroup = undefined\r\n speaker = ''\r\n activeGroup = ''\r\n talking = false\r\n constructor(server, heartTime = 20, autoReconnect = true){\r\n super();\r\n if(!server) return error('服务器地址为空!')\r\n this.server = server;\r\n this.heartTime = heartTime;\r\n this.autoReconnect = autoReconnect;\r\n }\r\n\r\n async initClient(){\r\n this.destorySocket();\r\n return new Promise((resolve, reject) => {\r\n if (this.server !== undefined) {\r\n let socket = new PttWebSocket(this.server);\r\n socket.on(PttWebSocketEvent.connected, () => {\r\n this.socket = socket;\r\n this.timer = setInterval(()=>{\r\n this.sendMessage({\"req\": 0});\r\n },this.heartTime*1000);\r\n resolve();\r\n });\r\n socket.on(PttWebSocketEvent.disconnected, () => {\r\n this.socket = undefined;\r\n if(this.autoReconnect){\r\n setTimeout(()=>{\r\n this.initClient();\r\n },3000);\r\n }else {\r\n this.emit(clientEvent.DISCONNECTED);\r\n }\r\n reject(\"socket connecion failed\");\r\n });\r\n socket.on(PttWebSocketEvent.message, (data) => this.onReviceMessage(data));\r\n socket.connect();\r\n } else {\r\n reject(\"server is empty\");\r\n }\r\n })\r\n }\r\n \r\n // 收到消息\r\n onReviceMessage(data){\r\n log(data);\r\n const { info, msg, res } = data;\r\n if (info === 10){\r\n this.speaker = `${msg.speaker}`;\r\n log(`${this.speaker}正在说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n if (info === 11) {\r\n if (res.code === 200) {\r\n this.activeGroup = this.waitinggroup;\r\n log(`加入组${this.activeGroup}`);\r\n }\r\n else {\r\n this.activeGroup = '';\r\n error(pttErrorCode[res.code]);\r\n this.emit(clientEvent.ERROR,pttErrorCode[res.code]);\r\n }\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n }\r\n if (info === 13) {\r\n if (res.code === 200)\r\n this.talking = true;\r\n else\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n }\r\n \r\n if (info === 14){\r\n this.speaker = '';\r\n log(`${this.speaker}停止说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n \r\n if (info === 15) {\r\n const user = {\r\n user:msg.number,\r\n group:msg.g_num,\r\n code:msg.status,\r\n };\r\n log(`${user}进入组`);\r\n this.emit(clientEvent.JOIN_INFO,user);\r\n }\r\n }\r\n\r\n joinGroup(group, user, ptts, port) {\r\n if (!this.socket)\r\n return\r\n this.waitinggroup = group;\r\n this.sendMessage({\"req\": 1, \"group\": group, \"user\": user, \"ptts\": ptts, \"port\": port });\r\n }\r\n quitGroup() {\r\n if (!this.socket)\r\n return\r\n this.activeGroup = '';\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n this.sendMessage({\"req\": 2});\r\n }\r\n talk() {\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 3});\r\n }\r\n stop() {\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 4});\r\n }\r\n\r\n // 发送消息\r\n sendMessage(message) {\r\n if (this.socket !== undefined) {\r\n this.socket.sendMessage(message);\r\n } else {\r\n throw new Error(\"socket is closed\")\r\n }\r\n }\r\n\r\n //销毁socket\r\n destorySocket() {\r\n if (this.socket !== undefined) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n }\r\n destory(){\r\n this.destorySocket();\r\n }\r\n}\n\nconst createPttClient = async (server, heartTime = 20, autoReconnect = true)=>{\r\n let client = new PttClient(server, heartTime , autoReconnect);\r\n await client.initClient();\r\n return client\r\n};\n\nexport { PttClient, clientEvent, createPttClient, disableLog, enableLog, pttErrorCode };\n","import { error } from 'src/log/Logger'\nimport { RtcSignalApi } from './RtcSignalApi'\nimport { createPttClient, PttClient, clientEvent } from 'usc-ptt-sdk'\n\n/**\n * RTC终端基础类,用来处理心跳等信息\n */\nexport abstract class RtcClientBase extends RtcSignalApi {\n\n //the default register expire time of seconds\n static defaultExpireTime = 60\n\n //the resgister signal heart beat time (seconds)\n pttClient?: any\n pttServer?: string\n enablePtt?: boolean\n constructor(config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }) {\n let expireTime = config.expireTime || RtcClientBase.defaultExpireTime\n super(config.server, config.localNumber, expireTime, config.heartTime || 5)\n this.enablePtt = config.enablePtt\n this.pttServer = config.pttServer\n }\n async initPttClient() {\n if (this.enablePtt) {\n if (!this.pttServer) {\n return Promise.reject('pttServer不存在')\n } else {\n const pttClient = await createPttClient(this.pttServer)\n if (!pttClient)\n return Promise.reject('ptt客户端初始化失败!')\n pttClient.on(clientEvent.ACTIVE_GROUP, (e: any) => {\n this.emit(clientEvent.ACTIVE_GROUP, e)\n })\n pttClient.on(clientEvent.SPEAKER, (e: any) => {\n this.emit(clientEvent.SPEAKER, e)\n })\n pttClient.on(clientEvent.TALKING, (e: any) => {\n this.emit(clientEvent.TALKING, e)\n })\n pttClient.on(clientEvent.JOIN_INFO, (e: any) => {\n this.emit(clientEvent.JOIN_INFO, e)\n })\n pttClient.on(clientEvent.DISCONNECTED, (e: any) => {\n this.emit(clientEvent.DISCONNECTED, e)\n })\n this.pttClient = pttClient\n }\n }\n }\n /**\n * \n * @param group 对讲组Id\n * @param user 用户ptt账号\n * @param ptts ptt对讲组使用的webscoket服务器,从ptt组中获取\n * @param port ptt对讲组使用的webscoket服务器端口,从ptt组中获取\n */\n joinGroup(group: string, user: string, ptts: string, port: number) {\n this.pttClient?.joinGroup(group, user, ptts, port)\n }\n quitGroup() {\n this.pttClient?.quitGroup()\n }\n talk() {\n this.pttClient?.talk()\n }\n stop() {\n this.pttClient?.stop()\n }\n\n onConnected() {\n // this.register()\n }\n onDisConnected() {\n super.onDisConnected()\n }\n\n}","import { RtcCalledType } from './RtcCalledTyped';\nimport { RtcClient } from \"../client/RtcClient\"\nimport { RtcAbstractSession } from \"./RtcAbstractSession\"\n/**\n * 被叫session\n */\nexport class RtcCalledSession extends RtcAbstractSession {\n callType: RtcCalledType = RtcCalledType.unknown\n //invite seq\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string, offerSdp: string, seq: number) {\n super(rtcClient, sessionId, remoteNumber)\n this.inviteSeq = seq\n //不直接setofer,改成存一下,用户接受的时候再set下去,因为对接sip电话的时候,用户还没有同意,流就过来了\n // this.setOffer(offerSdp)\n this.inviteOffer = offerSdp\n const lines = offerSdp.split(\"\\r\\n\")\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.callType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { RtcClientEvent, PTTEvent } from './RtcClientEvent';\nimport { SignalMessageType, PttMessageType } from './../message/SingalMessageType'\nimport { nanoid } from 'nanoid'\nimport { RtcSession } from './../session/RtcSession'\nimport { RtcClientBase } from './RtcClientBase'\nimport { RtcCalledSession } from '../session/RtcCalledSession'\nimport { RtcAbstractSession } from '../session/RtcAbstractSession'\nexport class RtcClient extends RtcClientBase {\n\n allSession: RtcAbstractSession[] = []\n\n //开启一个视频呼叫会话\n createSession(remoteNumber?: string): RtcSession {\n let session = new RtcSession(this, nanoid(), remoteNumber)\n this.allSession.push(session)\n return session\n }\n\n //处理一些服务端主动发送来的消息\n processMessage(data: any) {\n let { req } = data\n if (req === SignalMessageType.MESSAGE_TYPE_INVITE) {//there is a calling\n // let session = this.allSession.find(se => se.sessionId == data.cid)\n // if (session !== undefined) {//resetoffer\n // session.inviteSeq = data.seq\n // session.inviteOffer = data.sdp\n // //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n // session.acceptCall()\n // session.emit(RtcSessionEvent.reInvite)\n // session.pickNewConnection()\n // } else {//new session\n let session = new RtcCalledSession(this, data.cid, data.from, data.sdp, data.seq)\n this.allSession.push(session)\n this.emit(RtcClientEvent.invite, session)\n // }\n } else if (req === SignalMessageType.MESSAGE_TYPE_REINVITE) {\n let session = this.allSession.find(se => se.sessionId == data.cid)\n if (session !== undefined) {//resetoffer\n session.inviteSeq = data.seq\n session.inviteOffer = data.sdp\n //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n session.acceptCall()\n session.emit(RtcSessionEvent.reInvite, session)\n // session.pickNewConnection()\n }\n }\n else if (req === SignalMessageType.MESSAGE_TYPE_ICE) {//recive ice request\n this.allSession.find(sess => sess.sessionId === data.cid)?.reciveIceRequest(data)\n } else if (req === SignalMessageType.MESSAGE_TYPE_BYE) {//recive bye request\n let session = this.allSession.find(sess => sess.sessionId === data.cid)\n if (session !== undefined) {\n session.emit(RtcSessionEvent.bye)\n session.destory(false)\n }\n }\n if (req == PttMessageType.FPRE) {\n // this.sendPttMessage(JSON.stringify({ xd_oper: PttMessageType.PTT_QUERY_INFO_CONFIRM, xd_name: data.xd_name, \"seq\": data.seq }))\n this.emit(PTTEvent.FPREInfo, data)\n }\n if (req == PttMessageType.IMS) {\n this.emit(PTTEvent.IMSInfo, data)\n }\n }\n\n destory() {\n if (this.allSession !== undefined) {\n this.allSession.forEach(session => {\n session.destory()\n });\n }\n super.destory()\n }\n\n removeSession(session: RtcAbstractSession) {\n if (this.allSession !== undefined) {\n this.allSession = this.allSession.filter(sess => sess.sessionId !== session.sessionId)\n }\n }\n\n onDisConnected() {\n super.onDisConnected()\n this.destory()\n }\n\n}","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { RtcClient } from './client/RtcClient'\nimport { RtcInviteStatus } from \"./session/RtcInviteStatus\"\nimport { SignalMessage } from \"./message/SignalMessage\"\n\n/**\n * create a rtc client \n * the heartTime and expireTime units are secounds\n */\nexport const createRtcClient = async (config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }): Promise<RtcClient> => {\n let client = new RtcClient(config)\n await client.reConnect()\n await client.initPttClient().catch((e) => {\n console.error(e);\n })\n SignalMessage.random = String(Date.now()) //modify by jzg\n let message = await client.register()\n\n if (message.status === RtcInviteStatus.ok) {\n return client\n } else {\n client.destory()\n return Promise.reject(message)\n }\n}\n\n/**\n * 获取webrtc授权, 只需要调用一次,在合适的场景下使用就可以了\n */\nexport const authDevice = async () => {\n await navigator.mediaDevices.getUserMedia({ audio: true, video: true })\n}\n\nexport { RtcClient, RtcInviteStatus }\nexport { disableLog, enableLog } from \"./log/Logger\"\nexport { RtcClientEvent, PTTEvent } from \"./client/RtcClientEvent\"\nexport { RtcSessionEvent } from './session/RtcSessionEvent'\nexport { RtcCalledType } from \"./session/RtcCalledTyped\"\nexport { releaseStreamFromContainer, renderStreamToContainer } from \"./peer/StreamUtil\""],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","RtcSessionEvent","RtcClientEvent","PTTEvent","SignalMessageType","PttMessageType","releaseStreamFromContainer","container","undefined","pause","removeAttribute","renderStreamToContainer","stream","srcObject","play","closeStreamAndTrack","onaddtrack","onremovetrack","getTracks","forEach","track","removeTrack","onended","onmute","onunmute","stop","logAble","log","title","args","console","disableLog","enableLog","RtcInviteStatus","RtcCalledType","RtcWebSocketEvent","LocalStreamHandler","EventEmitter","constructor","super","this","localMediaStream","MediaStream","videoConstrains","width","ideal","height","frameRate","max","aspectRatio","audioConstrants","noiseSuppression","echoCancellation","autoGainControl","setMaxListeners","releaseTrack","_a","addDeviceChangeListener","listener","navigator","mediaDevices","addEventListener","removeDeviceChangeListener","removeEventListener","setVideoTrack","videoTrack","emit","localVideoChange","from","to","addTrack","localTractChange","setAudioTrack","audioTrack","localAudioChange","renderLocalStreamToContainer","getAllInputResource","all","enumerateDevices","audio","filter","res","kind","video","useDefaultDevice","getUserMedia","getAudioTracks","getVideoTracks","useAudio","deviceId","constraints","Object","assign","useDeviceVideo","useDeskTopVideo","getDisplayMedia","disableAudio","enabled","enableAudio","disableVideo","enableVideo","close","RTCPeerConnectionHandler","videoCodecs","audioCodecs","audioReciveCodecs","preferCodec","peerConnection","buildConnection","RTCPeerConnection","onIceCandidate","reciveTrack","prev","remoteStream","prevSender","getSenders","find","sender","replaceTrack","emitLocalStreamChange","isInMeeting","hasRemoteVideo","strem","some","muted","readyState","localStreamChange","audioOnly","emitRemoteStreamChange","trigerStreamChange","timeout","emitStreamTimeout","clearTimeout","setTimeout","videoCodec","audioCodec","senderVideoCapabilities","RTCRtpSender","getCapabilities","push","codecs","codec","mimeType","reciverVideoCapabilities","RTCRtpReceiver","senderAudioCapabilities","reciverAudioCapabilities","trackIsInPeerConnection","_b","id","updateTracks","signalingState","Error","error","getTransceivers","transceiver","setCodecPreferences","errorMessage","createOffer","offer","static","sdp","split","lines","indexOf","join","formatOffer","setLocalDescription","setOffer","setRemoteDescription","type","createAnswer","answer","setAnswer","setRemoteIce","ice","candidate","RTCIceCandidate","addIceCandidate","closeConnection","ontrack","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","onconnectionstatechange","RtcAbstractSession","rtcClient","sessionId","remoteNumber","reciveIceRequest","JSON","parse","getRemoteNumber","destory","isSendBye","removeAllListeners","sendBye","removeSession","rejectCall","inviteSeq","checkIsNotUndefined","acceptCall","inviteOffer","ok","pickNewConnection","x","item","sendDtmf","dtmf","RtcSession","responseCallType","unknown","start","status","invite","hasAudio","line","startsWith","hasVideo","audioVideo","addRemote","SignalMessage","req","data","seq","seqNum","registerid","random","String","Date","now","RtcWebSocket","server","heartBeat","heartTime","ws","SocketWorker","configHeartBeat","connect","initWebsocket","onmessage","message","connected","postMessage","cmd","url","send","sendMessage","RtcSocketServerHandler","localNumber","expireTime","activeServer","testWs","addrs","reduce","pre","cur","av","socketWorker","WebSocket","onopen","onclose","reConnect","useWs","length","MESSAGE_TYPE_REGISTER","expire","on","onConnected","disconnected","onDisConnected","onReviceMessage","unRegister","RtcSignalServer","asyncProducer","Map","sendRespondableMessage","set","getAsyncResolve","analyzer","get","delete","clear","call","processMessage","RtcSignalApi","register","user","cid","MESSAGE_TYPE_INVITE","sendIce","MESSAGE_TYPE_BYE","sendPttMessage","MESSAGE_TYPE_INFO","info","msg","EventHandlers","init","$getMaxListeners","that","_maxListeners","defaultMaxListeners","emitNone","handler","isFn","self","len","listeners","arrayClone","i","emitOne","arg1","emitTwo","arg2","emitThree","arg3","emitMany","_addListener","target","prepend","m","events","existing","TypeError","_events","newListener","_eventsCount","unshift","warned","w","name","emitter","count","warn","_onceWrap","fired","g","removeListener","arguments","listenerCount","evlistener","arr","copy","Array","prototype","create","usingDomains","domain","active","getPrototypeOf","n","isNaN","getMaxListeners","er","doError","err","context","domainEmitter","domainThrown","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","k","pop","spliceOne","off","key","keys","ret","unwrapListeners","eventNames","Reflect","ownKeys","clientEvent","pttErrorCode","PttWebSocketEvent","PttWebSocket","stringify","PttClient","socket","timer","waitinggroup","speaker","activeGroup","talking","autoReconnect","async","destorySocket","setInterval","initClient","code","number","group","g_num","joinGroup","ptts","port","quitGroup","talk","RtcClientBase","config","defaultExpireTime","enablePtt","pttServer","initPttClient","pttClient","client","createPttClient","RtcCalledSession","offerSdp","callType","RtcClient","allSession","createSession","session","size","crypto","getRandomValues","Uint8Array","byte","toString","toUpperCase","nanoid","MESSAGE_TYPE_REINVITE","se","reInvite","MESSAGE_TYPE_ICE","sess","bye","FPRE","FPREInfo","IMS","IMSInfo","createRtcClient","catch","authDevice"],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/session/RtcSessionEvent.ts","../src/client/RtcClientEvent.ts","../src/message/SingalMessageType.ts","../src/peer/StreamUtil.ts","../src/log/Logger.ts","../src/session/RtcInviteStatus.ts","../src/session/RtcCalledTyped.ts","../src/websocket/RtcWebSocketEvent.ts","../src/peer/LocalStreamHandler.ts","../src/peer/RTCPeerConnectionHandler.ts","../src/session/UscRtcProtocol.ts","../src/session/RtcAbstractSession.ts","../src/session/RtcSession.ts","../src/message/SignalMessage.ts","../src/websocket/RtcWebSocket.ts","../src/websocket/RtcSocketServerHandler.ts","../src/client/RtcSignalServer.ts","../src/client/RtcSignalApi.ts","../node_modules/usc-ptt-sdk/dist/index.js","../src/client/RtcClientBase.ts","../src/session/RtcCalledSession.ts","../src/client/RtcClient.ts","../node_modules/nanoid/index.browser.js","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcSessionEvent {\n //接收到bye请求\n bye = \"bye\",\n //接收到远程的流信息\n stream = \"stream\",\n //会话过程中修改视频流会触发重建invite\n reInvite = \"reInvite\",\n //本地音频流发生变化,流的变化以及是否启用的变化都会触发\n localAudioChange = \"localAudioChange\",\n //本地视频流发生变化,流的变化以及是否启用的变化都会触发\n localVideoChange = \"localVideoChange\",\n //本地流发生变化\n localStreamChange = \"localStreamChange\"\n}","export enum RtcClientEvent {\n connected = \"connected\", //the socket is connected to the server\n\n disconnected = \"disconnected\", //the socket is dis connected to the server\n\n invite = \"invite\",//somebody call you\n}\nexport enum PTTEvent {\n PTTInfo = \"PTTInfo\",\n FPREInfo = 'FPREInfo',\n IMSInfo = \"IMSInfo\",\n ERROR = 'error',\n SPEAKER = 'speaker',\n TALKING = 'talking',\n ACTIVE_GROUP = 'activeGroup',\n JOIN_INFO = 'joinInfo',\n // SERVER_CLOSE = 'serverClose',\n // SERVER_ERROR = 'serverError',\n // DISCONNECTED = 'disConnected'\n\n}","/**\n * 信令服务器的消息头\n * @author xiechanglei\n */\nexport enum SignalMessageType {\n MESSAGE_TYPE_REGISTER = \"REGISTER\",//注册\n MESSAGE_TYPE_INVITE = \"INVITE\",//邀请会话\n MESSAGE_TYPE_REINVITE = \"reINVITE\",//邀请会话\n MESSAGE_TYPE_ICE = \"ICE\",//ice探测消息发送\n MESSAGE_TYPE_INFO = \"INFO\",\n MESSAGE_TYPE_BYE = \"BYE\",//挂断\n}\n\nexport enum PttMessageType {\n FPRE = 'fpre',\n IMS = 'ims',\n PTT_QUERY_ONLINE_USER = \"15\",//在线用户查询\n PTT_ANSWER_ONLINE_USER = \"115\",//服务响应在线用户列表\n PTT_QUERY_INFO = \"16\",//群组在线用户查询通知\n PTT_QUERY_INFO_CONFIRM = \"116\",//确认消息\n}","/**\n * 销毁dom上渲染的流\n */\nexport const releaseStreamFromContainer = (container?: HTMLVideoElement | HTMLAudioElement) => {\n if (container !== undefined) {\n container.pause()\n container.removeAttribute(\"src\")\n container.removeAttribute(\"srcObject\")\n }\n}\n/**\n * 将流渲染到dom上\n */\nexport const renderStreamToContainer = (stream?: MediaStream, container?: HTMLVideoElement | HTMLAudioElement) => {\n if (stream !== undefined && container !== undefined) {\n container.srcObject = stream\n container.play()\n }\n}\n\n/**\n * 关闭流\n */\nexport const closeStreamAndTrack = (stream: MediaStream) => {\n stream.onaddtrack = null;\n stream.onremovetrack = null;\n stream.getTracks().forEach(track => {\n stream?.removeTrack(track)\n track.onended = null\n track.onmute = null\n track.onunmute = null\n track.stop()\n })\n}","//是否打印日志\nlet logAble = false\n//是否在网页上显示日志\n\nexport const log = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const error = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const disableLog = () => {\n logAble = false\n}\n\nexport const enableLog = () => {\n logAble = true\n}","export enum RtcInviteStatus {\n timeout = 408,\n reject = 488,\n busy = 486,\n notfound = 404,\n notAllowedMedia = 415,//不允许的媒体类型,目前至少包好一个音频媒体流\n ok = 200\n}","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcCalledType {\n //接收到bye请求\n audio = \"audio\",//音频呼叫\n video = \"video\",//视频呼叫\n audioVideo = \"audioVideo\",//音视频呼叫\n unknown = \"unknown\"//未知\n}","export enum RtcWebSocketEvent {\n connected = \"connected\",// the socket is connected\n disconnected = \"disconnected\", // the socket is dis connected\n message = \"message\" //收到消息\n}","import { renderStreamToContainer } from './StreamUtil';\nimport { RtcSessionEvent } from '../session/RtcSessionEvent';\nimport EventEmitter from 'events'\nimport { log } from '../log/Logger'\n\n\n\n/**\n * devicechange 设备输入变化\n */\nexport default abstract class LocalStreamHandler extends EventEmitter {\n constructor() {\n super()\n // ...........................................................................\n super.setMaxListeners(0)\n }\n //本地流媒体\n audioTrack: MediaStreamTrack | undefined\n videoTrack: MediaStreamTrack | undefined\n localMediaStream: MediaStream | undefined = new MediaStream()\n //https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings\n videoConstrains = { width: { ideal: 1920 }, height: { ideal: 1080 }, frameRate: { ideal: 20, max: 30 }, aspectRatio: { ideal: 16 / 9 } }\n audioConstrants = { noiseSuppression: true, echoCancellation: true, autoGainControl: true }\n\n /**\n * 释放track\n */\n releaseTrack(track: MediaStreamTrack | undefined) {\n if (track !== undefined) {\n this.localMediaStream?.removeTrack(track)\n track.stop()\n }\n }\n\n /**\n * 注册设备变化事件,记得组件销毁的时候remove\n */\n addDeviceChangeListener(listener: any) {\n navigator.mediaDevices.addEventListener(\"devicechange\", listener)\n }\n removeDeviceChangeListener(listener: any) {\n navigator.mediaDevices.removeEventListener(\"devicechange\", listener)\n }\n\n /**\n * 设置本地视频输入流\n */\n setVideoTrack(videoTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localVideoChange, { from: this.videoTrack, to: videoTrack })\n if (this.videoTrack !== videoTrack) {\n this.localMediaStream?.addTrack(videoTrack)\n this.localTractChange(this.videoTrack, videoTrack)\n }\n this.videoTrack = videoTrack\n }\n\n\n /**\n * 设置本地音頻输入流\n */\n setAudioTrack(audioTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localAudioChange, { from: this.audioTrack, to: audioTrack })\n if (this.audioTrack !== audioTrack) {\n this.localMediaStream?.addTrack(audioTrack)\n this.localTractChange(this.audioTrack, audioTrack)\n }\n this.audioTrack = audioTrack\n }\n\n abstract localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined): void\n\n /**\n * 将流渲染到dom上\n */\n renderLocalStreamToContainer(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n renderStreamToContainer(this.localMediaStream, container)\n }\n\n /**\n * 获取所有的输入设备源\n */\n async getAllInputResource() {\n let all = await navigator.mediaDevices.enumerateDevices();\n return { audio: all.filter(res => res.kind === \"audioinput\"), video: all.filter(res => res.kind === \"videoinput\") }\n }\n\n /**\n * 使用默认的音视频输入源\n */\n async useDefaultDevice(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n let constraints = { audio: true, video: true }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n this.setVideoTrack(stream.getVideoTracks()[0])\n this.renderLocalStreamToContainer(container)\n }\n /**\n * 设置本地音频输入流\n * https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia\n * @param deviceId 设备id,如果为空,表示使用默认输入设备\n */\n async useAudio(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: { ...this.audioConstrants }, video: false } : { video: false, audio: { deviceId, ...this.audioConstrants } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n return stream.getAudioTracks()[0] //modify by jzg 此处需要返回该媒体流对象, 防止在获取流媒体过程中收到挂断请求, 导致流媒体没释放\n }\n\n /**\n * 使用设备视频流\n */\n async useDeviceVideo(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: false, video: { ...this.videoConstrains } } : { audio: false, video: { deviceId, ...this.videoConstrains } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n\n /**\n * 使用桌面视频流\n */\n async useDeskTopVideo() {\n let stream = await navigator.mediaDevices.getDisplayMedia({ video: { ...this.videoConstrains }, audio: false })\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n /**\n * 禁用本地音频输入\n */\n disableAudio() {\n if (this.audioTrack !== undefined && this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = false\n this.setAudioTrack(this.audioTrack)\n }\n }\n /**\n * 启用本地音频输入\n */\n enableAudio() {\n if (this.audioTrack !== undefined && !this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = true\n this.setAudioTrack(this.audioTrack)\n }\n }\n\n /**\n * 禁用本地视频输入\n */\n disableVideo() {\n if (this.videoTrack !== undefined && this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = false\n this.setVideoTrack(this.videoTrack)\n }\n\n }\n\n /**\n * 启用本地视频输入\n */\n enableVideo() {\n if (this.videoTrack !== undefined && !this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = true\n this.setVideoTrack(this.videoTrack)\n }\n }\n\n close() {\n this.releaseTrack(this.audioTrack)\n this.releaseTrack(this.videoTrack)\n this.audioTrack = undefined\n this.videoTrack = undefined\n this.localMediaStream = undefined\n }\n}\n","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { log, error } from '../log/Logger'\nimport { UscRtcProtocol } from '../session/UscRtcProtocol'\nimport LocalStreamHandler from './LocalStreamHandler'\nimport { closeStreamAndTrack } from './StreamUtil';\n\n/**\n * 链接流程\n * https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling\n * TODO 1.音频呼叫\n * TODO 2.会话的过程中切换流\n */\nexport default abstract class RTCPeerConnectionHandler extends LocalStreamHandler {\n //peers\n peerConnection?: RTCPeerConnection\n\n //custorm codec\n videoCodecs: RTCRtpCodecCapability[] = []\n audioCodecs: RTCRtpCodecCapability[] = []\n audioReciveCodecs: RTCRtpCodecCapability[] = []\n remoteStream?: MediaStream\n emitStreamTimeout?: NodeJS.Timeout;\n constructor() {\n super()\n this.preferCodec()\n this.peerConnection = this.buildConnection()\n }\n\n /**生成一个peerconnection */\n buildConnection() {\n //指定dtls 证书\n // let cert = await RTCPeerConnection.generateCertificate({\n // name: 'RSASSA-PKCS1-v1_5',\n // hash: 'SHA-256',\n // modulusLength: 2048,\n // publicExponent: new Uint8Array([1, 0, 1])\n // })\n // this.peerConnection = new RTCPeerConnection({ certificates: [cert] });\n let peerConnection = new RTCPeerConnection()\n peerConnection.addEventListener(\"connectionstatechange\", (e) => log(\"connectionstatechange\", e))\n peerConnection.addEventListener(\"icecandidate\", (e) => { log(\"icecandidate\", e); this.onIceCandidate(e) })\n peerConnection.addEventListener(\"datachannel\", (e) => log(\"datachannel\", e))\n peerConnection.addEventListener(\"icecandidateerror\", (e) => log(\"icecandidateerror\", e))\n peerConnection.addEventListener(\"iceconnectionstatechange\", (e) => log(\"iceconnectionstatechange\", e))\n peerConnection.addEventListener(\"icegatheringstatechange\", (e) => log(\"icegatheringstatechange\", e))\n peerConnection.addEventListener(\"negotiationneeded\", (e) => log(\"negotiationneeded\", e))\n peerConnection.addEventListener(\"signalingstatechange\", (e) => log(\"signalingstatechange\", e))\n peerConnection.addEventListener(\"track\", (e) => this.reciveTrack(e))\n return peerConnection\n }\n\n\n\n //当流本地的流发生变化的时候,判断当前是否处于会话状态,从而进行处理\n async localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined) {\n if (this.remoteStream !== undefined && this.peerConnection !== undefined) {//如果处于会话过程中,那么判断之前的sender是否含有该类型的流,如果存在那么就替换,如果不存在,重新发offer\n if (next !== undefined) { //修改流\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === next.kind)\n if (prevSender !== undefined) {\n prevSender.replaceTrack(next)\n } else {\n //TODO\n //reoffer 重发offer的时候是三个sender? 然后再peerConnection.removetrack\n }\n } else { //删除流,如果原先存在对应类型的流,直接stop?还是reoffer\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === prev?.kind)\n if (prevSender !== undefined) {\n this.peerConnection.removeTrack(prevSender)\n }\n }\n }\n\n //TODO \n if (next !== undefined) {\n next.onended = (e) => log(\"local track end\", e)\n next.onmute = (e) => {\n log(\"local mute\", e)\n this.emitLocalStreamChange()\n }\n next.onunmute = (e) => {\n log(\"local unmute\", e)\n this.emitLocalStreamChange()\n }\n }\n\n this.releaseTrack(prev)\n this.emitLocalStreamChange()\n }\n\n /**\n * 是否处于会议当中\n */\n isInMeeting() {\n return this.remoteStream !== undefined\n }\n\n hasRemoteVideo(strem?: MediaStream) {\n return strem?.getVideoTracks().some(track => track.muted === false && track.readyState === \"live\") ?? false\n }\n\n\n emitLocalStreamChange() {\n this.emit(RtcSessionEvent.localStreamChange, { audioOnly: !this.hasRemoteVideo(this.localMediaStream), stream: this.localMediaStream })\n }\n\n /**\n * 通知用户远程的流发生了变化\n */\n emitRemoteStreamChange() {\n this.emit(RtcSessionEvent.stream, { audioOnly: !this.hasRemoteVideo(this.remoteStream), stream: this.remoteStream })\n }\n\n /**\n * 做个100ms的延时来缓冲流的变化\n */\n trigerStreamChange(timeout: number = 100) {\n if (this.emitStreamTimeout !== undefined) {\n clearTimeout(this.emitStreamTimeout)\n }\n this.emitStreamTimeout = setTimeout(() => {\n this.emitRemoteStreamChange()\n this.emitStreamTimeout = undefined\n }, timeout)\n }\n\n /**\n * 接受track时候的处理事件\n */\n reciveTrack(e: RTCTrackEvent) {\n log(\"recive track\", e)\n if (this.remoteStream === undefined) {\n this.remoteStream = new MediaStream()\n }\n e.track.addEventListener(\"ended\", () => this.trigerStreamChange())\n e.track.addEventListener(\"mute\", () => this.trigerStreamChange(3000))\n e.track.addEventListener(\"unmute\", () => this.trigerStreamChange(10))\n this.remoteStream.addTrack(e.track)\n this.trigerStreamChange()\n }\n\n\n abstract onIceCandidate(e: RTCPeerConnectionIceEvent): any;\n /**\n * use custorm codec , \n * default is H264/PCMA,\n * TODO 火狐浏览器没有RTCRtpSender.getCapabilities相关方法,是否在createoffer之后进行sdp协议处理来适配编码工作\n * @param videoCodec \n * @param audioCodec \n */\n preferCodec(videoCodec = \"H264\", audioCodec = \"PCMA\") {\n this.videoCodecs = []\n let senderVideoCapabilities = RTCRtpSender.getCapabilities(\"video\")\n if (senderVideoCapabilities !== null) {\n this.videoCodecs.push(...senderVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n let reciverVideoCapabilities = RTCRtpReceiver.getCapabilities(\"video\")\n if (reciverVideoCapabilities !== null) {\n this.videoCodecs.push(...reciverVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n this.audioCodecs = []\n let senderAudioCapabilities = RTCRtpSender.getCapabilities(\"audio\")\n if (senderAudioCapabilities !== null) {\n this.audioCodecs.push(...senderAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n let reciverAudioCapabilities = RTCRtpReceiver.getCapabilities(\"audio\")\n if (reciverAudioCapabilities !== null) {\n this.audioCodecs.push(...reciverAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n }\n\n trackIsInPeerConnection(track: MediaStreamTrack) {\n return this.peerConnection?.getSenders().some(sender => sender.track?.id === track.id) ?? false\n }\n /**\n * 将本地的track更新到peereonnection 中\n * 只接受流:没有本地stream rtcPeerConnection.addTransceiver(\"video\", {direction: \"recvonly\"});rtcPeerConnection.addTransceiver(\"audio\", {direction: \"recvonly\"});\n * recvonly/sendonly/sendrecv/inactive\n * \n */\n updateTracks() {\n if (this.peerConnection === undefined || this.peerConnection.signalingState === 'closed') {\n throw new Error(\"session is closed !\")\n }\n if (this.audioTrack === undefined && this.videoCodecs === undefined) {\n throw new Error(\"no input found\")\n }\n\n //这里addtrack不指定stream,接收的地方就得ontrack,指定stream,表示由RTCPeerConnection 接管流的管理\n if (this.audioTrack !== undefined && !this.trackIsInPeerConnection(this.audioTrack)) {\n try {\n this.peerConnection.addTrack(this.audioTrack)\n } catch (error) {\n }\n }\n if (this.videoTrack !== undefined && !this.trackIsInPeerConnection(this.videoTrack)) {\n try {\n this.peerConnection.addTrack(this.videoTrack)\n } catch (error) {\n }\n }\n //修改视频编码\n try {\n this.peerConnection.getTransceivers().forEach(transceiver => {\n if (transceiver.sender.track !== null) {\n if (transceiver.sender.track.kind === \"video\") {\n transceiver.setCodecPreferences([...this.videoCodecs])\n } else if (transceiver.sender.track.kind === \"audio\") {\n transceiver.setCodecPreferences([...this.audioCodecs])\n }\n }\n })\n } catch (errorMessage) {\n error(\"preferCodec error\", errorMessage, this.audioCodecs, this.videoCodecs)\n }\n }\n\n\n /**\n * create and format offer\n */\n async createOffer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let offer = await this.peerConnection.createOffer()\n offer = UscRtcProtocol.formatOffer(offer)\n await this.peerConnection.setLocalDescription(offer)\n return offer\n }\n\n /**\n * set offer \n */\n async setOffer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"offer\", sdp })\n }\n\n /**\n * create answer\n */\n async createAnswer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let answer = await this.peerConnection.createAnswer()\n this.peerConnection.setLocalDescription(answer)\n return answer\n }\n\n /**\n * set answer\n */\n async setAnswer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"answer\", sdp })\n }\n\n\n /**\n * set ice candidate\n * @param ice \n */\n setRemoteIce(ice: RTCIceCandidateInit) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n let candidate = new RTCIceCandidate(ice)\n this.peerConnection.addIceCandidate(candidate)\n }\n\n /**\n * 关闭链接\n */\n closeConnection(peerConnection: RTCPeerConnection) {\n peerConnection.close()\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onsignalingstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n peerConnection.onnegotiationneeded = null;\n peerConnection.onicecandidateerror = null;\n peerConnection.ondatachannel = null;\n peerConnection.onconnectionstatechange = null\n\n }\n\n /**\n * 销毁会话\n */\n close() {\n super.close()\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)\n this.peerConnection = undefined\n }\n if (this.remoteStream !== undefined) {\n closeStreamAndTrack(this.remoteStream)\n }\n }\n}","/**\n * usc webrtc 协议格式\n */\n\nexport class UscRtcProtocol {\n static formatOffer(offer: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n let { sdp } = offer\n if (sdp === undefined) {\n throw new Error(\"offer sdp is empty\")\n }\n sdp = sdp.split(\"\\r\\n\").filter(lines => lines.indexOf(\"a=group:BUNDLE\") === -1).join(\"\\r\\n\")\n offer.sdp = sdp\n return offer\n }\n}","import { closeStreamAndTrack } from \"src/peer/StreamUtil\"\nimport { RtcClient } from \"../client/RtcClient\"\nimport RTCPeerConnectionHandler from \"../peer/RTCPeerConnectionHandler\"\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\n\nexport abstract class RtcAbstractSession extends RTCPeerConnectionHandler {\n sessionId: string\n //隶属的rtcclient\n rtcClient: RtcClient | undefined\n //远端号码\n remoteNumber: string | undefined\n //invite的seq\n inviteSeq?: number\n //offer\n inviteOffer?: string\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string | undefined) {\n super()\n this.sessionId = sessionId\n this.rtcClient = rtcClient\n this.remoteNumber = remoteNumber\n }\n\n reciveIceRequest({ ice }: any) {\n this.setRemoteIce(JSON.parse(ice))\n }\n\n\n //获取远端主叫号码\n getRemoteNumber(): string | undefined {\n return this.remoteNumber\n }\n\n\n /**\n * ice candidate is trigger after createoffer or createanswer\n */\n onIceCandidate(e: RTCPeerConnectionIceEvent) {\n // if (e && e.candidate) {\n // this.rtcClient.ice(this.remoteNumber, this.sessionId, e.candidate)\n // }\n }\n\n /**\n * 销毁会话\n */\n destory(isSendBye: boolean = true) {\n this.removeAllListeners()\n if (this.rtcClient !== undefined) {\n if (this.remoteNumber !== undefined) {\n if (isSendBye)\n this.rtcClient.sendBye(this.remoteNumber, this.sessionId)\n this.remoteNumber = undefined\n }\n this.rtcClient.removeSession(this)\n }\n this.rtcClient = undefined\n super.close()\n }\n\n\n //拒绝会话\n rejectCall() {\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n rtcClient.answer(RtcInviteStatus.reject, inviteSeq, remoteNumber, this.sessionId)\n this.destory()\n }\n\n //接受会话,不过在这之前应该使用对应接口准备好本地的流(switchToUserMedia/switchToDeviceMedia)\n async acceptCall() {\n if (this.inviteOffer !== undefined) {\n await this.setOffer(this.inviteOffer)\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n let { sdp } = await this.createAnswer()\n rtcClient.answer(RtcInviteStatus.ok, inviteSeq, remoteNumber, this.sessionId, sdp)\n }\n }\n\n /**\n * 当同一个会议又收到offer的时候,尝试重新做一个链接,\n * 直接setoffer服务端有一些问题,使用此方案来处理一下,看看是否可行\n */\n async pickNewConnection() {\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)//关闭connection\n }\n this.peerConnection = this.buildConnection()\n if (this.remoteStream !== undefined) {//当前处于会话过程中\n closeStreamAndTrack(this.remoteStream)//关闭远程的流\n this.remoteStream = undefined\n this.acceptCall()\n }\n }\n\n checkIsNotUndefined(...x: any[]) {\n for (const item of x) {\n if (item === undefined) {\n throw new Error(`someone is undefined`)\n }\n }\n return x\n }\n\n //发送dtmf消息\n async sendDtmf(dtmf: string): Promise<any> {\n this.rtcClient?.sendDtmf(this.remoteNumber!, this.sessionId, dtmf)\n }\n}","import { RtcAbstractSession } from './RtcAbstractSession'\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\nimport { RtcCalledType } from './RtcCalledTyped';\n\n/**\n * Rtc 会话对象封装\n * 流程:\n * 1.创建会话\n * 1.(选择本地流/添加被叫用户)\n * 2.发送请求\n * 3.接受响应\n * 4.开始会话,被拒绝(结束会话)\n * 5.被挂断,主动挂断(结束会话)\n * 6.用户掉线\n */\nexport class RtcSession extends RtcAbstractSession {\n\n responseCallType: RtcCalledType = RtcCalledType.unknown\n /**\n * 开始会话\n */\n async start() {\n let [rtcClient, remoteNumber] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber)\n let offer = await this.createOffer()\n let { status, sdp } = await rtcClient.invite(remoteNumber, this.sessionId, offer.sdp)\n if (status === RtcInviteStatus.ok) {\n await this.setAnswer(sdp);\n }\n\n const lines = sdp.split(\"\\r\\n\") as string[]\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.responseCallType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n return status\n }\n\n /**\n * 添加会话用户\n */\n addRemote(remoteNumber: string) {\n this.remoteNumber = remoteNumber\n }\n}","import { SignalMessageType } from \"./SingalMessageType\"\n\n//消息体\nexport class SignalMessage {\n static random: string = String(Date.now())\n static seqNum: number = 0\n /**\n * 请求类型\n */\n req: SignalMessageType\n /**\n * 每次请求序列号增加1,后端设计如此\n * 导致前端websocket通道无法复用,对于每个账号都使用单独的websocket\n */\n seq: number\n\n /**\n * 信令发送方\n */\n from: string\n\n /**\n * 信令接收方 \n */\n to: string\n\n /**\n * 注册id,后端设计如此,注册成功之后,心跳注册registerid的不变,如果是新的注册,比如断网之后重新连接上,registerid要改变\n */\n registerid: string\n\n constructor(req: SignalMessageType, from: string, to: string, data?: Object) {\n this.req = req\n this.seq = SignalMessage.seqNum++\n this.from = from\n this.to = to\n this.registerid = `${SignalMessage.random}@${from}`\n if (data !== undefined) {\n Object.assign(this, data)\n }\n }\n}","import { log } from '../log/Logger'\nimport { EventEmitter } from \"events\"\nimport { RtcWebSocketEvent } from \"./RtcWebSocketEvent\"\nimport SocketWorker from 'web-worker:./worker.js'\nimport { SignalMessage } from \"../message/SignalMessage\"\n/**\n * 对websocket进行封装\n */\nexport class RtcWebSocket extends EventEmitter {\n /**\n * signal server address\n */\n server: string\n /**\n * websocket client\n */\n ws: Worker\n\n constructor(server: string, heartBeat: SignalMessage, heartTime: number) {\n super()\n this.server = server\n this.ws = new SocketWorker()\n this.configHeartBeat(heartBeat, heartTime)\n }\n\n /**\n * connect to the websocket server\n */\n connect() {\n this.initWebsocket()\n this.ws.onmessage = (e: any) => {\n const { type, data } = e.data\n switch (type) {\n case 'webSocket':\n log(\"websocket recive message \", data)\n this.emit(RtcWebSocketEvent.message, data)\n return;\n case 'open':\n log(\"websocket connected \", this.server)\n this.emit(RtcWebSocketEvent.connected)\n return\n }\n }\n }\n\n configHeartBeat(heartBeat: SignalMessage, heartTime: number) {\n log(\"websocket heartBeat\", heartBeat)\n log(\"websocket heartTime \", heartTime)\n\n this.ws.postMessage({ cmd: 'config', heartBeat, heartTime })\n }\n\n initWebsocket() {\n // 连接socket\n this.ws.postMessage({ cmd: 'start', url: this.server })\n }\n\n send(data: Object) {\n this.ws.postMessage({ cmd: 'msg', data })\n }\n\n\n /**\n * 主动断开websocket,不会触发重连机制\n */\n close(): void {\n this.ws.postMessage({ cmd: 'close' })\n }\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n log(\"websocket send message \", message)\n if (message !== undefined && this.ws !== undefined) {\n this.ws.postMessage({ cmd: 'msg', data: message })\n }\n }\n}","import { EventEmitter } from 'events'\nimport { RtcWebSocketEvent } from './RtcWebSocketEvent'\nimport { RtcWebSocket } from \"./RtcWebSocket\"\nimport { SignalMessage } from '../message/SignalMessage'\nimport { SignalMessageType } from '../message/SingalMessageType'\n\n/**\n * 内部持有一个websocket,并且对websocket进行管理,对外提供发送消息的接口以及相关事件\n */\nexport abstract class RtcSocketServerHandler extends EventEmitter {\n // local sip number\n localNumber: string\n\n //register signal message expire time (seconds)\n expireTime: number\n heartTime: number\n\n socketWorker?: RtcWebSocket\n server: string | string[]\n activeServer: string = ''\n\n // constructor(server: string, localNumber: string, expireTime: number, heartTime: number) {\n // super(server, localNumber, expireTime, heartTime)\n // }\n constructor(server: string, localNumber: string, expireTime: number, heartTime: number) {\n super()\n this.server = server\n this.localNumber = localNumber\n this.expireTime = expireTime\n this.heartTime = heartTime\n super.setMaxListeners(0)\n }\n\n\n abstract onReviceMessage(data: any): any\n\n abstract onConnected(): any\n\n abstract onDisConnected(e: CloseEvent): any\n abstract unRegister(): void\n\n /**\n * 测试可用的websocket地址\n */\n async testWs(addrs: string[]) {\n return addrs.reduce((pre, cur) => {\n return pre.then((av) => Promise.resolve(av), (av) => new Promise((resolve, reject) => {\n const socketWorker = new WebSocket(cur)\n socketWorker.onopen = () => {\n av.push(cur)\n socketWorker.close()\n resolve(av)\n }\n socketWorker.onclose = () => {\n reject(av)\n }\n }))\n\n }, Promise.reject([])).then((av) => Promise.resolve(av), (av) => Promise.resolve(av))\n }\n\n /**\n * 修改/设置 websocket地址\n */\n async reConnect(): Promise<void> {\n this.destory()\n let server: string[] = []\n if (this.server !== undefined) {\n if (typeof this.server === 'string') {\n server = [this.server]\n } else {\n server = this.server\n }\n }\n const useWs = await this.testWs(server)\n return new Promise((resolve, reject) => {\n if (useWs.length > 0) {\n this.activeServer = useWs[0]\n let socketWorker = new RtcWebSocket(this.activeServer, new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime }), this.heartTime)\n socketWorker.on(RtcWebSocketEvent.connected, () => {\n this.socketWorker = socketWorker\n this.onConnected()\n resolve()\n })\n socketWorker.on(RtcWebSocketEvent.disconnected, (e: CloseEvent) => {\n this.socketWorker = undefined\n this.onDisConnected(e)\n reject(\"socketWorker connecion failed\")\n })\n socketWorker.on(RtcWebSocketEvent.message, (data) => this.onReviceMessage(data))\n socketWorker.connect()\n } else {\n reject(\"server is empty\")\n }\n })\n }\n\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n if (this.socketWorker !== undefined) {\n this.socketWorker.sendMessage(message)\n } else {\n throw new Error(\"socketWorker is closed\")\n }\n }\n\n\n //销毁socket\n destory() {\n if (this.socketWorker !== undefined) {\n this.unRegister()\n this.socketWorker.close()\n this.socketWorker = undefined\n }\n // this.removeAllListeners()\n }\n}","import { SignalMessage } from './../message/SignalMessage';\nimport { RtcSocketServerHandler } from \"../websocket/RtcSocketServerHandler\"\nimport { RtcClientEvent } from './RtcClientEvent';\n\n/**\n * rtc 信令服务器,用来处理信令消息,以及按照协议获取信令的返回结果\n */\nexport abstract class RtcSignalServer extends RtcSocketServerHandler {\n // promise request \n asyncProducer: Map<number, Function> = new Map<number, Function>()\n\n /**\n * 发送需要回应消息的信令消息\n */\n async sendRespondableMessage(message: SignalMessage): Promise<any> {\n this.sendMessage(message)\n return new Promise((resolve) => this.asyncProducer.set(message.seq, resolve))\n }\n\n /**\n * 获取异步回调\n */\n getAsyncResolve(seq: number): Function | undefined {\n let analyzer = this.asyncProducer.get(seq)\n if (analyzer !== undefined) {\n this.asyncProducer.delete(seq)\n }\n return analyzer\n }\n\n //连接断开\n onDisConnected(e?: CloseEvent) {\n //清空异步等待\n this.asyncProducer.clear()\n //事件上报\n this.emit(RtcClientEvent.disconnected, e)\n }\n\n //invoke on message reviced\n onReviceMessage(data: any) {\n let { status, seq } = data\n if (status !== undefined) {\n this.getAsyncResolve(seq)?.call(undefined, data)\n } else {\n this.processMessage(data)\n }\n }\n\n\n abstract processMessage(data: any): any\n}","import { RtcInviteStatus } from './../session/RtcInviteStatus'\nimport { SignalMessageType } from \"../message/SingalMessageType\"\nimport { SignalMessage } from \"../message/SignalMessage\"\nimport { RtcSignalServer } from \"./RtcSignalServer\"\n\n/**\n * 信令请求Api\n */\nexport abstract class RtcSignalApi extends RtcSignalServer {\n\n /**\n * send register message to the server\n */\n async register(): Promise<any> {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime })\n return this.sendRespondableMessage(message)\n }\n\n unRegister(): void {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": 0 })\n this.sendMessage(message)\n }\n\n /**\n * send a invite request to user\n * @param user the remote user who you want invite \n * @param cid the session id\n * @param sdp sdp content\n * @returns \n */\n async invite(user: string, cid: string, sdp?: string): Promise<any> {\n return this.sendRespondableMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INVITE, this.localNumber, user, { cid, sdp }))\n }\n\n /**\n * send a ice request to user\n * @param user the remote user\n * @param cid session id\n * @param ice ice message\n * @returns \n */\n sendIce(user: string, cid: string, ice: RTCIceCandidate) {\n // return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_ICE, this.localNumber, user, { cid, ice: JSON.stringify(ice) }))\n }\n\n /**\n * send bye message\n * @param user the remote user\n * @param cid session id\n */\n sendBye(user: string, cid: string) {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_BYE, this.localNumber, user, { cid }))\n }\n\n /**\n * answer message\n * @param status answer status\n * @param seq the seq number from offer\n * @param to the remote offer user\n * @param cid session id\n * @param sdp sdp content\n */\n answer(status: RtcInviteStatus, seq: number, to: string, cid: string, sdp?: string) {\n this.sendMessage({ status, seq, from: to, to: this.localNumber, cid, sdp })\n }\n\n //PTT相关接口\n /**\n * answer message\n * @param xd_oper ptt infoType\n * @param xd_name the groupId\n * @param user the ptt user number\n */\n sendPttMessage(data: any) {\n this.sendMessage(data)\n }\n\n //发送dtmf\n async sendDtmf(user: string, cid: string, dtmf: string): Promise<any> {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INFO, this.localNumber, user, { cid, info: { msg: \"dtmf\", dtmf: dtmf } }))\n }\n\n}","var domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active ) ;\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n \n// Alias for removeListener added in NodeJS 10.0\n// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener\nEventEmitter.prototype.off = function(type, listener){\n return this.removeListener(type, listener);\n};\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nconst clientEvent = {\r\n ERROR:'error',\r\n SPEAKER:'speaker',\r\n TALKING:'talking',\r\n ACTIVE_GROUP:'activeGroup',\r\n JOIN_INFO:'joinInfo',\r\n SERVER_CLOSE:'serverClose',\r\n SERVER_ERROR:'serverError',\r\n DISCONNECTED:'disConnected'\r\n};\n\nconst pttErrorCode = {\r\n 400: '消息不符规范',\r\n 401: '验证不通过',\r\n 403: '无权利操作',\r\n 404: '不存在该用户',\r\n 415: '错误参数',\r\n 405: '无法操作',\r\n 424: '不存在XD群',\r\n 425: '管理员没有',\r\n 426: '已存在管理员',\r\n 427: '以前被拒绝过,或者删除过',\r\n 428: '超出所配置的下属管理员的数量',\r\n 429: '群内无用户',\r\n 430: '管理员的索引号冲突',\r\n 431: '还有子管理员存在',\r\n};\n\nconst PttWebSocketEvent = {\r\n connected : \"connected\",// the socket is connected\r\n disconnected : \"disconnected\", // the socket is dis connected\r\n message : \"message\" //收到消息\r\n};\n\n//是否打印日志\r\nlet logAble = true;\r\n//是否在网页上显示日志\r\n\r\nconst log = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst error = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst disableLog = () => {\r\n logAble = false;\r\n};\r\n\r\nconst enableLog = () => {\r\n logAble = true;\r\n};\n\n/**\r\n * 对websocket进行封装\r\n */\r\nclass PttWebSocket extends EventEmitter {\r\n server = ''\r\n ws = null\r\n\r\n constructor(server) {\r\n super();\r\n this.server = server;\r\n }\r\n\r\n /**\r\n * connect to the websocket server\r\n */\r\n connect() {\r\n this.ws = new WebSocket(this.server);\r\n this.ws.onopen = () => {\r\n log(\"websocket connected \", this.server);\r\n this.emit(PttWebSocketEvent.connected);\r\n };\r\n this.ws.onclose = () => {\r\n log(\"websocket disconnected \", this.server);\r\n this.ws = undefined;\r\n this.emit(PttWebSocketEvent.disconnected);\r\n };\r\n this.ws.onmessage = ({ data }) => {\r\n let message = JSON.parse(data);\r\n log(\"websocket recive message \", message);\r\n this.emit(PttWebSocketEvent.message, message);\r\n };\r\n }\r\n\r\n\r\n /**\r\n * 主动断开websocket,不会触发重连机制\r\n */\r\n close() {\r\n if (this.ws !== undefined) {\r\n this.ws.close();\r\n this.ws = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 发送消息\r\n */\r\n sendMessage(message) {\r\n log(\"websocket send message \", message);\r\n if (message !== undefined && this.ws !== undefined && this.ws.readyState === 1) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n}\n\n// import PttSocketServerHandler from '../websocket/PttSocketServerHandler.js'\r\nclass PttClient extends EventEmitter{\r\n socket = undefined\r\n timer = undefined\r\n waitinggroup = undefined\r\n speaker = ''\r\n activeGroup = ''\r\n talking = false\r\n constructor(server, heartTime = 20, autoReconnect = true){\r\n super();\r\n if(!server) return error('服务器地址为空!')\r\n this.server = server;\r\n this.heartTime = heartTime;\r\n this.autoReconnect = autoReconnect;\r\n }\r\n\r\n async initClient(){\r\n this.destorySocket();\r\n return new Promise((resolve, reject) => {\r\n if (this.server !== undefined) {\r\n let socket = new PttWebSocket(this.server);\r\n socket.on(PttWebSocketEvent.connected, () => {\r\n this.socket = socket;\r\n this.timer = setInterval(()=>{\r\n this.sendMessage({\"req\": 0});\r\n },this.heartTime*1000);\r\n resolve();\r\n });\r\n socket.on(PttWebSocketEvent.disconnected, () => {\r\n this.socket = undefined;\r\n if(this.autoReconnect){\r\n setTimeout(()=>{\r\n this.initClient();\r\n },3000);\r\n }else {\r\n this.emit(clientEvent.DISCONNECTED);\r\n }\r\n reject(\"socket connecion failed\");\r\n });\r\n socket.on(PttWebSocketEvent.message, (data) => this.onReviceMessage(data));\r\n socket.connect();\r\n } else {\r\n reject(\"server is empty\");\r\n }\r\n })\r\n }\r\n \r\n // 收到消息\r\n onReviceMessage(data){\r\n log(data);\r\n const { info, msg, res } = data;\r\n if (info === 10){\r\n this.speaker = `${msg.speaker}`;\r\n log(`${this.speaker}正在说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n if (info === 11) {\r\n if (res.code === 200) {\r\n this.activeGroup = this.waitinggroup;\r\n log(`加入组${this.activeGroup}`);\r\n }\r\n else {\r\n this.activeGroup = '';\r\n error(pttErrorCode[res.code]);\r\n this.emit(clientEvent.ERROR,pttErrorCode[res.code]);\r\n }\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n }\r\n if (info === 13) {\r\n if (res.code === 200)\r\n this.talking = true;\r\n else\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n }\r\n \r\n if (info === 14){\r\n this.speaker = '';\r\n log(`${this.speaker}停止说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n \r\n if (info === 15) {\r\n const user = {\r\n user:msg.number,\r\n group:msg.g_num,\r\n code:msg.status,\r\n };\r\n log(`${user}进入组`);\r\n this.emit(clientEvent.JOIN_INFO,user);\r\n }\r\n }\r\n\r\n joinGroup(group, user, ptts, port) {\r\n if (!this.socket)\r\n return\r\n this.waitinggroup = group;\r\n this.sendMessage({\"req\": 1, \"group\": group, \"user\": user, \"ptts\": ptts, \"port\": port });\r\n }\r\n quitGroup() {\r\n if (!this.socket)\r\n return\r\n this.activeGroup = '';\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n this.sendMessage({\"req\": 2});\r\n }\r\n talk() {\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 3});\r\n }\r\n stop() {\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 4});\r\n }\r\n\r\n // 发送消息\r\n sendMessage(message) {\r\n if (this.socket !== undefined) {\r\n this.socket.sendMessage(message);\r\n } else {\r\n throw new Error(\"socket is closed\")\r\n }\r\n }\r\n\r\n //销毁socket\r\n destorySocket() {\r\n if (this.socket !== undefined) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n }\r\n destory(){\r\n this.destorySocket();\r\n }\r\n}\n\nconst createPttClient = async (server, heartTime = 20, autoReconnect = true)=>{\r\n let client = new PttClient(server, heartTime , autoReconnect);\r\n await client.initClient();\r\n return client\r\n};\n\nexport { PttClient, clientEvent, createPttClient, disableLog, enableLog, pttErrorCode };\n","import { error } from 'src/log/Logger'\nimport { RtcSignalApi } from './RtcSignalApi'\nimport { createPttClient, PttClient, clientEvent } from 'usc-ptt-sdk'\n\n/**\n * RTC终端基础类,用来处理心跳等信息\n */\nexport abstract class RtcClientBase extends RtcSignalApi {\n\n //the default register expire time of seconds\n static defaultExpireTime = 60\n\n //the resgister signal heart beat time (seconds)\n pttClient?: any\n pttServer?: string\n enablePtt?: boolean\n constructor(config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }) {\n let expireTime = config.expireTime || RtcClientBase.defaultExpireTime\n super(config.server, config.localNumber, expireTime, config.heartTime || 5)\n this.enablePtt = config.enablePtt\n this.pttServer = config.pttServer\n }\n async initPttClient() {\n if (this.enablePtt) {\n if (!this.pttServer) {\n return Promise.reject('pttServer不存在')\n } else {\n const pttClient = await createPttClient(this.pttServer)\n if (!pttClient)\n return Promise.reject('ptt客户端初始化失败!')\n pttClient.on(clientEvent.ACTIVE_GROUP, (e: any) => {\n this.emit(clientEvent.ACTIVE_GROUP, e)\n })\n pttClient.on(clientEvent.SPEAKER, (e: any) => {\n this.emit(clientEvent.SPEAKER, e)\n })\n pttClient.on(clientEvent.TALKING, (e: any) => {\n this.emit(clientEvent.TALKING, e)\n })\n pttClient.on(clientEvent.JOIN_INFO, (e: any) => {\n this.emit(clientEvent.JOIN_INFO, e)\n })\n pttClient.on(clientEvent.DISCONNECTED, (e: any) => {\n this.emit(clientEvent.DISCONNECTED, e)\n })\n this.pttClient = pttClient\n }\n }\n }\n /**\n * \n * @param group 对讲组Id\n * @param user 用户ptt账号\n * @param ptts ptt对讲组使用的webscoket服务器,从ptt组中获取\n * @param port ptt对讲组使用的webscoket服务器端口,从ptt组中获取\n */\n joinGroup(group: string, user: string, ptts: string, port: number) {\n this.pttClient?.joinGroup(group, user, ptts, port)\n }\n quitGroup() {\n this.pttClient?.quitGroup()\n }\n talk() {\n this.pttClient?.talk()\n }\n stop() {\n this.pttClient?.stop()\n }\n\n onConnected() {\n // this.register()\n }\n onDisConnected() {\n super.onDisConnected()\n }\n\n}","import { RtcCalledType } from './RtcCalledTyped';\nimport { RtcClient } from \"../client/RtcClient\"\nimport { RtcAbstractSession } from \"./RtcAbstractSession\"\n/**\n * 被叫session\n */\nexport class RtcCalledSession extends RtcAbstractSession {\n callType: RtcCalledType = RtcCalledType.unknown\n //invite seq\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string, offerSdp: string, seq: number) {\n super(rtcClient, sessionId, remoteNumber)\n this.inviteSeq = seq\n //不直接setofer,改成存一下,用户接受的时候再set下去,因为对接sip电话的时候,用户还没有同意,流就过来了\n // this.setOffer(offerSdp)\n this.inviteOffer = offerSdp\n const lines = offerSdp.split(\"\\r\\n\")\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.callType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { RtcClientEvent, PTTEvent } from './RtcClientEvent';\nimport { SignalMessageType, PttMessageType } from './../message/SingalMessageType'\nimport { nanoid } from 'nanoid'\nimport { RtcSession } from './../session/RtcSession'\nimport { RtcClientBase } from './RtcClientBase'\nimport { RtcCalledSession } from '../session/RtcCalledSession'\nimport { RtcAbstractSession } from '../session/RtcAbstractSession'\nexport class RtcClient extends RtcClientBase {\n\n allSession: RtcAbstractSession[] = []\n\n //开启一个视频呼叫会话\n createSession(remoteNumber?: string): RtcSession {\n let session = new RtcSession(this, nanoid(), remoteNumber)\n this.allSession.push(session)\n return session\n }\n\n //处理一些服务端主动发送来的消息\n processMessage(data: any) {\n let { req } = data\n if (req === SignalMessageType.MESSAGE_TYPE_INVITE) {//there is a calling\n // let session = this.allSession.find(se => se.sessionId == data.cid)\n // if (session !== undefined) {//resetoffer\n // session.inviteSeq = data.seq\n // session.inviteOffer = data.sdp\n // //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n // session.acceptCall()\n // session.emit(RtcSessionEvent.reInvite)\n // session.pickNewConnection()\n // } else {//new session\n let session = new RtcCalledSession(this, data.cid, data.from, data.sdp, data.seq)\n this.allSession.push(session)\n this.emit(RtcClientEvent.invite, session)\n // }\n } else if (req === SignalMessageType.MESSAGE_TYPE_REINVITE) {\n let session = this.allSession.find(se => se.sessionId == data.cid)\n if (session !== undefined) {//resetoffer\n session.inviteSeq = data.seq\n session.inviteOffer = data.sdp\n //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n session.acceptCall()\n session.emit(RtcSessionEvent.reInvite, session)\n // session.pickNewConnection()\n }\n }\n else if (req === SignalMessageType.MESSAGE_TYPE_ICE) {//recive ice request\n this.allSession.find(sess => sess.sessionId === data.cid)?.reciveIceRequest(data)\n } else if (req === SignalMessageType.MESSAGE_TYPE_BYE) {//recive bye request\n let session = this.allSession.find(sess => sess.sessionId === data.cid)\n if (session !== undefined) {\n session.emit(RtcSessionEvent.bye)\n session.destory(false)\n }\n }\n if (req == PttMessageType.FPRE) {\n // this.sendPttMessage(JSON.stringify({ xd_oper: PttMessageType.PTT_QUERY_INFO_CONFIRM, xd_name: data.xd_name, \"seq\": data.seq }))\n this.emit(PTTEvent.FPREInfo, data)\n }\n if (req == PttMessageType.IMS) {\n this.emit(PTTEvent.IMSInfo, data)\n }\n }\n\n destory() {\n if (this.allSession !== undefined) {\n this.allSession.forEach(session => {\n session.destory()\n });\n }\n super.destory()\n }\n\n removeSession(session: RtcAbstractSession) {\n if (this.allSession !== undefined) {\n this.allSession = this.allSession.filter(sess => sess.sessionId !== session.sessionId)\n }\n }\n\n onDisConnected() {\n super.onDisConnected()\n this.destory()\n }\n\n}","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { RtcClient } from './client/RtcClient'\nimport { RtcInviteStatus } from \"./session/RtcInviteStatus\"\nimport { SignalMessage } from \"./message/SignalMessage\"\n\n/**\n * create a rtc client \n * the heartTime and expireTime units are secounds\n */\nexport const createRtcClient = async (config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }): Promise<RtcClient> => {\n let client = new RtcClient(config)\n await client.reConnect()\n await client.initPttClient().catch((e) => {\n console.error(e);\n })\n SignalMessage.random = String(Date.now()) //modify by jzg\n let message = await client.register()\n\n if (message.status === RtcInviteStatus.ok) {\n return client\n } else {\n client.destory()\n return Promise.reject(message)\n }\n}\n\n/**\n * 获取webrtc授权, 只需要调用一次,在合适的场景下使用就可以了\n */\nexport const authDevice = async () => {\n await navigator.mediaDevices.getUserMedia({ audio: true, video: true })\n}\n\nexport { RtcClient, RtcInviteStatus }\nexport { disableLog, enableLog } from \"./log/Logger\"\nexport { RtcClientEvent, PTTEvent } from \"./client/RtcClientEvent\"\nexport { RtcSessionEvent } from './session/RtcSessionEvent'\nexport { RtcCalledType } from \"./session/RtcCalledTyped\"\nexport { releaseStreamFromContainer, renderStreamToContainer } from \"./peer/StreamUtil\""],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","RtcSessionEvent","RtcClientEvent","PTTEvent","SignalMessageType","PttMessageType","exports","renderStreamToContainer","stream","container","undefined","srcObject","play","closeStreamAndTrack","onaddtrack","onremovetrack","getTracks","forEach","track","removeTrack","onended","onmute","onunmute","stop","logAble","log","title","args","console","RtcInviteStatus","RtcCalledType","RtcWebSocketEvent","LocalStreamHandler","EventEmitter","constructor","super","this","localMediaStream","MediaStream","videoConstrains","width","ideal","height","frameRate","max","aspectRatio","audioConstrants","noiseSuppression","echoCancellation","autoGainControl","setMaxListeners","releaseTrack","_a","addDeviceChangeListener","listener","navigator","mediaDevices","addEventListener","removeDeviceChangeListener","removeEventListener","setVideoTrack","videoTrack","emit","localVideoChange","from","to","addTrack","localTractChange","setAudioTrack","audioTrack","localAudioChange","renderLocalStreamToContainer","getAllInputResource","all","enumerateDevices","audio","filter","res","kind","video","useDefaultDevice","getUserMedia","getAudioTracks","getVideoTracks","useAudio","deviceId","constraints","Object","assign","useDeviceVideo","useDeskTopVideo","getDisplayMedia","disableAudio","enabled","enableAudio","disableVideo","enableVideo","close","RTCPeerConnectionHandler","videoCodecs","audioCodecs","audioReciveCodecs","preferCodec","peerConnection","buildConnection","RTCPeerConnection","onIceCandidate","reciveTrack","prev","remoteStream","prevSender","getSenders","find","sender","replaceTrack","emitLocalStreamChange","isInMeeting","hasRemoteVideo","strem","some","muted","readyState","localStreamChange","audioOnly","emitRemoteStreamChange","trigerStreamChange","timeout","emitStreamTimeout","clearTimeout","setTimeout","videoCodec","audioCodec","senderVideoCapabilities","RTCRtpSender","getCapabilities","push","codecs","codec","mimeType","reciverVideoCapabilities","RTCRtpReceiver","senderAudioCapabilities","reciverAudioCapabilities","trackIsInPeerConnection","_b","id","updateTracks","signalingState","Error","error","getTransceivers","transceiver","setCodecPreferences","errorMessage","createOffer","offer","static","sdp","split","lines","indexOf","join","formatOffer","setLocalDescription","setOffer","setRemoteDescription","type","createAnswer","answer","setAnswer","setRemoteIce","ice","candidate","RTCIceCandidate","addIceCandidate","closeConnection","ontrack","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","onconnectionstatechange","RtcAbstractSession","rtcClient","sessionId","remoteNumber","reciveIceRequest","JSON","parse","getRemoteNumber","destory","isSendBye","removeAllListeners","sendBye","removeSession","rejectCall","inviteSeq","checkIsNotUndefined","acceptCall","inviteOffer","ok","pickNewConnection","x","item","sendDtmf","dtmf","RtcSession","responseCallType","unknown","start","status","invite","hasAudio","line","startsWith","hasVideo","audioVideo","addRemote","SignalMessage","req","data","seq","seqNum","registerid","random","String","Date","now","RtcWebSocket","server","heartBeat","heartTime","ws","SocketWorker","configHeartBeat","connect","initWebsocket","onmessage","message","connected","postMessage","cmd","url","send","sendMessage","RtcSocketServerHandler","localNumber","expireTime","activeServer","testWs","addrs","reduce","pre","cur","av","socketWorker","WebSocket","onopen","onclose","reConnect","useWs","length","MESSAGE_TYPE_REGISTER","expire","on","onConnected","disconnected","onDisConnected","onReviceMessage","unRegister","RtcSignalServer","asyncProducer","Map","sendRespondableMessage","set","getAsyncResolve","analyzer","get","delete","clear","call","processMessage","RtcSignalApi","register","user","cid","MESSAGE_TYPE_INVITE","sendIce","MESSAGE_TYPE_BYE","sendPttMessage","MESSAGE_TYPE_INFO","info","msg","EventHandlers","init","$getMaxListeners","that","_maxListeners","defaultMaxListeners","emitNone","handler","isFn","self","len","listeners","arrayClone","i","emitOne","arg1","emitTwo","arg2","emitThree","arg3","emitMany","_addListener","target","prepend","m","events","existing","TypeError","_events","newListener","_eventsCount","unshift","warned","w","name","emitter","count","warn","_onceWrap","fired","g","removeListener","arguments","listenerCount","evlistener","arr","copy","Array","prototype","create","usingDomains","domain","active","getPrototypeOf","n","isNaN","getMaxListeners","er","doError","err","context","domainEmitter","domainThrown","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","k","pop","spliceOne","off","key","keys","ret","unwrapListeners","eventNames","Reflect","ownKeys","clientEvent","pttErrorCode","PttWebSocketEvent","PttWebSocket","stringify","PttClient","socket","timer","waitinggroup","speaker","activeGroup","talking","autoReconnect","async","destorySocket","setInterval","initClient","code","number","group","g_num","joinGroup","ptts","port","quitGroup","talk","RtcClientBase","config","defaultExpireTime","enablePtt","pttServer","initPttClient","pttClient","client","createPttClient","RtcCalledSession","offerSdp","callType","RtcClient","allSession","createSession","session","size","crypto","getRandomValues","Uint8Array","byte","toString","toUpperCase","nanoid","MESSAGE_TYPE_REINVITE","se","reInvite","MESSAGE_TYPE_ICE","sess","bye","FPRE","FPREInfo","IMS","IMSInfo","catch","pause","removeAttribute"],"mappings":"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"}
|