OverviewFilesCommitsIssuesDocsReleasesPeers

holepunchto-deps / @holepunchto / keet-call / server / media.js

1 lines · javascript ref:
const{Readable:n}=require("streamx"),e=require("hypercore-id-encoding"),s=require("./webrtc"),{MEDIA_EVENTS:i}=require("../lib/common");module.exports=class{constructor(n,s){this.server=n,this.swarm=n.swarm,this.onerror=n.onerror,this.callId=s,this.swarmId=e.encode(this.swarm.keyPair.publicKey),this._proxiesByConnection=new Map,this._sendingByConnection=new Map,this._pendingSignalsByConnection=new Map,this._signalSubscriptions=[],this._proxySubscriptions=[],this.server.internalActivateCall(this);for(const n of this.swarm.connections)this.addConnection(n,this.server._rawMuxersByStream.get(n))}close(){for(const n of this._proxiesByConnection.keys())this.removeConnection(n);this.server.internalDeactivateCall(this)}addConnection(n,e){if(this._proxiesByConnection.has(n))return;const i=this.swarm.dht.udx.createSocket(),o=new s(this.callId,e,i,{onsignal:e=>this._handleMediaSignal(n,e)});o.on("channel-open",()=>this._onProxyOpen(n,o)),o.on("channel-close",()=>this._onProxyClose(n)),this._proxiesByConnection.set(n,o),this._sendingByConnection.set(n,new Set)}removeConnection(n,s=!0){const o=e.encode(n.remotePublicKey),t=this._proxiesByConnection.get(n);if(t&&(t.close(),this._proxiesByConnection.delete(n),this._sendingByConnection.delete(n),this._pendingSignalsByConnection.delete(n),s))for(const n of this._proxySubscriptions)n.push({type:i.PROXY_CLOSE,swarmId:o})}_onProxyOpen(n,s){if(!this.server.isCurrentConnection(n))return;const o=e.encode(n.remotePublicKey);for(const n of this._proxySubscriptions)n.push({type:i.PROXY_OPEN,proxyPort:s.proxyPort,swarmId:o});const t=this._pendingSignalsByConnection.get(n);if(t){for(;t.length;)s.sendSignal(t.shift());this._pendingSignalsByConnection.delete(n)}}_onProxyClose(n){if(!this.server.isCurrentConnection(n))return;const s=e.encode(n.remotePublicKey);for(const n of this._proxySubscriptions)n.push({type:i.PROXY_CLOSE,swarmId:s})}_handleMediaSignal(n,s){if(!this.server.isCurrentConnection(n))return;const i=e.encode(n.remotePublicKey);for(const n of this._signalSubscriptions)n.push({swarmId:i,signal:s})}signal(n,e){this._proxiesByConnection.get(n).sendSignal(e)}subscribeMediaSignals(){const e=new n({destroy:n=>{const s=this._signalSubscriptions.indexOf(e);-1!==s&&this._signalSubscriptions.splice(s,1),n(null)}});return this._signalSubscriptions.push(e),e}subscribeProxyUpdates(){const s=new n({destroy:n=>{const e=this._proxySubscriptions.indexOf(s);-1!==e&&this._proxySubscriptions.splice(e,1),n(null)}});this._proxySubscriptions.push(s);for(const[n,o]of this._proxiesByConnection)o.channelOpened&&s.push({type:i.PROXY_OPEN,proxyPort:o.proxyPort,swarmId:e.encode(n.remotePublicKey)});return s}};