提交 647cccd8 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

fix getPort by use a well-tested npm module

上级 9a9760f0
......@@ -25,8 +25,6 @@ import net from 'net'
import { getPort } from './get-port'
test('getPort() for an available socket port', async t => {
// const PORT = 8788
let port = await getPort()
let ttl = 17
......@@ -37,7 +35,7 @@ test('getPort() for an available socket port', async t => {
const server = net.createServer(socket => {
console.log(socket)
})
server.listen(port, '127.0.0.1')
await new Promise(r => server.listen(port, r))
serverList.push(server)
port = await getPort()
......
import net from 'net'
const DEFAULT_PORT = 38788
import portfinder from 'portfinder'
/**
*
......@@ -13,47 +11,11 @@ const DEFAULT_PORT = 38788
* const DEFAULT_IANA_RANGE = {min: 49152, max: 65535}
*
*/
export function getPort (port = DEFAULT_PORT): Promise<number> {
let tryPort = nextPort(port)
return new Promise(resolve => {
// https://gist.github.com/mikeal/1840641
function _getPort (cb: (port: number) => void) {
const server = net.createServer()
server.on('error', (err) => {
if (err) {/* fail safe */ }
tryPort = nextPort(port)
_getPort(cb)
})
server.listen(tryPort, (err: any) => {
if (err) {/* fail safe */}
server.once('close', () => {
cb(tryPort)
})
server.close()
})
}
_getPort(okPort => {
// put to the end of the event loop
// make sure that all tasks had been done, esp. server.close()
setImmediate(() => resolve(okPort))
})
})
function nextPort (currentPort: number): number {
const RANGE = 1733
// do not use Math.random() here, because AVA will fork, then here will get the same random number, cause a race condition for socket listen
const n = Math.floor(Math.random() * RANGE)
/**
* nano seconds from node: http://stackoverflow.com/a/18197438/1123955
*/
// const [, nanoSeed] = process.hrtime()
// const n = 1 + nanoSeed % RANGE // +1 to prevent same port
if (currentPort + n > 65000) {
return currentPort + n - RANGE
}
return currentPort + n
export async function getPort (
basePort?: number,
): Promise<number> {
if (basePort) {
portfinder.basePort = basePort
}
return portfinder.getPortPromise()
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册