import { copy as copyBytes } from "../bytes/mod.ts";import { assert } from "../testing/asserts.ts";
const DEFAULT_BUFFER_SIZE = 32 * 1024;
export interface ByteRange { start: number;
end: number;}
export async function readRange( r: Deno.Reader & Deno.Seeker, range: ByteRange,): Promise<Uint8Array> { let length = range.end - range.start + 1; assert(length > 0, "Invalid byte range was passed."); await r.seek(range.start, Deno.SeekMode.Start); const result = new Uint8Array(length); let off = 0; while (length) { const p = new Uint8Array(Math.min(length, DEFAULT_BUFFER_SIZE)); const nread = await r.read(p); assert(nread !== null, "Unexpected EOF reach while reading a range."); assert(nread > 0, "Unexpected read of 0 bytes while reading a range."); copyBytes(p, result, off); off += nread; length -= nread; assert(length >= 0, "Unexpected length remaining after reading range."); } return result;}
export function readRangeSync( r: Deno.ReaderSync & Deno.SeekerSync, range: ByteRange,): Uint8Array { let length = range.end - range.start + 1; assert(length > 0, "Invalid byte range was passed."); r.seekSync(range.start, Deno.SeekMode.Start); const result = new Uint8Array(length); let off = 0; while (length) { const p = new Uint8Array(Math.min(length, DEFAULT_BUFFER_SIZE)); const nread = r.readSync(p); assert(nread !== null, "Unexpected EOF reach while reading a range."); assert(nread > 0, "Unexpected read of 0 bytes while reading a range."); copyBytes(p, result, off); off += nread; length -= nread; assert(length >= 0, "Unexpected length remaining after reading range."); } return result;}