diff --git a/Source/Client.js b/Source/Client.js index dcf38fd..e1f9220 100644 --- a/Source/Client.js +++ b/Source/Client.js @@ -1,3 +1,5 @@ +const { CLIENT_SEND_MESSAGE, CLIENT_UPDATE_PROP } = require("./IPC"); +const stats = require("./stats"); function Client() { /** @@ -21,6 +23,17 @@ function Client() this.APNumber = 0; this.APShortCode = 0; this.APIPAddress = 0; + + this.isProxy = false; + this.proxyProcess = null; + + this.sync = function(...args){ + process.nextTick(()=>{ + for (const name of args) { + CLIENT_UPDATE_PROP(this.id, name, this[name]); + } + }) + }; }; /** * @type {Map} @@ -34,6 +47,7 @@ Client.prototype.peerRequest = function(client){ let info = {}; this.store.forEach((value, name) => info[name] = value); this.pairs.add(client.id); + this.sync('pairs'); client.send([{ from: this.id, info @@ -45,6 +59,7 @@ Client.prototype.peerRequest = function(client){ */ Client.prototype.acceptPeerRequest = function(client){ this.pairs.add(client.id); + this.sync('pairs'); client.send([{ from: this.id },'accepted/pair']); @@ -55,6 +70,7 @@ Client.prototype.peerRequest = function(client){ Client.prototype.rejectPeerRequest = function(client){ this.pairs.delete(client.id); client.pairs.delete(this.id); + this.sync('pairs'); client.send([{ from: this.id },'rejected/pair']); @@ -75,7 +91,13 @@ Client.prototype.pairList = function(){ }; Client.prototype.send = function(obj){ - this.socket.sendUTF(JSON.stringify(obj)); + if(this.isProxy) + { + CLIENT_SEND_MESSAGE(this.id, obj, this.proxyProcess) + }else{ + stats.ws_sended_packs++; + this.socket.sendUTF(JSON.stringify(obj)); + } }; exports.Client = Client; \ No newline at end of file diff --git a/Source/HTTPServer.js b/Source/HTTPServer.js index 47bc01b..b549be8 100644 --- a/Source/HTTPServer.js +++ b/Source/HTTPServer.js @@ -6,19 +6,27 @@ let compression = require("compression"); let {resolve} = require("path"); const { termoutput } = require("./config"); let server = http.createServer(); +const stats = require("./stats"); let app = express(); server.addListener("request", app); app.use(compression({ level: 9 })); + server.listen(7707,'0.0.0.0',() => { termoutput && console.log("HTTP Service Running..."); }); +server.addListener("error",(err)=> { + console.err(err) +}) exports.http = server; app.get("/script",(request, response)=>{ response.sendFile(resolve("./script/index.js")) }); +app.get("/test",(request, response)=>{ + response.sendFile(resolve("./script/test.html")) +}); app.get("/index.js.map",(request, response)=>{ response.sendFile(resolve("./script/index.js.map")) }); @@ -28,6 +36,12 @@ app.get("/webrtc.js",(request, response)=>{ app.get("/webrtc.adapter.js",(request, response)=>{ response.sendFile(resolve("./script/webrtc.adapter.js")) }); +app.get("/",(request, response)=>{ + response.sendFile(resolve("./script/index.html")) +}); +app.post("/stats",(request, response)=>{ + response.json(stats.others); +}); app.get("*",(request, response)=>{ response.sendFile(resolve("./script/status.xml")) }); \ No newline at end of file diff --git a/Source/IPC.js b/Source/IPC.js new file mode 100644 index 0000000..2637309 --- /dev/null +++ b/Source/IPC.js @@ -0,0 +1,187 @@ + +process.on('message',data => { + const { Client } = require("./Client.js"); + const { Room } = require("./Services/Room"); + switch(data.type) + { + case "CLIENT_CREATED":{ + slog("CLIENT_CREATED"); + let client = new Client(); + client.isProxy = true; + client.proxyProcess = data.pid; + client.id = data.uuid; + Client.clients.set(client.id, client); + break; + } + case "CLIENT_UPDATE_PROP":{ + slog("CLIENT_UPDATE_PROP"); + let client = Client.clients.get(data.uuid); + client[data.name] = data.value; + break; + } + case "CLIENT_SEND_MESSAGE":{ + //slog("CLIENT_SEND_MESSAGE"); + let client = Client.clients.get(data.uuid); + if(client.isProxy != true) + { + client.send(data.message) + } + break; + } + case "CLIENT_DESTROY":{ + slog("CLIENT_DESTROY"); + Client.clients.delete(data.uuid); + break; + } + case "ROOM_CREATED":{ + slog("ROOM_CREATED"); + let room = Room.fromJSON(data.value); + Room.rooms.set(room.id, room); + break; + } + case "ROOM_UPDATE_PROP":{ + slog("ROOM_UPDATE_PROP"); + let room = Room.rooms.get(data.uuid); + room[data.name] = data.value; + break; + } + case "ROOM_JOIN_CLIENT":{ + slog("ROOM_JOIN_CLIENT"); + let room = Room.rooms.get(data.uuid); + let client = Client.clients.get(data.client); + if(room && client) + { + client.rooms.add(room.id); + room.clients.set(client.id, client); + } + break; + } + case "ROOM_EJECT_CLIENT":{ + slog("ROOM_EJECT_CLIENT"); + let room = Room.rooms.get(data.uuid); + let client = Client.clients.get(data.client); + if(room && client) + { + client.rooms.delete(room.id); + room.clients.delete(client.id, client); + } + break; + } + case "ROOM_DESTROY":{ + slog("ROOM_DESTROY"); + Room.rooms.delete(data.value); + break; + } + } +}); + +function CLIENT_CREATED(uuid) +{ + mlog("CLIENT_CREATED"); + process.send({ + type:'CLIENT_CREATED', + uuid: uuid + }) +}; +function CLIENT_UPDATE_PROP(uuid, name, value) +{ + mlog("CLIENT_UPDATE_PROP"); + process.send({ + type:'CLIENT_UPDATE_PROP', + uuid: uuid, + name, + value + }) +}; +function CLIENT_SEND_MESSAGE(uuid, message, clusterPid) +{ + mlog("CLIENT_SEND_MESSAGE"); + process.send({ + type:'CLIENT_SEND_MESSAGE', + uuid: uuid, + message, + process:clusterPid + }) +}; +function CLIENT_DESTROY(uuid) +{ + mlog("CLIENT_DESTROY"); + process.send({ + type:'CLIENT_DESTROY', + uuid: uuid + }) +}; + + +function ROOM_CREATED(room) +{ + mlog("ROOM_CREATED"); + let raw = room.toJSON(true); + process.send({ + type:'ROOM_CREATED', + value: raw + }) +}; + +function ROOM_UPDATE_PROP(uuid, name, value) +{ + mlog("ROOM_UPDATE_PROP"); + process.send({ + type:'ROOM_UPDATE_PROP', + uuid: uuid, + name, + value + }) +}; + +function ROOM_JOIN_CLIENT(uuid, client) +{ + mlog("ROOM_JOIN_CLIENT"); + process.send({ + type:'ROOM_JOIN_CLIENT', + uuid: uuid, + client + }) +}; +function ROOM_EJECT_CLIENT(uuid, client) +{ + mlog("ROOM_EJECT_CLIENT"); + process.send({ + type:'ROOM_EJECT_CLIENT', + uuid: uuid, + client + }) +}; + +function ROOM_DESTROY(room) +{ + mlog("ROOM_DESTROY"); + process.send({ + type:'ROOM_DESTROY', + value: room.id + }) +}; + +function mlog(command) +{ + return; + console.log("M",process.pid, command) +} +function slog(command) +{ + return; + console.log("S",process.pid, command) +} + + +exports.CLIENT_CREATED = CLIENT_CREATED; +exports.CLIENT_UPDATE_PROP = CLIENT_UPDATE_PROP; +exports.CLIENT_DESTROY = CLIENT_DESTROY; +exports.CLIENT_SEND_MESSAGE = CLIENT_SEND_MESSAGE; +exports.ROOM_CREATED = ROOM_CREATED; +exports.ROOM_UPDATE_PROP = ROOM_UPDATE_PROP; +exports.ROOM_JOIN_CLIENT = ROOM_JOIN_CLIENT; +exports.ROOM_EJECT_CLIENT = ROOM_EJECT_CLIENT; +exports.ROOM_DESTROY = ROOM_DESTROY; +exports.mlog = mlog; +exports.slog = slog; \ No newline at end of file diff --git a/Source/Services/Auth.js b/Source/Services/Auth.js index e12e256..660096a 100644 --- a/Source/Services/Auth.js +++ b/Source/Services/Auth.js @@ -1,4 +1,5 @@ const { Client } = require("../Client.js"); +const { CLIENT_UPDATE_PROP } = require("../IPC.js"); let {addService, addListener} = require("../WebSocket.js"); addService(({ @@ -13,13 +14,16 @@ addService(({ case "auth/pair-system":{ if(value == 'everybody') { - client.requiredPair = true; + client.requiredPair = true; end({status:"success"}); + client.sync('requiredPair'); } if(value == 'disable') { client.requiredPair = false; end({status:"success"}); + client.sync('requiredPair'); + //CLIENT_UPDATE_PROP(client.id, 'requiredPair', client.requiredPair); } break; } @@ -29,6 +33,7 @@ addService(({ } case 'auth/public':{ client.requiredPair = false; + client.sync('requiredPair'); return end({ value: 'success', mode: 'public' @@ -36,6 +41,7 @@ addService(({ } case 'auth/private':{ client.requiredPair = true; + client.sync('requiredPair'); return end({ value: 'success', mode: 'private' diff --git a/Source/Services/DataTransfer.js b/Source/Services/DataTransfer.js index 5aff745..6de3334 100644 --- a/Source/Services/DataTransfer.js +++ b/Source/Services/DataTransfer.js @@ -94,9 +94,9 @@ addService(({ }) }; Room.rooms.get(to).send([{ - from: client.id, + from: to, pack: pack - }, 'pack'], wom ? client.id : void 0); + }, 'pack/room'], wom ? client.id : void 0); handshake && end({ type: 'success' }) diff --git a/Source/Services/IPPressure.js b/Source/Services/IPPressure.js index 1f9ac98..cd8ce09 100644 --- a/Source/Services/IPPressure.js +++ b/Source/Services/IPPressure.js @@ -3,6 +3,7 @@ let {addService, addListener} = require("../WebSocket.js"); let { randomBytes } = require("node:crypto"); +const { slog } = require("../IPC"); class APNumber{ /** @@ -11,14 +12,20 @@ class APNumber{ static busyNumbers = new Map(); /** * @type {number} + * @param {Client} client */ - static lock() + static lock(client) { let c = 24; while(true){ if(!APNumber.busyNumbers.has(c)) { - APNumber.busyNumbers.set(c,true); + APNumber.busyNumbers.set(c,client); + process.send({ + type: 'AP_NUMBER/LOCK', + uuid: client.id, + value: c + }) return c; } c++; @@ -30,6 +37,11 @@ class APNumber{ static release(num) { APNumber.busyNumbers.delete(num); + process.send({ + type: 'AP_NUMBER/RELEASE', + uuid: APNumber.busyNumbers.get(num).id, + value: num + }) } static whois(num){ return APNumber.busyNumbers.get(num)?.id; @@ -56,6 +68,11 @@ class APShortCode{ if(APShortCode.busyCodes.has(code) == false) { APShortCode.busyCodes.set(code, client); + process.send({ + type: 'AP_SHORTCODE/LOCK', + uuid: APShortCode.busyCodes.get(num).id, + value: code + }) return code; } if(!thirdLetter.end()) @@ -79,7 +96,15 @@ class APShortCode{ } } static release(code){ - APShortCode.busyCodes.delete(code); + if(APShortCode.busyCodes.has(code)) + { + process.send({ + type: 'AP_SHORTCODE/RELEASE', + uuid: APShortCode.busyCodes.get(code).id, + value: code + }) + APShortCode.busyCodes.delete(code); + } } static whois(num){ return APShortCode.busyCodes.get(num)?.id; @@ -122,6 +147,11 @@ class APIPAddress{ if(APIPAddress.busyIP.has(code) == false) { APIPAddress.busyIP.set(code, client); + process.send({ + type: 'AP_IPADDRESS/LOCK', + uuid: APIPAddress.busyIP.get(code).id, + value: code + }) return code; } if(D != 255) @@ -156,7 +186,15 @@ class APIPAddress{ } } static release(code){ - APIPAddress.busyIP.delete(code); + if(APIPAddress.busyIP.has(code)) + { + process.send({ + type: 'AP_IPADDRESS/RELEASE', + uuid: APIPAddress.busyIP.get(code).id, + value: code + }) + APIPAddress.busyIP.delete(code); + } } static whois(num){ return APIPAddress.busyIP.get(num)?.id; @@ -167,7 +205,6 @@ exports.APNumber = APNumber; exports.APShortCode = APShortCode; exports.APIPAddress = APIPAddress; - addService(({ client, message, @@ -186,6 +223,7 @@ addService(({ }; let value = APIPAddress.lock(client); client.APIPAddress = value; + client.sync('APIPAddress'); end({ status : "success", ip : value @@ -201,6 +239,7 @@ addService(({ }; let value = APNumber.lock(client); client.APNumber = value; + client.sync('APNumber'); end({ status : "success", number : value @@ -216,6 +255,7 @@ addService(({ }; let value = APShortCode.lock(client); client.APShortCode = value; + client.sync('APShortCode'); end({ status : "success", code : value @@ -230,6 +270,7 @@ addService(({ } APIPAddress.release(client.APIPAddress); let value = APIPAddress.lock(client); + client.sync('APIPAddress'); end({ status : "success", ip : value @@ -244,6 +285,7 @@ addService(({ } APNumber.release(client.APNumber); let value = APNumber.lock(client); + client.sync('APNumber'); end({ status : "success", number : value @@ -258,6 +300,7 @@ addService(({ } APShortCode.release(client.APShortCode); let value = APShortCode.lock(client); + client.sync('APShortCode'); end({ status : "success", code : value @@ -266,6 +309,8 @@ addService(({ } case "release/APIPAddress":{ APIPAddress.release(client.APIPAddress); + client.APIPAddress = void 0; + client.sync('APShortCode'); end({ status : "success" }) @@ -273,6 +318,8 @@ addService(({ } case "release/APNumber":{ APNumber.release(client.APNumber); + client.APNumber = void 0; + client.sync('APIPAddress'); end({ status : "success" }) @@ -280,6 +327,8 @@ addService(({ } case "release/APShortCode":{ APShortCode.release(client.APShortCode); + client.APShortCode = void 0; + client.sync('APIPAddress'); end({ status : "success" }) @@ -333,6 +382,72 @@ addService(({ } }) +process.on('message',({type, uuid, value}) => { + switch(type) + { + case "AP_NUMBER/LOCK":{ + console.log("S",process.pid, 'IPPressure SYNCED') + let client = Client.clients.get(uuid); + APNumber.busyNumbers.set(value, client); + if(client) + { + client.APNumber = value; + client.sync('APNumber'); + } + } + case "AP_NUMBER/RELEASE":{ + console.log("S",process.pid, 'IPPressure SYNCED') + APNumber.busyNumbers.delete(value); + let client = Client.clients.get(uuid); + if(client) + { + client.APNumber = void 0; + client.sync('APNumber'); + } + } + case "AP_SHORTCODE/LOCK":{ + console.log("S",process.pid, 'IPPressure SYNCED') + let client = Client.clients.get(uuid); + APShortCode.busyCodes.set(value, client); + if(client) + { + client.APShortCode = value; + client.sync('APShortCode'); + } + } + case "AP_SHORTCODE/RELEASE":{ + console.log("S",process.pid, 'IPPressure SYNCED') + APShortCode.busyCodes.delete(value); + let client = Client.clients.get(uuid); + if(client) + { + client.APShortCode = void 0; + client.sync('APShortCode'); + } + } + case "AP_IPADDRESS/LOCK":{ + console.log("S",process.pid, 'IPPressure SYNCED') + let client = Client.clients.get(uuid); + APIPAddress.busyIP.set(value, client); + if(client) + { + client.APIPAddress = value; + client.sync('APIPAddress'); + } + } + case "AP_IPADDRESS/RELEASE":{ + console.log("S",process.pid, 'IPPressure SYNCED') + APIPAddress.busyIP.delete(value); + let client = Client.clients.get(uuid); + if(client) + { + client.APIPAddress = void 0; + client.sync('APIPAddress'); + } + } + } +}) + addListener('disconnect',(global, client)=>{ if(client.APIPAddress != 0) { diff --git a/Source/Services/Room.js b/Source/Services/Room.js index 6d26d40..c797c0b 100644 --- a/Source/Services/Room.js +++ b/Source/Services/Room.js @@ -3,6 +3,7 @@ let {randomUUID,createHash} = require("crypto"); const joi = require("joi"); let {addService,addListener} = require("../WebSocket.js"); const { termoutput } = require("../config.js"); +const { ROOM_CREATED, ROOM_DESTROY, ROOM_UPDATE_PROP, ROOM_JOIN_CLIENT, ROOM_EJECT_CLIENT } = require("../IPC.js"); let term = require("terminal-kit").terminal; function Sha256(update) @@ -64,15 +65,24 @@ function Room() * @type {string[]} */ this.waitingInvited = new Set(); + + this.sync = function(...args){ + process.nextTick(()=>{ + for (const name of args) { + ROOM_UPDATE_PROP(this.id, name, this[name]); + } + }) + }; } /** * @param {Room} room */ Room.prototype.publish = function(room){ Room.rooms.set(this.id, this); + ROOM_CREATED(this); termoutput && term.green("Room Published ").white(this.name," in ").yellow(this.clients.size).white(" clients")('\n'); }; -Room.prototype.toJSON = function(){ +Room.prototype.toJSON = function(detailed){ let obj = {}; obj.id = this.id; obj.accessType = this.accessType; @@ -82,8 +92,47 @@ Room.prototype.toJSON = function(){ obj.name = this.name; obj.owner = this.owner.id; obj.waitingInvited = [...this.waitingInvited]; + if(detailed) + { + obj.credential = this.credential; + obj.notifyActionInvite = this.notifyActionInvite; + obj.notifyActionJoined = this.notifyActionJoined; + obj.notifyActionEjected = this.notifyActionEjected; + obj.clients = [...this.clients.keys()]; + } return obj; }; +/** + * @param {Object} data + * @param {Room} room + */ +Room.fromJSON = function(data, room){ + room = room || new Room(); + let obj = {}; + room.id = data.id; + room.accessType = data.accessType; + room.createdAt = data.createdAt; + room.description = data.description; + room.joinType = data.joinType; + room.name = data.name; + if(data.owner && Client.clients.has(data.owner)) + { + room.owner = Client.clients.get(data.owner); + } + room.waitingInvited = new Set(data.waitingInvited); + obj.credential = data.credential; + obj.notifyActionInvite = data.notifyActionInvite; + obj.notifyActionJoined = data.notifyActionJoined; + obj.notifyActionEjected = data.notifyActionEjected; + obj.clients = new Map( + data.clients.map(e => ([ + e, // map key + Client.clients.get(e) // map value + ]) + ) + ) + return room; +}; Room.prototype.send = function(obj, withOut){ for (const client of this.clients.values()) { if(client.id != withOut) @@ -107,6 +156,7 @@ Room.prototype.join = function(client){ }; client.rooms.add(this.id); this.clients.set(client.id, client); + ROOM_JOIN_CLIENT(this.id, client.id); termoutput && term.green("Client Room joined ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; Room.prototype.down = function(){ @@ -116,6 +166,7 @@ Room.prototype.down = function(){ ownerid: this.owner.id },'room/closed']); Room.rooms.delete(this.id); + ROOM_DESTROY(this) }; /** * @param {Client} client @@ -131,6 +182,7 @@ Room.prototype.eject = function(client){ } client.rooms.delete(this.id); this.clients.delete(client.id); + ROOM_EJECT_CLIENT(this.id, client.id); if(this.clients.size == 0) { @@ -154,8 +206,8 @@ addListener('connect',(global, client)=>{ room.id = client.id; room.name = "Your Room | " + client.id; room.owner = client; - room.join(client); room.publish(); + room.join(client); }); addListener('disconnect',(global, client)=>{ @@ -296,8 +348,8 @@ addService(({ { room.credential = Sha256(message.credential + ""); } - room.join(client); room.publish(); + room.join(client); end({ status: "success", room: room.toJSON() diff --git a/Source/WebSocket.js b/Source/WebSocket.js index 470e41e..63c6ceb 100644 --- a/Source/WebSocket.js +++ b/Source/WebSocket.js @@ -5,6 +5,8 @@ let {http} = require("./HTTPServer"); let {randomUUID} = require("crypto"); const { Client } = require("./Client.js"); const { termoutput } = require("./config"); +const { CLIENT_CREATED, CLIENT_DESTROY } = require("./IPC"); +const stats = require("./stats"); termoutput && console.log("Web Socket Protocol is ready"); http.addListener("upgrade",() => { @@ -15,11 +17,22 @@ let wsServer = new websocket.server({ httpServer: http, autoAcceptConnections: true }); +/* +process.send({ + core: "writestat", + writeBytes:0, + readBytes:0, + totalBytes:0, + recaivedPacket:0, + sendedPacket:0, + totalPacket:0 +})*/ let global = new Map(); let clients = new Map(); -wsServer.addListener("connect",(socket) => { + +wsServer.addListener("connect",(socket) => { let xClient = new Client(); let id = randomUUID(); socket.id = id; @@ -29,12 +42,34 @@ wsServer.addListener("connect",(socket) => { Client.clients.set(id, xClient); clients.set(id, xClient); + console.log("Client:", id,"on worker pid:",process.pid) + + CLIENT_CREATED(id); + emit("connect", global, xClient); + + let oldw = 0, oldr = 0; + let timer = setInterval(()=>{ + let writed = socket.socket.bytesRead - oldr; + let readed = socket.socket.bytesWritten - oldw; + stats.ws_total_bytes += (writed + readed); + stats.ws_readed_bytes += readed; + stats.ws_writed_bytes += writed; + oldr = socket.socket.bytesRead; + oldw = socket.socket.bytesWritten; + }, 1000) + socket.addListener("close",()=>{ emit("disconnect", global, xClient); + CLIENT_DESTROY(id); Client.clients.set(id, xClient); + clearInterval(timer); }); + socket.addListener("message",({type,utf8Data}) => { + stats.ws_recaived_packs++; + stats.ws_total_packs++; + if(type == "utf8") { let json; diff --git a/Source/stats.js b/Source/stats.js new file mode 100644 index 0000000..fdf776c --- /dev/null +++ b/Source/stats.js @@ -0,0 +1,53 @@ +const { mlog } = require("./IPC"); + +exports.ws_writed_bytes = 0; +exports.ws_readed_bytes = 0; +exports.ws_total_bytes = 0; +exports.ws_sended_packs = 0; +exports.ws_recaived_packs = 0; +exports.ws_total_packs = 0; + + +process.send({ + core: "writestat", + ws_writed_bytes: exports.ws_writed_bytes, + ws_readed_bytes: exports.ws_readed_bytes, + ws_total_bytes: exports.ws_total_bytes, + ws_sended_packs: exports.ws_sended_packs, + ws_recaived_packs: exports.ws_recaived_packs, + ws_total_packs: exports.ws_total_packs +}); +setInterval(()=>{ + process.send({ + core: "writestat", + ws_writed_bytes: exports.ws_writed_bytes, + ws_readed_bytes: exports.ws_readed_bytes, + ws_total_bytes: exports.ws_total_bytes, + ws_sended_packs: exports.ws_sended_packs, + ws_recaived_packs: exports.ws_recaived_packs, + ws_total_packs: exports.ws_total_packs + }) + mlog(`writed ${exports.ws_writed_bytes} bytes, readed ${exports.ws_readed_bytes} bytes`); + exports.ws_writed_bytes = 0; + exports.ws_readed_bytes = 0; + exports.ws_total_bytes = 0; + exports.ws_sended_packs = 0; + exports.ws_recaived_packs = 0; + exports.ws_total_packs = 0; + process.send({ + core: "readstat", + ws_writed_bytes: exports.ws_writed_bytes, + ws_readed_bytes: exports.ws_readed_bytes, + ws_total_bytes: exports.ws_total_bytes, + ws_sended_packs: exports.ws_sended_packs, + ws_recaived_packs: exports.ws_recaived_packs, + ws_total_packs: exports.ws_total_packs + }) +}, 3000) + +process.on('message', stat => { + if(stat.type == ':stats:') + { + exports.others = stat.data; + } +}) diff --git a/frontend/index.ts b/frontend/index.ts index e41f822..c54a506 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -70,9 +70,9 @@ export default class MWSE extends EventTarget { this.peer(from, true).emit('request', scope); this.peer('me').emit('request', scope); }) - this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => { - let {to,pack} = payload; - this.room(to).emit('message', pack); + this.EventPooling.signal('pack/room',(payload : {from:string,pack:any}) => { + let {from,pack} = payload; + this.room(from).emit('message', pack); }) this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => { let {id,roomid} = payload; diff --git a/index.js b/index.js new file mode 100644 index 0000000..e57a966 --- /dev/null +++ b/index.js @@ -0,0 +1,125 @@ +/** @type {import('node:cluster').Cluster} */ +const cluster = require("cluster"); +const os = require("os"); +let {randomUUID} = require("crypto"); + +/** + * Use Round Robin algorithm for cluster process load balancer + */ +cluster.schedulingPolicy = cluster.SCHED_RR; + +async function main() +{ + if(cluster.isPrimary == false) + { + console.log("Slave Process PID:", process.pid); + // This process is a worker / slave + // Compile source code and run + require("./Source/index"); + // stay here + return; + }; + + // This process is a primary / master + console.log("Master Process PID:", process.pid); + + // Worker process list + const master = new Map(); + + const coreCount = 3 //os.cpus().length; + for(let index = 0; index < coreCount; index++) + { + // Open slave process + let worker = await generateFlow(); + // Save process with id + master.set(worker.id, worker); + // Listen process for commands + worker.message( + // This process want to send payload to sibling process with IPC + (workerId, payload) =>{ + // Check Target worker + if(payload.core) + { + switch(payload.core) + { + case "writestat":{ + master.get(workerId).setStats(payload) + break; + } + case "readstat":{ + master.get(workerId).send({ + type: ':stats:', + data: [ + ...master.entries() + ].map(( + [, master] + ) => { + let e = master.getStats(); + return { + core: master.uuid, + ws_writed_bytes:e.ws_writed_bytes, + ws_readed_bytes:e.ws_readed_bytes, + ws_total_bytes:e.ws_total_bytes, + ws_sended_packs:e.ws_sended_packs, + ws_recaived_packs:e.ws_recaived_packs, + ws_total_packs:e.ws_total_packs + } + }) + }) + break; + } + } + }else if(payload.process) + { + master.get(payload.process).send({ + ...payload, + pid: worker.id + }) + }else for (const [siblingWorkerId,{send}] of master) { + // No sending to itself + if(workerId !== siblingWorkerId) + { + + // Send command to sibling with IPC + send({ + ...payload, + pid: worker.id + }) + } + } + } + ) + } +} + + + + +async function generateFlow() +{ + // Mirror this process with for (low-level os multitasking) + const worker = cluster.fork(); + // Wait process is online + await new Promise(ok => { + worker.addListener("online",()=> { + ok() + }) + }); + // Get process pid on the os + let id = worker.process.pid; + + let stats = {}; + + // Simplification wrapping send and get events with IPC's event functions + return { + id, + uuid: randomUUID(), + send: message => worker.send(message), + message: (callback) => worker.addListener("message", e => callback(id,e)), + getStats: () => stats, + setStats: e => Object.assign(stats, e) + } +} + +// Run immediately +process.nextTick(main); \ No newline at end of file diff --git a/script/index.html b/script/index.html new file mode 100644 index 0000000..9933e70 --- /dev/null +++ b/script/index.html @@ -0,0 +1,678 @@ + + + + + + + Network meter + + +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/script/index.js b/script/index.js index a80f551..4a2d254 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),this.autoPair=e.autoPair||!1}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 s=JSON.parse(e);for(const e of this.recaivePackEvent)e(s)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class s{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((s,t)=>{let o=++this.count;this.wsts.WSTSProtocol.SendRequest(e,o),this.events.set(o,[e=>{s(e)},e=>{t(e)}])}))}stream(e,s){let t=++this.count;this.wsts.WSTSProtocol.StartStream(e,t),this.events.set(t,[e=>{s(e)},()=>{}])}signal(e,s){let t=this.signals.get(e);t?t.push(s):this.signals.set(e,[s])}}class t{events={};emit(e,...s){if(this.events[e])for(const t of this.events[e])t(...s)}on(e,s){this.events[e]?this.events[e].push(s):this.events[e]=[s]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}class o{constructor(e){this.mwse=e}async allocAPIPAddress(){let{status:e,ip:s}=await this.mwse.EventPooling.request({type:"alloc/APIPAddress"});if("success"==e)return this.APIPAddress=s,s;throw new Error("Error Allocated Access Point IP Address")}async allocAPNumber(){let{status:e,number:s}=await this.mwse.EventPooling.request({type:"alloc/APNumber"});if("success"==e)return this.APNumber=s,s;throw new Error("Error Allocated Access Point Number")}async allocAPShortCode(){let{status:e,code:s}=await this.mwse.EventPooling.request({type:"alloc/APShortCode"});if("success"==e)return this.APShortCode=s,s;throw new Error("Error Allocated Access Point Short Code")}async reallocAPIPAddress(){let{status:e,ip:s}=await this.mwse.EventPooling.request({type:"realloc/APIPAddress"});if("success"==e)return this.APIPAddress=s,s;throw new Error("Error Reallocated Access Point IP Address")}async reallocAPNumber(){let{status:e,number:s}=await this.mwse.EventPooling.request({type:"realloc/APNumber"});if("success"==e)return this.APNumber=s,s;throw new Error("Error Reallocated Access Point Number")}async reallocAPShortCode(){let{status:e,code:s}=await this.mwse.EventPooling.request({type:"realloc/APShortCode"});if("success"==e)return this.APShortCode=s,s;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:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==s?t:null}async queryAPNumber(e){let{status:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==s?t:null}async queryAPShortCode(e){let{status:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==s?t:null}}class i extends t{options={};selfSocket=!1;active=!1;constructor(e){super(),this.mwse=e}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){await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId})}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class r extends t{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let s={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(s,e),this.options=s}}setRoomId(e){this.roomId=e}async createRoom(e){let s=this.options||e,t=await this.mwse.EventPooling.request({type:"create-room",...s});if("fail"==t.status){if("ALREADY-EXISTS"==t.message&&this.options.ifexistsJoin)return this.join();throw new Error(t.message||t.messages)}this.options={...this.options,...t.room},this.roomId=t.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,s=!1){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:s})}async fetchAllPeers(){let{status:e,peers:s}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),t=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of s){let s=this.mwse.peer(e);t.push(s),this.peers.set(e,s)}return t}}class n{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,s){this.mwse.server.tranferToServer([e,s,"R"])}StartStream(e,s){this.mwse.server.tranferToServer([e,s,"S"])}PackAnalyze(e){let[s,t,o]=e;if("number"==typeof t){let e=this.mwse.EventPooling.events.get(t);if(e){if(e[0](s,o),"E"===o)this.mwse.EventPooling.events.delete(t)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(t);if(e)for(const t of e)t(s);else console.warn("Missing event sended from server")}}}window.MWSE=class extends t{rooms=new Map;pairs=new Map;peers=new Map;constructor(t){super(),this.server=new e(t),this.WSTSProtocol=new n(this),this.EventPooling=new s(this),this.virtualPressure=new o(this),this.server.connect(),this.me=new i(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,s){let{pack:t}=await this.EventPooling.request({type:"request/to",to:e,pack:s});return t}async response(e,s,t){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:t,id:s})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:s,pack:t}=e;this.peer(s,!0).emit("message",t)})),this.EventPooling.signal("request",(e=>{let{from:s,pack:t,id:o}=e,i={body:t,response:e=>{this.response(s,o,e)},peer:this.peer(s,!0)};this.peer(s,!0).emit("request",i),this.peer("me").emit("request",i)})),this.EventPooling.signal("pack/room",(e=>{let{to:s,pack:t}=e;this.room(s).emit("message",t)})),this.EventPooling.signal("room/joined",(e=>{let{id:s,roomid:t}=e,o=this.room(t),i=this.peer(s,!0);o.peers.set(i.socketId,i),o.emit("join",i)})),this.EventPooling.signal("room/ejected",(e=>{let{id:s,roomid:t}=e,o=this.room(t),i=this.peer(s);o.peers.delete(i.socketId),o.emit("eject",i)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:s}=e,t=this.room(s);t.peers.clear(),t.emit("close"),this.rooms.delete(s)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let s=new r(this);return s.setRoomOptions(e),this.emit("room"),s}peer(e,s=!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 t=new i(this);return t.setPeerOptions(e),t.active=s,this.peers.set(t.socketId,t),this.emit("peer",t),t}}})(); +(()=>{class e{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint),this.autoPair=e.autoPair||!1}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 s=JSON.parse(e);for(const e of this.recaivePackEvent)e(s)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class s{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((s,t)=>{let o=++this.count;this.wsts.WSTSProtocol.SendRequest(e,o),this.events.set(o,[e=>{s(e)},e=>{t(e)}])}))}stream(e,s){let t=++this.count;this.wsts.WSTSProtocol.StartStream(e,t),this.events.set(t,[e=>{s(e)},()=>{}])}signal(e,s){let t=this.signals.get(e);t?t.push(s):this.signals.set(e,[s])}}class t{events={};emit(e,...s){if(this.events[e])for(const t of this.events[e])t(...s)}on(e,s){this.events[e]?this.events[e].push(s):this.events[e]=[s]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}class o{constructor(e){this.mwse=e}async allocAPIPAddress(){let{status:e,ip:s}=await this.mwse.EventPooling.request({type:"alloc/APIPAddress"});if("success"==e)return this.APIPAddress=s,s;throw new Error("Error Allocated Access Point IP Address")}async allocAPNumber(){let{status:e,number:s}=await this.mwse.EventPooling.request({type:"alloc/APNumber"});if("success"==e)return this.APNumber=s,s;throw new Error("Error Allocated Access Point Number")}async allocAPShortCode(){let{status:e,code:s}=await this.mwse.EventPooling.request({type:"alloc/APShortCode"});if("success"==e)return this.APShortCode=s,s;throw new Error("Error Allocated Access Point Short Code")}async reallocAPIPAddress(){let{status:e,ip:s}=await this.mwse.EventPooling.request({type:"realloc/APIPAddress"});if("success"==e)return this.APIPAddress=s,s;throw new Error("Error Reallocated Access Point IP Address")}async reallocAPNumber(){let{status:e,number:s}=await this.mwse.EventPooling.request({type:"realloc/APNumber"});if("success"==e)return this.APNumber=s,s;throw new Error("Error Reallocated Access Point Number")}async reallocAPShortCode(){let{status:e,code:s}=await this.mwse.EventPooling.request({type:"realloc/APShortCode"});if("success"==e)return this.APShortCode=s,s;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:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==s?t:null}async queryAPNumber(e){let{status:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==s?t:null}async queryAPShortCode(e){let{status:s,socket:t}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==s?t:null}}class i extends t{options={};selfSocket=!1;active=!1;constructor(e){super(),this.mwse=e}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){await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId})}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class r extends t{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let s={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(s,e),this.options=s}}setRoomId(e){this.roomId=e}async createRoom(e){let s=this.options||e,t=await this.mwse.EventPooling.request({type:"create-room",...s});if("fail"==t.status){if("ALREADY-EXISTS"==t.message&&this.options.ifexistsJoin)return this.join();throw new Error(t.message||t.messages)}this.options={...this.options,...t.room},this.roomId=t.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,s=!1){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:s})}async fetchAllPeers(){let{status:e,peers:s}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),t=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of s){let s=this.mwse.peer(e);t.push(s),this.peers.set(e,s)}return t}}class n{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,s){this.mwse.server.tranferToServer([e,s,"R"])}StartStream(e,s){this.mwse.server.tranferToServer([e,s,"S"])}PackAnalyze(e){let[s,t,o]=e;if("number"==typeof t){let e=this.mwse.EventPooling.events.get(t);if(e){if(e[0](s,o),"E"===o)this.mwse.EventPooling.events.delete(t)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(t);if(e)for(const t of e)t(s);else console.warn("Missing event sended from server")}}}window.MWSE=class extends t{rooms=new Map;pairs=new Map;peers=new Map;constructor(t){super(),this.server=new e(t),this.WSTSProtocol=new n(this),this.EventPooling=new s(this),this.virtualPressure=new o(this),this.server.connect(),this.me=new i(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,s){let{pack:t}=await this.EventPooling.request({type:"request/to",to:e,pack:s});return t}async response(e,s,t){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:t,id:s})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:s,pack:t}=e;this.peer(s,!0).emit("message",t)})),this.EventPooling.signal("request",(e=>{let{from:s,pack:t,id:o}=e,i={body:t,response:e=>{this.response(s,o,e)},peer:this.peer(s,!0)};this.peer(s,!0).emit("request",i),this.peer("me").emit("request",i)})),this.EventPooling.signal("pack/room",(e=>{let{from:s,pack:t}=e;this.room(s).emit("message",t)})),this.EventPooling.signal("room/joined",(e=>{let{id:s,roomid:t}=e,o=this.room(t),i=this.peer(s,!0);o.peers.set(i.socketId,i),o.emit("join",i)})),this.EventPooling.signal("room/ejected",(e=>{let{id:s,roomid:t}=e,o=this.room(t),i=this.peer(s);o.peers.delete(i.socketId),o.emit("eject",i)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:s}=e,t=this.room(s);t.peers.clear(),t.emit("close"),this.rooms.delete(s)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let s=new r(this);return s.setRoomOptions(e),this.emit("room"),s}peer(e,s=!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 t=new i(this);return t.setPeerOptions(e),t.active=s,this.peers.set(t.socketId,t),this.emit("peer",t),t}}})(); //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index cb79cd6..9507b3a 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"MAIO,MAAMA,EAIFC,UAAqB,EACrBC,WAAsB,EAC7BC,YAAYC,GACRC,KAAKC,SAAW,IAAIC,IAAIH,EAAQE,UAChCD,KAAKJ,SAAWG,EAAQH,WAAY,CACxC,CACOO,UAEHH,KAAKI,GAAK,IAAIC,UAAUL,KAAKC,SAASK,MACtCN,KAAKO,aACT,CACOC,aAEHR,KAAKI,GAAGK,OACZ,CACOF,cAEHP,KAAKI,GAAGM,iBAAiB,QAAQ,IAAMV,KAAKW,cAC5CX,KAAKI,GAAGM,iBAAiB,SAAS,IAAMV,KAAKY,eAC7CZ,KAAKI,GAAGM,iBAAiB,SAAS,IAAMV,KAAKa,eAC7Cb,KAAKI,GAAGM,iBAAiB,WAAW,EAACI,KAACA,KAAUd,KAAKe,aAAaD,IACtE,CACQH,YAEJX,KAAKH,WAAY,EACjB,IAAK,MAAMmB,KAAYhB,KAAKiB,sBACxBD,OAAS,EAEjB,CACQJ,aAEJZ,KAAKH,WAAY,CACrB,CACQgB,aAEJb,KAAKH,WAAY,CACrB,CACQqB,iBAA2C,GAC5CC,cAAcC,GAEjBpB,KAAKkB,iBAAiBG,KAAKD,EAC/B,CACQH,sBAAqC,GACtCK,SAASF,GAETpB,KAAKH,UAEJuB,IAEApB,KAAKiB,sBAAsBI,KAAKD,EAExC,CACQL,aAAaD,GAEjB,GAAkB,iBAARA,EACV,CACI,IAAIS,EAAQC,KAAKC,MAAMX,GACvB,IAAK,MAAME,KAAYhB,KAAKkB,iBACxBF,EAASO,EAEjB,CACJ,CACOG,gBAAgBZ,GAEhBd,KAAKH,WAEJG,KAAKI,GAAGuB,KAAKH,KAAKI,UAAUd,GAEpC,ECzEW,MAAAe,EAGJC,OAA4C,IAAIC,IAChDC,QAAoC,IAAID,IAExCE,SAA8C,IAAIF,IAElDG,MAAQ,EACfpC,YAAYqC,GACRnC,KAAKmC,KAAOA,CAChB,CACOC,QAAQC,GAEX,OAAO,IAAIC,SAAQ,CAACC,EAAGC,KACnB,IAAIC,IAAOzC,KAAKkC,MAChBlC,KAAKmC,KAAKO,aAAaC,YAAYN,EAAKI,GACxCzC,KAAK8B,OAAOc,IAAIH,EAAG,CACd3B,IACGyB,EAAGzB,EAAA,EAENA,IACG0B,EAAI1B,EAAA,GAEX,GAET,CACO+B,OAAOR,EAAcrB,GAExB,IAAIyB,IAAOzC,KAAKkC,MAChBlC,KAAKmC,KAAKO,aAAaI,YAAYT,EAAKI,GACxCzC,KAAK8B,OAAOc,IAAIH,EAAG,CACd3B,IACGE,EAASF,EAAA,EAEb,QAER,CACOiC,OAAOC,EAAehC,GAEzB,IAAIiC,EAAIjD,KAAKgC,QAAQkB,IAAIF,GACrBC,EAIAA,EAAE5B,KAAKL,GAFPhB,KAAKgC,QAAQY,IAAII,EAAO,CAAChC,GAIjC,EClDW,MAAAmC,EAEHrB,OAAqC,CAAC,EACvCsB,KAAKC,KAAsBC,GAE9B,GAAGtD,KAAK8B,OAAOuB,GAEX,IAAK,MAAMrC,KAAYhB,KAAK8B,OAAOuB,GAC/BrC,KAAYsC,EAGxB,CACOC,GAAGF,EAAmBrC,GAEtBhB,KAAK8B,OAAOuB,GAEXrD,KAAK8B,OAAOuB,GAAWhC,KAAKL,GAE5BhB,KAAK8B,OAAOuB,GAAa,CAACrC,EAElC,CACOwC,aAAwB,EAC/BC,MAAMC,GAEC1D,KAAKwD,YAEJE,IAEA1D,KAAKuD,GAAG,QAASG,EAEzB,EC5BG,MAAMC,EAMT7D,YAAY8D,GACR5D,KAAK4D,KAAOA,CAChB,CACAC,yBAEI,IAAIC,OAACA,EAAMC,GAACA,SAAY/D,KAAK4D,KAAKI,aAAa5B,QAAQ,CACnD6B,KAAM,sBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKkE,YAAcH,EACZA,EAEP,MAAM,IAAII,MAAM,0CAExB,CACAN,sBAEI,IAAIC,OAACA,EAAMM,OAACA,SAAgBpE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAM,mBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKqE,SAAWD,EACTA,EAEP,MAAM,IAAID,MAAM,sCAExB,CACAN,yBAEI,IAAIC,OAACA,EAAMQ,KAACA,SAActE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACrD6B,KAAM,sBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKuE,YAAcD,EACZA,EAEP,MAAM,IAAIH,MAAM,0CAExB,CACAN,2BAEI,IAAIC,OAACA,EAAMC,GAACA,SAAY/D,KAAK4D,KAAKI,aAAa5B,QAAQ,CACnD6B,KAAM,wBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKkE,YAAcH,EACZA,EAEP,MAAM,IAAII,MAAM,4CAExB,CACAN,wBAEI,IAAIC,OAACA,EAAMM,OAACA,SAAgBpE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAM,qBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKqE,SAAWD,EACTA,EAEP,MAAM,IAAID,MAAM,wCAExB,CACAN,2BAEI,IAAIC,OAACA,EAAMQ,KAACA,SAActE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACrD6B,KAAM,wBAKV,GAAa,WAAVH,EAGC,OADA9D,KAAKuE,YAAcD,EACZA,EAEP,MAAM,IAAIH,MAAM,4CAExB,CACAN,2BAEI,IAAIC,OAACA,SAAgB9D,KAAK4D,KAAKI,aAAa5B,QAAQ,CAChD6B,KAAM,wBAIV,GAAa,WAAVH,EAIC,MAAM,IAAIK,MAAM,yCAFhBnE,KAAKkE,iBAAcM,CAI3B,CACAX,wBAEI,IAAIC,OAACA,SAAgB9D,KAAK4D,KAAKI,aAAa5B,QAAQ,CAChD6B,KAAM,qBAIV,GAAa,WAAVH,EAIC,MAAM,IAAIK,MAAM,qCAFhBnE,KAAKqE,cAAWG,CAIxB,CACAX,2BAEI,IAAIC,OAACA,SAAgB9D,KAAK4D,KAAKI,aAAa5B,QAAQ,CAChD6B,KAAM,wBAIV,GAAa,WAAVH,EAIC,MAAM,IAAIK,MAAM,yCAFhBnE,KAAKuE,iBAAcC,CAI3B,CACAX,uBAA8BE,GAE1B,IAAID,OAACA,EAAMW,OAACA,SAAgBzE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAM,oBACNS,MAAOX,IAKX,MAAa,WAAVD,EAEQW,EAEA,IAEf,CACAZ,oBAA2BO,GAEvB,IAAIN,OAACA,EAAMW,OAACA,SAAgBzE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAM,iBACNS,MAAON,IAKX,MAAa,WAAVN,EAEQW,EAEA,IAEf,CACAZ,uBAA8BS,GAE1B,IAAIR,OAACA,EAAMW,OAACA,SAAgBzE,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAM,oBACNS,MAAOJ,IAKX,MAAa,WAAVR,EAEQW,EAEA,IAEf,EC5LW,MAAAE,UAAmBxB,EAGvBpD,QAAyB,CAAC,EAE1B6E,YAAuB,EACvBC,QAAmB,EAC1B/E,YAAYqC,GACR2C,QACA9E,KAAK4D,KAAOzB,CAChB,CACA4C,eAAehF,GACU,iBAAXA,EAENC,KAAKgF,YAAYjF,GAEjBC,KAAKD,QAAUA,CAEvB,CACAiF,YAAYC,GACRjF,KAAKkF,SAAWD,CACpB,CACApB,iBAEI,GAAoB,MAAjB7D,KAAKkF,SACR,CACI,IAAIC,QAAenF,KAAK4D,KAAKI,aAAa5B,QAAQ,CAC9C6B,KAAK,gBAOT,OALAjE,KAAK4E,YAAa,EAClB5E,KAAK6E,UAAW,EAChB7E,KAAKkF,SAAWC,EAChBnF,KAAKoD,KAAK,SACVpD,KAAKwD,aAAc,EACZ2B,CACX,CACJ,CAEAtB,cAAcuB,GACV,GAAGpF,KAAK6E,OAEL,aAAa7E,KAAK4D,KAAKxB,QAAQpC,KAAKkF,SAAoBE,EAE/D,CACAC,QAAQC,GAEJ,OAAOtF,KAAKkF,UAAYI,EAAKJ,QACjC,CACArB,oBAEI,aAAa7D,KAAK4D,KAAKI,aAAa5B,QAAQ,CACxC6B,KAAK,eACLsB,GAAIvF,KAAKkF,UAEjB,CACArB,6BACU7D,KAAK4D,KAAKI,aAAa5B,QAAQ,CACjC6B,KAAK,mBACLuB,MAAO,aAEf,CACA3B,8BACU7D,KAAK4D,KAAKI,aAAa5B,QAAQ,CACjC6B,KAAK,mBACLuB,MAAO,WAEf,CACA3B,WAAWuB,SACDpF,KAAK4D,KAAKI,aAAa5B,QAAQ,CACjC6B,KAAK,U,KACLmB,EACAG,GAAIvF,KAAKkF,UAEjB,CACArB,eACI7D,KAAK4D,KAAK6B,MAAMC,OAAO1F,KAAKkF,UAC5BlF,KAAK4D,KAAK+B,MAAMD,OAAO1F,KAAKkF,SAChC,ECnEW,MAAAU,UAAmBzC,EAUvBsC,MAA2B,IAAI1D,IAEtCjC,YAAYqC,GACR2C,QACA9E,KAAK4D,KAAOzB,CAChB,CACO0D,eAAe9F,GAElB,GAAqB,iBAAXA,EAENC,KAAK8F,OAAS/F,MACb,CACD,IAAIgG,EAAiB,CACjBC,SAAU,OACVC,cAAc,EACdC,WAAY,UACZC,oBAAoB,EACpBC,oBAAoB,EACpBC,qBAAqB,GAEzBC,OAAOC,OAAOR,EAAehG,GAC7BC,KAAKD,QAAUgG,CACnB,CACJ,CAEAS,UAAUvB,GACNjF,KAAK8F,OAASb,CAClB,CACApB,iBAAiB4C,GACb,IAAI1G,EAAUC,KAAKD,SAAY0G,EAC3BtB,QAAenF,KAAK4D,KAAKI,aAAa5B,QAAQ,CAC9C6B,KAAK,iBACFlE,IAEP,GAAoB,QAAjBoF,EAAOrB,OACV,CACI,GAAqB,kBAAlBqB,EAAOuB,SAA+B1G,KAAKD,QAAQkG,aAElD,OAAOjG,KAAK2G,OAEhB,MAAM,IAAIxC,MAAMgB,EAAOuB,SAAWvB,EAAOyB,SAC7C,CACI5G,KAAKD,QAAU,IACRC,KAAKD,WACLoF,EAAO0B,MAEd7G,KAAK8F,OAASX,EAAO0B,KAAKpE,GAC1BzC,KAAK4D,KAAKkD,MAAMlE,IAAI5C,KAAK8F,OAAkB9F,KAEnD,CACA6D,aACI,IAAIsB,QAAenF,KAAK4D,KAAKI,aAAa5B,QAAQ,CAC9C6B,KAAK,WACL8C,KAAM/G,KAAKD,QAAQgH,KACnBC,WAAYhH,KAAKD,QAAQiH,aAE7B,GAAoB,QAAjB7B,EAAOrB,OAEN,MAAM,IAAIK,MAAMgB,EAAOuB,SAEvB1G,KAAKD,QAAU,IACRC,KAAKD,WACLoF,EAAO0B,MAEd7G,KAAK8F,OAASX,EAAO0B,KAAKpE,GAC1BzC,KAAK4D,KAAKkD,MAAMlE,IAAI5C,KAAK8F,OAAkB9F,KAEnD,CACA6D,cACI,IAAII,KAACA,SAAcjE,KAAK4D,KAAKI,aAAa5B,QAAQ,CAC9C6B,KAAK,YACL6B,OAAQ9F,KAAK8F,SAEjB9F,KAAKyF,MAAMwB,QACA,WAARhD,GAECjE,KAAK4D,KAAKkD,MAAMpB,OAAO1F,KAAK8F,OAEpC,CACAjC,WAAWuB,EAAW8B,GAAc,SAC1BlH,KAAK4D,KAAKI,aAAa5B,QAAQ,CACjC6B,KAAK,Y,KACLmB,EACAG,GAAIvF,KAAK8F,O,IACToB,GAER,CACArD,sBACI,IAAIC,OAACA,EAAM2B,MAAEA,SAAezF,KAAK4D,KAAKI,aAAa5B,QAAQ,CACvD6B,KAAK,aACL6B,OAAQ9F,KAAK8F,SAGbqB,EAAe,GAEnB,GAAa,QAAVrD,EAEC,MAAM,IAAIK,MAAM,4BACd,GAAa,WAAVL,EACL,IAAK,MAAMsD,KAAU3B,EAAO,CACxB,IAAIH,EAAOtF,KAAK4D,KAAK0B,KAAK8B,GAC1BD,EAAI9F,KAAKiE,GACTtF,KAAKyF,MAAM7C,IAAIwE,EAAQ9B,EAC3B,CAEJ,OAAO6B,CACX,ECjIW,MAAAE,EAGXvH,YAAYqC,GACRnC,KAAK4D,KAAOzB,EACZnC,KAAKsH,aACT,CACOA,cAEHtH,KAAK4D,KAAK2D,QAAQpG,eAAeiE,IAC7BpF,KAAKwH,YAAYpC,EAAA,GAEzB,CACOqC,QAAQrC,GAEXpF,KAAK4D,KAAK2D,OAAO7F,gBAAgB0D,EACrC,CACOsC,SAAStC,GAEZpF,KAAK4D,KAAK2D,OAAO7F,gBAAgB,CAAC0D,EAAK,KAC3C,CACOzC,YAAYyC,EAAe3C,GAE9BzC,KAAK4D,KAAK2D,OAAO7F,gBAAgB,CAAC0D,EAAM3C,EAAI,KAChD,CACOK,YAAYsC,EAAe3C,GAE9BzC,KAAK4D,KAAK2D,OAAO7F,gBAAgB,CAAC0D,EAAM3C,EAAI,KAChD,CACO+E,YAAY1G,GAEf,IAAK6G,EAASlF,EAAImF,GAAU9G,EAC5B,GAAiB,iBAAP2B,EACV,CACI,IAAIzB,EAAWhB,KAAK4D,KAAKI,aAAalC,OAAOoB,IAAIT,GACjD,GAAGzB,GAGC,GADAA,EAAS,GAAG2G,EAASC,GAGZ,MAFFA,EAGC5H,KAAK4D,KAAKI,aAAalC,OAAO4D,OAAOjD,QAQ3CoF,QAAQC,KAAK,mCACvB,KAAK,CACD,IAAI9F,EAAUhC,KAAK4D,KAAKI,aAAahC,QAAQkB,IAAIT,GACjD,GAAGT,EAEC,IAAK,MAAM+F,KAAY/F,EACnB+F,EAASJ,QAEXE,QAAQC,KAAK,mCACvB,CACJ,EC6EJE,OAAOC,KAtIQ,cAAmB9E,EAIvB2D,MAA4B,IAAI/E,IAChC4D,MAA4B,IAAI5D,IAChC0D,MAA4B,IAAI1D,IAGvCjC,YAAYC,GACR+E,QACA9E,KAAKuH,OAAS,IAAI5H,EAAWI,GAC7BC,KAAK0C,aAAe,IAAI2E,EAAarH,MACrCA,KAAKgE,aAAe,IAAInC,EAAU7B,MAClCA,KAAKkI,gBAAkB,IAAIvE,EAAW3D,MACtCA,KAAKuH,OAAOpH,UACZH,KAAKmI,GAAK,IAAIxD,EAAK3E,MACnBA,KAAKmI,GAAG1E,OAAM,KACVzD,KAAKyF,MAAM7C,IAAI,KAAM5C,KAAKmI,IAC1BnI,KAAKyF,MAAM7C,IAAI5C,KAAKmI,GAAGjD,SAAoBlF,KAAKmI,GAAE,IAEtDnI,KAAKuH,OAAOjG,UAASuC,UACjB7D,KAAKmI,GAAGnD,YAAY,YACdhF,KAAKmI,GAAGC,WACdpI,KAAKoD,KAAK,SACVpD,KAAKwD,aAAc,CAAI,IAE3BxD,KAAKqI,qBACT,CACAxE,cAAqByE,EAAgBlD,GAEjC,IAAKA,KAAKmD,SAAgBvI,KAAKgE,aAAa5B,QAAQ,CAChD6B,KAAM,aACNsB,GAAI+C,E,KACJlD,IAEJ,OAAOmD,CACX,CACA1E,eAAsByE,EAAgBE,EAAkBpD,GAEpDpF,KAAK0C,aAAagF,SAAS,CACvBzD,KAAM,cACNsB,GAAI+C,E,KACJlD,EACA3C,GAAI+F,GAEZ,CACQH,sBAEJrI,KAAKgE,aAAajB,OAAO,QAAQ4E,IAC7B,IAAIc,KAACA,EAAIrD,KAACA,GAAQuC,EAClB3H,KAAKsF,KAAKmD,GAAM,GAAMrF,KAAK,UAAWgC,EAAA,IAE1CpF,KAAKgE,aAAajB,OAAO,WAAW4E,IAChC,IAAIc,KAACA,EAAIrD,KAACA,EAAI3C,GAAEA,GAAMkF,EAClBlE,EAAQ,CACRiF,KAAMtD,EACNuD,SAAWvD,IACPpF,KAAK2I,SAASF,EAAMhG,EAAI2C,EAAA,EAE5BE,KAAMtF,KAAKsF,KAAKmD,GAAM,IAE1BzI,KAAKsF,KAAKmD,GAAM,GAAMrF,KAAK,UAAWK,GACtCzD,KAAKsF,KAAK,MAAMlC,KAAK,UAAWK,EAAA,IAEpCzD,KAAKgE,aAAajB,OAAO,aAAa4E,IAClC,IAAIpC,GAACA,EAAEH,KAACA,GAAQuC,EAChB3H,KAAK6G,KAAKtB,GAAInC,KAAK,UAAWgC,EAAA,IAElCpF,KAAKgE,aAAajB,OAAO,eAAe4E,IACpC,IAAIlF,GAACA,EAAEmG,OAACA,GAAUjB,EACdd,EAAO7G,KAAK6G,KAAK+B,GACjBtD,EAAOtF,KAAKsF,KAAK7C,GAAI,GACzBoE,EAAKpB,MAAM7C,IAAI0C,EAAKJ,SAAoBI,GACxCuB,EAAKzD,KAAK,OAAQkC,EAAA,IAEtBtF,KAAKgE,aAAajB,OAAO,gBAAgB4E,IACrC,IAAIlF,GAACA,EAAEmG,OAACA,GAAUjB,EACdd,EAAO7G,KAAK6G,KAAK+B,GACjBtD,EAAOtF,KAAKsF,KAAK7C,GACrBoE,EAAKpB,MAAMC,OAAOJ,EAAKJ,UACvB2B,EAAKzD,KAAK,QAASkC,EAAA,IAEvBtF,KAAKgE,aAAajB,OAAO,eAAe4E,IACpC,IAAIiB,OAACA,GAAUjB,EACXd,EAAO7G,KAAK6G,KAAK+B,GACrB/B,EAAKpB,MAAMwB,QACXJ,EAAKzD,KAAK,SACVpD,KAAK8G,MAAMpB,OAAOkD,EAAA,GAE1B,CACO/B,KAAK9G,GAER,GAAqB,iBAAXA,GAEHC,KAAK8G,MAAM+B,IAAI9I,GAEd,OAAOC,KAAK8G,MAAM5D,IAAInD,GAG9B,IAAI8G,EAAO,IAAIjB,EAAK5F,MAIpB,OAHA6G,EAAKhB,eAAe9F,GAEpBC,KAAKoD,KAAK,QACHyD,CACX,CACOvB,KAAKvF,EAAgC+I,GAAW,GAEnD,GAAqB,iBAAX/I,EACV,CACI,GAAGC,KAAKyF,MAAMoD,IAAI9I,GAEd,OAAOC,KAAKyF,MAAMvC,IAAInD,GAE1B,GAAGC,KAAK2F,MAAMkD,IAAI9I,GAEd,OAAOC,KAAK2F,MAAMzC,IAAInD,EAE9B,CACA,IAAIuF,EAAO,IAAIX,EAAK3E,MAKpB,OAJAsF,EAAKP,eAAehF,GACpBuF,EAAKT,OAASiE,EACd9I,KAAKyF,MAAM7C,IAAI0C,EAAKJ,SAAoBI,GACxCtF,KAAKoD,KAAK,OAAQkC,GACXA,CACX,E","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n\r\n public requests : Map = new Map();\r\n\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import MWSE from \"frontend\";\r\n\r\nexport class IPPressure\r\n{\r\n public mwse : MWSE;\r\n public APNumber? : number;\r\n public APShortCode? : string;\r\n public APIPAddress? : string;\r\n constructor(mwse : MWSE){\r\n this.mwse = mwse;\r\n };\r\n public async allocAPIPAddress()\r\n {\r\n let {status,ip} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n ip?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = ip;\r\n return ip;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point IP Address\");\r\n }\r\n }\r\n public async allocAPNumber()\r\n {\r\n let {status,number} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n number?:number\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = number;\r\n return number;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point Number\");\r\n }\r\n }\r\n public async allocAPShortCode()\r\n {\r\n let {status,code} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APShortCode'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n code?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = code;\r\n return code;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point Short Code\");\r\n }\r\n }\r\n public async reallocAPIPAddress()\r\n {\r\n let {status,ip} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n ip?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = ip;\r\n return ip;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point IP Address\");\r\n }\r\n }\r\n public async reallocAPNumber()\r\n {\r\n let {status,number} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n number?:number\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = number;\r\n return number;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point Number\");\r\n }\r\n }\r\n public async reallocAPShortCode()\r\n {\r\n let {status,code} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APShortCode'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n code?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = code;\r\n return code;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point Short Code\");\r\n }\r\n }\r\n public async releaseAPIPAddress()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point IP Address\");\r\n }\r\n }\r\n public async releaseAPNumber()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point Number\");\r\n }\r\n }\r\n public async releaseAPShortCode()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APShortCode'\r\n }) as {\r\n status:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point Short Code\");\r\n }\r\n }\r\n public async queryAPIPAddress(ip:string)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APIPAddress',\r\n whois: ip\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n public async queryAPNumber(number:number)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APNumber',\r\n whois: number\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n public async queryAPShortCode(code:string)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APShortCode',\r\n whois: code\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\n\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options : IPeerOptions = {};\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n };\r\n \r\n async request(pack:any){\r\n if(this.active)\r\n {\r\n return await this.mwse.request(this.socketId as string, pack);\r\n }\r\n };\r\n equalTo(peer : Peer | {socketId: string})\r\n {\r\n return this.socketId == peer.socketId;\r\n }\r\n async isReachable()\r\n {\r\n return await this.mwse.EventPooling.request({\r\n type:'is/reachable',\r\n to: this.socketId\r\n });\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n async forget(){\r\n this.mwse.peers.delete(this.socketId as string);\r\n this.mwse.pairs.delete(this.socketId as string);\r\n }\r\n} ","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\nimport Peer from \"./Peer\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public roomId? : string;\r\n public accessType? : \"public\"|\"private\";\r\n public description? : string;\r\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\r\n public name? : string;\r\n public owner? : string;\r\n public peers : Map = new Map();\r\n\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions | string)\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n this.roomId = options;\r\n }else{\r\n let defaultOptions = {\r\n joinType: \"free\",\r\n ifexistsJoin: true,\r\n accessType: \"private\",\r\n notifyActionInvite: true,\r\n notifyActionJoined: true,\r\n notifyActionEjected: true\r\n };\r\n Object.assign(defaultOptions,options);\r\n this.options = defaultOptions as IRoomOptions;\r\n }\r\n }\r\n \r\n setRoomId(uuid: string){\r\n this.roomId = uuid;\r\n }\r\n async createRoom(roomOptions : IRoomOptions){\r\n let options = this.options || roomOptions;\r\n let result = await this.mwse.EventPooling.request({\r\n type:'create-room',\r\n ...options\r\n });\r\n if(result.status == 'fail')\r\n {\r\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\r\n {\r\n return this.join();\r\n }\r\n throw new Error(result.message || result.messages);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async join(){\r\n let result = await this.mwse.EventPooling.request({\r\n type:'joinroom',\r\n name: this.options.name,\r\n credential: this.options.credential\r\n });\r\n if(result.status == 'fail')\r\n {\r\n throw new Error(result.message);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async eject(){\r\n let {type} = await this.mwse.EventPooling.request({\r\n type:'ejectroom',\r\n roomId: this.roomId\r\n });\r\n this.peers.clear();\r\n if(type == 'success')\r\n {\r\n this.mwse.rooms.delete(this.roomId as string);\r\n }\r\n }\r\n async send(pack: any, wom:boolean = false){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/room',\r\n pack,\r\n to: this.roomId,\r\n wom\r\n });\r\n }\r\n async fetchAllPeers(){\r\n let {status, peers} = await this.mwse.EventPooling.request({\r\n type:'room-peers',\r\n roomId: this.roomId\r\n }) as {status:\"success\"|\"fail\", peers: string[]};\r\n\r\n let cup : Peer[] = [];\r\n\r\n if(status == 'fail')\r\n {\r\n throw new Error(\"Cant using peers on room\")\r\n }else if(status == 'success'){\r\n for (const peerid of peers) {\r\n let peer = this.mwse.peer(peerid);\r\n cup.push(peer);\r\n this.peers.set(peerid, peer);\r\n }\r\n };\r\n return cup;\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}","import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport { IPPressure } from \"./IPPressure\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public virtualPressure : IPPressure;\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.virtualPressure = new IPPressure(this);\r\n this.server.connect();\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n public async request(peerId: string, pack:Message)\r\n {\r\n let {pack:answer} = await this.EventPooling.request({\r\n type: 'request/to',\r\n to: peerId,\r\n pack\r\n });\r\n return answer;\r\n }\r\n public async response(peerId: string, requestId:number, pack:Message)\r\n {\r\n this.WSTSProtocol.SendOnly({\r\n type: 'response/to',\r\n to: peerId,\r\n pack,\r\n id: requestId\r\n })\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\r\n let {from,pack} = payload;\r\n this.peer(from, true).emit('message', pack);\r\n })\r\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\r\n let {from,pack, id} = payload;\r\n let scope = {\r\n body: pack,\r\n response: (pack: Message) => {\r\n this.response(from, id, pack);\r\n },\r\n peer: this.peer(from, true)\r\n };\r\n this.peer(from, true).emit('request', scope);\r\n this.peer('me').emit('request', scope);\r\n })\r\n this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.room(to).emit('message', pack);\r\n })\r\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id, true);\r\n room.peers.set(peer.socketId as string, peer);\r\n room.emit('join', peer);\r\n })\r\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id);\r\n room.peers.delete(peer.socketId as string);\r\n room.emit('eject', peer);\r\n })\r\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\r\n let {roomid} = payload;\r\n let room = this.room(roomid);\r\n room.peers.clear();\r\n room.emit('close');\r\n this.rooms.delete(roomid);\r\n })\r\n }\r\n public room(options: IRoomOptions | string) : Room\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.rooms.has(options))\r\n {\r\n return this.rooms.get(options) as Room\r\n }\r\n }\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n // this.rooms.set(room.roomId as string, room);\r\n this.emit('room');\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions, isActive = false) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n peer.active = isActive;\r\n this.peers.set(peer.socketId as string, peer);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\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","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","active","super","setPeerOptions","setSocketId","uuid","socketId","result","pack","equalTo","peer","to","value","peers","delete","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","Object","assign","setRoomId","roomOptions","message","join","messages","room","rooms","name","credential","clear","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","server","PackAnalyze","SendRaw","SendOnly","payload","action","console","warn","callback1","window","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","answer","requestId","from","body","response","roomid","has","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/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n\r\n public requests : Map = new Map();\r\n\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import MWSE from \"frontend\";\r\n\r\nexport class IPPressure\r\n{\r\n public mwse : MWSE;\r\n public APNumber? : number;\r\n public APShortCode? : string;\r\n public APIPAddress? : string;\r\n constructor(mwse : MWSE){\r\n this.mwse = mwse;\r\n };\r\n public async allocAPIPAddress()\r\n {\r\n let {status,ip} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n ip?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = ip;\r\n return ip;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point IP Address\");\r\n }\r\n }\r\n public async allocAPNumber()\r\n {\r\n let {status,number} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n number?:number\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = number;\r\n return number;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point Number\");\r\n }\r\n }\r\n public async allocAPShortCode()\r\n {\r\n let {status,code} = await this.mwse.EventPooling.request({\r\n type: 'alloc/APShortCode'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n code?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = code;\r\n return code;\r\n }else{\r\n throw new Error(\"Error Allocated Access Point Short Code\");\r\n }\r\n }\r\n public async reallocAPIPAddress()\r\n {\r\n let {status,ip} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n ip?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = ip;\r\n return ip;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point IP Address\");\r\n }\r\n }\r\n public async reallocAPNumber()\r\n {\r\n let {status,number} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n number?:number\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = number;\r\n return number;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point Number\");\r\n }\r\n }\r\n public async reallocAPShortCode()\r\n {\r\n let {status,code} = await this.mwse.EventPooling.request({\r\n type: 'realloc/APShortCode'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n code?:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = code;\r\n return code;\r\n }else{\r\n throw new Error(\"Error Reallocated Access Point Short Code\");\r\n }\r\n }\r\n public async releaseAPIPAddress()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APIPAddress'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n };\r\n if(status == 'success')\r\n {\r\n this.APIPAddress = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point IP Address\");\r\n }\r\n }\r\n public async releaseAPNumber()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APNumber'\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n };\r\n if(status == 'success')\r\n {\r\n this.APNumber = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point Number\");\r\n }\r\n }\r\n public async releaseAPShortCode()\r\n {\r\n let {status} = await this.mwse.EventPooling.request({\r\n type: 'release/APShortCode'\r\n }) as {\r\n status:string\r\n };\r\n if(status == 'success')\r\n {\r\n this.APShortCode = undefined;\r\n }else{\r\n throw new Error(\"Error release Access Point Short Code\");\r\n }\r\n }\r\n public async queryAPIPAddress(ip:string)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APIPAddress',\r\n whois: ip\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n public async queryAPNumber(number:number)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APNumber',\r\n whois: number\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n public async queryAPShortCode(code:string)\r\n {\r\n let {status,socket} = await this.mwse.EventPooling.request({\r\n type: 'whois/APShortCode',\r\n whois: code\r\n }) as {\r\n status:\"fail\"|\"success\",\r\n socket?:string\r\n };\r\n if(status == \"success\")\r\n {\r\n return socket;\r\n }else{\r\n return null;\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\n\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options : IPeerOptions = {};\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n };\r\n \r\n async request(pack:any){\r\n if(this.active)\r\n {\r\n return await this.mwse.request(this.socketId as string, pack);\r\n }\r\n };\r\n equalTo(peer : Peer | {socketId: string})\r\n {\r\n return this.socketId == peer.socketId;\r\n }\r\n async isReachable()\r\n {\r\n return await this.mwse.EventPooling.request({\r\n type:'is/reachable',\r\n to: this.socketId\r\n });\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n async forget(){\r\n this.mwse.peers.delete(this.socketId as string);\r\n this.mwse.pairs.delete(this.socketId as string);\r\n }\r\n} ","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\nimport Peer from \"./Peer\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public roomId? : string;\r\n public accessType? : \"public\"|\"private\";\r\n public description? : string;\r\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\r\n public name? : string;\r\n public owner? : string;\r\n public peers : Map = new Map();\r\n\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions | string)\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n this.roomId = options;\r\n }else{\r\n let defaultOptions = {\r\n joinType: \"free\",\r\n ifexistsJoin: true,\r\n accessType: \"private\",\r\n notifyActionInvite: true,\r\n notifyActionJoined: true,\r\n notifyActionEjected: true\r\n };\r\n Object.assign(defaultOptions,options);\r\n this.options = defaultOptions as IRoomOptions;\r\n }\r\n }\r\n \r\n setRoomId(uuid: string){\r\n this.roomId = uuid;\r\n }\r\n async createRoom(roomOptions : IRoomOptions){\r\n let options = this.options || roomOptions;\r\n let result = await this.mwse.EventPooling.request({\r\n type:'create-room',\r\n ...options\r\n });\r\n if(result.status == 'fail')\r\n {\r\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\r\n {\r\n return this.join();\r\n }\r\n throw new Error(result.message || result.messages);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async join(){\r\n let result = await this.mwse.EventPooling.request({\r\n type:'joinroom',\r\n name: this.options.name,\r\n credential: this.options.credential\r\n });\r\n if(result.status == 'fail')\r\n {\r\n throw new Error(result.message);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async eject(){\r\n let {type} = await this.mwse.EventPooling.request({\r\n type:'ejectroom',\r\n roomId: this.roomId\r\n });\r\n this.peers.clear();\r\n if(type == 'success')\r\n {\r\n this.mwse.rooms.delete(this.roomId as string);\r\n }\r\n }\r\n async send(pack: any, wom:boolean = false){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/room',\r\n pack,\r\n to: this.roomId,\r\n wom\r\n });\r\n }\r\n async fetchAllPeers(){\r\n let {status, peers} = await this.mwse.EventPooling.request({\r\n type:'room-peers',\r\n roomId: this.roomId\r\n }) as {status:\"success\"|\"fail\", peers: string[]};\r\n\r\n let cup : Peer[] = [];\r\n\r\n if(status == 'fail')\r\n {\r\n throw new Error(\"Cant using peers on room\")\r\n }else if(status == 'success'){\r\n for (const peerid of peers) {\r\n let peer = this.mwse.peer(peerid);\r\n cup.push(peer);\r\n this.peers.set(peerid, peer);\r\n }\r\n };\r\n return cup;\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}","import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport { IPPressure } from \"./IPPressure\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public virtualPressure : IPPressure;\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.virtualPressure = new IPPressure(this);\r\n this.server.connect();\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n public async request(peerId: string, pack:Message)\r\n {\r\n let {pack:answer} = await this.EventPooling.request({\r\n type: 'request/to',\r\n to: peerId,\r\n pack\r\n });\r\n return answer;\r\n }\r\n public async response(peerId: string, requestId:number, pack:Message)\r\n {\r\n this.WSTSProtocol.SendOnly({\r\n type: 'response/to',\r\n to: peerId,\r\n pack,\r\n id: requestId\r\n })\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\r\n let {from,pack} = payload;\r\n this.peer(from, true).emit('message', pack);\r\n })\r\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\r\n let {from,pack, id} = payload;\r\n let scope = {\r\n body: pack,\r\n response: (pack: Message) => {\r\n this.response(from, id, pack);\r\n },\r\n peer: this.peer(from, true)\r\n };\r\n this.peer(from, true).emit('request', scope);\r\n this.peer('me').emit('request', scope);\r\n })\r\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any}) => {\r\n let {from,pack} = payload;\r\n this.room(from).emit('message', pack);\r\n })\r\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id, true);\r\n room.peers.set(peer.socketId as string, peer);\r\n room.emit('join', peer);\r\n })\r\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id);\r\n room.peers.delete(peer.socketId as string);\r\n room.emit('eject', peer);\r\n })\r\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\r\n let {roomid} = payload;\r\n let room = this.room(roomid);\r\n room.peers.clear();\r\n room.emit('close');\r\n this.rooms.delete(roomid);\r\n })\r\n }\r\n public room(options: IRoomOptions | string) : Room\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.rooms.has(options))\r\n {\r\n return this.rooms.get(options) as Room\r\n }\r\n }\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n // this.rooms.set(room.roomId as string, room);\r\n this.emit('room');\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions, isActive = false) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n peer.active = isActive;\r\n this.peers.set(peer.socketId as string, peer);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\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","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","active","super","setPeerOptions","setSocketId","uuid","socketId","result","pack","equalTo","peer","to","value","peers","delete","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","Object","assign","setRoomId","roomOptions","message","join","messages","room","rooms","name","credential","clear","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","server","PackAnalyze","SendRaw","SendOnly","payload","action","console","warn","window","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","answer","requestId","from","body","response","roomid","has","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file diff --git a/test.html b/script/test.html similarity index 59% rename from test.html rename to script/test.html index d0ecd7a..632ddc6 100644 --- a/test.html +++ b/script/test.html @@ -7,12 +7,13 @@ Document - +

+

+