{"version":3,"file":"StreamDataParser.mjs","sources":["../../../src/infra/StreamDataParser.ts"],"sourcesContent":["import { StreamEvent, StreamEventName } from \"../models\";\n\n/**\n * Provides parsing functionality for stream data.\n *\n * @internal\n */\nexport class StreamDataParser {\n  private eventName: string;\n  private data: string;\n  private decoder: TextDecoder;\n  private NEWLINE_ASCII_CODE = 10;\n\n  constructor() {\n    this.eventName = \"\";\n    this.data = \"\";\n    this.decoder = new TextDecoder();\n  }\n\n  /**\n   * Decodes raw data from stream and parses it into {@link StreamEvent}.\n   * The expected format of raw data follows server-sent events (SSE) standard:\n   * `event: startTokenStream\\ndata: {\"token\": \"Yext Chat\"}\\n\\n`\n   *\n   * @param byteArray - data from stream\n   * @param eventHander - function to invoke once a complete stream event is successfully parsed\n   */\n  public parse(\n    byteArray: Buffer | Uint8Array,\n    eventHander: (e: StreamEvent) => void\n  ): void {\n    let newLineIndex = -1;\n\n    const appendData = (line: string) => {\n      if (line.startsWith(\"data:\")) {\n        // Following EventSource API, multiple consecutive lines that begin with \"data:\"\n        // will be concatenated, with a newline character between each one.\n        const newData = line.replace(/^data: ?/, \"\");\n        this.data = this.data == \"\" ? newData : `${this.data}\\n${newData}`;\n      } else {\n        // Incomplete event data, should continue in next chunk\n        this.data += line;\n      }\n    };\n\n    byteArray.forEach((byte, i) => {\n      if (byte !== this.NEWLINE_ASCII_CODE) {\n        if (i == byteArray.length - 1) {\n          // Data chunk not ending on pair of newlines indicates more data to come in the next\n          // chunk for the same event. Save remaining data to continue process in next chunk\n          appendData(this.decoder.decode(byteArray.subarray(newLineIndex + 1)));\n        }\n        return;\n      }\n      const prevNewLineIndex = newLineIndex;\n      newLineIndex = i;\n      // A pair of newline characters indicates end of an event stream\n      if (prevNewLineIndex + 1 === newLineIndex) {\n        const streamEvent = this.createStreamEvent(this.eventName, this.data);\n        if (streamEvent) {\n          eventHander(streamEvent);\n        }\n        this.eventName = \"\";\n        this.data = \"\";\n        return;\n      }\n      const line = this.decoder.decode(\n        byteArray.subarray(prevNewLineIndex + 1, newLineIndex)\n      );\n      if (line.startsWith(\"event:\")) {\n        this.eventName = line.replace(/^event: ?/, \"\");\n      } else {\n        appendData(line);\n      }\n    });\n  }\n\n  private createStreamEvent(\n    eventName: string,\n    data: string\n  ): StreamEvent | undefined {\n    if (!eventName) {\n      console.error(\"Stream Error: Unnamed event with following data:\", data);\n    } else {\n      switch (eventName) {\n        case StreamEventName.StartEvent:\n        case StreamEventName.TokenStreamEvent:\n        case StreamEventName.EndEvent:\n          return { event: eventName, data: JSON.parse(data) };\n        default:\n          console.error(\n            `Stream Error: Unknown Event \"${eventName}\" with data: ${data}`\n          );\n      }\n    }\n  }\n}\n"],"names":[],"mappings":"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"}