# Newton LSP Server Bridge ## Credit https://github.com/mkslanc/websockets-ls https://github.com/lspcontainers/dockerfiles/servers ## Overview This repo provides a primary Dockerfile (with additional example standalone LSP Dockler files from `lspcontainers`) that packages a number of LSPs and tools into a container along with the src/ folder code. The code under src/ comes from `websockets-ls` and has been cleaned up and formatted to my style/asthetics as well as modified server list. The code creates a WebSocket bridge to interface with multiple Language Servers through clients via a single WebSocket connection. It supports various language servers concurrently and handles language-specific file extensions and initialization parameters. ## Features - Utilizes `vscode-jsonrpc` for LSP message handling. - Supports multiple language servers concurrently. - Support for IPC and stdio communication with language servers. - Easy language server configuration and initialization parameter modification. - Error handling and logging for language server processes. - Automatic file URI translation between server and client paths. - Temporary file creation for `textDocument/didOpen` events. ## Usage ##### Setup 1: 1. Install Node.js. 2. Run 'npm install'. 3. Configure the desired language servers in `defaultServers.js`. 4. Run the script: `npm run start || start-verbose`. 5. Connect to the WebSocket server on `ws://localhost:9999/`. 6. Transmit LSP messages via the WebSocket connection. ##### Setup 2: 1. Install Podman. 2. Create `opt/` folder in `Docker/` and add any additional programs there. 3. Configure the desired language servers in `src/defaultServers.js`. 3. Configure the start script at `Docker/scripts/start.sh` with abny additional env args or mount points. 4. Run from `Newton-LSP/` `Docker/build.sh` . 5. Run `Docker/scripts/start.sh` 6. Connect to the WebSocket server on `ws://localhost:9999/`. 7. Transmit LSP messages via the WebSocket connection. ## Configuration Add or modify language server configurations in `languageServers.js`: ```javascript exports.servers = [ { endpointName: "language_endpoint", // WebSocket endpoint name args: ['executable_path', ['arg1', 'arg2', ...]], connectionType: "ipc" | "stdio", // Communication type relativePath: true | false, // Whether to use relative paths serverFileNameReplacePattern: { // Server file name regex replacements from: /pattern/, to: "replacement" }, clientFileNameReplacePattern: { // Client file name regex replacements from: /pattern/, to: "replacement" } }, ... ]; ```