Home

Awesome

port-authority

Utilities for dealing with ports in Node apps.

Port Authority

import * as ports from 'port-authority';

async function start(port) {
  if (port) {
    // if the selected port is unavailable,
    // print something nicer than EADDRINUSE
    const available = await ports.check(port);
    if (!available) {
      console.log(`> Port ${port} is unavailable`);
      return;
    }
  } else {
    // if no port was selected, start at 3000
    // and keep counting until we find one
    port = await ports.find(3000);
  }

  const proc = child_process.fork('server.js', [], {
    env: {
      PORT: port
    }
  });

  try {
    await ports.waitUntilBusy(port, {
      timeout: 5000
    });

    console.log(`> Server is running on port ${port}`);

    setTimeout(() => proc.kill(), 100);
    await ports.waitUntilFree(port);

    console.log(`> Port ${port} is free`);
  } catch (err) {
    console.log(`> Could not find server on port ${port}`);
    proc.kill();
  }
}

start();

There are existing libraries to do this stuff, but I couldn't find any that do all the things that port-authority does, with treeshakeable functions and a modern Promise-based API.

Additional functions

On Unix-like systems, you can also do the following:

// Find the process ID that is using port n.
// Returns `null` if port is currently unused
const pid = await ports.blame(n);

// Kill the process using port n, if any.
// Returns `true` if the port was in use
const killed = await ports.kill(n);

PRs welcome to make this work on all operating systems.

License

LIL