{"version":3,"file":"range.cjs","names":[],"sources":["../../src/utils/range.ts"],"sourcesContent":["import type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { IncomingMessage } from \"node:http\";\n\nexport function parseRange(request: IncomingMessage): PFrameInternal.HttpRange | null | undefined {\n  const range = request.headers[\"range\"];\n  if (range === undefined) return undefined;\n\n  const match = range.match(/^bytes=(\\d*)-(\\d*)$/);\n  if (!match) return null;\n\n  const [, startStr, endStr] = match;\n  const start = startStr ? parseInt(startStr, 10) : null;\n  const end = endStr ? parseInt(endStr, 10) : null;\n  if (\n    (start !== null && (isNaN(start) || start < 0)) ||\n    (end !== null && (isNaN(end) || end < 0)) ||\n    (start !== null && end !== null && start > end)\n  )\n    return null;\n\n  // Both start and end are specified - bounded range\n  if (start !== null && end !== null) {\n    return { type: \"bounded\", start, end };\n  }\n\n  // Only start is specified - offset range (e.g., bytes=500-)\n  if (start !== null && end === null) {\n    return { type: \"offset\", offset: start };\n  }\n\n  // Only end is specified - suffix range (e.g., bytes=-500)\n  if (start === null && end !== null) {\n    return { type: \"suffix\", suffix: end };\n  }\n\n  // Neither start nor end specified (bytes=-) - invalid\n  return null;\n}\n"],"mappings":";AAGA,SAAgB,WAAW,SAAuE;CAChG,MAAM,QAAQ,QAAQ,QAAQ;AAC9B,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;CAEhC,MAAM,QAAQ,MAAM,MAAM,sBAAsB;AAChD,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,GAAG,UAAU,UAAU;CAC7B,MAAM,QAAQ,WAAW,SAAS,UAAU,GAAG,GAAG;CAClD,MAAM,MAAM,SAAS,SAAS,QAAQ,GAAG,GAAG;AAC5C,KACG,UAAU,SAAS,MAAM,MAAM,IAAI,QAAQ,MAC3C,QAAQ,SAAS,MAAM,IAAI,IAAI,MAAM,MACrC,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,IAE3C,QAAO;AAGT,KAAI,UAAU,QAAQ,QAAQ,KAC5B,QAAO;EAAE,MAAM;EAAW;EAAO;EAAK;AAIxC,KAAI,UAAU,QAAQ,QAAQ,KAC5B,QAAO;EAAE,MAAM;EAAU,QAAQ;EAAO;AAI1C,KAAI,UAAU,QAAQ,QAAQ,KAC5B,QAAO;EAAE,MAAM;EAAU,QAAQ;EAAK;AAIxC,QAAO"}