You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
995 B

11 months ago
  1. // Get all loopback addresses that are available for use or binding.
  2. function getLocalHosts() {
  3. const os = require("os");
  4. const interfaces = os.networkInterfaces();
  5. const results = new Set([undefined, "0.0.0.0"]);
  6. for (const _interface of Object.values(interfaces)) {
  7. for (const config of _interface) {
  8. results.add(config.address);
  9. }
  10. }
  11. return Array.from(results);
  12. }
  13. function checkPort(options = {}) {
  14. const net = require("net");
  15. return new Promise((resolve, reject) => {
  16. const server = net.createServer();
  17. server.unref();
  18. server.on("error", reject);
  19. server.listen(options, () => {
  20. server.close(() => {
  21. resolve(true);
  22. });
  23. });
  24. });
  25. }
  26. async function isPortInUse(port, host) {
  27. try {
  28. await checkPort({ port, host });
  29. return true;
  30. } catch (error) {
  31. if (!["EADDRNOTAVAIL", "EINVAL"].includes(error.code)) {
  32. return false;
  33. }
  34. }
  35. return false;
  36. }
  37. module.exports = {
  38. isPortInUse,
  39. getLocalHosts,
  40. };