@nx/web
Version:
45 lines (44 loc) • 1.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.waitForPortOpen = waitForPortOpen;
const devkit_1 = require("@nx/devkit");
const net = require("net");
function waitForPortOpen(port, options = {}) {
const host = options.host ?? '127.0.0.1';
const allowedErrorCodes = ['ECONNREFUSED', 'ECONNRESET', 'ETIMEDOUT'];
return new Promise((resolve, reject) => {
const checkPort = (retries = options.retries ?? 120) => {
const client = new net.Socket();
const cleanupClient = () => {
client.removeAllListeners('connect');
client.removeAllListeners('error');
client.end();
client.destroy();
client.unref();
};
client.once('connect', () => {
cleanupClient();
resolve();
});
client.once('error', (err) => {
if (retries === 0 || !allowedErrorCodes.includes(err['code'])) {
if (process.env['NX_VERBOSE_LOGGING'] === 'true') {
devkit_1.logger.info(`Error connecting on ${host}:${port}: ${err['code'] || err}`);
}
cleanupClient();
reject(err);
}
else {
setTimeout(() => checkPort(retries - 1), options.retryDelay ?? 1000);
}
});
// Node will use IPv6 if it is available, but this can cause issues if the server is only listening on IPv4.
// Hard-coding to look on 127.0.0.1 to avoid using the IPv6 loopback address "::1".
if (process.env['NX_VERBOSE_LOGGING'] === 'true') {
devkit_1.logger.info(`Connecting on ${host}:${port}`);
}
client.connect({ port, host });
};
checkPort();
});
}