@eclipse-emfcloud/modelserver-theia
Version:
## Typescript Client API
204 lines • 8.89 kB
JavaScript
;
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