190 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| var _EventStream_instances, _EventStream_connectedPromise, _EventStream_resolveConnectedPromise, _EventStream_rejectConnectedPromise, _EventStream_endPromise, _EventStream_resolveEndPromise, _EventStream_rejectEndPromise, _EventStream_listeners, _EventStream_ended, _EventStream_errored, _EventStream_aborted, _EventStream_catchingPromiseCreated, _EventStream_handleError;
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.EventStream = void 0;
 | |
| const tslib_1 = require("../internal/tslib.js");
 | |
| const error_1 = require("../error.js");
 | |
| class EventStream {
 | |
|     constructor() {
 | |
|         _EventStream_instances.add(this);
 | |
|         this.controller = new AbortController();
 | |
|         _EventStream_connectedPromise.set(this, void 0);
 | |
|         _EventStream_resolveConnectedPromise.set(this, () => { });
 | |
|         _EventStream_rejectConnectedPromise.set(this, () => { });
 | |
|         _EventStream_endPromise.set(this, void 0);
 | |
|         _EventStream_resolveEndPromise.set(this, () => { });
 | |
|         _EventStream_rejectEndPromise.set(this, () => { });
 | |
|         _EventStream_listeners.set(this, {});
 | |
|         _EventStream_ended.set(this, false);
 | |
|         _EventStream_errored.set(this, false);
 | |
|         _EventStream_aborted.set(this, false);
 | |
|         _EventStream_catchingPromiseCreated.set(this, false);
 | |
|         tslib_1.__classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve, reject) => {
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve, "f");
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
 | |
|         }), "f");
 | |
|         tslib_1.__classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve, reject) => {
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve, "f");
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
 | |
|         }), "f");
 | |
|         // Don't let these promises cause unhandled rejection errors.
 | |
|         // we will manually cause an unhandled rejection error later
 | |
|         // if the user hasn't registered any error listener or called
 | |
|         // any promise-returning method.
 | |
|         tslib_1.__classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => { });
 | |
|         tslib_1.__classPrivateFieldGet(this, _EventStream_endPromise, "f").catch(() => { });
 | |
|     }
 | |
|     _run(executor) {
 | |
|         // Unfortunately if we call `executor()` immediately we get runtime errors about
 | |
|         // references to `this` before the `super()` constructor call returns.
 | |
|         setTimeout(() => {
 | |
|             executor().then(() => {
 | |
|                 this._emitFinal();
 | |
|                 this._emit('end');
 | |
|             }, tslib_1.__classPrivateFieldGet(this, _EventStream_instances, "m", _EventStream_handleError).bind(this));
 | |
|         }, 0);
 | |
|     }
 | |
|     _connected() {
 | |
|         if (this.ended)
 | |
|             return;
 | |
|         tslib_1.__classPrivateFieldGet(this, _EventStream_resolveConnectedPromise, "f").call(this);
 | |
|         this._emit('connect');
 | |
|     }
 | |
|     get ended() {
 | |
|         return tslib_1.__classPrivateFieldGet(this, _EventStream_ended, "f");
 | |
|     }
 | |
|     get errored() {
 | |
|         return tslib_1.__classPrivateFieldGet(this, _EventStream_errored, "f");
 | |
|     }
 | |
|     get aborted() {
 | |
|         return tslib_1.__classPrivateFieldGet(this, _EventStream_aborted, "f");
 | |
|     }
 | |
|     abort() {
 | |
|         this.controller.abort();
 | |
|     }
 | |
|     /**
 | |
|      * Adds the listener function to the end of the listeners array for the event.
 | |
|      * No checks are made to see if the listener has already been added. Multiple calls passing
 | |
|      * the same combination of event and listener will result in the listener being added, and
 | |
|      * called, multiple times.
 | |
|      * @returns this ChatCompletionStream, so that calls can be chained
 | |
|      */
 | |
|     on(event, listener) {
 | |
|         const listeners = tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] || (tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = []);
 | |
|         listeners.push({ listener });
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * Removes the specified listener from the listener array for the event.
 | |
|      * off() will remove, at most, one instance of a listener from the listener array. If any single
 | |
|      * listener has been added multiple times to the listener array for the specified event, then
 | |
|      * off() must be called multiple times to remove each instance.
 | |
|      * @returns this ChatCompletionStream, so that calls can be chained
 | |
|      */
 | |
|     off(event, listener) {
 | |
|         const listeners = tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event];
 | |
|         if (!listeners)
 | |
|             return this;
 | |
|         const index = listeners.findIndex((l) => l.listener === listener);
 | |
|         if (index >= 0)
 | |
|             listeners.splice(index, 1);
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * Adds a one-time listener function for the event. The next time the event is triggered,
 | |
|      * this listener is removed and then invoked.
 | |
|      * @returns this ChatCompletionStream, so that calls can be chained
 | |
|      */
 | |
|     once(event, listener) {
 | |
|         const listeners = tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] || (tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = []);
 | |
|         listeners.push({ listener, once: true });
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * This is similar to `.once()`, but returns a Promise that resolves the next time
 | |
|      * the event is triggered, instead of calling a listener callback.
 | |
|      * @returns a Promise that resolves the next time given event is triggered,
 | |
|      * or rejects if an error is emitted.  (If you request the 'error' event,
 | |
|      * returns a promise that resolves with the error).
 | |
|      *
 | |
|      * Example:
 | |
|      *
 | |
|      *   const message = await stream.emitted('message') // rejects if the stream errors
 | |
|      */
 | |
|     emitted(event) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
 | |
|             if (event !== 'error')
 | |
|                 this.once('error', reject);
 | |
|             this.once(event, resolve);
 | |
|         });
 | |
|     }
 | |
|     async done() {
 | |
|         tslib_1.__classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
 | |
|         await tslib_1.__classPrivateFieldGet(this, _EventStream_endPromise, "f");
 | |
|     }
 | |
|     _emit(event, ...args) {
 | |
|         // make sure we don't emit any events after end
 | |
|         if (tslib_1.__classPrivateFieldGet(this, _EventStream_ended, "f")) {
 | |
|             return;
 | |
|         }
 | |
|         if (event === 'end') {
 | |
|             tslib_1.__classPrivateFieldSet(this, _EventStream_ended, true, "f");
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_resolveEndPromise, "f").call(this);
 | |
|         }
 | |
|         const listeners = tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event];
 | |
|         if (listeners) {
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = listeners.filter((l) => !l.once);
 | |
|             listeners.forEach(({ listener }) => listener(...args));
 | |
|         }
 | |
|         if (event === 'abort') {
 | |
|             const error = args[0];
 | |
|             if (!tslib_1.__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, "f") && !listeners?.length) {
 | |
|                 Promise.reject(error);
 | |
|             }
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, "f").call(this, error);
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_rejectEndPromise, "f").call(this, error);
 | |
|             this._emit('end');
 | |
|             return;
 | |
|         }
 | |
|         if (event === 'error') {
 | |
|             // NOTE: _emit('error', error) should only be called from #handleError().
 | |
|             const error = args[0];
 | |
|             if (!tslib_1.__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, "f") && !listeners?.length) {
 | |
|                 // Trigger an unhandled rejection if the user hasn't registered any error handlers.
 | |
|                 // If you are seeing stack traces here, make sure to handle errors via either:
 | |
|                 // - runner.on('error', () => ...)
 | |
|                 // - await runner.done()
 | |
|                 // - await runner.finalChatCompletion()
 | |
|                 // - etc.
 | |
|                 Promise.reject(error);
 | |
|             }
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, "f").call(this, error);
 | |
|             tslib_1.__classPrivateFieldGet(this, _EventStream_rejectEndPromise, "f").call(this, error);
 | |
|             this._emit('end');
 | |
|         }
 | |
|     }
 | |
|     _emitFinal() { }
 | |
| }
 | |
| exports.EventStream = EventStream;
 | |
| _EventStream_connectedPromise = new WeakMap(), _EventStream_resolveConnectedPromise = new WeakMap(), _EventStream_rejectConnectedPromise = new WeakMap(), _EventStream_endPromise = new WeakMap(), _EventStream_resolveEndPromise = new WeakMap(), _EventStream_rejectEndPromise = new WeakMap(), _EventStream_listeners = new WeakMap(), _EventStream_ended = new WeakMap(), _EventStream_errored = new WeakMap(), _EventStream_aborted = new WeakMap(), _EventStream_catchingPromiseCreated = new WeakMap(), _EventStream_instances = new WeakSet(), _EventStream_handleError = function _EventStream_handleError(error) {
 | |
|     tslib_1.__classPrivateFieldSet(this, _EventStream_errored, true, "f");
 | |
|     if (error instanceof Error && error.name === 'AbortError') {
 | |
|         error = new error_1.APIUserAbortError();
 | |
|     }
 | |
|     if (error instanceof error_1.APIUserAbortError) {
 | |
|         tslib_1.__classPrivateFieldSet(this, _EventStream_aborted, true, "f");
 | |
|         return this._emit('abort', error);
 | |
|     }
 | |
|     if (error instanceof error_1.OpenAIError) {
 | |
|         return this._emit('error', error);
 | |
|     }
 | |
|     if (error instanceof Error) {
 | |
|         const openAIError = new error_1.OpenAIError(error.message);
 | |
|         // @ts-ignore
 | |
|         openAIError.cause = error;
 | |
|         return this._emit('error', openAIError);
 | |
|     }
 | |
|     return this._emit('error', new error_1.OpenAIError(String(error)));
 | |
| };
 | |
| //# sourceMappingURL=EventStream.js.map
 |