




















@@ -25,7 +25,7 @@ type LspSession = {
2525process: ChildProcess;
2626requestId: number;
2727pendingRequests: Map<number, PendingLspRequest>;
28-buffer: string;
28+buffer: Buffer;
2929initialized: boolean;
3030capabilities: LspServerCapabilities;
3131disposed: boolean;
@@ -93,7 +93,7 @@ function createLspSession(serverName: string, child: ChildProcess): LspSession {
9393process: child,
9494requestId: 0,
9595pendingRequests: new Map(),
96-buffer: "",
96+buffer: Buffer.alloc(0),
9797initialized: false,
9898capabilities: {},
9999disposed: false,
@@ -105,8 +105,9 @@ function registerActiveLspSession(session: LspSession): void {
105105}
106106107107function attachLspProcessHandlers(session: LspSession): void {
108-session.process.stdout?.setEncoding("utf-8");
109-session.process.stdout?.on("data", (chunk: string) => handleIncomingData(session, chunk));
108+session.process.stdout?.on("data", (chunk: Buffer | string) =>
109+handleIncomingData(session, chunk),
110+);
110111session.process.stderr?.setEncoding("utf-8");
111112session.process.stderr?.on("data", (chunk: string) => {
112113for (const line of chunk.split(/\r?\n/).filter(Boolean)) {
@@ -120,38 +121,39 @@ function encodeLspMessage(body: unknown): string {
120121return `Content-Length: ${Buffer.byteLength(json, "utf-8")}\r\n\r\n${json}`;
121122}
122123123-function parseLspMessages(buffer: string): { messages: unknown[]; remaining: string } {
124+function parseLspMessages(buffer: Buffer): { messages: unknown[]; remaining: Buffer } {
124125const messages: unknown[] = [];
125126let remaining = buffer;
127+const headerSeparator = Buffer.from("\r\n\r\n", "ascii");
126128127129while (true) {
128-const headerEnd = remaining.indexOf("\r\n\r\n");
130+const headerEnd = remaining.indexOf(headerSeparator);
129131if (headerEnd === -1) {
130132break;
131133}
132134133-const header = remaining.slice(0, headerEnd);
135+const header = remaining.subarray(0, headerEnd).toString("ascii");
134136const match = header.match(/Content-Length:\s*(\d+)/i);
135137if (!match) {
136-remaining = remaining.slice(headerEnd + 4);
138+remaining = remaining.subarray(headerEnd + headerSeparator.length);
137139continue;
138140}
139141140142const contentLength = Number.parseInt(match[1], 10);
141-const bodyStart = headerEnd + 4;
143+const bodyStart = headerEnd + headerSeparator.length;
142144const bodyEnd = bodyStart + contentLength;
143145144-if (Buffer.byteLength(remaining.slice(bodyStart), "utf-8") < contentLength) {
146+if (remaining.length < bodyEnd) {
145147break;
146148}
147149148150try {
149-const body = remaining.slice(bodyStart, bodyStart + contentLength);
151+const body = remaining.subarray(bodyStart, bodyEnd).toString("utf8");
150152messages.push(JSON.parse(body));
151153} catch {
152154// skip malformed
153155}
154-remaining = remaining.slice(bodyEnd);
156+remaining = remaining.subarray(bodyEnd);
155157}
156158157159return { messages, remaining };
@@ -174,10 +176,13 @@ function sendRequest(session: LspSession, method: string, params?: unknown): Pro
174176});
175177}
176178177-function handleIncomingData(session: LspSession, chunk: string) {
178-session.buffer += chunk;
179+function handleIncomingData(session: LspSession, chunk: Buffer | string) {
180+session.buffer = Buffer.concat([
181+session.buffer,
182+typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk,
183+]);
179184const { messages, remaining } = parseLspMessages(session.buffer);
180-session.buffer = remaining;
185+session.buffer = remaining.length === 0 ? Buffer.alloc(0) : Buffer.from(remaining);
181186182187for (const msg of messages) {
183188if (typeof msg !== "object" || msg === null) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。