Skip to content

detached not working as expected #1595

Open
@nkomonen-amazon

Description

@nkomonen-amazon

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.

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    info-neededIssue requires more information from poster

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions