61 lines
1.4 KiB
JavaScript
61 lines
1.4 KiB
JavaScript
import Debug from 'debug';
|
|
|
|
class PortManager {
|
|
constructor(opt) {
|
|
this.debug = Debug('lt:PortManager');
|
|
this.range = opt.range || null;
|
|
this.first = null;
|
|
this.last = null;
|
|
this.pool = {};
|
|
this.initializePool();
|
|
}
|
|
|
|
initializePool() {
|
|
if (this.range === null) {
|
|
return;
|
|
}
|
|
|
|
if (!/^[0-9]+:[0-9]+$/.test(this.range)) {
|
|
throw new Error('Bad range expression: ' + this.range);
|
|
}
|
|
|
|
[this.first, this.last] = this.range.split(':').map((port) => parseInt(port));
|
|
|
|
if (this.first > this.last) {
|
|
throw new Error('Bad range expression min > max: ' + this.range);
|
|
}
|
|
|
|
for (let port = this.first; port <= this.last; port++) {
|
|
this.pool['_' + port] = null;
|
|
}
|
|
this.debug = Debug('lt:PortManager');
|
|
this.debug('Pool initialized ' + JSON.stringify(this.pool));
|
|
}
|
|
|
|
release(port) {
|
|
if (this.range === null) {
|
|
return;
|
|
}
|
|
this.debug('Release port ' + port);
|
|
this.pool['_' + port] = null;
|
|
}
|
|
|
|
getNextAvailable(clientId) {
|
|
if (this.range === null) {
|
|
return null;
|
|
}
|
|
|
|
for (let port = this.first; port <= this.last; port++) {
|
|
if (this.pool['_' + port] === null) {
|
|
this.pool['_' + port] = clientId;
|
|
this.debug('Port found ' + port);
|
|
return port;
|
|
}
|
|
}
|
|
this.debug('No more ports available ');
|
|
throw new Error('No more ports available in range ' + this.range);
|
|
}
|
|
}
|
|
|
|
export default PortManager;
|