IPPressure
This commit is contained in:
		
							parent
							
								
									cc2bcab52e
								
							
						
					
					
						commit
						d50f9250e8
					
				| 
						 | 
				
			
			@ -17,6 +17,10 @@ function Client()
 | 
			
		|||
    this.rooms = new Set();
 | 
			
		||||
    this.pairs = new Set();
 | 
			
		||||
    this.requiredPair = false;
 | 
			
		||||
 | 
			
		||||
    this.APNumber = 0;
 | 
			
		||||
    this.APShortCode = 0;
 | 
			
		||||
    this.APIPAddress = 0;
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * @type {Map<string, Client>}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,301 @@
 | 
			
		|||
const { Client } = require("../Client");
 | 
			
		||||
let {addService, addListener} = require("../WebSocket.js");
 | 
			
		||||
let {
 | 
			
		||||
    randomBytes
 | 
			
		||||
} = require("node:crypto");
 | 
			
		||||
 | 
			
		||||
class APNumber{
 | 
			
		||||
    /**
 | 
			
		||||
     * @type {Map<Number, Client>}
 | 
			
		||||
     */
 | 
			
		||||
    static busyNumbers = new Map();
 | 
			
		||||
    /**
 | 
			
		||||
     * @type {number}
 | 
			
		||||
     */
 | 
			
		||||
    static lock()
 | 
			
		||||
    {
 | 
			
		||||
        let c = 24;
 | 
			
		||||
        while(true){
 | 
			
		||||
            if(!APNumber.busyNumbers.has(c))
 | 
			
		||||
            {
 | 
			
		||||
                APNumber.busyNumbers.set(c,true);
 | 
			
		||||
                return c;
 | 
			
		||||
            }
 | 
			
		||||
            c++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {number} num 
 | 
			
		||||
     */
 | 
			
		||||
    static release(num)
 | 
			
		||||
    {
 | 
			
		||||
        APNumber.busyNumbers.delete(num);
 | 
			
		||||
    }
 | 
			
		||||
    static whois(num){
 | 
			
		||||
        return APNumber.busyNumbers.get(num)?.id;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class APShortCode{
 | 
			
		||||
    /**
 | 
			
		||||
     * @type {Map<string, Client>}
 | 
			
		||||
     */
 | 
			
		||||
    static busyCodes = new Map();
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @param {Client} client 
 | 
			
		||||
     * @returns 
 | 
			
		||||
     */
 | 
			
		||||
    static lock(client){
 | 
			
		||||
        let firstLetter = new ShortCodeLetter();
 | 
			
		||||
        let secondLetter = new ShortCodeLetter();
 | 
			
		||||
        let thirdLetter = new ShortCodeLetter();
 | 
			
		||||
        while(1)
 | 
			
		||||
        {
 | 
			
		||||
            let code = [firstLetter.code,secondLetter.code,thirdLetter.code].join('');
 | 
			
		||||
            if(APShortCode.busyCodes.has(code) == false)
 | 
			
		||||
            {
 | 
			
		||||
                APShortCode.busyCodes.set(code, client);
 | 
			
		||||
                return code.join('');
 | 
			
		||||
            }
 | 
			
		||||
            if(!thirdLetter.end())
 | 
			
		||||
            {
 | 
			
		||||
                thirdLetter.next()
 | 
			
		||||
            }else{
 | 
			
		||||
                thirdLetter.reset()
 | 
			
		||||
                if(!secondLetter.end())
 | 
			
		||||
                {
 | 
			
		||||
                    secondLetter.next();
 | 
			
		||||
                }else{
 | 
			
		||||
                    secondLetter.reset();
 | 
			
		||||
                    if(!firstLetter.end())
 | 
			
		||||
                    {
 | 
			
		||||
                        firstLetter.next();
 | 
			
		||||
                    }else{
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static release(code){
 | 
			
		||||
        APShortCode.busyCodes.delete(code);
 | 
			
		||||
    }
 | 
			
		||||
    static whois(num){
 | 
			
		||||
        return APShortCode.busyCodes.get(num)?.id;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
class ShortCodeLetter{
 | 
			
		||||
    chars = 'ABCDEFGHIKLMNOPRSTVXYZ'.split('');
 | 
			
		||||
    now = 0;
 | 
			
		||||
    code = 'A';
 | 
			
		||||
    next(){
 | 
			
		||||
        this.now++
 | 
			
		||||
        this.code = this.chars.at(this.now);
 | 
			
		||||
        return this.code;
 | 
			
		||||
    }
 | 
			
		||||
    reset(){
 | 
			
		||||
        this.now = 0;
 | 
			
		||||
        this.code = 'A';
 | 
			
		||||
    }
 | 
			
		||||
    end(){
 | 
			
		||||
        return !this.chars.at(this.now + 1)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class APIPAddress{
 | 
			
		||||
    /**
 | 
			
		||||
     * @type {Map<[number,number,number,number], Client>}
 | 
			
		||||
     */
 | 
			
		||||
    static busyIP = new Map();
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {Client} client
 | 
			
		||||
     */
 | 
			
		||||
    static lock(client){
 | 
			
		||||
        let A = 10;
 | 
			
		||||
        let B = 0;
 | 
			
		||||
        let C = 0;
 | 
			
		||||
        let D = 1;
 | 
			
		||||
        while(1)
 | 
			
		||||
        {
 | 
			
		||||
            let code = [A,B,C,D].join('.');
 | 
			
		||||
            if(APIPAddress.busyIP.has(code) == false)
 | 
			
		||||
            {
 | 
			
		||||
                APIPAddress.busyIP.set(code, client);
 | 
			
		||||
                return code;
 | 
			
		||||
            }
 | 
			
		||||
            if(D != 255)
 | 
			
		||||
            {
 | 
			
		||||
                D++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }else{
 | 
			
		||||
                D = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if(C != 255)
 | 
			
		||||
            {
 | 
			
		||||
                C++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }else{
 | 
			
		||||
                C = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if(B != 255)
 | 
			
		||||
            {
 | 
			
		||||
                B++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }else{
 | 
			
		||||
                B = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if(A != 255)
 | 
			
		||||
            {
 | 
			
		||||
                A++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }else{
 | 
			
		||||
                A = 0;
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static release(code){
 | 
			
		||||
        APIPAddress.busyCodes.delete(code);
 | 
			
		||||
    }
 | 
			
		||||
    static whois(num){
 | 
			
		||||
        return APIPAddress.busyIP.get(num)?.id;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.APNumber = APNumber;
 | 
			
		||||
exports.APShortCode = APShortCode;
 | 
			
		||||
exports.APIPAddress = APIPAddress;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
addService(({
 | 
			
		||||
    client,
 | 
			
		||||
    message,
 | 
			
		||||
    end,
 | 
			
		||||
    next
 | 
			
		||||
})=>{
 | 
			
		||||
    let {type,whois} = message;
 | 
			
		||||
    switch(type)
 | 
			
		||||
    {
 | 
			
		||||
        case "alloc/APIPAddress":{
 | 
			
		||||
            let value = APIPAddress.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                ip : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "alloc/APNumber":{
 | 
			
		||||
            let value = APNumber.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                number : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "alloc/APShortCode":{
 | 
			
		||||
            let value = APShortCode.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                code : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "realloc/APIPAddress":{
 | 
			
		||||
            APIPAddress.release(client.APIPAddress);
 | 
			
		||||
            let value = APIPAddress.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                ip : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "realloc/APNumber":{
 | 
			
		||||
            APNumber.release(client.APNumber);
 | 
			
		||||
            let value = APNumber.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                number : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "realloc/APShortCode":{
 | 
			
		||||
            APShortCode.release(client.APShortCode);
 | 
			
		||||
            let value = APShortCode.lock(client);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess",
 | 
			
		||||
                code : value
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "release/APIPAddress":{
 | 
			
		||||
            APIPAddress.release(client.APIPAddress);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess"
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "release/APNumber":{
 | 
			
		||||
            APNumber.release(client.APNumber);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess"
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "release/APShortCode":{
 | 
			
		||||
            APShortCode.release(client.APShortCode);
 | 
			
		||||
            end({
 | 
			
		||||
                status : "sucess"
 | 
			
		||||
            })
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "whois/APIPAddress":{
 | 
			
		||||
            let socketId = APIPAddress.whois(whois);
 | 
			
		||||
            if(socketId)
 | 
			
		||||
            {
 | 
			
		||||
                end({
 | 
			
		||||
                    status : "sucess",
 | 
			
		||||
                    socket : socketId
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "whois/APNumber":{
 | 
			
		||||
            let socketId = APNumber.whois(whois);
 | 
			
		||||
            if(socketId)
 | 
			
		||||
            {
 | 
			
		||||
                end({
 | 
			
		||||
                    status : "sucess",
 | 
			
		||||
                    socket : socketId
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case "whois/APShortCode":{
 | 
			
		||||
            let socketId = APShortCode.whois(whois);
 | 
			
		||||
            if(socketId)
 | 
			
		||||
            {
 | 
			
		||||
                end({
 | 
			
		||||
                    status : "sucess",
 | 
			
		||||
                    socket : socketId
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
addListener('disconnect',(global, client)=>{
 | 
			
		||||
    if(client.APIPAddress != 0)
 | 
			
		||||
    {
 | 
			
		||||
        APIPAddress.release(client.APIPAddress);
 | 
			
		||||
    }
 | 
			
		||||
    if(client.APNumber != 0)
 | 
			
		||||
    {
 | 
			
		||||
        APNumber.release(client.APNumber);
 | 
			
		||||
    }
 | 
			
		||||
    if(client.APShortCode != 0)
 | 
			
		||||
    {
 | 
			
		||||
        APShortCode.release(client.APShortCode);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -84,4 +84,4 @@ export default class Peer extends EventTarget
 | 
			
		|||
        this.mwse.peers.delete(this.socketId as string);
 | 
			
		||||
        this.mwse.pairs.delete(this.socketId as string);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}   
 | 
			
		||||
		Loading…
	
		Reference in New Issue