Packages
membrane_rtc_engine
0.5.1
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.1
0.15.0
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha
Membrane RTC Engine and its client library
Current section
Files
Jump to
Current section
Files
priv/static/index.js
var b=Object.defineProperty,ae=Object.defineProperties;var re=Object.getOwnPropertyDescriptors;var N=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable,E=Math.pow,V=(n,e,t)=>e in n?b(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,$=(n,e)=>{for(var t in e||(e={}))ne.call(e,t)&&V(n,t,e[t]);if(N)for(var t of N(e))ie.call(e,t)&&V(n,t,e[t]);return n},_=(n,e)=>ae(n,re(e)),ce=n=>b(n,"__esModule",{value:!0});var oe=(n,e)=>{ce(n);for(var t in e)b(n,t,{get:e[t],enumerable:!0})};var u=(n,e,t)=>new Promise((a,r)=>{var i=c=>{try{s(t.next(c))}catch(d){r(d)}},o=c=>{try{s(t.throw(c))}catch(d){r(d)}},s=c=>c.done?a(c.value):Promise.resolve(c.value).then(i,o);s((t=t.apply(n,e)).next())});oe(exports,{MembraneWebRTC:()=>P});function G(n){return JSON.stringify(n)}function H(n){return JSON.parse(n)}function f(n,e){var t={type:n};return e&&(t=_($({},t),{data:e})),t}function p(n){return f("custom",n)}var I,se=new Uint8Array(16);function C(){if(!I&&(I=typeof crypto!="undefined"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||typeof msCrypto!="undefined"&&typeof msCrypto.getRandomValues=="function"&&msCrypto.getRandomValues.bind(msCrypto),!I))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return I(se)}var X=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function de(n){return typeof n=="string"&&X.test(n)}var q=de;var l=[];for(y=0;y<256;++y)l.push((y+256).toString(16).substr(1));var y;function le(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=(l[n[e+0]]+l[n[e+1]]+l[n[e+2]]+l[n[e+3]]+"-"+l[n[e+4]]+l[n[e+5]]+"-"+l[n[e+6]]+l[n[e+7]]+"-"+l[n[e+8]]+l[n[e+9]]+"-"+l[n[e+10]]+l[n[e+11]]+l[n[e+12]]+l[n[e+13]]+l[n[e+14]]+l[n[e+15]]).toLowerCase();if(!q(t))throw TypeError("Stringified UUID is invalid");return t}var F=le;function ke(n,e,t){n=n||{};var a=n.random||(n.rng||C)();if(a[6]=a[6]&15|64,a[8]=a[8]&63|128,e){t=t||0;for(var r=0;r<16;++r)e[t+r]=a[r];return e}return F(a)}var M=ke;var K={direction:"sendonly",sendEncodings:[{rid:"l",active:!0,scaleResolutionDownBy:4},{rid:"m",active:!0,scaleResolutionDownBy:2},{rid:"h",active:!0}]};var P=class{constructor(e){this.localTracksWithStreams=[];this.trackIdToTrack=new Map;this.idToPeer=new Map;this.localPeer={id:"",metadata:{},trackIdToMetadata:new Map};this.localTrackIdToTrack=new Map;this.midToTrackId=new Map;this.disabledTrackEncodings=new Map;this.rtcConfig={iceServers:[{urls:"stun:stun.l.google.com:19302"}]};this.join=e=>{var t,a;try{this.localPeer.metadata=e;let r=f("join",{metadata:e});this.sendMediaEvent(r)}catch(r){(a=(t=this.callbacks).onConnectionError)==null||a.call(t,r),this.leave()}};this.receiveMediaEvent=e=>{var a,r,i,o;let t=H(e);switch(t.type){case"peerAccepted":this.localPeer.id=t.data.id,(r=(a=this.callbacks).onJoinSuccess)==null||r.call(a,t.data.id,t.data.peersInRoom),t.data.peersInRoom.forEach(c=>{this.addPeer(c)});break;case"peerDenied":(o=(i=this.callbacks).onJoinError)==null||o.call(i,t.data);break;default:this.localPeer.id!=null&&this.handleMediaEvent(t)}};this.handleMediaEvent=e=>{var r,i,o,s,c,d,k,v,x,w,R,S,A,B,j,D;let t,a;switch(e.type){case"offerData":let Q=e.data.integratedTurnServers,Y=e.data.iceTransportPolicy;this.setTurns(Q,Y);let Z=new Map(Object.entries(e.data.tracksTypes));this.onOfferData(Z);break;case"tracksAdded":if(a=e.data,this.getPeerId()===a.peerId)return;a.trackIdToMetadata=new Map(Object.entries(a.trackIdToMetadata)),t=this.idToPeer.get(a.peerId);let z=t.trackIdToMetadata;t.trackIdToMetadata=new Map([...t.trackIdToMetadata,...a.trackIdToMetadata]),this.idToPeer.set(t.id,t),Array.from(t.trackIdToMetadata.entries()).forEach(([T,g])=>{var h,m;if(!z.has(T)){let J={stream:null,track:null,trackId:T,isSimulcast:!1,metadata:g,peer:t,maxBandwidth:0};this.trackIdToTrack.set(T,J),(m=(h=this.callbacks).onTrackAdded)==null||m.call(h,J)}});break;case"tracksRemoved":a=e.data;let ee=a.peerId;if(this.getPeerId()===a.peerId)return;a.trackIds.forEach(T=>{var h,m;let g=this.trackIdToTrack.get(T);(m=(h=this.callbacks).onTrackRemoved)==null||m.call(h,g),this.eraseTrack(T,ee)});break;case"sdpAnswer":this.midToTrackId=new Map(Object.entries(e.data.midToTrackId)),this.onAnswer(e.data);break;case"candidate":this.onRemoteCandidate(e.data);break;case"peerJoined":if(t=e.data.peer,t.id===this.getPeerId())return;this.addPeer(t),(i=(r=this.callbacks).onPeerJoined)==null||i.call(r,t);break;case"peerLeft":if(t=this.idToPeer.get(e.data.peerId),t===void 0)return;Array.from(t.trackIdToMetadata.keys()).forEach(T=>{var g,h;return(h=(g=this.callbacks).onTrackRemoved)==null?void 0:h.call(g,this.trackIdToTrack.get(T))}),this.erasePeer(t),(s=(o=this.callbacks).onPeerLeft)==null||s.call(o,t);break;case"peerUpdated":if(this.getPeerId()===e.data.peerId)return;t=this.idToPeer.get(e.data.peerId),t.metadata=e.data.metadata,this.addPeer(t),(d=(c=this.callbacks).onPeerUpdated)==null||d.call(c,t);break;case"peerRemoved":if(this.getPeerId()!==e.data.peerId){console.error("Received onRemoved media event, but it does not refer to the local peer");return}(v=(k=this.callbacks).onRemoved)==null||v.call(k,e.data.reason);break;case"trackUpdated":if(this.getPeerId()===e.data.peerId)return;if(t=this.idToPeer.get(e.data.peerId),t==null)throw`Peer with id: ${e.data.peerId} doesn't exist`;let L=e.data.trackId,O=e.data.metadata;t.trackIdToMetadata.set(L,O);let U=this.trackIdToTrack.get(L);U.metadata=O,(w=(x=this.callbacks).onTrackUpdated)==null||w.call(x,U);break;case"tracksPriority":let W=e.data.tracks.map(T=>this.trackIdToTrack.get(T)),te=Array.from(this.trackIdToTrack.values()).filter(T=>!W.includes(T));(S=(R=this.callbacks).onTracksPriorityChanged)==null||S.call(R,W,te);case"encodingSwitched":(B=(A=this.callbacks).onTrackEncodingChanged)==null||B.call(A,e.data.peerId,e.data.trackId,e.data.encoding);break;case"custom":this.handleMediaEvent(e.data);break;case"error":(D=(j=this.callbacks).onConnectionError)==null||D.call(j,e.data.message),this.leave();break;default:console.warn("Received unknown media event: ",e.type);break}};this.addTrackToConnection=e=>{let t=e.track,a;e.isSimulcast?(a=t.kind==="audio"?{direction:"sendonly"}:K,this.disabledTrackEncodings.set(e.trackId,[])):(a={direction:"sendonly",sendEncodings:[{active:!0}]},e.maxBandwidth!==void 0&&e.maxBandwidth>0&&(a.sendEncodings[0].maxBitrate=e.maxBandwidth*1024)),this.connection.addTransceiver(t,a)};this.updatePeerMetadata=e=>{let t=f("updatePeerMetadata",{metadata:e});this.sendMediaEvent(t)};this.updateTrackMetadata=(e,t)=>{let a=this.localTrackIdToTrack.get(e);a.metadata=t,this.localTrackIdToTrack.set(e,a),this.localPeer.trackIdToMetadata.set(e,t);let r=f("updateTrackMetadata",{trackId:e,trackMetadata:t});this.sendMediaEvent(r)};this.getMidToTrackId=()=>{let e={};return this.connection?(this.connection.getTransceivers().forEach(t=>{var s;let a=(s=t.sender.track)==null?void 0:s.id,r=t.mid,i=this.localPeer.trackIdToMetadata.keys(),o=Array.from(i).map(c=>this.localTrackIdToTrack.get(c));if(a&&r){let c=o.find(d=>d.track.id===a);e[r]=c.trackId}}),e):null};this.leave=()=>{let e=f("leave");this.sendMediaEvent(e),this.cleanUp()};this.cleanUp=()=>{this.connection&&(this.connection.onicecandidate=null,this.connection.ontrack=null),this.localTracksWithStreams.forEach(({track:e})=>e.stop()),this.localTracksWithStreams=[],this.connection=void 0};this.sendMediaEvent=e=>{this.callbacks.onSendMediaEvent(G(e))};this.onAnswer=e=>u(this,null,function*(){this.connection.ontrack=this.onTrack();try{yield this.connection.setRemoteDescription(e),this.disabledTrackEncodings.forEach((t,a)=>{t.forEach(r=>this.disableTrackEncoding(a,r))})}catch(t){console.log(t)}});this.addTransceiversIfNeeded=e=>{var s;let t=this.connection.getTransceivers().filter(c=>c.direction==="recvonly"),a=[],r=c=>{let d=e.get(c);d=d!==void 0?d:0;let k=t.filter(v=>v.receiver.track.kind===c).length;return Array(d-k).fill(c)},i=r("audio"),o=r("video");a=a.concat(i),a=a.concat(o);for(let c of a)(s=this.connection)==null||s.addTransceiver(c,{direction:"recvonly"})};this.getTrackIdToMetadata=()=>{let e={};return Array.from(this.localPeer.trackIdToMetadata.entries()).forEach(([t,a])=>{e[t]=a}),e};this.checkIfTrackBelongToPeer=(e,t)=>Array.from(t.trackIdToMetadata.keys()).some(a=>e.startsWith(a));this.onOfferData=e=>u(this,null,function*(){this.connection?yield this.connection.restartIce():(this.connection=new RTCPeerConnection(this.rtcConfig),this.connection.onicecandidate=this.onLocalCandidate(),Array.from(this.localTrackIdToTrack.values()).forEach(t=>this.addTrackToConnection(t)),this.connection.getTransceivers().forEach(t=>t.direction="sendonly")),this.addTransceiversIfNeeded(e),yield this.createAndSendOffer()});this.onRemoteCandidate=e=>{try{let t=new RTCIceCandidate(e);if(!this.connection)throw new Error("Received new remote candidate but RTCConnection is undefined");this.connection.addIceCandidate(t)}catch(t){console.error(t)}};this.onLocalCandidate=()=>e=>{if(e.candidate){let t=p({type:"candidate",data:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex}});this.sendMediaEvent(t)}};this.onTrack=()=>e=>{var c,d;let[t]=e.streams,a=e.transceiver.mid,r=this.midToTrackId.get(a);if(this.checkIfTrackBelongToPeer(r,this.localPeer))return;let i=Array.from(this.idToPeer.values()).filter(k=>this.checkIfTrackBelongToPeer(r,k))[0],o=i.trackIdToMetadata.get(r),s={stream:t,track:e.track,peer:i,trackId:r,metadata:o,isSimulcast:!1};this.trackIdToTrack.set(r,s),(d=(c=this.callbacks).onTrackReady)==null||d.call(c,s)};this.setTurns=(e,t)=>{this.rtcConfig.iceServers||(this.rtcConfig.iceServers=[]),t==="relay"&&(this.rtcConfig.iceTransportPolicy="relay",e.forEach(a=>{var r,i;a.transport=="tls"?(r="tcp",i="turns"):(r=a.transport,i="turn");let o={credential:a.password,credentialType:"password",urls:i.concat(":",a.serverAddr,":",a.serverPort,"?transport=",r),username:a.username};this.rtcConfig.iceServers.push(o)}))};this.addPeer=e=>{e.hasOwnProperty("trackIdToMetadata")?e.trackIdToMetadata=new Map(Object.entries(e.trackIdToMetadata)):e.trackIdToMetadata=new Map,this.idToPeer.set(e.id,e)};this.erasePeer=e=>{let t=Array.from(e.trackIdToMetadata.keys());t.forEach(a=>this.trackIdToTrack.delete(a)),Array.from(this.midToTrackId.entries()).forEach(([a,r])=>{t.includes(r)&&this.midToTrackId.delete(a)}),this.idToPeer.delete(e.id)};this.eraseTrack=(e,t)=>{this.trackIdToTrack.delete(e);let a=Array.from(this.midToTrackId.entries()),[r,i]=a.find(([o,s])=>s===e);this.midToTrackId.delete(r),this.idToPeer.get(t).trackIdToMetadata.delete(e),this.disabledTrackEncodings.delete(e)};this.getPeerId=()=>this.localPeer.id;let{callbacks:t,rtcConfig:a}=e;this.callbacks=t,this.rtcConfig=a||this.rtcConfig}addTrack(e,t,a=new Map,r=!1,i=0){if(this.getPeerId()==="")throw"Cannot add tracks before being accepted by the server";let o=this.getTrackId(M());this.localTracksWithStreams.push({track:e,stream:t}),this.localPeer.trackIdToMetadata.set(o,a);let s={track:e,stream:t,trackId:o,peer:this.localPeer,metadata:a,isSimulcast:r,maxBandwidth:i};this.localTrackIdToTrack.set(o,s),this.connection&&(this.addTrackToConnection(s),this.connection.getTransceivers().forEach(d=>d.direction=d.direction==="sendrecv"?"sendonly":d.direction));let c=p({type:"renegotiateTracks"});return this.sendMediaEvent(c),o}replaceTrack(e,t,a){return u(this,null,function*(){let r=this.localTrackIdToTrack.get(e),i=this.findSender(r.track.id);return i?i.replaceTrack(t).then(()=>{let o=a||this.localTrackIdToTrack.get(e).metadata;return r.track=t,this.updateTrackMetadata(e,o),!0}).catch(()=>!1):!1})}setTrackBandwidth(e,t){let a=this.findSender(e),r=a.getParameters();if(r.encodings.length===0&&(r.encodings=[{}]),t===0)r.encodings.forEach(i=>delete i.maxBitrate);else{let i=r.encodings[0].scaleResolutionDownBy||1,o=r.encodings.reduce((c,d)=>c+E(i/(d.scaleResolutionDownBy||1),2),0),s=t/o;r.encodings.forEach(c=>c.maxBitrate=s*E(i/(c.scaleResolutionDownBy||1),2))}return a.setParameters(r).then(()=>!0).catch(i=>(console.log(i),!1))}removeTrack(e){let t=this.localTrackIdToTrack.get(e),a=this.findSender(t.track.id);this.connection.removeTrack(a);let r=p({type:"renegotiateTracks"});this.sendMediaEvent(r)}prioritizeTrack(e){let t=p({type:"prioritizeTrack",data:{trackId:e}});this.sendMediaEvent(t)}unprioritizeTrack(e){let t=p({type:"unprioritizeTrack",data:{trackId:e}});this.sendMediaEvent(t)}setPreferedVideoSizes(e,t,a=0,r=!1){let i=p({type:"preferedVideoSizes",data:{bigScreens:e,mediumScreens:a,smallScreens:t,allSameSize:r}});this.sendMediaEvent(i)}selectTrackEncoding(e,t,a){let r=f("selectEncoding",{peerId:e,trackId:t,encoding:a});this.sendMediaEvent(r)}enableTrackEncoding(e,t){var s,c,d;let a=(s=this.localTrackIdToTrack.get(e))==null?void 0:s.track,r=(c=this.disabledTrackEncodings.get(e))==null?void 0:c.filter(k=>k!==t);this.disabledTrackEncodings.set(e,r);let i=(d=this.connection)==null?void 0:d.getSenders().filter(k=>k.track===a)[0],o=i==null?void 0:i.getParameters();o.encodings.filter(k=>k.rid==t)[0].active=!0,i==null||i.setParameters(o)}disableTrackEncoding(e,t){var o,s;let a=(o=this.localTrackIdToTrack.get(e))==null?void 0:o.track;this.disabledTrackEncodings.get(e).push(t);let r=(s=this.connection)==null?void 0:s.getSenders().filter(c=>c.track===a)[0],i=r==null?void 0:r.getParameters();i.encodings.filter(c=>c.rid==t)[0].active=!1,r==null||r.setParameters(i)}findSender(e){return this.connection.getSenders().find(t=>t.track&&t.track.id===e)}getTrackId(e){return`${this.getPeerId()}:${e}`}createAndSendOffer(){return u(this,null,function*(){if(!!this.connection)try{let e=yield this.connection.createOffer();yield this.connection.setLocalDescription(e);let t=p({type:"sdpOffer",data:{sdpOffer:e,trackIdToTrackMetadata:this.getTrackIdToMetadata(),midToTrackId:this.getMidToTrackId()}});this.sendMediaEvent(t)}catch(e){console.error(e)}})}};
//# sourceMappingURL=index.js.map