Skip to content

Commit b0b5853

Browse files
committed
fix: dispose
1 parent 72f3454 commit b0b5853

3 files changed

Lines changed: 35 additions & 20 deletions

File tree

src/cm/lsp/clientManager.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,22 @@ export class LspClientManager {
10741074
logLspInfo(`[LSP:${server.id}] attached to ${uri}${suffix}`);
10751075
};
10761076

1077+
const dispose = async (): Promise<void> => {
1078+
if (disposed) return;
1079+
disposed = true;
1080+
this.#clients.delete(key);
1081+
try {
1082+
client.disconnect();
1083+
} catch (error) {
1084+
console.warn(`Error disconnecting LSP client ${server.id}`, error);
1085+
}
1086+
try {
1087+
await transportHandle.dispose?.();
1088+
} catch (error) {
1089+
console.warn(`Error disposing LSP transport ${server.id}`, error);
1090+
}
1091+
};
1092+
10771093
const detach = (uri: string, view?: EditorView): void => {
10781094
const actualUri = uriAliases.get(uri) ?? uri;
10791095
const existing = fileRefs.get(actualUri);
@@ -1100,26 +1116,11 @@ export class LspClientManager {
11001116
server,
11011117
client,
11021118
rootUri: effectiveRoot,
1119+
dispose,
11031120
});
11041121
}
11051122
};
11061123

1107-
const dispose = async (): Promise<void> => {
1108-
if (disposed) return;
1109-
disposed = true;
1110-
this.#clients.delete(key);
1111-
try {
1112-
client.disconnect();
1113-
} catch (error) {
1114-
console.warn(`Error disconnecting LSP client ${server.id}`, error);
1115-
}
1116-
try {
1117-
await transportHandle.dispose?.();
1118-
} catch (error) {
1119-
console.warn(`Error disposing LSP transport ${server.id}`, error);
1120-
}
1121-
};
1122-
11231124
return {
11241125
server,
11251126
client,

src/cm/lsp/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@ export interface ClientIdleInfo {
413413
server: LspServerDefinition;
414414
client: LSPClient;
415415
rootUri: string | null;
416+
/** Disposes only this idle client instance (not every client for the server id). */
417+
dispose: () => Promise<void>;
416418
}
417419

418420
export interface ClientState {

src/lib/editorManager.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3290,10 +3290,22 @@ async function EditorManager($header, $body) {
32903290

32913291
lspClientManager.setOptions({
32923292
resolveRoot: resolveRootUriForContext,
3293-
onClientIdle: ({ server }) => {
3294-
if (!server?.id) return;
3295-
stopManagedServer(server.id);
3296-
void lspClientManager.disposeServer(server.id);
3293+
onClientIdle: ({ server, dispose }) => {
3294+
if (!server?.id || typeof dispose !== "function") return;
3295+
// Dispose only this idle client. disposeServer(server.id) would tear
3296+
// down every workspace sharing the server id (e.g. web-worker LSPs).
3297+
void (async () => {
3298+
await dispose();
3299+
const stillActive = lspClientManager
3300+
.getActiveClients()
3301+
.some(
3302+
(state) =>
3303+
state.server?.id?.toLowerCase() === server.id.toLowerCase(),
3304+
);
3305+
if (!stillActive) {
3306+
stopManagedServer(server.id);
3307+
}
3308+
})();
32973309
},
32983310
displayFile: async (targetUri) => {
32993311
if (!targetUri) return null;

0 commit comments

Comments
 (0)