UNPKG

@httpland/range-request-middleware

Version:
44 lines (43 loc) 1.61 kB
// Copyright 2023-latest the httpland authors. All rights reserved. MIT license. // This module is browser compatible. import { concat, isString, stringifyContentRange, } from "../deps.js"; /** Deserialize {@link MultipartByteranges} into multipart/byterages bytestream. */ export function multipartByteranges(args) { const { content, contentType, ranges, boundary, rangeUnit } = args; const size = content.byteLength; const boundaryDelimiter = "--" + boundary; const endDelimiter = boundaryDelimiter + "--"; const encoder = new TextEncoder(); const contentTypeStr = `Content-Type: ${contentType}`; const contents = ranges .map(bodyParts) .flat() .map((buffer) => new Uint8Array(buffer)) .concat(encoder.encode(endDelimiter)); const buffer = join(contents, encoder.encode("\n")).buffer; return buffer; function bodyParts(inclRange) { const contentRangeStr = stringifyContentRange({ rangeUnit, ...inclRange, completeLength: size, }); return [ boundaryDelimiter, contentTypeStr, `Content-Range: ${contentRangeStr}`, "", content.slice(inclRange.firstPos, inclRange.lastPos + 1), ].map(toBuffer); } } export function join(list, separator) { return list.reduce((acc, cur, i) => { if (!i) return concat(acc, cur); return concat(acc, separator, cur); }, new Uint8Array()); } export function toBuffer(input) { return isString(input) ? new TextEncoder().encode(input) : input; }