diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index c54d890e9..4c8ff8a98 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -124,9 +124,9 @@ connection.onRequest(GetConvertAttrCasingEditsRequest.type, async params => { }); connection.onRequest(GetConnectedNamedPipeServerRequest.type, async fileName => { - const connected = await tsPluginClient.connectForFile(fileName); - if (connected) { - return connected[1]; + const server = await tsPluginClient.searchNamedPipeServerForFile(fileName); + if (server) { + return server; } }); diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index e97cc495e..b425fbc7e 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -81,18 +81,20 @@ export function getElementAttrs( } async function sendRequest(request: Request) { - const connected = await connectForFile(request.args[0]); - if (!connected) { + const server = await searchNamedPipeServerForFile(request.args[0]); + if (!server) { console.warn('[Vue Named Pipe Client] No server found for', request.args[0]); return; } - const [client] = connected; - const result = await sendRequestWorker(request, client); - client.end(); - return result; + const client = await connect(server.path); + if (!client) { + console.warn('[Vue Named Pipe Client] Failed to connect to', server.path); + return; + } + return await sendRequestWorker(request, client); } -export async function connectForFile(fileName: string) { +export async function searchNamedPipeServerForFile(fileName: string) { if (!fs.existsSync(pipeTable)) { return; } @@ -107,7 +109,7 @@ export async function connectForFile(fileName: string) { if (client) { const response = await sendRequestWorker({ type: 'containsFile', args: [fileName] }, client); if (response) { - return [client, server] as const; + return server; } } } @@ -115,7 +117,7 @@ export async function connectForFile(fileName: string) { if (!path.relative(server.currentDirectory, fileName).startsWith('..')) { const client = await connect(server.path); if (client) { - return [client, server] as const; + return server; } } } @@ -123,7 +125,12 @@ export async function connectForFile(fileName: string) { function sendRequestWorker(request: Request, client: net.Socket) { return new Promise(resolve => { - client.once('data', data => { + let dataChunks: Buffer[] = []; + client.on('data', chunk => { + dataChunks.push(chunk); + }); + client.on('end', () => { + const data = Buffer.concat(dataChunks); const text = data.toString(); resolve(JSON.parse(text)); }); diff --git a/packages/typescript-plugin/lib/server.ts b/packages/typescript-plugin/lib/server.ts index 9df744b67..029f7d03b 100644 --- a/packages/typescript-plugin/lib/server.ts +++ b/packages/typescript-plugin/lib/server.ts @@ -77,6 +77,7 @@ export function startNamedPipeServer(serverKind: ts.server.ProjectKind, currentD console.warn('[Vue Named Pipe Server] Unknown request type:', request.type); connection.write(JSON.stringify(null)); } + connection.end(); }); connection.on('error', err => console.error('[Vue Named Pipe Server]', err.message)); });