@@ -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
136151const basePathUrlPostfix = ( basePath ?: string ) : string => {
0 commit comments