Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/modules-modules / deps / isPortTaken.ts
Size: Mime:
import net from 'net'

export type ResolvedPortReturn =
  | [NodeJS.ErrnoException, undefined]
  | [undefined, boolean]
export type PortReturnPromiseValue = NodeJS.ErrnoException | boolean

/**
 * 1. listen for port
 * 2. if already listening, return EADDRINUSE
 * 3. if able to listen, stop listening, return true
 */
function isPortTaken(port: number | string): Promise<PortReturnPromiseValue> {
  return new Promise(resolve => {
    // want to return a boolean
    const toResolved = (
      array: ResolvedPortReturn
    ): Promise<PortReturnPromiseValue> => {
      const value = array[0] === undefined ? array[1] : array[0]
      resolve(value)
      return Promise.resolve(value)
    }

    const tester = net
      .createServer()
      .once('error', (EADDRINUSE: NodeJS.ErrnoException) => {
        if (EADDRINUSE.code !== 'EADDRINUSE') {
          return toResolved([EADDRINUSE, undefined])
        }

        return toResolved([undefined, false])
      })
      .once('listening', () => {
        /* prettier-ignore */
        tester
          .once('close', () => {
            return toResolved([undefined, true])
          })
          .close()
      })
      .listen(port)
  })
}

export { isPortTaken }
export default isPortTaken