Skip to content
This repository was archived by the owner on Sep 11, 2025. It is now read-only.

Commit c466b38

Browse files
authored
Rewrite getIsPortTaken function (#22)
1 parent 1f12076 commit c466b38

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

src/index.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,34 @@ async function outOfStin<T>(block: () => Promise<T>) {
118118
return result
119119
}
120120

121-
function getIsPortTaken(config: JestProcessManagerOptions) {
122-
let server: net.Server
123-
const cleanupAndReturn: (val: boolean) => void = result =>
124-
new Promise(resolve => server.once('close', () => resolve(result)).close())
125-
return new Promise((resolve, reject) => {
126-
server = net
127-
.createServer()
128-
.once('error', (err: JestProcessManagerError) =>
129-
err.code === 'EADDRINUSE' ? resolve(cleanupAndReturn(true)) : reject(),
130-
)
131-
.once('listening', () => resolve(cleanupAndReturn(false)))
132-
.listen(config.port, config.host)
133-
})
121+
async function getIsPortTaken(config: JestProcessManagerOptions) {
122+
// TODO Make it configurable through config?
123+
const timeout = 1000
124+
const {port, host} = config
125+
const promise = new Promise(((resolve, reject) => {
126+
const socket = new net.Socket()
127+
128+
const onError = () => {
129+
socket.destroy()
130+
reject()
131+
};
132+
133+
socket.setTimeout(timeout);
134+
socket.once('error', onError)
135+
socket.once('timeout', onError)
136+
137+
socket.connect(port, host as string, () => {
138+
socket.end()
139+
resolve()
140+
})
141+
}))
142+
143+
try {
144+
await promise
145+
return true
146+
} catch (_) {
147+
return false
148+
}
134149
}
135150

136151
const basePathUrlPostfix = (basePath?: string): string => {

0 commit comments

Comments
 (0)