454 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			454 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
const { Client } = require("../Client");
 | 
						|
let {addService, addListener} = require("../WebSocket.js");
 | 
						|
 | 
						|
class APNumber{
 | 
						|
    /**
 | 
						|
     * @type {Map<Number, Client>}
 | 
						|
     */
 | 
						|
    static busyNumbers = new Map();
 | 
						|
    /**
 | 
						|
     * @type {number}
 | 
						|
     * @param {Client} client
 | 
						|
     */
 | 
						|
    static lock(client)
 | 
						|
    {
 | 
						|
        let c = 24;
 | 
						|
        while(true){
 | 
						|
            if(!APNumber.busyNumbers.has(c))
 | 
						|
            {
 | 
						|
                APNumber.busyNumbers.set(c,client);
 | 
						|
                process.send({
 | 
						|
                    type: 'AP_NUMBER/LOCK',
 | 
						|
                    uuid: client.id,
 | 
						|
                    value: c
 | 
						|
                })
 | 
						|
                return c;
 | 
						|
            }
 | 
						|
            c++;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * @param {number} num 
 | 
						|
     */
 | 
						|
    static release(num)
 | 
						|
    {
 | 
						|
        process.send({
 | 
						|
            type: 'AP_NUMBER/RELEASE',
 | 
						|
            uuid: APNumber.busyNumbers.get(num).id,
 | 
						|
            value: 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);
 | 
						|
                process.send({
 | 
						|
                    type: 'AP_SHORTCODE/LOCK',
 | 
						|
                    uuid: APShortCode.busyCodes.get(code).id,
 | 
						|
                    value: code
 | 
						|
                })
 | 
						|
                return code;
 | 
						|
            }
 | 
						|
            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){
 | 
						|
        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;
 | 
						|
    }
 | 
						|
};
 | 
						|
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);
 | 
						|
                process.send({
 | 
						|
                    type: 'AP_IPADDRESS/LOCK',
 | 
						|
                    uuid: APIPAddress.busyIP.get(code).id,
 | 
						|
                    value: code
 | 
						|
                })
 | 
						|
                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){
 | 
						|
        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;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
exports.APNumber = APNumber;
 | 
						|
exports.APShortCode = APShortCode;
 | 
						|
exports.APIPAddress = APIPAddress;
 | 
						|
 | 
						|
addService(({
 | 
						|
    client,
 | 
						|
    message,
 | 
						|
    end,
 | 
						|
    next
 | 
						|
})=>{
 | 
						|
    let {type,whois} = message;
 | 
						|
    switch(type)
 | 
						|
    {
 | 
						|
        case "alloc/APIPAddress":{
 | 
						|
            if(client.APIPAddress) {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    ip : client.APIPAddress
 | 
						|
                })
 | 
						|
            };
 | 
						|
            let value = APIPAddress.lock(client);
 | 
						|
            client.APIPAddress = value;
 | 
						|
            client.sync('APIPAddress');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                ip : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "alloc/APNumber":{
 | 
						|
            if(client.APNumber) {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    number : client.APNumber
 | 
						|
                })
 | 
						|
            };
 | 
						|
            let value = APNumber.lock(client);
 | 
						|
            client.APNumber = value;
 | 
						|
            client.sync('APNumber');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                number : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "alloc/APShortCode":{
 | 
						|
            if(client.APShortCode) {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    code : client.APShortCode
 | 
						|
                })
 | 
						|
            };
 | 
						|
            let value = APShortCode.lock(client);
 | 
						|
            client.APShortCode = value;
 | 
						|
            client.sync('APShortCode');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                code : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "realloc/APIPAddress":{
 | 
						|
            if(client.APIPAddress == 0){
 | 
						|
                return end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            APIPAddress.release(client.APIPAddress);
 | 
						|
            let value = APIPAddress.lock(client);
 | 
						|
            client.sync('APIPAddress');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                ip : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "realloc/APNumber":{
 | 
						|
            if(client.APNumber == 0){
 | 
						|
                return end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            APNumber.release(client.APNumber);
 | 
						|
            let value = APNumber.lock(client);
 | 
						|
            client.sync('APNumber');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                number : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "realloc/APShortCode":{
 | 
						|
            if(client.APShortCode == 0){
 | 
						|
                return end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            APShortCode.release(client.APShortCode);
 | 
						|
            let value = APShortCode.lock(client);
 | 
						|
            client.sync('APShortCode');
 | 
						|
            end({
 | 
						|
                status : "success",
 | 
						|
                code : value
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "release/APIPAddress":{
 | 
						|
            APIPAddress.release(client.APIPAddress);
 | 
						|
            client.APIPAddress = void 0;
 | 
						|
            client.sync('APShortCode');
 | 
						|
            end({
 | 
						|
                status : "success"
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "release/APNumber":{
 | 
						|
            APNumber.release(client.APNumber);
 | 
						|
            client.APNumber = void 0;
 | 
						|
            client.sync('APIPAddress');
 | 
						|
            end({
 | 
						|
                status : "success"
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "release/APShortCode":{
 | 
						|
            APShortCode.release(client.APShortCode);
 | 
						|
            client.APShortCode = void 0;
 | 
						|
            client.sync('APIPAddress');
 | 
						|
            end({
 | 
						|
                status : "success"
 | 
						|
            })
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "whois/APIPAddress":{
 | 
						|
            let socketId = APIPAddress.whois(whois);
 | 
						|
            if(socketId)
 | 
						|
            {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    socket : socketId
 | 
						|
                })
 | 
						|
            }else{
 | 
						|
                end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "whois/APNumber":{
 | 
						|
            let socketId = APNumber.whois(whois);
 | 
						|
            if(socketId)
 | 
						|
            {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    socket : socketId
 | 
						|
                })
 | 
						|
            }else{
 | 
						|
                end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "whois/APShortCode":{
 | 
						|
            let socketId = APShortCode.whois(whois);
 | 
						|
            if(socketId)
 | 
						|
            {
 | 
						|
                end({
 | 
						|
                    status : "success",
 | 
						|
                    socket : socketId
 | 
						|
                })
 | 
						|
            }else{
 | 
						|
                end({
 | 
						|
                    status : "fail"
 | 
						|
                })
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
})
 | 
						|
 | 
						|
process.on('message',({type, uuid, value}) => {
 | 
						|
    switch(type)
 | 
						|
    {
 | 
						|
        case "AP_NUMBER/LOCK":{
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            APNumber.busyNumbers.set(value, client);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APNumber = value;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "AP_NUMBER/RELEASE":{
 | 
						|
            APNumber.busyNumbers.delete(value);
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APNumber = void 0;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "AP_SHORTCODE/LOCK":{
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            APShortCode.busyCodes.set(value, client);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APShortCode = value;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "AP_SHORTCODE/RELEASE":{
 | 
						|
            APShortCode.busyCodes.delete(value);
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APShortCode = void 0;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "AP_IPADDRESS/LOCK":{
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            APIPAddress.busyIP.set(value, client);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APIPAddress = value;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        case "AP_IPADDRESS/RELEASE":{
 | 
						|
            APIPAddress.busyIP.delete(value);
 | 
						|
            let client = Client.clients.get(uuid);
 | 
						|
            if(client)
 | 
						|
            {
 | 
						|
                client.APIPAddress = void 0;
 | 
						|
            }
 | 
						|
            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);
 | 
						|
    }
 | 
						|
}); |