Open
Description
My original task is that if the LS client (Extension Host) terminates gracefully or non gracefully, I don't want my Language Server to terminate. I want the LS to decide for itself when to terminate.
- It looks like the
detached
flag should have been the solution but I am not able to get it to working. - I've also tried:
// based on this comment: https://github.com/microsoft/vscode-languageserver-node/issues/857#issuecomment-980003467
{ initializationOptions: { processId: '' }, }
Minimal Repro
These are the following steps to setup for repro.
- I am using the lsp-sample project
- Replace
server/src/server.ts
with the following
import {
createConnection,
NotificationType,
ProposedFeatures} from 'vscode-languageserver/node';
const Heartbeat: NotificationType<undefined> = new NotificationType<undefined>('heartbeat');
const connection = createConnection(ProposedFeatures.all);
connection.onInitialize(() => {
connection.console.log(`PPID ${process.ppid}`);
// I would expect this PID to stay alive after the PPID above is terminated, but it does not
connection.console.log(`PID ${process.pid}`);
return {
capabilities: {}
};
});
connection.onNotification(Heartbeat, () => {
connection.console.log('heartbeat');
});
connection.listen();
- Replace
client/src/extension.ts
import * as path from 'path';
import { ExtensionContext } from 'vscode';
import {
Executable,
LanguageClient,
NotificationType,
TransportKind
} from 'vscode-languageclient/node';
let client: LanguageClient;
const Heartbeat: NotificationType<undefined> = new NotificationType<undefined>('heartbeat');
export async function activate(context: ExtensionContext) {
const serverModule = context.asAbsolutePath(
path.join('server', 'out', 'server.js')
);
// `detached` is not available in ForkOptions, so I must do it this way
const serverOptions: Executable = {
command: 'node', args: [serverModule], transport: TransportKind.stdio, options: { detached: true }
};
// Create the language client and start the client.
client = new LanguageClient(
'languageServerExample',
'Language Server Example',
serverOptions,
// Tried this based on this comment: https://github.com/microsoft/vscode-languageserver-node/issues/857#issuecomment-980003467
{ initializationOptions: { processId: '' }, }
);
await client.start();
// Send a heartbeat every interval to show we are connected to LSP
setInterval(async () => {
await client.sendNotification(Heartbeat);
}, 5000);
}
export function deactivate(): Thenable<void> | undefined {
return undefined;
}
- Run the extension in Debug Mode
- Note the PPID+PID in the logs of the
Language Server Example
Output logs - Kill the PPID (Ext host)
- The PID unexpectedly terminates shortly after.
Expected
I would expect that with detached: true
killing the Ext Host would not impact the Language Server.
Is there any configuration that I am missing? Maybe something that needs to be configured on the LS side?