UNPKG

@httpland/range-request-middleware

Version:
47 lines (46 loc) 1.76 kB
// Copyright 2023-latest the httpland authors. All rights reserved. MIT license. // This module is browser compatible. import { filterKeys, isRepresentationHeader, not, parseAcceptRanges, RangeHeader, Status, stringifyContentRange, } from "./deps.js"; export var RangeUnit; (function (RangeUnit) { RangeUnit["Bytes"] = "bytes"; RangeUnit["None"] = "none"; })(RangeUnit || (RangeUnit = {})); /** Shallow merge two headers. */ export function shallowMergeHeaders(left, right) { const lHeader = new Headers(left); right.forEach((value, key) => lHeader.set(key, value)); return lHeader; } export class RequestedRangeNotSatisfiableResponse extends Response { constructor(contentRange, init) { const { statusText } = init ?? {}; const headers = filterKeys(new Headers(init?.headers), not(isRepresentationHeader)); if (!headers.has(RangeHeader.ContentRange)) { const contentRangeStr = stringifyContentRange(contentRange); headers.set(RangeHeader.ContentRange, contentRangeStr); } super(null, { status: Status.RequestedRangeNotSatisfiable, statusText, headers, }); } } /** Whether the inputs are equal to case sensitivity. */ export function equalsCaseInsensitive(left, right) { if (left === right) return true; return !left.localeCompare(right, undefined, { sensitivity: "accent" }); } /** Whether the input has {@link Token} or not. * If the input is invalid [`Accept-Ranges`](https://www.rfc-editor.org/rfc/rfc9110.html#section-14.3-2) then `false`. */ export function hasToken(input, token) { try { return parseAcceptRanges(input).includes(token); } catch { return false; } }