const { CLIENT_SEND_MESSAGE, CLIENT_UPDATE_PROP } = require("./IPC"); const stats = require("./stats"); function Client() { /** * @type {string} */ this.id = null; /** * @type {import("websocket").connection} */ this.socket = null; /** * @type {Date} */ this.created_at = null; /** * @type {Map} */ this.info = new Map(); /** * @type {Map} */ this.store = new Map(); /** * @type {Set} */ this.rooms = new Set(); this.pairs = new Set(); this.requiredPair = false; 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} */ Client.clients = new Map(); /** * @param {Client} client */ 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 },'request/pair']); }; /** * @param {Client|string} client */ Client.prototype.isSecure = function(client) { const { Room } = require("./Services/Room"); if(typeof client == "string") { if(Client.clients.has(client)) { client = Client.clients.get(client); }else return false; }else if(!(client instanceof Client)){ return false; }; // Eşleştirilmiş kullanıcı if(this.isPaired(client)) { return true; } // Aynı odada bulunan kullanıcı for (const id of this.rooms) { let room = Room.rooms.get(id); if(room) { if(room.clients.has(id)) { return true } } }; return false; } /** * @returns {{pairs:Map,roompairs:Map}} */ Client.prototype.getSucureClients = function() { const { Room } = require("./Services/Room"); let pairs = new Map(); let roompairs = new Map(); for (const [id, client] of this.pairs) { map.set(id, client) } // Aynı odada bulunan kullanıcı for (const id of this.rooms) { let room = Room.rooms.get(id); if(room) { for (const [id, client] of room.clients) { if(id == this.id) continue; roompairs.set(id, client) }; } }; return { pairs, roompairs }; } /** * @param {Client} client */ Client.prototype.acceptPeerRequest = function(client){ this.pairs.add(client.id); this.sync('pairs'); client.send([{ from: this.id },'accepted/pair']); }; /** * @param {Client} 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']); }; /** * @param {Client|string} client * @returns {Boolean} */ Client.prototype.isPaired = function(client){ if(typeof client == "string") { return Client.clients.get(client)?.pairs.has(this.id) && this.pairs.has(client) } return client.pairs.has(this.id) && this.pairs.has(client.id); }; Client.prototype.pairList = function(){ return [...this.pairs.values()].filter(e => this.isPaired(e)); }; Client.prototype.send = function(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;