nativescript
Version:
Command-line interface for building NativeScript projects
123 lines • 4.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Net = void 0;
const net = require("net");
const _ = require("lodash");
const helpers_1 = require("../helpers");
const yok_1 = require("../yok");
class Net {
constructor($errors, $childProcess, $logger, $osInfo) {
this.$errors = $errors;
this.$childProcess = $childProcess;
this.$logger = $logger;
this.$osInfo = $osInfo;
}
async getFreePort() {
const server = net.createServer((sock) => {
/* empty - noone will connect here */
});
return new Promise((resolve, reject) => {
let isResolved = false;
server.listen(0, () => {
const portUsed = server.address().port;
server.close();
if (!isResolved) {
isResolved = true;
resolve(portUsed);
}
});
server.on("error", (err) => {
if (!isResolved) {
isResolved = true;
reject(err);
}
});
});
}
async isPortAvailable(port) {
return new Promise((resolve, reject) => {
let isResolved = false;
const server = net.createServer();
server.on("error", (err) => {
if (!isResolved) {
isResolved = true;
resolve(false);
}
});
server.once("close", () => {
if (!isResolved) {
// "close" will be emitted right after "error"
isResolved = true;
resolve(true);
}
});
server.on("listening", (err) => {
if (err && !isResolved) {
isResolved = true;
resolve(true);
}
server.close();
});
server.listen(port, "localhost");
});
}
async getAvailablePortInRange(startPort, endPort) {
endPort = endPort || 65534;
while (!(await this.isPortAvailable(startPort))) {
startPort++;
if (startPort > endPort) {
this.$errors.fail("Unable to find free local port.");
}
}
return startPort;
}
async waitForPortToListen(waitForPortListenData) {
if (!waitForPortListenData) {
this.$errors.fail("You must pass port and timeout for check.");
}
const { timeout, port } = waitForPortListenData;
const interval = waitForPortListenData.interval || Net.DEFAULT_INTERVAL;
const endTime = new Date().getTime() + timeout;
const platformData = {
darwin: {
command: "netstat -f inet -p tcp -anL",
regex: new RegExp(`\\.${port}\\b`, "g"),
},
linux: {
command: "netstat -tnl",
regex: new RegExp(`:${port}\\s`, "g"),
},
win32: {
command: "netstat -ant -p tcp",
regex: new RegExp(`TCP\\s+(\\d+\\.){3}\\d+:${port}.*?LISTEN`, "g"),
},
};
const platform = this.$osInfo.platform();
const currentPlatformData = platformData[platform];
if (!currentPlatformData) {
this.$errors.fail(`Unable to check for free ports on ${platform}. Supported platforms are: ${_.keys(platformData).join(", ")}`);
}
while (true) {
const { command, regex } = currentPlatformData;
try {
const result = await this.$childProcess.exec(command);
if (result && !!result.match(regex)) {
return true;
}
}
catch (err) {
this.$logger.trace(`Error while calling '${command}': ${err}`);
}
const currentTime = new Date().getTime();
if (currentTime >= endTime) {
break;
}
await (0, helpers_1.sleep)(interval);
}
return false;
}
}
exports.Net = Net;
Net.DEFAULT_INTERVAL = 1000;
yok_1.injector.register("net", Net);
//# sourceMappingURL=net-service.js.map
;