diff --git a/frontend/Peer.ts b/frontend/Peer.ts index db294ad..02884e7 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -7,6 +7,12 @@ interface IPeerOptions{ }; +enum IMessageSymbase +{ + PayloadMessagePack = -12873.54, + PayloadRTCBasePack = -12884.54 +} + export default class Peer extends EventTarget { @@ -23,10 +29,30 @@ export default class Peer extends EventTarget super(); this.mwse = wsts; this.info = new PeerInfo(this); + + this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => { + if(data.type == 'rtc') + { + if(data.action == IMessageSymbase.PayloadRTCBasePack) + { + if(this.rtc) + { + return this.rtc.emit("input", data.payload) + } + console.warn("Not active rtc but recaived rtc packs") + }; + if(data.action == IMessageSymbase.PayloadMessagePack) + { + return this.emit("message", data.payload) + } + }; + this.emit("message", data); + }); } public createRTC() : WebRTC { this.rtc = new WebRTC(); + this.rtc.peer = this; this.rtc.on("connected", () => { this.peerConnection = true; }); @@ -35,22 +61,11 @@ export default class Peer extends EventTarget }) this.rtc.on("output",(payload:object) => { this.send({ - type: 'rtc:session', + type: 'rtc', + action: IMessageSymbase.PayloadRTCBasePack, payload: payload }) }); - this.on('message',(data:{type?:string,payload?:any}) => { - if(data.type == 'rtc:session') - { - if(this.rtc) - { - this.rtc.emit("input", data.payload) - } - }else if(data.type == 'rtc:message') - { - this.emit("message", data.payload) - } - }); return this.rtc; } public setPeerOptions(options: string | IPeerOptions){ @@ -137,7 +152,8 @@ export default class Peer extends EventTarget }); }else{ this.rtc?.send({ - type: 'rtc:message', + type: 'rtc', + action: IMessageSymbase.PayloadMessagePack, payload: pack }) } diff --git a/frontend/WebRTC.ts b/frontend/WebRTC.ts index 72df2bc..754ddd5 100644 --- a/frontend/WebRTC.ts +++ b/frontend/WebRTC.ts @@ -1,3 +1,5 @@ +import Peer from "./Peer"; + interface TransferStreamInfo { senders : RTCRtpSender[]; @@ -22,6 +24,8 @@ export default class WebRTC public events : { [eventname:string]: Function[] } = {}; public channel : RTCDataChannel | undefined; + public peer? : Peer; + public WebRTC() { this.rtc = new RTCPeerConnection({ @@ -337,7 +341,7 @@ export default class WebRTC if(this.connectionStatus != 'connected'){ return } - for (const [id, {stream}] of this.sendingStream) { + for (const [, {stream}] of this.sendingStream) { if(stream == undefined) { continue; diff --git a/script/index.js b/script/index.js index 76678a5..ed918cc 100644 --- a/script/index.js +++ b/script/index.js @@ -1,2 +1,2 @@ -(()=>{class e{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint)}connect(){this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){this.ws.close()}addWSEvents(){this.ws.addEventListener("open",(()=>this.eventOpen())),this.ws.addEventListener("close",(()=>this.eventClose())),this.ws.addEventListener("error",(()=>this.eventError())),this.ws.addEventListener("message",(({data:e})=>this.eventMessage(e)))}eventOpen(){this.connected=!0;for(const e of this.activeConnectionEvent)e(void 0)}eventClose(){this.connected=!1}eventError(){this.connected=!1}recaivePackEvent=[];onRecaivePack(e){this.recaivePackEvent.push(e)}activeConnectionEvent=[];onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(const e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class t{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((t,s)=>{let i=++this.count;this.wsts.WSTSProtocol.SendRequest(e,i),this.events.set(i,[e=>{t(e)},e=>{s(e)}])}))}stream(e,t){let s=++this.count;this.wsts.WSTSProtocol.StartStream(e,s),this.events.set(s,[e=>{t(e)},()=>{}])}signal(e,t){let s=this.signals.get(e);s?s.push(t):this.signals.set(e,[t])}}class s{events={};emit(e,...t){if(this.events[e])for(const s of this.events[e])s(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}class i{constructor(e){this.mwse=e}async allocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"alloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw new Error("Error Allocated Access Point IP Address")}async allocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"alloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw new Error("Error Allocated Access Point Number")}async allocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"alloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw new Error("Error Allocated Access Point Short Code")}async reallocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"realloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw new Error("Error Reallocated Access Point IP Address")}async reallocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"realloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw new Error("Error Reallocated Access Point Number")}async reallocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"realloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw new Error("Error Reallocated Access Point Short Code")}async releaseAPIPAddress(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APIPAddress"});if("success"!=e)throw new Error("Error release Access Point IP Address");this.APIPAddress=void 0}async releaseAPNumber(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APNumber"});if("success"!=e)throw new Error("Error release Access Point Number");this.APNumber=void 0}async releaseAPShortCode(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APShortCode"});if("success"!=e)throw new Error("Error release Access Point Short Code");this.APShortCode=void 0}async queryAPIPAddress(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==t?s:null}async queryAPNumber(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==t?s:null}async queryAPShortCode(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==t?s:null}}class n{info={};constructor(e){this.peer=e}async fetch(e){if(e){let t=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId,name:e});"success"==t.status?this.info=t.info:console.warn(t.message)}else{let e=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId});"success"==e.status?this.info=e.info:console.warn(e.message)}return this.info}set(e,t){this.info[e]=t,this.peer.mwse.WSTSProtocol.SendOnly({type:"auth/info",name:e,value:t})}get(e){return e?this.info[e]:this.info}}class o{static channels=new Map;static requireGC=!1;active=!1;connectionStatus="new";iceStatus="new";gatheringStatus="new";signalingStatus="";recaivingStream=new Map;sendingStream=new Map;events={};WebRTC(){this.rtc=new RTCPeerConnection({iceCandidatePoolSize:0,iceTransportPolicy:"all",rtcpMuxPolicy:"require",iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"},{urls:"stun:stun2.l.google.com:19302"},{urls:"stun:stun3.l.google.com:19302"},{urls:"stun:stun4.l.google.com:19302"}]}),this.rtc.addEventListener("connectionstatechange",(()=>{this.eventConnectionState()})),this.rtc.addEventListener("icecandidate",((...e)=>{this.eventIcecandidate(...e)})),this.rtc.addEventListener("iceconnectionstatechange",(()=>{this.eventICEConnectionState()})),this.rtc.addEventListener("icegatheringstatechange",(()=>{this.eventICEGatherinState()})),this.rtc.addEventListener("negotiationneeded",(()=>{this.eventNogationNeeded()})),this.rtc.addEventListener("signalingstatechange",(()=>{this.eventSignalingState()})),this.rtc.addEventListener("track",((...e)=>{this.eventTrack(...e)})),this.rtc.addEventListener("datachannel",((...e)=>{this.eventDatachannel(...e)})),this.on("input",(async e=>{switch(e.type){case"icecandidate":await this.rtc.addIceCandidate(new RTCIceCandidate(e.value));break;case"offer":{await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));let t=await this.rtc.createAnswer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(t),this.send({type:"answer",value:t});break}case"answer":await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));break;case"streamInfo":{let{id:t,value:s}=e,i=this.recaivingStream.get(t);i?this.recaivingStream.set(t,{...i,...s}):this.recaivingStream.set(t,s),this.send({type:"streamAccept",id:t});break}case"streamRemoved":{let{id:t}=e;this.emit("stream:stopped",this.recaivingStream.get(t)),this.sendingStream.delete(t);break}case"streamAccept":{let{id:t}=e,{stream:s}=this.sendingStream.get(t),i=[];for(const e of s.getTracks())i.push(this.rtc.addTrack(e,s));s.senders=i;break}case"message":this.emit("message",e.payload)}}))}addEventListener(e,t){(this.events[e]||(this.events[e]=[])).push(t)}on(e,t){this.addEventListener(e,t)}async dispatch(e,...t){if(this.events[e])for(const s of this.events[e])await s(...t)}async emit(e,...t){await this.dispatch(e,...t)}connect(){this.channel||this.createDefaultDataChannel()}sendMessage(e){this.send({type:"message",payload:e})}createDefaultDataChannel(){let e=this.rtc.createDataChannel(":default:",{ordered:!0});e.addEventListener("open",(()=>{this.channel=e,o.channels.set(this.id,this)})),e.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.addEventListener("close",(()=>{this.channel=void 0}))}destroy(){this.active=!1,this.channel&&(this.channel.close(),this.channel=void 0),this.rtc&&this.rtc.close(),this.emit("disconnected"),o.channels.delete(this.id)}eventDatachannel(e){":default:"==e.channel.label&&(o.channels.set(this.id,this),this.channel=e.channel),e.channel.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.channel.addEventListener("close",(()=>{this.channel=void 0,o.channels.delete(this.id),o.requireGC=!0}))}send(e){"open"==this.channel?.readyState?this.channel.send(JSON.stringify(e)):this.emit("output",e)}eventConnectionState(){this.connectionStatus=this.rtc.connectionState,"connected"==this.connectionStatus&&0==this.active&&(this.emit("connected"),this.active=!0),"failed"!=this.connectionStatus&&"disconnected"!=this.connectionStatus&&"closed"!=this.connectionStatus||this.active&&this.destroy()}eventIcecandidate(e){e.candidate&&this.send({type:"icecandidate",value:e.candidate})}eventICEConnectionState(){this.iceStatus=this.rtc.iceConnectionState}eventICEGatherinState(){this.gatheringStatus=this.rtc.iceGatheringState}async eventNogationNeeded(){let e=await this.rtc.createOffer({iceRestart:!0,offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(e),this.send({type:"offer",value:e})}eventSignalingState(){this.signalingStatus=this.rtc.signalingState}eventTrack(e){if(e.streams.length)for(const t of e.streams)null==this.recaivingStream.get(t.id).stream?(this.recaivingStream.get(t.id).stream=t,this.emit("stream:added",this.recaivingStream.get(t.id))):this.recaivingStream.get(t.id).stream=t}sendStream(e,t,s){this.send({type:"streamInfo",id:e.id,value:{...s,name:t}}),this.sendingStream.set(e.id,{...s,id:e.id,name:t,stream:e})}stopStream(e){if("connected"==this.connectionStatus&&this.sendingStream.has(e.id)){let{stream:t}=this.sendingStream.get(e.id);for(const e of t.getTracks())for(const t of this.rtc.getSenders())t.track?.id==e.id&&this.rtc.removeTrack(t);this.send({type:"streamRemoved",id:t.id}),this.sendingStream.delete(e.id)}}stopAllStreams(){if("connected"==this.connectionStatus){for(const[e,{stream:t}]of this.sendingStream)if(null!=t){for(const e of t.getTracks())for(const t of this.rtc.getSenders())t.track?.id==e.id&&this.rtc.removeTrack(t);this.send({type:"streamRemoved",id:t.id})}this.sendingStream.clear()}}}o.requireGC=!1,setInterval((()=>{if(0==o.requireGC)return;let e=document.createElement("img");e.src=window.URL.createObjectURL(new Blob([new ArrayBuffer(5e7)])),e.onerror=function(){window.URL.revokeObjectURL(this.src)},o.requireGC=!1}),3e3);class r extends s{options={};selfSocket=!1;active=!1;peerConnection=!1;primaryChannel="datachannel";constructor(e){super(),this.mwse=e,this.info=new n(this)}createRTC(){return this.rtc=new o,this.rtc.on("connected",(()=>{this.peerConnection=!0})),this.rtc.on("disconnected",(()=>{this.peerConnection=!1})),this.rtc.on("output",(e=>{this.send({type:"rtc:session",payload:e})})),this.on("message",(e=>{"rtc:session"==e.type?this.rtc&&this.rtc.emit("input",e.payload):"rtc:message"==e.type&&this.emit("message",e.payload)})),this.rtc}setPeerOptions(e){"string"==typeof e?this.setSocketId(e):this.options=e}setSocketId(e){this.socketId=e}async metadata(){if("me"==this.socketId){let e=await this.mwse.EventPooling.request({type:"my/socketid"});return this.selfSocket=!0,this.active||=!0,this.socketId=e,this.emit("scope"),this.activeScope=!0,e}}async request(e){if(this.active)return await this.mwse.request(this.socketId,e)}equalTo(e){return this.socketId==e.socketId}async isReachable(){return await this.mwse.EventPooling.request({type:"is/reachable",to:this.socketId})}async enablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"everybody"})}async disablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"disable"})}async send(e){let t,s=this.peerConnection,i=this.mwse.server.connected;t=s&&i?"websocket"==this.primaryChannel?"websocket":"datachannel":i?"websocket":"datachannel","websocket"==t?await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId}):this.rtc?.send({type:"rtc:message",payload:e})}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class a extends s{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(t,e),this.options=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.options||e,s=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==s.status){if("ALREADY-EXISTS"==s.message&&this.options.ifexistsJoin)return this.join();throw new Error(s.message||s.messages)}this.options={...this.options,...s.room},this.roomId=s.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.options.name,credential:this.options.credential});if("fail"==e.status)throw new Error(e.message);this.options={...this.options,...e.room},this.roomId=e.room.id,this.mwse.rooms.set(this.roomId,this)}async eject(){let{type:e}=await this.mwse.EventPooling.request({type:"ejectroom",roomId:this.roomId});this.peers.clear(),"success"==e&&this.mwse.rooms.delete(this.roomId)}async send(e,t=!1){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t})}async fetchPeers(){let{status:e,peers:t}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),s=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of t){let t=this.mwse.peer(e);s.push(t),this.peers.set(e,t)}return s}}class c{constructor(e){this.mwse=e,this.addListener()}addListener(){this.mwse.server?.onRecaivePack((e=>{this.PackAnalyze(e)}))}SendRaw(e){this.mwse.server.tranferToServer(e)}SendOnly(e){this.mwse.server.tranferToServer([e,"R"])}SendRequest(e,t){this.mwse.server.tranferToServer([e,t,"R"])}StartStream(e,t){this.mwse.server.tranferToServer([e,t,"S"])}PackAnalyze(e){let[t,s,i]=e;if("number"==typeof s){let e=this.mwse.EventPooling.events.get(s);if(e){if(e[0](t,i),"E"===i)this.mwse.EventPooling.events.delete(s)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(s);if(e)for(const s of e)s(t);else console.warn("Missing event sended from server")}}}window.MWSE=class extends s{rooms=new Map;pairs=new Map;peers=new Map;constructor(s){super(),this.server=new e(s),this.WSTSProtocol=new c(this),this.EventPooling=new t(this),this.virtualPressure=new i(this),this.server.connect(),this.me=new r(this),this.me.scope((()=>{this.peers.set("me",this.me),this.peers.set(this.me.socketId,this.me)})),this.server.onActive((async()=>{this.me.setSocketId("me"),await this.me.metadata(),this.emit("scope"),this.activeScope=!0})),this.packMessagingSystem()}async request(e,t){let{pack:s}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return s}async response(e,t,s){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:s,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:t,pack:s}=e;this.peer(t,!0).emit("message",s)})),this.EventPooling.signal("request",(e=>{let{from:t,pack:s,id:i}=e,n={body:s,response:e=>{this.response(t,i,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",n),this.peer("me").emit("request",n)})),this.EventPooling.signal("pack/room",(e=>{let{from:t,pack:s}=e;this.room(t).emit("message",s)})),this.EventPooling.signal("room/joined",(e=>{let{id:t,roomid:s}=e,i=this.room(s),n=this.peer(t,!0);i.peers.set(n.socketId,n),i.emit("join",n)})),this.EventPooling.signal("room/ejected",(e=>{let{id:t,roomid:s}=e,i=this.room(s),n=this.peer(t);i.peers.delete(n.socketId),i.emit("eject",n)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:t}=e,s=this.room(t);s.peers.clear(),s.emit("close"),this.rooms.delete(t)})),this.EventPooling.signal("pair/info",(e=>{let{from:t,name:s,value:i}=e,n=this.peer(t);n.info.info[s]=i,n.emit("info",s,i)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new a(this);return t.setRoomOptions(e),this.emit("room"),t}peer(e,t=!1){if("string"==typeof e){if(this.peers.has(e))return this.peers.get(e);if(this.pairs.has(e))return this.pairs.get(e)}let s=new r(this);return s.setPeerOptions(e),s.active=t,this.peers.set(s.socketId,s),this.emit("peer",s),s}}})(); +(()=>{class e{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint)}connect(){this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){this.ws.close()}addWSEvents(){this.ws.addEventListener("open",(()=>this.eventOpen())),this.ws.addEventListener("close",(()=>this.eventClose())),this.ws.addEventListener("error",(()=>this.eventError())),this.ws.addEventListener("message",(({data:e})=>this.eventMessage(e)))}eventOpen(){this.connected=!0;for(const e of this.activeConnectionEvent)e(void 0)}eventClose(){this.connected=!1}eventError(){this.connected=!1}recaivePackEvent=[];onRecaivePack(e){this.recaivePackEvent.push(e)}activeConnectionEvent=[];onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(const e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class t{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((t,s)=>{let i=++this.count;this.wsts.WSTSProtocol.SendRequest(e,i),this.events.set(i,[e=>{t(e)},e=>{s(e)}])}))}stream(e,t){let s=++this.count;this.wsts.WSTSProtocol.StartStream(e,s),this.events.set(s,[e=>{t(e)},()=>{}])}signal(e,t){let s=this.signals.get(e);s?s.push(t):this.signals.set(e,[t])}}class s{events={};emit(e,...t){if(this.events[e])for(const s of this.events[e])s(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}class i{constructor(e){this.mwse=e}async allocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"alloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw new Error("Error Allocated Access Point IP Address")}async allocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"alloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw new Error("Error Allocated Access Point Number")}async allocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"alloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw new Error("Error Allocated Access Point Short Code")}async reallocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"realloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw new Error("Error Reallocated Access Point IP Address")}async reallocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"realloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw new Error("Error Reallocated Access Point Number")}async reallocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"realloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw new Error("Error Reallocated Access Point Short Code")}async releaseAPIPAddress(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APIPAddress"});if("success"!=e)throw new Error("Error release Access Point IP Address");this.APIPAddress=void 0}async releaseAPNumber(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APNumber"});if("success"!=e)throw new Error("Error release Access Point Number");this.APNumber=void 0}async releaseAPShortCode(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APShortCode"});if("success"!=e)throw new Error("Error release Access Point Short Code");this.APShortCode=void 0}async queryAPIPAddress(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==t?s:null}async queryAPNumber(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==t?s:null}async queryAPShortCode(e){let{status:t,socket:s}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==t?s:null}}class n{info={};constructor(e){this.peer=e}async fetch(e){if(e){let t=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId,name:e});"success"==t.status?this.info=t.info:console.warn(t.message)}else{let e=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId});"success"==e.status?this.info=e.info:console.warn(e.message)}return this.info}set(e,t){this.info[e]=t,this.peer.mwse.WSTSProtocol.SendOnly({type:"auth/info",name:e,value:t})}get(e){return e?this.info[e]:this.info}}class o{static channels=new Map;static requireGC=!1;active=!1;connectionStatus="new";iceStatus="new";gatheringStatus="new";signalingStatus="";recaivingStream=new Map;sendingStream=new Map;events={};WebRTC(){this.rtc=new RTCPeerConnection({iceCandidatePoolSize:0,iceTransportPolicy:"all",rtcpMuxPolicy:"require",iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"},{urls:"stun:stun2.l.google.com:19302"},{urls:"stun:stun3.l.google.com:19302"},{urls:"stun:stun4.l.google.com:19302"}]}),this.rtc.addEventListener("connectionstatechange",(()=>{this.eventConnectionState()})),this.rtc.addEventListener("icecandidate",((...e)=>{this.eventIcecandidate(...e)})),this.rtc.addEventListener("iceconnectionstatechange",(()=>{this.eventICEConnectionState()})),this.rtc.addEventListener("icegatheringstatechange",(()=>{this.eventICEGatherinState()})),this.rtc.addEventListener("negotiationneeded",(()=>{this.eventNogationNeeded()})),this.rtc.addEventListener("signalingstatechange",(()=>{this.eventSignalingState()})),this.rtc.addEventListener("track",((...e)=>{this.eventTrack(...e)})),this.rtc.addEventListener("datachannel",((...e)=>{this.eventDatachannel(...e)})),this.on("input",(async e=>{switch(e.type){case"icecandidate":await this.rtc.addIceCandidate(new RTCIceCandidate(e.value));break;case"offer":{await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));let t=await this.rtc.createAnswer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(t),this.send({type:"answer",value:t});break}case"answer":await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));break;case"streamInfo":{let{id:t,value:s}=e,i=this.recaivingStream.get(t);i?this.recaivingStream.set(t,{...i,...s}):this.recaivingStream.set(t,s),this.send({type:"streamAccept",id:t});break}case"streamRemoved":{let{id:t}=e;this.emit("stream:stopped",this.recaivingStream.get(t)),this.sendingStream.delete(t);break}case"streamAccept":{let{id:t}=e,{stream:s}=this.sendingStream.get(t),i=[];for(const e of s.getTracks())i.push(this.rtc.addTrack(e,s));s.senders=i;break}case"message":this.emit("message",e.payload)}}))}addEventListener(e,t){(this.events[e]||(this.events[e]=[])).push(t)}on(e,t){this.addEventListener(e,t)}async dispatch(e,...t){if(this.events[e])for(const s of this.events[e])await s(...t)}async emit(e,...t){await this.dispatch(e,...t)}connect(){this.channel||this.createDefaultDataChannel()}sendMessage(e){this.send({type:"message",payload:e})}createDefaultDataChannel(){let e=this.rtc.createDataChannel(":default:",{ordered:!0});e.addEventListener("open",(()=>{this.channel=e,o.channels.set(this.id,this)})),e.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.addEventListener("close",(()=>{this.channel=void 0}))}destroy(){this.active=!1,this.channel&&(this.channel.close(),this.channel=void 0),this.rtc&&this.rtc.close(),this.emit("disconnected"),o.channels.delete(this.id)}eventDatachannel(e){":default:"==e.channel.label&&(o.channels.set(this.id,this),this.channel=e.channel),e.channel.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.channel.addEventListener("close",(()=>{this.channel=void 0,o.channels.delete(this.id),o.requireGC=!0}))}send(e){"open"==this.channel?.readyState?this.channel.send(JSON.stringify(e)):this.emit("output",e)}eventConnectionState(){this.connectionStatus=this.rtc.connectionState,"connected"==this.connectionStatus&&0==this.active&&(this.emit("connected"),this.active=!0),"failed"!=this.connectionStatus&&"disconnected"!=this.connectionStatus&&"closed"!=this.connectionStatus||this.active&&this.destroy()}eventIcecandidate(e){e.candidate&&this.send({type:"icecandidate",value:e.candidate})}eventICEConnectionState(){this.iceStatus=this.rtc.iceConnectionState}eventICEGatherinState(){this.gatheringStatus=this.rtc.iceGatheringState}async eventNogationNeeded(){let e=await this.rtc.createOffer({iceRestart:!0,offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(e),this.send({type:"offer",value:e})}eventSignalingState(){this.signalingStatus=this.rtc.signalingState}eventTrack(e){if(e.streams.length)for(const t of e.streams)null==this.recaivingStream.get(t.id).stream?(this.recaivingStream.get(t.id).stream=t,this.emit("stream:added",this.recaivingStream.get(t.id))):this.recaivingStream.get(t.id).stream=t}sendStream(e,t,s){this.send({type:"streamInfo",id:e.id,value:{...s,name:t}}),this.sendingStream.set(e.id,{...s,id:e.id,name:t,stream:e})}stopStream(e){if("connected"==this.connectionStatus&&this.sendingStream.has(e.id)){let{stream:t}=this.sendingStream.get(e.id);for(const e of t.getTracks())for(const t of this.rtc.getSenders())t.track?.id==e.id&&this.rtc.removeTrack(t);this.send({type:"streamRemoved",id:t.id}),this.sendingStream.delete(e.id)}}stopAllStreams(){if("connected"==this.connectionStatus){for(const[,{stream:e}]of this.sendingStream)if(null!=e){for(const t of e.getTracks())for(const e of this.rtc.getSenders())e.track?.id==t.id&&this.rtc.removeTrack(e);this.send({type:"streamRemoved",id:e.id})}this.sendingStream.clear()}}}let r;var a;o.requireGC=!1,setInterval((()=>{if(0==o.requireGC)return;let e=document.createElement("img");e.src=window.URL.createObjectURL(new Blob([new ArrayBuffer(5e7)])),e.onerror=function(){window.URL.revokeObjectURL(this.src)},o.requireGC=!1}),3e3),(a=r||(r={}))[a.PayloadMessagePack=-12873.54]="PayloadMessagePack",a[a.PayloadRTCBasePack=-12884.54]="PayloadRTCBasePack";class c extends s{options={};selfSocket=!1;active=!1;peerConnection=!1;primaryChannel="datachannel";constructor(e){super(),this.mwse=e,this.info=new n(this),this.on("pack",(e=>{if("rtc"==e.type){if(e.action==r.PayloadRTCBasePack){if(this.rtc)return this.rtc.emit("input",e.payload);console.warn("Not active rtc but recaived rtc packs")}if(e.action==r.PayloadMessagePack)return this.emit("message",e.payload)}this.emit("message",e)}))}createRTC(){return this.rtc=new o,this.rtc.peer=this,this.rtc.on("connected",(()=>{this.peerConnection=!0})),this.rtc.on("disconnected",(()=>{this.peerConnection=!1})),this.rtc.on("output",(e=>{this.send({type:"rtc",action:r.PayloadRTCBasePack,payload:e})})),this.rtc}setPeerOptions(e){"string"==typeof e?this.setSocketId(e):this.options=e}setSocketId(e){this.socketId=e}async metadata(){if("me"==this.socketId){let e=await this.mwse.EventPooling.request({type:"my/socketid"});return this.selfSocket=!0,this.active||=!0,this.socketId=e,this.emit("scope"),this.activeScope=!0,e}}async request(e){if(this.active)return await this.mwse.request(this.socketId,e)}equalTo(e){return this.socketId==e.socketId}async isReachable(){return await this.mwse.EventPooling.request({type:"is/reachable",to:this.socketId})}async enablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"everybody"})}async disablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"disable"})}async send(e){let t,s=this.peerConnection,i=this.mwse.server.connected;t=s&&i?"websocket"==this.primaryChannel?"websocket":"datachannel":i?"websocket":"datachannel","websocket"==t?await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId}):this.rtc?.send({type:"rtc",action:r.PayloadMessagePack,payload:e})}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class h extends s{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(t,e),this.options=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.options||e,s=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==s.status){if("ALREADY-EXISTS"==s.message&&this.options.ifexistsJoin)return this.join();throw new Error(s.message||s.messages)}this.options={...this.options,...s.room},this.roomId=s.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.options.name,credential:this.options.credential});if("fail"==e.status)throw new Error(e.message);this.options={...this.options,...e.room},this.roomId=e.room.id,this.mwse.rooms.set(this.roomId,this)}async eject(){let{type:e}=await this.mwse.EventPooling.request({type:"ejectroom",roomId:this.roomId});this.peers.clear(),"success"==e&&this.mwse.rooms.delete(this.roomId)}async send(e,t=!1){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t})}async fetchPeers(){let{status:e,peers:t}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),s=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of t){let t=this.mwse.peer(e);s.push(t),this.peers.set(e,t)}return s}}class d{constructor(e){this.mwse=e,this.addListener()}addListener(){this.mwse.server?.onRecaivePack((e=>{this.PackAnalyze(e)}))}SendRaw(e){this.mwse.server.tranferToServer(e)}SendOnly(e){this.mwse.server.tranferToServer([e,"R"])}SendRequest(e,t){this.mwse.server.tranferToServer([e,t,"R"])}StartStream(e,t){this.mwse.server.tranferToServer([e,t,"S"])}PackAnalyze(e){let[t,s,i]=e;if("number"==typeof s){let e=this.mwse.EventPooling.events.get(s);if(e){if(e[0](t,i),"E"===i)this.mwse.EventPooling.events.delete(s)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(s);if(e)for(const s of e)s(t);else console.warn("Missing event sended from server")}}}window.MWSE=class extends s{rooms=new Map;pairs=new Map;peers=new Map;constructor(s){super(),this.server=new e(s),this.WSTSProtocol=new d(this),this.EventPooling=new t(this),this.virtualPressure=new i(this),this.server.connect(),this.me=new c(this),this.me.scope((()=>{this.peers.set("me",this.me),this.peers.set(this.me.socketId,this.me)})),this.server.onActive((async()=>{this.me.setSocketId("me"),await this.me.metadata(),this.emit("scope"),this.activeScope=!0})),this.packMessagingSystem()}async request(e,t){let{pack:s}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return s}async response(e,t,s){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:s,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:t,pack:s}=e;this.peer(t,!0).emit("message",s)})),this.EventPooling.signal("request",(e=>{let{from:t,pack:s,id:i}=e,n={body:s,response:e=>{this.response(t,i,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",n),this.peer("me").emit("request",n)})),this.EventPooling.signal("pack/room",(e=>{let{from:t,pack:s}=e;this.room(t).emit("message",s)})),this.EventPooling.signal("room/joined",(e=>{let{id:t,roomid:s}=e,i=this.room(s),n=this.peer(t,!0);i.peers.set(n.socketId,n),i.emit("join",n)})),this.EventPooling.signal("room/ejected",(e=>{let{id:t,roomid:s}=e,i=this.room(s),n=this.peer(t);i.peers.delete(n.socketId),i.emit("eject",n)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:t}=e,s=this.room(t);s.peers.clear(),s.emit("close"),this.rooms.delete(t)})),this.EventPooling.signal("pair/info",(e=>{let{from:t,name:s,value:i}=e,n=this.peer(t);n.info.info[s]=i,n.emit("info",s,i)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new h(this);return t.setRoomOptions(e),this.emit("room"),t}peer(e,t=!1){if("string"==typeof e){if(this.peers.has(e))return this.peers.get(e);if(this.pairs.has(e))return this.pairs.get(e)}let s=new c(this);return s.setPeerOptions(e),s.active=t,this.peers.set(s.socketId,s),this.emit("peer",s),s}}})(); //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index c4b9c1f..43968d3 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\n endpoint: string;\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n constructor(options: IConnection){\n this.endpoint = new URL(options.endpoint);\n }\n public connect()\n {\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n this.connected = false;\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","interface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public WebRTC()\n {\n this.rtc = new RTCPeerConnection({\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n iceServers:[{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }]\n });\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n break;\n }\n case \"offer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.sendingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let {stream} = this.sendingStream.get(id) as {stream:MediaStream};\n let senders = [];\n for (const track of stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, stream));\n };\n stream.senders = senders;\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n // this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel\n }\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n this.active = true;\n }\n };\n if(this.connectionStatus == 'failed' || this.connectionStatus == \"disconnected\" || this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n (\n this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}\n ).stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n (\n this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}\n ).stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [id, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000)\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc? : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new PeerInfo(this);\n }\n public createRTC() : WebRTC\n {\n this.rtc = new WebRTC();\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: 'rtc:session',\n payload: payload\n })\n });\n this.on('message',(data:{type?:string,payload?:any}) => {\n if(data.type == 'rtc:session')\n {\n if(this.rtc)\n {\n this.rtc.emit(\"input\", data.payload)\n }\n }else if(data.type == 'rtc:message')\n {\n this.emit(\"message\", data.payload)\n }\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.send({\n type: 'rtc:message',\n payload: pack\n })\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true\n };\n Object.assign(defaultOptions,options);\n this.options = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let options = this.options || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...options\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.options,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.options.name,\n credential: this.options.credential\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.options,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false){\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom\n });\n }\n async fetchPeers(){\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId\n }) as {status:\"success\"|\"fail\", peers: string[]};\n\n let cup : Peer[] = [];\n\n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}","import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n constructor(options: IConnection){\n super();\n this.server = new Connection(options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.packMessagingSystem();\n }\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n let {from,pack} = payload;\n this.peer(from, true).emit('message', pack);\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any}) => {\n let {from,pack} = payload;\n this.room(from).emit('message', pack);\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n\n let peer = this.peer(from);\n\n peer.info.info[name] = value;\n\n peer.emit(\"info\", name, value);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n // this.rooms.set(room.roomId as string, room);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;"],"names":["$201ddc79d766b86c$export$98b66c25bb38499d","autoPair","connected","constructor","options","this","endpoint","URL","connect","ws","WebSocket","href","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","activeConnectionEvent","recaivePackEvent","onRecaivePack","func","push","onActive","$data","JSON","parse","tranferToServer","send","stringify","$7bc29f3852fca8a1$export$2e2bcd8739ae039","events","Map","signals","requests","count","wsts","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","set","stream","StartStream","signal","event","T","get","$639a7a490074f3f2$export$2e2bcd8739ae039","emit","eventName","args","on","activeScope","scope","f","$707287ab76ae8d6a$export$cd59d3e68ede65a1","mwse","async","status","ip","EventPooling","type","APIPAddress","Error","number","APNumber","code","APShortCode","undefined","socket","whois","$d7d20b916ab000fe$export$f3bd5f68ae16de","info","peer","name","rinfo","socketId","console","warn","message","value","SendOnly","$895bfe3da380c655$export$2e2bcd8739ae039","static","active","connectionStatus","iceStatus","gatheringStatus","signalingStatus","recaivingStream","sendingStream","WebRTC","rtc","RTCPeerConnection","iceCandidatePoolSize","iceTransportPolicy","rtcpMuxPolicy","iceServers","urls","eventConnectionState","eventIcecandidate","eventICEConnectionState","eventICEGatherinState","eventNogationNeeded","eventSignalingState","eventTrack","eventDatachannel","addIceCandidate","RTCIceCandidate","setRemoteDescription","RTCSessionDescription","answer","createAnswer","offerToReceiveAudio","offerToReceiveVideo","setLocalDescription","streamInfo","delete","senders","track","getTracks","addTrack","payload","dispatch","channel","createDefaultDataChannel","sendMessage","dt","createDataChannel","ordered","channels","pack","destroy","label","requireGC","readyState","connectionState","candidate","iceConnectionState","iceGatheringState","offer","createOffer","iceRestart","signalingState","streams","length","sendStream","stopStream","_stream","has","RTCPSender","getSenders","removeTrack","stopAllStreams","clear","setInterval","img","document","createElement","src","window","createObjectURL","Blob","ArrayBuffer","onerror","revokeObjectURL","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","peerConnection","primaryChannel","super","createRTC","setPeerOptions","setSocketId","uuid","result","equalTo","to","sendChannel","isOpenedP2P","isOpenedServer","server","peers","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","Object","assign","setRoomId","roomOptions","join","messages","room","rooms","credential","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","PackAnalyze","SendRaw","action","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","requestId","from","body","response","roomid","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file +{"mappings":"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","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\n endpoint: string;\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n constructor(options: IConnection){\n this.endpoint = new URL(options.endpoint);\n }\n public connect()\n {\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n this.connected = false;\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import Peer from \"./Peer\";\n\ninterface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public peer? : Peer;\n\n public WebRTC()\n {\n this.rtc = new RTCPeerConnection({\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n iceServers:[{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }]\n });\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n break;\n }\n case \"offer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.sendingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let {stream} = this.sendingStream.get(id) as {stream:MediaStream};\n let senders = [];\n for (const track of stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, stream));\n };\n stream.senders = senders;\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n // this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel\n }\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n this.active = true;\n }\n };\n if(this.connectionStatus == 'failed' || this.connectionStatus == \"disconnected\" || this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n (\n this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}\n ).stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n (\n this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}\n ).stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000)\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\nenum IMessageSymbase\n{\n PayloadMessagePack = -12873.54,\n PayloadRTCBasePack = -12884.54\n}\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc? : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new PeerInfo(this);\n\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == 'rtc')\n {\n if(data.action == IMessageSymbase.PayloadRTCBasePack)\n {\n if(this.rtc)\n {\n return this.rtc.emit(\"input\", data.payload)\n }\n console.warn(\"Not active rtc but recaived rtc packs\")\n };\n if(data.action == IMessageSymbase.PayloadMessagePack)\n {\n return this.emit(\"message\", data.payload)\n }\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC() : WebRTC\n {\n this.rtc = new WebRTC();\n this.rtc.peer = this;\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: 'rtc',\n action: IMessageSymbase.PayloadRTCBasePack,\n payload: payload\n })\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.send({\n type: 'rtc',\n action: IMessageSymbase.PayloadMessagePack,\n payload: pack\n })\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true\n };\n Object.assign(defaultOptions,options);\n this.options = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let options = this.options || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...options\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.options,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.options.name,\n credential: this.options.credential\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.options,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false){\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom\n });\n }\n async fetchPeers(){\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId\n }) as {status:\"success\"|\"fail\", peers: string[]};\n\n let cup : Peer[] = [];\n\n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}","import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n constructor(options: IConnection){\n super();\n this.server = new Connection(options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.packMessagingSystem();\n }\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n let {from,pack} = payload;\n this.peer(from, true).emit('message', pack);\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any}) => {\n let {from,pack} = payload;\n this.room(from).emit('message', pack);\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n\n let peer = this.peer(from);\n\n peer.info.info[name] = value;\n\n peer.emit(\"info\", name, value);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n // this.rooms.set(room.roomId as string, room);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;"],"names":["$201ddc79d766b86c$export$98b66c25bb38499d","autoPair","connected","constructor","options","this","endpoint","URL","connect","ws","WebSocket","href","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","activeConnectionEvent","recaivePackEvent","onRecaivePack","func","push","onActive","$data","JSON","parse","tranferToServer","send","stringify","$7bc29f3852fca8a1$export$2e2bcd8739ae039","events","Map","signals","requests","count","wsts","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","set","stream","StartStream","signal","event","T","get","$639a7a490074f3f2$export$2e2bcd8739ae039","emit","eventName","args","on","activeScope","scope","f","$707287ab76ae8d6a$export$cd59d3e68ede65a1","mwse","async","status","ip","EventPooling","type","APIPAddress","Error","number","APNumber","code","APShortCode","undefined","socket","whois","$d7d20b916ab000fe$export$f3bd5f68ae16de","info","peer","name","rinfo","socketId","console","warn","message","value","SendOnly","$895bfe3da380c655$export$2e2bcd8739ae039","static","active","connectionStatus","iceStatus","gatheringStatus","signalingStatus","recaivingStream","sendingStream","WebRTC","rtc","RTCPeerConnection","iceCandidatePoolSize","iceTransportPolicy","rtcpMuxPolicy","iceServers","urls","eventConnectionState","eventIcecandidate","eventICEConnectionState","eventICEGatherinState","eventNogationNeeded","eventSignalingState","eventTrack","eventDatachannel","addIceCandidate","RTCIceCandidate","setRemoteDescription","RTCSessionDescription","answer","createAnswer","offerToReceiveAudio","offerToReceiveVideo","setLocalDescription","streamInfo","delete","senders","track","getTracks","addTrack","payload","dispatch","channel","createDefaultDataChannel","sendMessage","dt","createDataChannel","ordered","channels","pack","destroy","label","requireGC","readyState","connectionState","candidate","iceConnectionState","iceGatheringState","offer","createOffer","iceRestart","signalingState","streams","length","sendStream","stopStream","_stream","has","RTCPSender","getSenders","removeTrack","stopAllStreams","clear","$9f6c30de484136d4$var$IMessageSymbase","IMessageSymbase","setInterval","img","document","createElement","src","window","createObjectURL","Blob","ArrayBuffer","onerror","revokeObjectURL","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","peerConnection","primaryChannel","super","action","PayloadRTCBasePack","PayloadMessagePack","createRTC","setPeerOptions","setSocketId","uuid","result","equalTo","to","sendChannel","isOpenedP2P","isOpenedServer","server","peers","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","Object","assign","setRoomId","roomOptions","join","messages","room","rooms","credential","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","PackAnalyze","SendRaw","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","requestId","from","body","response","roomid","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file