Skip to content

Commit ec0c403

Browse files
committed
fix: remove abort listener after fetch completion
1 parent 6c11a74 commit ec0c403

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

src/client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ export class OpenAI {
972972
return await this.fetch.call(undefined, url, fetchOptions);
973973
} finally {
974974
clearTimeout(timeout);
975+
if (signal) signal.removeEventListener('abort', abort);
975976
}
976977
}
977978

tests/index.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,29 @@ describe('default encoder', () => {
653653
});
654654

655655
describe('retries', () => {
656+
test('removes abort listener after successful fetch', async () => {
657+
const client = new OpenAI({
658+
apiKey: 'My API Key',
659+
adminAPIKey: 'My Admin API Key',
660+
fetch: async () =>
661+
new Response(JSON.stringify({ a: 1 }), { headers: { 'Content-Type': 'application/json' } }),
662+
});
663+
664+
const externalController = new AbortController();
665+
const addEventListener = jest.spyOn(externalController.signal, 'addEventListener');
666+
const removeEventListener = jest.spyOn(externalController.signal, 'removeEventListener');
667+
668+
await client.fetchWithTimeout(
669+
'http://localhost/foo',
670+
{ signal: externalController.signal },
671+
1000,
672+
new AbortController(),
673+
);
674+
675+
expect(addEventListener).toHaveBeenCalledWith('abort', expect.any(Function), { once: true });
676+
expect(removeEventListener).toHaveBeenCalledWith('abort', addEventListener.mock.calls[0][1]);
677+
});
678+
656679
test('retry on timeout', async () => {
657680
let count = 0;
658681
const testFetch = async (

0 commit comments

Comments
 (0)