index.js 793 B

1234567891011121314151617181920212223242526272829303132333435
  1. 'use strict';
  2. const net = require('net');
  3. const isAvailable = options => new Promise((resolve, reject) => {
  4. const server = net.createServer();
  5. server.unref();
  6. server.on('error', reject);
  7. server.listen(options, () => {
  8. const {port} = server.address();
  9. server.close(() => {
  10. resolve(port);
  11. });
  12. });
  13. });
  14. const getPort = options => {
  15. options = Object.assign({}, options);
  16. if (typeof options.port === 'number') {
  17. options.port = [options.port];
  18. }
  19. return (options.port || []).reduce(
  20. (seq, port) => seq.catch(
  21. () => isAvailable(Object.assign({}, options, {port}))
  22. ),
  23. Promise.reject()
  24. );
  25. };
  26. module.exports = options => options ?
  27. getPort(options).catch(() => getPort(Object.assign(options, {port: 0}))) :
  28. getPort({port: 0});
  29. module.exports.default = module.exports;