zcatalyst-cli
Version:
Command Line Tool for CATALYST
134 lines (133 loc) • 6.61 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _a, _PortResolver_takenPorts, _PortResolver_isPortTaken;
Object.defineProperty(exports, "__esModule", { value: true });
const ansi_colors_1 = require("ansi-colors");
const portfinder_1 = require("portfinder");
const index_js_1 = __importDefault(require("./error/index.js"));
const runtime_store_1 = __importDefault(require("./runtime-store"));
const constants_1 = require("./util_modules/constants");
const index_1 = require("./util_modules/logger/index");
const featureRef = {
client: 'client',
aio: 'advancedio',
bio: 'basicio',
master: 'master',
appsail: 'appsail',
slate: 'slate',
browserlogic: 'browser_logic'
};
class PortResolver {
static freePort(port) {
__classPrivateFieldGet(this, _a, "f", _PortResolver_takenPorts).delete(port);
}
static getFreePort(startPort, searchSpan = 0, dupCheck = false) {
return __awaiter(this, void 0, void 0, function* () {
if (searchSpan < 0) {
throw new Error('unable to find port. searchSpan has reached the bottom line');
}
const port = yield (0, portfinder_1.getPortPromise)({
port: startPort,
stopPort: startPort + searchSpan
});
if (__classPrivateFieldGet(PortResolver, _a, "m", _PortResolver_isPortTaken).call(PortResolver, port)) {
if (dupCheck) {
return PortResolver.getFreePort(port + 1, searchSpan - (port - startPort), dupCheck);
}
return port;
}
__classPrivateFieldGet(PortResolver, _a, "f", _PortResolver_takenPorts).add(port);
return port;
});
}
static getPort(feature, type, { name = '', duplicateCheck = true, searchSpan = 20, fallbackNeeded = true, server } = {}) {
return __awaiter(this, void 0, void 0, function* () {
let port = parseInt(runtime_store_1.default.get(`context.port.${type}.${feature}.${name}`), 10);
port = isNaN(port) ? parseInt(runtime_store_1.default.get(`context.port.${type}.${feature}`), 10) : port;
if (isNaN(port)) {
if (type === 'debug' && feature === 'client') {
throw new index_js_1.default('client cannot be debugged', { exit: 2 });
}
if (!fallbackNeeded) {
return -1;
}
if (feature === 'appsail') {
if (!server || type !== 'http') {
throw new index_js_1.default('Invalid appsail details', { exit: 2 });
}
port = constants_1.DEFAULT.serve_port['http']['appsail'][server];
}
else if (feature === 'slate') {
if (!server || type !== 'http') {
throw new index_js_1.default('Invalid slate details', { exit: 2 });
}
port = constants_1.DEFAULT.serve_port['http']['slate'][server];
}
else {
port = constants_1.DEFAULT.serve_port[type][featureRef[feature]];
}
}
else {
searchSpan = 0;
}
if (port === -1) {
throw new index_js_1.default('port resolved to -1 for feature ' + feature + ' and type ' + type, {
exit: 2
});
}
let finalPort = port;
try {
finalPort = yield PortResolver.getFreePort(port, searchSpan, duplicateCheck);
}
catch (e) {
if (searchSpan === 0) {
const err = index_js_1.default.getErrorInstance(e, {
message: `Provided port '${port}' is not available`,
skipHelp: false
});
err.errorId = 'PORT-RESOLVER-1';
err.arg = [
ansi_colors_1.bold.red(port + ''),
type === 'debug' ? 'debugging' : 'serving',
(0, ansi_colors_1.bold)(feature),
name,
type
];
throw err;
}
const cerr = index_js_1.default.getErrorInstance(e, {
message: `No ports from '${port}' to ${port + searchSpan} is free to use as a ${type} port.`,
skipHelp: server ? true : false
});
cerr.errorId = 'PORT-RESOLVER-2';
cerr.arg = [(0, ansi_colors_1.bold)(port + ''), (0, ansi_colors_1.bold)(port + searchSpan + ''), (0, ansi_colors_1.bold)('--' + type)];
throw cerr;
}
if (finalPort !== port) {
(0, index_1.debug)(`${type} port : '${port}' is not available. Hence port '${finalPort}' will be used instead.`);
}
return finalPort;
});
}
}
exports.default = PortResolver;
_a = PortResolver, _PortResolver_isPortTaken = function _PortResolver_isPortTaken(port) {
return __classPrivateFieldGet(PortResolver, _a, "f", _PortResolver_takenPorts).has(port);
};
_PortResolver_takenPorts = { value: new Set() };