fix(core): avoid error handling on cancelled requests to prevent crash (#6039)

Co-authored-by: Jacob Richman <jacob314@gmail.com>
This commit is contained in:
pwrwpw 2025-08-21 16:18:30 +09:00 committed by GitHub
parent 63f9e86bc3
commit f8f79bf2f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 4 deletions

View File

@ -445,6 +445,32 @@ describe('Turn', () => {
{ type: GeminiEventType.Finished, value: 'OTHER' },
]);
});
it('should not crash when cancelled request has malformed error', async () => {
const abortController = new AbortController();
const errorToThrow = {
response: {
data: undefined, // Malformed error data
},
};
mockSendMessageStream.mockImplementation(async () => {
abortController.abort();
throw errorToThrow;
});
const events = [];
const reqParts: Part[] = [{ text: 'Test malformed error handling' }];
for await (const event of turn.run(reqParts, abortController.signal)) {
events.push(event);
}
expect(events).toEqual([{ type: GeminiEventType.UserCancelled }]);
expect(reportError).not.toHaveBeenCalled();
});
});
describe('getDebugResponses', () => {

View File

@ -247,16 +247,17 @@ export class Turn {
}
}
} catch (e) {
const error = toFriendlyError(e);
if (error instanceof UnauthorizedError) {
throw error;
}
if (signal.aborted) {
yield { type: GeminiEventType.UserCancelled };
// Regular cancellation error, fail gracefully.
return;
}
const error = toFriendlyError(e);
if (error instanceof UnauthorizedError) {
throw error;
}
const contextForReport = [...this.chat.getHistory(/*curated*/ true), req];
await reportError(
error,