graph_http/traits/
byte_range.rs

1use async_trait::async_trait;
2use bytes::BytesMut;
3use std::collections::VecDeque;
4
5// The size of each byte range must be a multiple of 320 KiB (327,680 bytes).
6static RANGE_MULTIPLES: [usize; 32] = [
7    2, 4, 5, 8, 10, 16, 20, 32, 40, 64, 80, 128, 160, 256, 320, 512, 640, 1024, 1280, 2048, 2560,
8    4096, 5120, 8192, 10240, 16384, 20480, 32768, 40960, 65536, 81920, 163_840,
9];
10
11pub trait ByteRangeMultiple {
12    fn size(&self) -> u64;
13
14    fn byte_range_multiple(&self) -> u64 {
15        let size = self.size();
16        for (i, next) in RANGE_MULTIPLES.iter().rev().enumerate() {
17            let n = *next as u64;
18            let div = size / n;
19            let half = size / 2;
20
21            if div > 2 && div < half {
22                let num: u64 = size / n;
23                if num > 15 || i > 25 {
24                    return n;
25                }
26            }
27        }
28        1
29    }
30}
31
32impl ByteRangeMultiple for BytesMut {
33    fn size(&self) -> u64 {
34        self.len() as u64
35    }
36}
37
38pub trait ByteRangeRead: ByteRangeMultiple {
39    fn read_to_vec(self) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
40    fn read_to_vec_range(
41        self,
42        start: u64,
43        end: u64,
44    ) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
45}
46
47#[async_trait]
48pub trait AsyncByteRangeRead: ByteRangeMultiple {
49    async fn read_to_vec(self) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
50    async fn read_to_vec_range(
51        self,
52        start: u64,
53        end: u64,
54    ) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
55}