async Task ListenForMessages() { this.messageLoopSyncContext = SynchronizationContext.Current; // Ensure that the console is using UTF-8 encoding System.Console.InputEncoding = Encoding.UTF8; System.Console.OutputEncoding = Encoding.UTF8; // Open the standard input/output streams this.inputStream = System.Console.OpenStandardInput(); this.outputStream = System.Console.OpenStandardOutput(); IMessageSerializer messageSerializer = null; IMessageProcessor messageProcessor = null; // Use a different serializer and message processor based // on whether this instance should host a language server // debug adapter. if (this.runDebugAdapter) { DebugAdapter debugAdapter = new DebugAdapter(); debugAdapter.Initialize(); messageProcessor = debugAdapter; messageSerializer = new V8MessageSerializer(); } else { // Set up the LanguageServer LanguageServer languageServer = new LanguageServer(); languageServer.Initialize(); messageProcessor = languageServer; messageSerializer = new JsonRpcMessageSerializer(); } // Set up the reader and writer this.messageReader = new MessageReader( this.inputStream, messageSerializer); this.messageWriter = new MessageWriter( this.outputStream, messageSerializer); // Set up the console host which will send events // through the MessageWriter this.consoleHost = new StdioConsoleHost(messageWriter); // Set up the PowerShell session this.editorSession = new EditorSession(); this.editorSession.StartSession(this.consoleHost); this.editorSession.PowerShellContext.OutputWritten += powerShellContext_OutputWritten; if (this.runDebugAdapter) { // Attach to debugger events from the PowerShell session this.editorSession.DebugService.DebuggerStopped += DebugService_DebuggerStopped; } // Run the message loop bool isRunning = true; while (isRunning) { Message newMessage = null; try { // Read a message from stdin newMessage = await this.messageReader.ReadMessage(); } catch (MessageParseException e) { // TODO: Write an error response Logger.Write( LogLevel.Error, "Could not parse a message that was received:\r\n\r\n" + e.ToString()); // Continue the loop continue; } // Process the message await messageProcessor.ProcessMessage( newMessage, this.editorSession, this.messageWriter); } }
public void Start() { // If the test is running in the debugger, tell the language // service to also wait for the debugger string languageServiceArguments = string.Empty; if (System.Diagnostics.Debugger.IsAttached) { languageServiceArguments = "/waitForDebugger"; } this.languageServiceProcess = new System.Diagnostics.Process { StartInfo = new ProcessStartInfo { FileName = "Microsoft.PowerShell.EditorServices.Host.exe", Arguments = languageServiceArguments, CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, StandardOutputEncoding = Encoding.UTF8, }, EnableRaisingEvents = true, }; // Start the process this.languageServiceProcess.Start(); // Attach to the language service process if debugging if (System.Diagnostics.Debugger.IsAttached) { AttachToProcessIfDebugging(this.languageServiceProcess.Id); } IMessageSerializer messageSerializer = new JsonRpcMessageSerializer(); // Open the standard input/output streams this.inputStream = this.languageServiceProcess.StandardOutput.BaseStream; this.outputStream = this.languageServiceProcess.StandardInput.BaseStream; // Set up the message reader and writer this.MessageReader = new MessageReader( this.inputStream, messageSerializer); this.MessageWriter = new MessageWriter( this.outputStream, messageSerializer); // Send the 'initialize' request and wait for the response var initializeRequest = new InitializeRequest { RootPath = "", Capabilities = new ClientCapabilities() }; // TODO: Assert some capability data? this.MessageWriter.WriteRequest(InitializeRequest.Type, initializeRequest, 1).Wait(); Message initializeResponse = this.MessageReader.ReadMessage().Result; }