diff --git a/src/lib/EventEmitter.ts b/src/lib/EventEmitter.ts index 9adeebdc3..7d70cce0e 100644 --- a/src/lib/EventEmitter.ts +++ b/src/lib/EventEmitter.ts @@ -74,7 +74,7 @@ export class EventEmitter an : EventParameters > { return new Promise((resolve, reject) => { - // TODO: handle errors + if (event !== 'error') this.once('error', reject as any); this.once(event, resolve as any); }); } diff --git a/tests/lib/eventEmitter.test.ts b/tests/lib/eventEmitter.test.ts new file mode 100644 index 000000000..b3ca763af --- /dev/null +++ b/tests/lib/eventEmitter.test.ts @@ -0,0 +1,33 @@ +import { EventEmitter } from 'openai/lib/EventEmitter'; + +interface TestEvents { + foo: (value: string) => void; + error: (err: Error) => void; +} + +class TestEmitter extends EventEmitter { + emitFoo(value: string) { + this._emit('foo', value); + } + emitError(err: Error) { + this._emit('error', err); + } +} + +describe('EventEmitter.emitted', () => { + test('resolves when event is emitted', async () => { + const emitter = new TestEmitter(); + const promise = emitter.emitted('foo'); + emitter.emitFoo('bar'); + await expect(promise).resolves.toBe('bar'); + }); + + test('rejects if error emitted before event', async () => { + const emitter = new TestEmitter(); + const promise = emitter.emitted('foo'); + const error = new Error('oops'); + emitter.emitError(error); + emitter.emitFoo('bar'); + await expect(promise).rejects.toBe(error); + }); +});