@httpland/range-request-middleware
Version:
HTTP range request middleware
44 lines (43 loc) • 1.61 kB
JavaScript
// 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;
}