slavery-js
Version:
A simple clustering app that allows you to scale an application on multiple thread, containers or machines
1 lines • 11.5 kB
Source Map (JSON)
{"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"]}