2021-11-28 17:48:43 +01:00
|
|
|
import type { NextServerOptions, NextServer, RequestHandler } from '../next'
|
|
|
|
import { warn } from '../../build/output/log'
|
2018-09-27 21:10:53 +02:00
|
|
|
import http from 'http'
|
2018-09-28 14:05:23 +02:00
|
|
|
import next from '../next'
|
2018-09-27 21:10:53 +02:00
|
|
|
|
2021-11-28 17:48:43 +01:00
|
|
|
interface StartServerOptions extends NextServerOptions {
|
|
|
|
allowRetry?: boolean
|
|
|
|
}
|
|
|
|
|
|
|
|
export function startServer(opts: StartServerOptions) {
|
|
|
|
let requestHandler: RequestHandler
|
|
|
|
|
|
|
|
const server = http.createServer((req, res) => {
|
2021-10-15 09:09:54 +02:00
|
|
|
return requestHandler(req, res)
|
|
|
|
})
|
|
|
|
|
2021-11-28 17:48:43 +01:00
|
|
|
return new Promise<NextServer>((resolve, reject) => {
|
|
|
|
let port = opts.port
|
2021-11-11 23:19:20 +01:00
|
|
|
let retryCount = 0
|
2021-11-28 17:48:43 +01:00
|
|
|
|
|
|
|
server.on('error', (err: NodeJS.ErrnoException) => {
|
2021-11-11 23:19:20 +01:00
|
|
|
if (
|
|
|
|
port &&
|
2021-11-28 17:48:43 +01:00
|
|
|
opts.allowRetry &&
|
|
|
|
err.code === 'EADDRINUSE' &&
|
2021-11-11 23:19:20 +01:00
|
|
|
retryCount < 10
|
|
|
|
) {
|
|
|
|
warn(`Port ${port} is in use, trying ${port + 1} instead.`)
|
|
|
|
port += 1
|
|
|
|
retryCount += 1
|
2021-11-28 17:48:43 +01:00
|
|
|
server.listen(port, opts.hostname)
|
2021-11-11 23:19:20 +01:00
|
|
|
} else {
|
|
|
|
reject(err)
|
|
|
|
}
|
|
|
|
})
|
2021-11-28 17:48:43 +01:00
|
|
|
|
|
|
|
server.on('listening', () => {
|
|
|
|
const addr = server.address()
|
|
|
|
const hostname =
|
|
|
|
!opts.hostname || opts.hostname === '0.0.0.0'
|
|
|
|
? 'localhost'
|
|
|
|
: opts.hostname
|
|
|
|
|
|
|
|
const app = next({
|
|
|
|
...opts,
|
|
|
|
hostname,
|
|
|
|
customServer: false,
|
|
|
|
httpServer: server,
|
|
|
|
port: addr && typeof addr === 'object' ? addr.port : port,
|
|
|
|
})
|
|
|
|
|
|
|
|
requestHandler = app.getRequestHandler()
|
|
|
|
resolve(app)
|
|
|
|
})
|
|
|
|
|
|
|
|
server.listen(port, opts.hostname)
|
2018-09-27 21:10:53 +02:00
|
|
|
})
|
|
|
|
}
|