EventStream.mjs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
  2. if (kind === "m") throw new TypeError("Private method is not writable");
  3. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  4. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  5. return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
  6. };
  7. var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
  8. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  9. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  10. return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
  11. };
  12. 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;
  13. import { APIUserAbortError, OpenAIError } from "../error.mjs";
  14. export class EventStream {
  15. constructor() {
  16. _EventStream_instances.add(this);
  17. this.controller = new AbortController();
  18. _EventStream_connectedPromise.set(this, void 0);
  19. _EventStream_resolveConnectedPromise.set(this, () => { });
  20. _EventStream_rejectConnectedPromise.set(this, () => { });
  21. _EventStream_endPromise.set(this, void 0);
  22. _EventStream_resolveEndPromise.set(this, () => { });
  23. _EventStream_rejectEndPromise.set(this, () => { });
  24. _EventStream_listeners.set(this, {});
  25. _EventStream_ended.set(this, false);
  26. _EventStream_errored.set(this, false);
  27. _EventStream_aborted.set(this, false);
  28. _EventStream_catchingPromiseCreated.set(this, false);
  29. __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve, reject) => {
  30. __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve, "f");
  31. __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
  32. }), "f");
  33. __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve, reject) => {
  34. __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve, "f");
  35. __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
  36. }), "f");
  37. // Don't let these promises cause unhandled rejection errors.
  38. // we will manually cause an unhandled rejection error later
  39. // if the user hasn't registered any error listener or called
  40. // any promise-returning method.
  41. __classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => { });
  42. __classPrivateFieldGet(this, _EventStream_endPromise, "f").catch(() => { });
  43. }
  44. _run(executor) {
  45. // Unfortunately if we call `executor()` immediately we get runtime errors about
  46. // references to `this` before the `super()` constructor call returns.
  47. setTimeout(() => {
  48. executor().then(() => {
  49. this._emitFinal();
  50. this._emit('end');
  51. }, __classPrivateFieldGet(this, _EventStream_instances, "m", _EventStream_handleError).bind(this));
  52. }, 0);
  53. }
  54. _connected() {
  55. if (this.ended)
  56. return;
  57. __classPrivateFieldGet(this, _EventStream_resolveConnectedPromise, "f").call(this);
  58. this._emit('connect');
  59. }
  60. get ended() {
  61. return __classPrivateFieldGet(this, _EventStream_ended, "f");
  62. }
  63. get errored() {
  64. return __classPrivateFieldGet(this, _EventStream_errored, "f");
  65. }
  66. get aborted() {
  67. return __classPrivateFieldGet(this, _EventStream_aborted, "f");
  68. }
  69. abort() {
  70. this.controller.abort();
  71. }
  72. /**
  73. * Adds the listener function to the end of the listeners array for the event.
  74. * No checks are made to see if the listener has already been added. Multiple calls passing
  75. * the same combination of event and listener will result in the listener being added, and
  76. * called, multiple times.
  77. * @returns this ChatCompletionStream, so that calls can be chained
  78. */
  79. on(event, listener) {
  80. const listeners = __classPrivateFieldGet(this, _EventStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = []);
  81. listeners.push({ listener });
  82. return this;
  83. }
  84. /**
  85. * Removes the specified listener from the listener array for the event.
  86. * off() will remove, at most, one instance of a listener from the listener array. If any single
  87. * listener has been added multiple times to the listener array for the specified event, then
  88. * off() must be called multiple times to remove each instance.
  89. * @returns this ChatCompletionStream, so that calls can be chained
  90. */
  91. off(event, listener) {
  92. const listeners = __classPrivateFieldGet(this, _EventStream_listeners, "f")[event];
  93. if (!listeners)
  94. return this;
  95. const index = listeners.findIndex((l) => l.listener === listener);
  96. if (index >= 0)
  97. listeners.splice(index, 1);
  98. return this;
  99. }
  100. /**
  101. * Adds a one-time listener function for the event. The next time the event is triggered,
  102. * this listener is removed and then invoked.
  103. * @returns this ChatCompletionStream, so that calls can be chained
  104. */
  105. once(event, listener) {
  106. const listeners = __classPrivateFieldGet(this, _EventStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = []);
  107. listeners.push({ listener, once: true });
  108. return this;
  109. }
  110. /**
  111. * This is similar to `.once()`, but returns a Promise that resolves the next time
  112. * the event is triggered, instead of calling a listener callback.
  113. * @returns a Promise that resolves the next time given event is triggered,
  114. * or rejects if an error is emitted. (If you request the 'error' event,
  115. * returns a promise that resolves with the error).
  116. *
  117. * Example:
  118. *
  119. * const message = await stream.emitted('message') // rejects if the stream errors
  120. */
  121. emitted(event) {
  122. return new Promise((resolve, reject) => {
  123. __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
  124. if (event !== 'error')
  125. this.once('error', reject);
  126. this.once(event, resolve);
  127. });
  128. }
  129. async done() {
  130. __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
  131. await __classPrivateFieldGet(this, _EventStream_endPromise, "f");
  132. }
  133. _emit(event, ...args) {
  134. // make sure we don't emit any events after end
  135. if (__classPrivateFieldGet(this, _EventStream_ended, "f")) {
  136. return;
  137. }
  138. if (event === 'end') {
  139. __classPrivateFieldSet(this, _EventStream_ended, true, "f");
  140. __classPrivateFieldGet(this, _EventStream_resolveEndPromise, "f").call(this);
  141. }
  142. const listeners = __classPrivateFieldGet(this, _EventStream_listeners, "f")[event];
  143. if (listeners) {
  144. __classPrivateFieldGet(this, _EventStream_listeners, "f")[event] = listeners.filter((l) => !l.once);
  145. listeners.forEach(({ listener }) => listener(...args));
  146. }
  147. if (event === 'abort') {
  148. const error = args[0];
  149. if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, "f") && !listeners?.length) {
  150. Promise.reject(error);
  151. }
  152. __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, "f").call(this, error);
  153. __classPrivateFieldGet(this, _EventStream_rejectEndPromise, "f").call(this, error);
  154. this._emit('end');
  155. return;
  156. }
  157. if (event === 'error') {
  158. // NOTE: _emit('error', error) should only be called from #handleError().
  159. const error = args[0];
  160. if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, "f") && !listeners?.length) {
  161. // Trigger an unhandled rejection if the user hasn't registered any error handlers.
  162. // If you are seeing stack traces here, make sure to handle errors via either:
  163. // - runner.on('error', () => ...)
  164. // - await runner.done()
  165. // - await runner.finalChatCompletion()
  166. // - etc.
  167. Promise.reject(error);
  168. }
  169. __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, "f").call(this, error);
  170. __classPrivateFieldGet(this, _EventStream_rejectEndPromise, "f").call(this, error);
  171. this._emit('end');
  172. }
  173. }
  174. _emitFinal() { }
  175. }
  176. _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) {
  177. __classPrivateFieldSet(this, _EventStream_errored, true, "f");
  178. if (error instanceof Error && error.name === 'AbortError') {
  179. error = new APIUserAbortError();
  180. }
  181. if (error instanceof APIUserAbortError) {
  182. __classPrivateFieldSet(this, _EventStream_aborted, true, "f");
  183. return this._emit('abort', error);
  184. }
  185. if (error instanceof OpenAIError) {
  186. return this._emit('error', error);
  187. }
  188. if (error instanceof Error) {
  189. const openAIError = new OpenAIError(error.message);
  190. // @ts-ignore
  191. openAIError.cause = error;
  192. return this._emit('error', openAIError);
  193. }
  194. return this._emit('error', new OpenAIError(String(error)));
  195. };
  196. //# sourceMappingURL=EventStream.mjs.map