getPort.js 768 B

1234567891011121314151617181920212223242526272829303132
  1. const toArr = require('./toArr');
  2. const net = require('net');
  3. exports = function(ports, host) {
  4. ports = toArr(ports);
  5. ports.push(0);
  6. return ports.reduce((seq, port) => {
  7. return seq.catch(() => isAvailable(port, host));
  8. }, Promise.reject());
  9. };
  10. function isAvailable(port, host) {
  11. return new Promise((resolve, reject) => {
  12. const server = net.createServer();
  13. server.unref();
  14. server.on('error', reject);
  15. const options = {};
  16. options.port = port;
  17. if (host) options.host = host;
  18. server.listen(options, () => {
  19. const { port } = server.address();
  20. server.close(() => {
  21. resolve(port);
  22. });
  23. });
  24. });
  25. }
  26. module.exports = exports;