EventStream.js 9.8 KB

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