UNPKG

@eclipse-emfcloud/modelserver-theia

Version:
204 lines 8.89 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultModelServerNodeLauncher = exports.DefaultModelServerLauncher = exports.ModelServerLauncher = void 0; const inversify_1 = require("@theia/core/shared/inversify"); const process_manager_1 = require("@theia/process/lib/node/process-manager"); const raw_process_1 = require("@theia/process/lib/node/raw-process"); const common_1 = require("../common"); const launch_options_1 = require("./launch-options"); exports.ModelServerLauncher = Symbol('ModelServerLauncher'); let DefaultModelServerLauncher = class DefaultModelServerLauncher { constructor() { this.launchOptions = launch_options_1.DEFAULT_LAUNCH_OPTIONS; } async initialize() { try { const alive = await this.modelserverClient.ping(); if (alive) { this.logError('Model Server is already running!'); } else { throw new Error('Could not reach Model Server'); } } catch (error) { this.logInfo('Starting Model Server'); this.startServer(); } } startServer() { if (this.validateLaunch()) { this.doStartServer(); } return true; } doStartServer() { // Note that the existence of the jarPath was previously checked let args = ['-jar', this.launchOptions.jarPath, '--port', `${this.resolveJavaServerPort(this.launchOptions)}`]; if (this.launchOptions.vmArgs) { args = [...this.launchOptions.vmArgs, ...args]; } if (this.launchOptions.additionalArgs) { args = [...args, ...this.launchOptions.additionalArgs]; } this.spawnProcessAsync('java', args); } /** * Resolve the TCP port number that the Java server should be configured to listen on. * * @param options the launch options * @returns the most appropriate port number to configure the Java server process to listen on */ resolveJavaServerPort(options) { var _a; return (_a = options.serverPort) !== null && _a !== void 0 ? _a : launch_options_1.DEFAULT_LAUNCH_OPTIONS.serverPort; } validateLaunch() { if (!this.launchOptions.jarPath) { this.logError('Could not start model server. No path to executable is specified'); return false; } return true; } spawnProcessAsync(command, args, options) { const rawProcess = this.processFactory({ command, args, options }); rawProcess.errorStream.on('data', this.logError.bind(this)); rawProcess.outputStream.on('data', this.logInfo.bind(this)); return new Promise((resolve, reject) => { rawProcess.onError((error) => { this.onDidFailSpawnProcess(error); if (error.code === 'ENOENT') { const guess = command.split(/\s+/).shift(); if (guess) { reject(new Error(`Failed to spawn ${guess}.\nPerhaps it is not on the PATH.`)); return; } } reject(error); }); process.nextTick(() => resolve(rawProcess)); }); } onDidFailSpawnProcess(error) { this.logError(error.message); } logError(data) { if (data) { console.error(`ModelServerBackendContribution: ${data.toString().trimEnd()}`); } } logInfo(data) { if (data) { console.info(`ModelServerBackendContribution: ${data.toString().trimEnd()}`); } } dispose() { // nothing to do } onStop() { this.dispose(); } }; __decorate([ (0, inversify_1.inject)(launch_options_1.LaunchOptions), (0, inversify_1.optional)(), __metadata("design:type", Object) ], DefaultModelServerLauncher.prototype, "launchOptions", void 0); __decorate([ (0, inversify_1.inject)(raw_process_1.RawProcessFactory), __metadata("design:type", Function) ], DefaultModelServerLauncher.prototype, "processFactory", void 0); __decorate([ (0, inversify_1.inject)(process_manager_1.ProcessManager), __metadata("design:type", process_manager_1.ProcessManager) ], DefaultModelServerLauncher.prototype, "processManager", void 0); __decorate([ (0, inversify_1.inject)(common_1.TheiaModelServerClient), __metadata("design:type", Object) ], DefaultModelServerLauncher.prototype, "modelserverClient", void 0); DefaultModelServerLauncher = __decorate([ (0, inversify_1.injectable)() ], DefaultModelServerLauncher); exports.DefaultModelServerLauncher = DefaultModelServerLauncher; let DefaultModelServerNodeLauncher = class DefaultModelServerNodeLauncher extends DefaultModelServerLauncher { constructor() { super(...arguments); this.launchOptions = launch_options_1.DEFAULT_MODELSERVER_NODE_LAUNCH_OPTIONS; } validateLaunch() { var _a; let result = super.validateLaunch(); if (!((_a = this.launchOptions.modelServerNode) === null || _a === void 0 ? void 0 : _a.jsPath)) { this.logError('Could not start model server (Node). No path to main script is specified'); result = false; } return result; } doStartServer() { this.startJavaServer(); this.startNodeServer(); } startJavaServer() { // Launch the Java server as per superclass behavior super.doStartServer(); } resolveJavaServerPort(options) { return this.resolveUpstreamPort(options); } startNodeServer() { var _a; // Note that validation previously asserted the existence of the `modelServerNode` property const upstreamPort = this.resolveUpstreamPort(this.launchOptions); const port = this.resolveNodeServerPort(this.launchOptions); // Note that the existence of the jsPath was previously checked let args = [this.launchOptions.modelServerNode.jsPath, '--port', `${port}`, '--upstream', `${upstreamPort}`]; if ((_a = this.launchOptions.modelServerNode) === null || _a === void 0 ? void 0 : _a.additionalArgs) { args = [...args, ...this.launchOptions.modelServerNode.additionalArgs]; } this.spawnProcessAsync('node', args); } /** * Resolve the TCP port number that the Node server should be configured to address its upstream Java server. * * @param options the launch options * @returns the most appropriate port number to configure the Node server process to connect to for the upstream Java server */ resolveUpstreamPort(options) { var _a; // Note that validation previously asserted the existence of the `modelServerNode` property return (_a = options.modelServerNode.upstreamPort) !== null && _a !== void 0 ? _a : launch_options_1.DEFAULT_MODELSERVER_NODE_LAUNCH_OPTIONS.modelServerNode.upstreamPort; } /** * Resolve the TCP port number that the Node server should be configured to listen on. * * @param options the launch options * @returns the most appropriate port number to configure the Node server process to listen on */ resolveNodeServerPort(options) { var _a; return (_a = options.serverPort) !== null && _a !== void 0 ? _a : launch_options_1.DEFAULT_MODELSERVER_NODE_LAUNCH_OPTIONS.serverPort; } }; __decorate([ (0, inversify_1.inject)(launch_options_1.LaunchOptions), (0, inversify_1.optional)(), __metadata("design:type", Object) ], DefaultModelServerNodeLauncher.prototype, "launchOptions", void 0); __decorate([ (0, inversify_1.inject)(common_1.TheiaModelServerClientV2), __metadata("design:type", Object) ], DefaultModelServerNodeLauncher.prototype, "modelserverClient", void 0); DefaultModelServerNodeLauncher = __decorate([ (0, inversify_1.injectable)() ], DefaultModelServerNodeLauncher); exports.DefaultModelServerNodeLauncher = DefaultModelServerNodeLauncher; //# sourceMappingURL=model-server-backend-contribution.js.map