UNPKG

port-get

Version:

Get an available TCP port (a minimal CJS module)

34 lines (31 loc) 1.1 kB
'use strict' const { createServer } = process.versions.bare ? require('http') : require('net') class PortGet extends Promise { static get [Symbol.species] () { return Promise } errors = [] constructor (portlist = [], host = '127.0.0.1') { let completers = null super((resolve, reject) => { completers = [resolve, reject] }) const [resolve, reject] = completers if (typeof portlist === 'string') { host = portlist portlist = [] } portlist = Array.isArray(portlist) ? portlist : [portlist] this.portlist = portlist.filter(Number.isInteger) this.server = createServer() this.server.unref() const [port = 0, ...spare] = this.portlist this.server.once('error', (err) => { this.errors.push(err) if (port !== 0) return new this.constructor(spare).then(resolve, reject) err.all = this.errors reject(err) }) this.server.listen(port, host, () => { const { port } = this.server.address() this.server.close(() => resolve(port)) }) } } module.exports = (portlist, host) => new PortGet(portlist, host)