{"version":3,"sources":["../../src/utils/Pool.ts"],"sourcesContent":["import Queue from './Queue.js'\n\nclass Pool<T> {\n    /* *\n     * this class handle the socket connectd\n     * queue of sockets and manages connection with the workers\n     * */\n\n    private enabled: Queue<string>;\n    private disabled: string[];\n    private items: { [key: string]: T };\n\n    constructor() {\n        this.enabled = new Queue();\n        this.disabled = [];\n        this.items = {}\n    }\n\n    has( id: string ): boolean {\n        return this.items[id] ? true : false;\n    }\n\n    add( id: string, item: T ): boolean {\n        // if the item is already in the pool\n        if (this.has(id)) this.remove(id);\n        // add to the queue\n        this.enabled.enqueue(id);\n        // add the item to the pool\n        this.items[id] = item;\n        // return true\n        return false;\n    }\n\n    disable(id: string): boolean {\n        if( !this.has(id) ) return false;\n        // if it is in the disable list, job done\n        if( this.disabled.indexOf(id) !== -1 ) return true;\n        // if it is in the enabled list, remove it\n        if( this.enabled.indexOf(id) !== -1 ){\n            this.enabled.remove(id);\n            // add the slave to the disable list\n            this.disabled.push(id);\n            return true;\n        }\n        return false;\n    }\n\n    disableUntil(id: string, timeOrCondition: number | Function): undefined {\n        // if it is not in the pool, return false\n        if( !this.has(id) ) return;\n        // check if timeOrCondition is a number or a function\n        let time = null;\n        let condition : any = null;\n        if(typeof timeOrCondition === 'number')\n            time = timeOrCondition;\n        else if(typeof timeOrCondition === 'function')\n            condition = timeOrCondition;\n        else throw new Error('timeOrCondition must be a number or a function');\n        // if it is already disabled, we want to keep it disabled until the timeOrCondition is met\n        // if it is in the enabled list, disable it\n        if( this.enabled.indexOf(id) !== -1 ) this.disable(id);\n        // check that the id is in the disabled list\n        if( this.disabled.indexOf(id) === -1 ) throw new Error('id is not in the disabled list');\n        // if time is defined, set a timeout\n        if(time) setTimeout(() => this.enable(id), time);\n        // if condition is defined, set a interval\n        if(condition){\n            let interval = setInterval(() => {\n                if(condition()){\n                    clearInterval(interval);\n                    this.enable(id);\n                }\n            }, 100);\n        }\n    }\n\n\n    enable(id: string) : boolean {\n        // if it is not in the pool, return false\n        if( !this.has(id) ) return false;\n        // if it is already enabled, job done\n        if( this.enabled.indexOf(id) !== -1 ) return true;\n        // if it is in the disabled list, remove it\n        if( this.disabled.indexOf(id) !== -1 ){\n            // remove the slave from the disable list\n            this.disabled = this.disabled.filter( e => e !== id );\n            // add the slave to the queue\n            this.enabled.enqueue(id);\n            return true\n        }\n        return false;\n    }\n\n    nextAndEnable() : string | boolean {\n        // if the diabled list is empty, return false\n        if( this.disabled.length === 0 ) return false;\n        // get the first element of the disabled list\n        let id = this.disabled[0];\n        // and enable it\n        this.enable(id);\n        // return the id\n        return id;\n    }\n\n    rotate() : T | null { \n        // dequeue and enqueue\n        if(this.size() === 0) return null\n        const id = this.enabled.dequeue()\n        if(!id) return null\n        this.enabled.enqueue(id)\n        return this.items[id]\n    }\n\n    hasEnabled() : boolean {\n        return this.enabled.size() > 0;\n    }\n\n\n    nextAndDisable() : T | null { // dequeue and disable\n        if(this.size() === 0) return null\n        const id = this.enabled.dequeue();\n        if(!id) return null;\n        this.disabled.push(id);\n        return this.items[id];\n    }\n\n    // remove value while maintaining order\n    remove( id: string ) : T | null {\n        // look in the queue for the id\n        let result = this._lookUp(id);\n        if(result){\n            let index = result.index;\n            let list = result.list;\n            // remove the lists\n            if(list === 'enabled')\n                this.enabled.removeAt(index);\n            else\n                this.disabled.splice(index, 1);\n            // remove the items\n            let item = this.items[id];\n            delete this.items[id];\n            // return true\n            return item;\n        }\n        return null;\n    }\n\n    removeOne() : T | null {\n        // get the first element of the enabled list\n        if(this.enabled.size() > 0){\n            let id = this.enabled.dequeue();\n            if(id === undefined || id === false) return null;\n            // remove the item from the pool\n            let item = this.items[id];\n            delete this.items[id];\n            return item;\n        }\n        return null;\n    }\n\n    get( id: string ) : T | null {\n        /* get the item from the pool */\n        if(!this.has(id)) return null;\n        return this.items[id];\n    }\n\n    // get the size of the pool\n    size() : number {\n        return Object.keys(this.items).length;\n    }\n\n    // lenght of the pool\n    length() : number {\n        return this.size();\n    }\n\n    // count the enabled elements\n    getEnabledCount() : number {\n        return this.enabled.size();\n    }\n\n    // count the disabled elements\n    getDisabledCount() : number {\n        return this.disabled.length;\n    }\n\n    // check if queue is empty\n    isEmpty() : boolean {\n        return this.size() === 0;\n    }\n\n    _lookUp( id : string ) : { index: number, list: string } | false {\n        // look in the queue for the id\n        let index = this.enabled.indexOf(id);\n        if(!(index === -1))\n            return { index, list: 'enabled' };\n        // look in the disable list for the id\n        index = this.disabled.indexOf(id);\n        if(!(index === -1))\n            return { index, list: 'disabled' };\n        return false;\n    }\n\n    toArray() : T[] {\n        return Object.values(this.items);\n    }\n\n    print() : void {\n        console.log(this.toArray());\n    }\n\n    getEnabled() : string[] {\n        return this.enabled.toArray();\n    }\n\n    getEnabledObjects() : T[] {\n        return this.enabled.toArray().map( id => this.items[id] );\n    }\n\n    getDisabled() : string[] {\n        return this.disabled;\n    }\n\n    getDisabledObjects() : T[] {\n        return this.disabled.map( id => this.items[id] );\n    }\n\n    getConnections() : string[] {\n        return Object.keys(this.items);\n    }\n\n    healthCheck() : boolean {\n        let total = this.size();\n        let enabled = this.getEnabled().length;\n        let disabled = this.getDisabled().length;\n        if(total === (enabled + disabled))\n            return true;\n        else return false;\n    }\n\n    // synonims\n    next = this.rotate\n    pop = this.nextAndDisable;\n    shift = this.nextAndEnable;\n    unshift = this.add;\n    push = this.add;\n    count = this.size;\n    removeAt = this.remove;\n    removeItem = this.remove;\n\n\n}\n\nexport default Pool;\n"],"mappings":"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","names":["Queue"]}