{"version":3,"file":"assetRange.js","names":[],"sources":["esm/server/assetRange.js"],"sourcesContent":["async function withRange(request, response) {\n  const range = request.headers.get(\"range\");\n  if (!range || request.method !== \"GET\" || response.status !== 200 || !response.body || response.headers.has(\"content-range\") || response.headers.has(\"content-encoding\") || !ifRangeMatches(request.headers.get(\"if-range\"), response.headers)) {\n    return response;\n  }\n  const match = /^bytes=(\\d*)-(\\d*)$/.exec(range.trim());\n  if (!match || !match[1] && !match[2]) return response;\n  const length = response.headers.get(\"content-length\");\n  const known = length && /^\\d+$/.test(length) ? Number(length) : void 0;\n  const headers = new Headers(response.headers);\n  headers.set(\"accept-ranges\", \"bytes\");\n  headers.delete(\"content-length\");\n  const { size, kept, keptStart } = await readRange(response.body, match, known);\n  const span = resolve(match, size);\n  if (!span) {\n    headers.set(\"content-range\", `bytes */${size}`);\n    return new Response(null, { status: 416, headers });\n  }\n  headers.set(\"content-range\", `bytes ${span.start}-${span.end}/${size}`);\n  headers.set(\"content-length\", String(span.end - span.start + 1));\n  return new Response(kept.subarray(span.start - keptStart, span.end - keptStart + 1), {\n    status: 206,\n    headers\n  });\n}\nfunction ifRangeMatches(ifRange, headers) {\n  if (!ifRange) return true;\n  const value = ifRange.trim();\n  if (value.startsWith('\"')) {\n    const etag = headers.get(\"etag\");\n    return !!etag && !etag.startsWith(\"W/\") && etag === value;\n  }\n  if (value.startsWith(\"W/\")) return false;\n  return headers.get(\"last-modified\") === value;\n}\nfunction resolve(match, size) {\n  let start;\n  let end;\n  if (!match[1]) {\n    start = Math.max(0, size - Number(match[2]));\n    end = size - 1;\n  } else {\n    start = Number(match[1]);\n    end = match[2] ? Math.min(Number(match[2]), size - 1) : size - 1;\n  }\n  if (start >= size || start > end) return;\n  return { start, end };\n}\nasync function readRange(body, match, known) {\n  const span = known === void 0 ? void 0 : resolve(match, known) ?? { start: known, end: -1 };\n  const suffix = !span && !match[1] ? Number(match[2]) : 0;\n  const from = span ? span.start : match[1] ? Number(match[1]) : 0;\n  const to = span ? span.end : match[2] && match[1] ? Number(match[2]) : Number.POSITIVE_INFINITY;\n  const chunks = [];\n  let keptBytes = 0;\n  let size = 0;\n  const reader = body.getReader();\n  while (known === void 0 || size <= to) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    const chunkStart = size;\n    size += value.byteLength;\n    if (suffix) {\n      chunks.push(value);\n      keptBytes += value.byteLength;\n      while (chunks.length > 1 && keptBytes - chunks[0].byteLength >= suffix) {\n        keptBytes -= chunks.shift().byteLength;\n      }\n      continue;\n    }\n    const lo = Math.max(from, chunkStart);\n    const hi = Math.min(to + 1, size);\n    if (hi > lo) {\n      chunks.push(value.subarray(lo - chunkStart, hi - chunkStart));\n      keptBytes += hi - lo;\n    }\n  }\n  if (known !== void 0) {\n    await reader.cancel();\n    size = known;\n  }\n  const kept = new Uint8Array(keptBytes);\n  let at = 0;\n  for (const chunk of chunks) {\n    kept.set(chunk, at);\n    at += chunk.byteLength;\n  }\n  return { size, kept, keptStart: suffix ? size - keptBytes : from };\n}\nexport {\n  withRange\n};\n//# sourceMappingURL=assetRange.js.map\n"],"mappings":"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"}