deno.land / std@0.173.0 / io / read_range.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
import { copy as copyBytes } from "../bytes/copy.ts";import { assert } from "../_util/asserts.ts";import type { Reader, ReaderSync } from "../types.d.ts";
const DEFAULT_BUFFER_SIZE = 32 * 1024;
export interface ByteRange { /** The 0 based index of the start byte for a range. */ start: number;
/** The 0 based index of the end byte for a range, which is inclusive. */ end: number;}
/** * Read a range of bytes from a file or other resource that is readable and * seekable. The range start and end are inclusive of the bytes within that * range. * * ```ts * import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts"; * import { readRange } from "https://deno.land/std@$STD_VERSION/io/read_range.ts"; * * // Read the first 10 bytes of a file * const file = await Deno.open("example.txt", { read: true }); * const bytes = await readRange(file, { start: 0, end: 9 }); * assertEquals(bytes.length, 10); * ``` */export async function readRange( r: Reader & Deno.Seeker, range: ByteRange,): Promise<Uint8Array> { // byte ranges are inclusive, so we have to add one to the end 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;}
/** * Read a range of bytes synchronously from a file or other resource that is * readable and seekable. The range start and end are inclusive of the bytes * within that range. * * ```ts * import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts"; * import { readRangeSync } from "https://deno.land/std@$STD_VERSION/io/read_range.ts"; * * // Read the first 10 bytes of a file * const file = Deno.openSync("example.txt", { read: true }); * const bytes = readRangeSync(file, { start: 0, end: 9 }); * assertEquals(bytes.length, 10); * ``` */export function readRangeSync( r: ReaderSync & Deno.SeekerSync, range: ByteRange,): Uint8Array { // byte ranges are inclusive, so we have to add one to the end 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;}
std

Version Info

Tagged at
a year ago