{"record":{"id":"aca79175416e5d83","repo":"neoclide/coc.nvim","slug":"transport-kind-ipc-is-not-supported-for-command-ex","errorCode":null,"errorMessage":"Transport kind ipc is not supported for command executable","messagePattern":"Transport kind ipc is not supported for command executable","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/language-client/index.ts","lineNumber":450,"sourceCode":"                reject(err)\n              })\n            })\n          }\n        })\n      } else if (Executable.is(json) && json.command) {\n        let command: Executable = json\n        let args = Array.isArray(command.args) ? command.args.slice(0) : []\n        let pipeName: string | undefined\n        const transport = json.transport\n        if (transport === TransportKind.stdio) {\n          args.push('--stdio')\n        } else if (transport === TransportKind.pipe) {\n          pipeName = generateRandomPipeName()\n          args.push(`--pipe=${pipeName}`)\n        } else if (Transport.isSocket(transport)) {\n          args.push(`--socket=${transport.port}`)\n        } else if (transport === TransportKind.ipc) {\n          throw new Error(`Transport kind ipc is not supported for command executable`)\n        }\n        let options = Object.assign({ shell: process.platform === 'win32' }, command.options) as SpawnOptions\n        options.env = getEnvironment(options.env, false)\n        options.cwd = options.cwd ?? serverWorkingDir\n        options.windowsHide = true\n        const attachProcess = (serverProcess: ChildProcess, pipiStdout = true) => {\n          this._serverProcess = serverProcess\n          this._isDetached = !!options.detached\n          logger.info(`Language server \"${this.id}\" started with ${serverProcess.pid}`)\n          if (pipiStdout) pipeStdoutToLogOutputChannel(serverProcess.stdout, this.outputChannel)\n          pipeStderrToLogOutputChannel(serverProcess.stderr, this.outputChannel)\n        }\n        let cmd = workspace.expand(json.command)\n        if (transport === undefined || transport === TransportKind.stdio) {\n          const serverProcess = child_process.spawn(cmd, args, options)\n          if (!serverProcess || !serverProcess.pid) {\n            return handleChildProcessStartError(serverProcess, `Launching server using command ${cmd} failed.`)\n          }","sourceCodeStart":432,"sourceCodeEnd":468,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/language-client/index.ts#L432-L468","documentation":"Node's child_process does not support IPC-style named-pipe transport for arbitrary command executables the way fork() does. The client therefore rejects a server configuration combining TransportKind.ipc with a command: the ipc transport is only available for Node modules run via fork.","triggerScenarios":"ServerOptions using run: { command: 'foo', transport: TransportKind.ipc } or a transport factory resolving to ipc for an executable-based server.","commonSituations":"Copy-pasting a node-module ServerOptions transport into a command-based one; switching a server from module to binary form without changing the transport;misreading docs that ipc works everywhere.","solutions":["Switch the transport to TransportKind.stdio for command executables","If ipc is required, run the server as a Node module (module:/fork style ServerOptions)","Use TransportKind.socket or TransportKind.pipe for cross-process transport with binaries","Fix the client options object passed to the language client constructor"],"exampleFix":"// before\nconst serverOptions: ServerOptions = { command: 'myls', transport: TransportKind.ipc }\n// after\nconst serverOptions: ServerOptions = { command: 'myls', transport: TransportKind.stdio }","handlingStrategy":"validation","validationCode":"// Validate transport compatibility before constructing ServerOptions\nconst isNodeModule = typeof server === 'string' && server.startsWith('module:')\nif (!isNodeModule && (transport === TransportKind.ipc)) {\n  throw new Error('Use stdio/socket/pipe transport for command executables')\n}","typeGuard":null,"tryCatchPattern":"try {\n  const client = new LanguageClient(id, name, serverOptions, clientOptions)\n  await client.start()\n} catch (e) {\n  if (String(e.message).includes('Transport kind ipc is not supported')) {\n    // fall back to stdio transport and retry\n  } else { throw e }\n}","preventionTips":["Use TransportKind.stdio as the default for binary servers","Reserve ipc for Node module (forked) servers only","Document transport choice next to serverOptions in your extension","Prefer socket/pipe when you need non-stdio transports with executables"],"tags":["ipc","transport","configuration","child-process"],"backgroundTag":"unsupported-transport-kind","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}