@pact-foundation/pact
Version:
Pact for all things Javascript
54 lines • 2.05 kB
JavaScript
;
/**
* Network module.
* @module net
* @private
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.freePort = exports.isPortAvailable = exports.portCheck = exports.localAddresses = void 0;
const node_net_1 = __importDefault(require("node:net"));
exports.localAddresses = ['127.0.0.1', 'localhost', '0.0.0.0', '::1'];
const portCheck = (port, host) => new Promise((resolve, reject) => {
const server = node_net_1.default
.createServer()
.listen({ port, host, exclusive: true })
.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
reject(new Error(`Port ${port} is unavailable on address ${host}`));
}
else {
reject(e);
}
})
.on('listening', () => {
server.once('close', () => resolve()).close();
});
});
exports.portCheck = portCheck;
const isPortAvailable = (port, host) => Promise.allSettled(exports.localAddresses.map((localHost) => (0, exports.portCheck)(port, localHost))).then((settledPortChecks) => {
// if every port check failed, then fail the `isPortAvailable` check
if (settledPortChecks.every((result) => result.status === 'rejected')) {
throw new Error(`Cannot open port ${port} on ipv4 or ipv6 interfaces`);
}
// the local addresses passed - now check the host that the user has specified
return (0, exports.portCheck)(port, host);
});
exports.isPortAvailable = isPortAvailable;
const freePort = () => new Promise((res) => {
const s = node_net_1.default.createServer();
s.listen(0, () => {
const addr = s.address();
if (addr !== null && typeof addr !== 'string') {
const { port } = addr;
s.close(() => res(port));
}
else {
throw Error('unable to find a free port');
}
});
});
exports.freePort = freePort;
//# sourceMappingURL=net.js.map