4551571615
* Automatically using different port to start dev server for non-explicit port * return correct port * more reasonable changes * fix isExplicitPort * 1. rename isExplicitPort to allowRetry 2.restrict the number of retries Co-authored-by: Steven <steven@ceriously.com>
49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import http from 'http'
|
|
import next from '../next'
|
|
import { warn } from '../../build/output/log'
|
|
|
|
export default async function start(
|
|
serverOptions: any,
|
|
port?: number,
|
|
hostname?: string
|
|
) {
|
|
let requestHandler: ReturnType<typeof app.getRequestHandler>
|
|
const srv = http.createServer((req, res) => {
|
|
return requestHandler(req, res)
|
|
})
|
|
const app = next({
|
|
...serverOptions,
|
|
customServer: false,
|
|
httpServer: srv,
|
|
})
|
|
requestHandler = app.getRequestHandler()
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
let retryCount = 0
|
|
srv.on('error', (err: NodeJS.ErrnoException) => {
|
|
// This code catches EADDRINUSE error if the port is already in use
|
|
if (
|
|
err.code === 'EADDRINUSE' &&
|
|
serverOptions.allowRetry &&
|
|
port &&
|
|
retryCount < 10
|
|
) {
|
|
warn(`Port ${port} is in use, trying ${port + 1} instead.`)
|
|
port += 1
|
|
retryCount += 1
|
|
srv.listen(port, hostname)
|
|
} else {
|
|
reject(err)
|
|
}
|
|
})
|
|
srv.on('listening', () => resolve())
|
|
srv.listen(port, hostname)
|
|
})
|
|
// It's up to caller to run `app.prepare()`, so it can notify that the server
|
|
// is listening before starting any intensive operations.
|
|
const addr = srv.address()
|
|
return {
|
|
app,
|
|
actualPort: addr && typeof addr === 'object' ? addr.port : port,
|
|
}
|
|
}
|