Skip to content

Commit 9fd0d97

Browse files
authored
Better disposable leak fix (microsoft#269613)
1 parent 198cd6e commit 9fd0d97

1 file changed

Lines changed: 45 additions & 40 deletions

File tree

src/vs/workbench/api/browser/mainThreadLanguageModels.ts

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -55,48 +55,53 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
5555
}
5656

5757
$registerLanguageModelProvider(vendor: string): void {
58-
const disposables = this._store.add(new DisposableStore());
59-
disposables.add(this._chatProviderService.registerLanguageModelProvider(vendor, {
60-
onDidChange: Event.filter(this._lmProviderChange.event, e => e.vendor === vendor, disposables) as unknown as Event<void>,
61-
provideLanguageModelChatInfo: async (options, token) => {
62-
const modelsAndIdentifiers = await this._proxy.$provideLanguageModelChatInfo(vendor, options, token);
63-
modelsAndIdentifiers.forEach(m => {
64-
if (m.metadata.auth) {
65-
disposables.add(this._registerAuthenticationProvider(m.metadata.extension, m.metadata.auth));
58+
const disposables = new DisposableStore();
59+
try {
60+
disposables.add(this._chatProviderService.registerLanguageModelProvider(vendor, {
61+
onDidChange: Event.filter(this._lmProviderChange.event, e => e.vendor === vendor, disposables) as unknown as Event<void>,
62+
provideLanguageModelChatInfo: async (options, token) => {
63+
const modelsAndIdentifiers = await this._proxy.$provideLanguageModelChatInfo(vendor, options, token);
64+
modelsAndIdentifiers.forEach(m => {
65+
if (m.metadata.auth) {
66+
disposables.add(this._registerAuthenticationProvider(m.metadata.extension, m.metadata.auth));
67+
}
68+
});
69+
return modelsAndIdentifiers;
70+
},
71+
sendChatRequest: async (modelId, messages, from, options, token) => {
72+
const requestId = (Math.random() * 1e6) | 0;
73+
const defer = new DeferredPromise<any>();
74+
const stream = new AsyncIterableSource<IChatResponsePart | IChatResponsePart[]>();
75+
76+
try {
77+
this._pendingProgress.set(requestId, { defer, stream });
78+
await Promise.all(
79+
messages.flatMap(msg => msg.content)
80+
.filter(part => part.type === 'image_url')
81+
.map(async part => {
82+
part.value.data = VSBuffer.wrap(await resizeImage(part.value.data.buffer));
83+
})
84+
);
85+
await this._proxy.$startChatRequest(modelId, requestId, from, new SerializableObjectWithBuffers(messages), options, token);
86+
} catch (err) {
87+
this._pendingProgress.delete(requestId);
88+
throw err;
6689
}
67-
});
68-
return modelsAndIdentifiers;
69-
},
70-
sendChatRequest: async (modelId, messages, from, options, token) => {
71-
const requestId = (Math.random() * 1e6) | 0;
72-
const defer = new DeferredPromise<any>();
73-
const stream = new AsyncIterableSource<IChatResponsePart | IChatResponsePart[]>();
74-
75-
try {
76-
this._pendingProgress.set(requestId, { defer, stream });
77-
await Promise.all(
78-
messages.flatMap(msg => msg.content)
79-
.filter(part => part.type === 'image_url')
80-
.map(async part => {
81-
part.value.data = VSBuffer.wrap(await resizeImage(part.value.data.buffer));
82-
})
83-
);
84-
await this._proxy.$startChatRequest(modelId, requestId, from, new SerializableObjectWithBuffers(messages), options, token);
85-
} catch (err) {
86-
this._pendingProgress.delete(requestId);
87-
throw err;
88-
}
8990

90-
return {
91-
result: defer.p,
92-
stream: stream.asyncIterable
93-
} satisfies ILanguageModelChatResponse;
94-
},
95-
provideTokenCount: (modelId, str, token) => {
96-
return this._proxy.$provideTokenLength(modelId, str, token);
97-
},
98-
}));
99-
this._providerRegistrations.set(vendor, disposables);
91+
return {
92+
result: defer.p,
93+
stream: stream.asyncIterable
94+
} satisfies ILanguageModelChatResponse;
95+
},
96+
provideTokenCount: (modelId, str, token) => {
97+
return this._proxy.$provideTokenLength(modelId, str, token);
98+
},
99+
}));
100+
this._providerRegistrations.set(vendor, disposables);
101+
} catch (err) {
102+
disposables.dispose();
103+
throw err;
104+
}
100105
}
101106

102107
$onLMProviderChange(vendor: string): void {

0 commit comments

Comments
 (0)