Skip to content

Commit

Permalink
lsp: migrate from tcp to stdio
Browse files Browse the repository at this point in the history
- Remove all networking artifacts.
- Let the Language Client handle spawning the process (and thus, process
	cleanup).
- Remove language server networking configuration options.
- Remove all process cleanup code, and associated libraries.
  • Loading branch information
bph-c8y committed Nov 25, 2024
1 parent 2858fce commit 0aeed2f
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 188 deletions.
109 changes: 0 additions & 109 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 0 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,6 @@
"default": "local",
"description": "Configure if the Language Server is enabled."
},
"apama.langServer.port": {
"type": "integer",
"default": "30030",
"description": "The Language Server port."
},
"apama.langServer.maxErrors": {
"type": "integer",
"default": "100",
"description": "The maximum number of diagnostics that the Language Server will return."
},
"apama.c8y.url": {
"type": "string",
"default": "https://demos.cumulocity.com/",
Expand Down Expand Up @@ -328,8 +318,6 @@
"glob": "^11.0.0",
"semver": "^7.6.3",
"shelljs": "^0.8.5",
"terminate": "^2.8.0",
"tree-kill": "^1.2.2",
"vscode-languageclient": "^9.0.1",
"vscode-languageserver": "^9.0.1",
"xpath": "0.0.34"
Expand Down
63 changes: 19 additions & 44 deletions src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
"use_strict";

import * as net from 'net';
import * as os from 'os';
import * as path from 'path';

import { ExtensionContext, Disposable, tasks, debug, workspace, WorkspaceConfiguration} from 'vscode';

import {
LanguageClient, LanguageClientOptions, ServerOptions
Executable,
LanguageClient, LanguageClientOptions,
TransportKind
} from 'vscode-languageclient/node';


Expand All @@ -19,11 +20,8 @@ import { ApamaCommandProvider } from './apama_util/commands';
import { Logger } from './logger/logger';

import { ExecutableResolver } from './settings/ExecutableResolver';
import { ChildProcessWithoutNullStreams, spawn } from 'child_process';
import { killProcessTree } from './utils/processUtils';

let languageClient : LanguageClient;
let LanguageServerProcess: ChildProcessWithoutNullStreams | null = null;
const logger = new Logger('ApamaCommunity.apama-extensions');

export async function activate(context: ExtensionContext): Promise<void> {
Expand Down Expand Up @@ -55,7 +53,7 @@ export async function activate(context: ExtensionContext): Promise<void> {
return Promise.resolve();
}

LanguageServerProcess = await createLangServerTCP(config, `${path.dirname(resolve.path)}/apama_env`);
createLangServerTCP(config, `${path.dirname(resolve.path)}/apama_env`);

const apamaEnv: ApamaEnvironment = new ApamaEnvironment();
const taskprov = new ApamaTaskProvider(logger, apamaEnv);
Expand Down Expand Up @@ -86,47 +84,25 @@ async function createLangServerTCP(config: WorkspaceConfiguration, apamaEnvPath:
/**
* Spawns a language server, and then proceeds to connect the language client up to it.
*/
const logger = new Logger('Apama Language Server');
const lsType: string | undefined = config.get<string>("type");
if (lsType === "disabled") {
return Promise.reject("Apama Language Server disabled");
}

const serverOptions: ServerOptions = () => {
return new Promise((resolve) => {
if (os.platform() == "win32") {
LanguageServerProcess = spawn(`${path.dirname(apamaEnvPath)}/eplbuddy.exe`, ['-l'])
} else {
LanguageServerProcess = spawn(apamaEnvPath, [`eplbuddy`, "-l"], { "detached": true});
}

LanguageServerProcess.stdout.on('data', (data) => {
logger.info(`stdout: ${data}`);

if (data.toString().startsWith("Listening on")) {
const clientSocket = new net.Socket();
// Set an error handler
clientSocket.on('error', (error) => {
logger.error(`Socket connection error: ${error.message}`);
});

clientSocket.connect(30030, "127.0.0.1", () => {
logger.debug(`Connected to socket at: ${config.port}`)
resolve({
reader: clientSocket,
writer: clientSocket,
});
});
}
});

LanguageServerProcess.stderr.on('data', (data) => {
logger.info(`stderr: ${data}`);
});
LanguageServerProcess.on('error', (error) => {
logger.info(`Error: ${error}`);
});
});
let commandStr;
let args;
if (os.platform() == "win32") {
commandStr = `${path.dirname(apamaEnvPath)}/eplbuddy.exe`
args = ['-s']
} else {
commandStr = apamaEnvPath
args = [`eplbuddy`, "-s"]
}

const serverOptions: Executable = {
transport: TransportKind.stdio,
command: commandStr,
args: args
};

// Options of the language client
Expand All @@ -141,14 +117,13 @@ async function createLangServerTCP(config: WorkspaceConfiguration, apamaEnvPath:
fileEvents: workspace.createFileSystemWatcher('**/.mon')
}
};
languageClient = new LanguageClient(`Apama Language Client (host ${config.host} port ${config.port})`, serverOptions, clientOptions);
languageClient = new LanguageClient(`Apama Language Client`, serverOptions, clientOptions);
await languageClient.start();
return null;
}

export function deactivate() {
return Promise.all([
languageClient.stop(),
killProcessTree(LanguageServerProcess, logger),
]);
}
23 changes: 0 additions & 23 deletions src/utils/processUtils.ts

This file was deleted.

0 comments on commit 0aeed2f

Please sign in to comment.