Skip to content

Commit d99c66c

Browse files
authored
Fix cancelling chat requests (microsoft#199089)
* Fix cancelling chat requests Work around CancelablePromise issue microsoft#199068 * Work around telemetry-extractor issue
1 parent 578ad35 commit d99c66c

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/vs/workbench/contrib/chat/common/chatServiceImpl.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
7-
import { CancellationToken } from 'vs/base/common/cancellation';
6+
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
87
import { Emitter, Event } from 'vs/base/common/event';
98
import { MarkdownString } from 'vs/base/common/htmlContent';
109
import { Iterable } from 'vs/base/common/iterator';
@@ -135,7 +134,7 @@ export class ChatService extends Disposable implements IChatService {
135134
private readonly _providers = new Map<string, IChatProvider>();
136135

137136
private readonly _sessionModels = this._register(new DisposableMap<string, ChatModel>());
138-
private readonly _pendingRequests = new Map<string, CancelablePromise<void>>();
137+
private readonly _pendingRequests = this._register(new DisposableMap<string, CancellationTokenSource>());
139138
private readonly _persistedSessions: ISerializableChatsData;
140139
private readonly _hasProvider: IContextKey<boolean>;
141140

@@ -461,7 +460,9 @@ export class ChatService extends Disposable implements IChatService {
461460
let gotProgress = false;
462461
const requestType = commandPart ? 'slashCommand' : 'string';
463462

464-
const rawResponsePromise = createCancelablePromise<void>(async token => {
463+
const source = new CancellationTokenSource();
464+
const token = source.token;
465+
const sendRequestInternal = async () => {
465466
const progressCallback = (progress: IChatProgress) => {
466467
if (token.isCancellationRequested) {
467468
return;
@@ -599,10 +600,11 @@ export class ChatService extends Disposable implements IChatService {
599600
} finally {
600601
listener.dispose();
601602
}
602-
});
603-
this._pendingRequests.set(model.sessionId, rawResponsePromise);
603+
};
604+
const rawResponsePromise = sendRequestInternal();
605+
this._pendingRequests.set(model.sessionId, source);
604606
rawResponsePromise.finally(() => {
605-
this._pendingRequests.delete(model.sessionId);
607+
this._pendingRequests.deleteAndDispose(model.sessionId);
606608
});
607609
return rawResponsePromise;
608610
}
@@ -662,6 +664,7 @@ export class ChatService extends Disposable implements IChatService {
662664
cancelCurrentRequestForSession(sessionId: string): void {
663665
this.trace('cancelCurrentRequestForSession', `sessionId: ${sessionId}`);
664666
this._pendingRequests.get(sessionId)?.cancel();
667+
this._pendingRequests.deleteAndDispose(sessionId);
665668
}
666669

667670
clearSession(sessionId: string): void {
@@ -675,6 +678,7 @@ export class ChatService extends Disposable implements IChatService {
675678

676679
this._sessionModels.deleteAndDispose(sessionId);
677680
this._pendingRequests.get(sessionId)?.cancel();
681+
this._pendingRequests.deleteAndDispose(sessionId);
678682
this._onDidDisposeSession.fire({ sessionId, providerId: model.providerId, reason: 'cleared' });
679683
}
680684

0 commit comments

Comments
 (0)