Skip to content

Commit

Permalink
#521 Test sending command, extend logging
Browse files Browse the repository at this point in the history
  • Loading branch information
kaisalmen committed Aug 16, 2023
1 parent 46b2f3e commit 57094ed
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 13 deletions.
34 changes: 29 additions & 5 deletions packages/examples/main/src/python/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@ import { RegisteredFileSystemProvider, registerFileSystemOverlay, RegisteredMemo
import { buildWorkerDefinition } from 'monaco-editor-workers';
buildWorkerDefinition('../../../node_modules/monaco-editor-workers/dist/workers/', new URL('', window.location.href).href, false);

const languageId = 'python';
let languageClient: MonacoLanguageClient;

const createWebSocket = (url: string): WebSocket => {
const webSocket = new WebSocket(url);
webSocket.onopen = () => {
const socket = toSocket(webSocket);
const reader = new WebSocketMessageReader(socket);
const writer = new WebSocketMessageWriter(socket);
const languageClient = createLanguageClient({
languageClient = createLanguageClient({
reader,
writer
});
Expand All @@ -40,7 +43,9 @@ const createLanguageClient = (transports: MessageTransports): MonacoLanguageClie
name: 'Pyright Language Client',
clientOptions: {
// use a language id as a document selector
documentSelector: ['json'],
documentSelector: [{
language: languageId
}],
// disable the default error handler
errorHandler: {
error: () => ({ action: ErrorAction.Continue }),
Expand All @@ -65,10 +70,12 @@ const run = async () => {
enableModelService: true,
enableThemeService: true,
enableTextmateService: true,
enableKeybindingsService: true,
configureConfigurationServiceConfig: {
defaultWorkspaceUri: '/tmp'
},
enableKeybindingsService: true,
enableLanguagesService: true,
enableQuickaccessService: true,
debugLogging: true
});

Expand All @@ -77,6 +84,8 @@ const run = async () => {
"workbench.colorTheme": "Default Dark Modern"
}`);

registerCommands();

const fileSystemProvider = new RegisteredFileSystemProvider(false);
fileSystemProvider.registerFile(new RegisteredMemoryFile(vscode.Uri.file('/tmp/hello.py'), 'print("Hello, World!")'));
registerFileSystemOverlay(1, fileSystemProvider);
Expand All @@ -85,14 +94,13 @@ const run = async () => {
createWebSocket('ws://localhost:30000/pyright');

// register the JSON language with Monaco
const languageId = 'python';
monaco.languages.register({
id: languageId,
extensions: ['.py'],
aliases: ['PYTHON', 'python']
});

// create the model inside the workspace
// use the file create before
const modelRef = await createModelReference(monaco.Uri.file('/tmp/hello.py'));
modelRef.object.setLanguageId(languageId);

Expand All @@ -103,4 +111,20 @@ const run = async () => {
});
};

const registerCommands = () => {
vscode.commands.registerCommand('pyright.restartserver', (...args: any[]) => {
languageClient.sendRequest('workspace/executeCommand', { command: 'pyright.restartserver', arguments: args });
});
};

const executeCommand = (cmd: string, ...args: unknown[]): Thenable<unknown> => {
return vscode.commands.executeCommand(cmd, ...args);
};

run();

// just test if sending commands works
setTimeout(async () => {
console.log('Firing restart after 5000ms.');
await executeCommand('pyright.restartserver');
}, 5000);
12 changes: 9 additions & 3 deletions packages/examples/main/src/python/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,16 @@ const launchLanguageServer = (socket: IWebSocket) => {
const writer = new WebSocketMessageWriter(socket);

// start the language server as an external process
const serverName = 'PYRIGHT';
const socketConnection = createConnection(reader, writer, () => socket.dispose());
const serverConnection = createServerProcess('PYRIGHT', 'npx', ['pyright', '--verbose', '--watch', '/tmp']);
if (serverConnection) {
forward(socketConnection, serverConnection, message => {
const result = createServerProcess(serverName, 'npx', ['pyright', '--verbose', '--watch', '/tmp']);
if (result.serverProcess.stdout !== null) {
result.serverProcess.stdout.on('data', data =>
console.log(`${serverName} Server: ${data}`)
);
}
if (result.connection) {
forward(socketConnection, result.connection, message => {
if (Message.isRequest(message)) {
console.log(message);
if (message.method === InitializeRequest.type.method) {
Expand Down
6 changes: 3 additions & 3 deletions packages/examples/main/src/server/json-server-launcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ export function launch(socket: IWebSocket) {
// start the language server as an external process
const extJsonServerPath = resolve(getLocalDirectory(import.meta.url), '../../dist/server/ext-json-server.js');
const socketConnection = createConnection(reader, writer, () => socket.dispose());
const serverConnection = createServerProcess('JSON', 'node', [extJsonServerPath]);
if (serverConnection) {
forward(socketConnection, serverConnection, message => {
const result = createServerProcess('JSON', 'node', [extJsonServerPath]);
if (result.connection) {
forward(socketConnection, result.connection, message => {
if (Message.isRequest(message)) {
if (message.method === InitializeRequest.type.method) {
const initializeParams = message.params as InitializeParams;
Expand Down
11 changes: 9 additions & 2 deletions packages/vscode-ws-jsonrpc/src/server/launch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ import { IWebSocket, IWebSocketConnection } from '../socket/socket.js';
import { WebSocketMessageReader } from '../socket/reader.js';
import { WebSocketMessageWriter } from '../socket/writer.js';

export function createServerProcess(serverName: string, command: string, args?: string[], options?: cp.SpawnOptions): IConnection | undefined {
export function createServerProcess(serverName: string, command: string, args?: string[],
options?: cp.SpawnOptions): {
connection: IConnection | undefined,
serverProcess: cp.ChildProcess
} {
const serverProcess = cp.spawn(command, args || [], options || {});
serverProcess.on('error', error =>
console.error(`Launching ${serverName} Server failed: ${error}`)
Expand All @@ -22,7 +26,10 @@ export function createServerProcess(serverName: string, command: string, args?:
console.error(`${serverName} Server: ${data}`)
);
}
return createProcessStreamConnection(serverProcess);
return {
connection: createProcessStreamConnection(serverProcess),
serverProcess
};
}

export function createWebSocketConnection(socket: IWebSocket): IWebSocketConnection {
Expand Down

0 comments on commit 57094ed

Please sign in to comment.