{"version":3,"file":"decoder.cjs","names":["TRAILING_NEWLINE"],"sources":["../../../../src/client/stream/transport/decoder.ts"],"sourcesContent":["import type { StreamPart } from \"./types.js\";\nimport { CR, LF, NULL, COLON, SPACE, TRAILING_NEWLINE } from \"./constants.js\";\n\nfunction joinArrays(data: ArrayLike<number>[]) {\n  const totalLength = data.reduce((acc, curr) => acc + curr.length, 0);\n  const merged = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const chunk of data) {\n    merged.set(chunk, offset);\n    offset += chunk.length;\n  }\n  return merged;\n}\n\nfunction decodeArraysToJson(decoder: TextDecoder, data: ArrayLike<number>[]) {\n  return JSON.parse(decoder.decode(joinArrays(data)));\n}\n\nexport function BytesLineDecoder() {\n  let buffer: Uint8Array[] = [];\n  let trailingCr = false;\n\n  return new TransformStream<Uint8Array, Uint8Array>({\n    start() {\n      buffer = [];\n      trailingCr = false;\n    },\n\n    transform(chunk, controller) {\n      let text = chunk;\n\n      if (trailingCr) {\n        text = joinArrays([[CR], text]);\n        trailingCr = false;\n      }\n\n      if (text.length > 0 && text.at(-1) === CR) {\n        trailingCr = true;\n        text = text.subarray(0, -1);\n      }\n\n      if (!text.length) {\n        return;\n      }\n      const trailingNewline = TRAILING_NEWLINE.includes(text.at(-1)!);\n\n      const lastIdx = text.length - 1;\n      const { lines } = text.reduce<{ lines: Uint8Array[]; from: number }>(\n        (acc, cur, idx) => {\n          if (acc.from > idx) {\n            return acc;\n          }\n\n          if (cur === CR || cur === LF) {\n            acc.lines.push(text.subarray(acc.from, idx));\n            if (cur === CR && text[idx + 1] === LF) {\n              acc.from = idx + 2;\n            } else {\n              acc.from = idx + 1;\n            }\n          }\n\n          if (idx === lastIdx && acc.from <= lastIdx) {\n            acc.lines.push(text.subarray(acc.from));\n          }\n\n          return acc;\n        },\n        { lines: [], from: 0 }\n      );\n\n      if (lines.length === 1 && !trailingNewline) {\n        buffer.push(lines[0]);\n        return;\n      }\n\n      if (buffer.length) {\n        buffer.push(lines[0]);\n        lines[0] = joinArrays(buffer);\n        buffer = [];\n      }\n\n      if (!trailingNewline && lines.length) {\n        buffer = [lines.pop()!];\n      }\n\n      for (const line of lines) {\n        controller.enqueue(line);\n      }\n    },\n\n    flush(controller) {\n      if (buffer.length) {\n        controller.enqueue(joinArrays(buffer));\n      }\n    },\n  });\n}\n\nexport function SSEDecoder() {\n  let event = \"\";\n  let data: Uint8Array[] = [];\n  let lastEventId = \"\";\n  let retry: number | null = null;\n\n  const decoder = new TextDecoder();\n\n  return new TransformStream<Uint8Array, StreamPart>({\n    transform(chunk, controller) {\n      if (!chunk.length) {\n        if (!event && !data.length && !lastEventId && retry == null) {\n          return;\n        }\n\n        controller.enqueue({\n          id: lastEventId || undefined,\n          event,\n          data: data.length ? decodeArraysToJson(decoder, data) : null,\n        });\n\n        event = \"\";\n        data = [];\n        retry = null;\n        return;\n      }\n\n      if (chunk[0] === COLON) {\n        return;\n      }\n\n      const sepIdx = chunk.indexOf(COLON);\n      if (sepIdx === -1) {\n        return;\n      }\n\n      const fieldName = decoder.decode(chunk.subarray(0, sepIdx));\n      let value = chunk.subarray(sepIdx + 1);\n      if (value[0] === SPACE) {\n        value = value.subarray(1);\n      }\n\n      if (fieldName === \"event\") {\n        event = decoder.decode(value);\n      } else if (fieldName === \"data\") {\n        data.push(value);\n      } else if (fieldName === \"id\") {\n        if (value.indexOf(NULL) === -1) {\n          lastEventId = decoder.decode(value);\n        }\n      } else if (fieldName === \"retry\") {\n        const retryNum = Number.parseInt(decoder.decode(value), 10);\n        if (!Number.isNaN(retryNum)) {\n          retry = retryNum;\n        }\n      }\n    },\n\n    flush(controller) {\n      if (event) {\n        controller.enqueue({\n          id: lastEventId || undefined,\n          event,\n          data: data.length ? decodeArraysToJson(decoder, data) : null,\n        });\n      }\n    },\n  });\n}\n"],"mappings":"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"}