Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

detached not working as expected #1595

Open
nkomonen-amazon opened this issue Dec 18, 2024 · 0 comments
Open

detached not working as expected #1595

nkomonen-amazon opened this issue Dec 18, 2024 · 0 comments

Comments

@nkomonen-amazon
Copy link

nkomonen-amazon commented Dec 18, 2024

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant