{"version":3,"file":"StreamResponse.mjs","sources":["../../../src/infra/StreamResponse.ts"],"sourcesContent":["import {\n  ApiError,\n  EnumOrLiteral,\n  StreamEvent,\n  StreamEventName,\n} from \"../models\";\nimport { RawResponse } from \"../models/http/RawResponse\";\nimport { StreamEventCallback } from \"../models/endpoints/stream/StreamEventCallback\";\nimport { ApiResponse } from \"../models/http/ApiResponse\";\nimport { ApiResponseValidator } from \"../validation/ApiResponseValidator\";\nimport { StreamDataParser } from \"./StreamDataParser\";\n\n/**\n * Wrapper class around {@link RawResponse} that provides\n * an interface for working with Chat's streaming data in\n * both browser and Node environments.\n *\n * @public\n */\nexport class StreamResponse {\n  /**\n   * {@inheritdoc RawResponse}\n   *\n   * @public\n   */\n  readonly rawResponse: RawResponse;\n\n  private streamDataParser: StreamDataParser;\n\n  private isConsumed = false;\n  private eventListeners: {\n    [E in EnumOrLiteral<StreamEventName>]?: StreamEventCallback<E>[];\n  } = {};\n\n  constructor(rawResponse: RawResponse) {\n    this.rawResponse = rawResponse;\n    this.streamDataParser = new StreamDataParser();\n  }\n\n  /**\n   * Registers a function that will be called whenever the specified stream event occurs.\n   *\n   * @public\n   *\n   * @param eventName - name of the event to listen\n   * @param cb - callback function to invoke when event occurs\n   */\n  addEventListener<E extends EnumOrLiteral<StreamEventName>>(\n    eventName: E,\n    cb: StreamEventCallback<E>\n  ) {\n    const cbs = this.eventListeners[eventName];\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    cbs ? cbs.push(cb) : (this.eventListeners[eventName] = [cb] as any);\n  }\n\n  /**\n   * Reads data from a stream response and invokes callbacks from event\n   * listeners for each chunk of data that is read.\n   *\n   * @remarks\n   * Once the data has been consumed from the stream, this method will\n   * simply return immediately on subsequent calls.\n   *\n   * @public\n   */\n  async consume(): Promise<void> {\n    if (this.isConsumed) {\n      console.error(\n        \"Stream Error: data has been consumed from the stream. Cannot be read again.\"\n      );\n      return;\n    }\n    const resBody = this.rawResponse.body;\n    if (!resBody) {\n      return Promise.reject(\n        new ApiError('Response Error: \"body\" property is undefined.')\n      );\n    }\n\n    if (!this.rawResponse.ok) {\n      const jsonResponse: ApiResponse = await this.rawResponse.json();\n      const validationResult = ApiResponseValidator.validate(\n        jsonResponse,\n        this.rawResponse.status\n      );\n      return validationResult\n        ? Promise.reject(validationResult)\n        : Promise.reject(\n            new ApiError(\n              \"An error occurred while processing request to Chat API.\"\n            )\n          );\n    }\n\n    const streamCompleted =\n      \"getReader\" in resBody\n        ? this.consumeWebStream(resBody)\n        : this.consumeNodeStream(resBody);\n    this.isConsumed = true;\n    return streamCompleted;\n  }\n\n  private async consumeWebStream(\n    resBody: ReadableStream<Uint8Array>\n  ): Promise<void> {\n    const reader = resBody.getReader();\n    let doneStreaming = false;\n    do {\n      const { value, done } = await reader.read();\n      doneStreaming = done;\n      if (!value) {\n        continue;\n      }\n      this.streamDataParser.parse(value, (e) => this.handleEvent(e));\n    } while (!doneStreaming);\n  }\n\n  private async consumeNodeStream(\n    resBody: NodeJS.ReadableStream\n  ): Promise<void> {\n    return new Promise<void>((resolve, reject) => {\n      resBody.on(\"data\", (chunk: Buffer) => {\n        this.streamDataParser.parse(chunk, (e) => this.handleEvent(e));\n      });\n      resBody.on(\"error\", (err) => {\n        reject(err);\n      });\n      resBody.on(\"end\", () => resolve());\n    });\n  }\n\n  private handleEvent(event: StreamEvent) {\n    this.eventListeners[event.event]?.forEach((cb) => {\n      (cb as StreamEventCallback<typeof event.event>)(event);\n    });\n  }\n}\n"],"names":[],"mappings":"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"}