mirror of
https://github.com/Drop-OSS/droplet.git
synced 2025-11-10 20:42:14 +10:00
feat: Add file start and end to read_file function
Signed-off-by: quexeky <git@quexeky.dev>
This commit is contained in:
@ -22,7 +22,7 @@ time-macros = "0.2.22"
|
|||||||
time = "0.3.41"
|
time = "0.3.41"
|
||||||
webpki = "0.22.4"
|
webpki = "0.22.4"
|
||||||
ring = "0.17.14"
|
ring = "0.17.14"
|
||||||
tokio = { version = "1.45.1", features = ["fs"] }
|
tokio = { version = "1.45.1", features = ["fs", "io-util"] }
|
||||||
tokio-util = { version = "0.7.15", features = ["codec"] }
|
tokio-util = { version = "0.7.15", features = ["codec"] }
|
||||||
|
|
||||||
[dependencies.x509-parser]
|
[dependencies.x509-parser]
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
use std::os::unix::fs::PermissionsExt;
|
use std::os::unix::fs::PermissionsExt;
|
||||||
use std::{
|
use std::{
|
||||||
fs::{self, metadata, File},
|
fs::{self, metadata, File},
|
||||||
io::{self, BufReader, ErrorKind, Read},
|
io::{self, BufReader, ErrorKind, Read, Seek},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
task::Poll,
|
task::Poll,
|
||||||
};
|
};
|
||||||
@ -11,6 +11,7 @@ use napi::{
|
|||||||
bindgen_prelude::*,
|
bindgen_prelude::*,
|
||||||
tokio_stream::{Stream, StreamExt},
|
tokio_stream::{Stream, StreamExt},
|
||||||
};
|
};
|
||||||
|
use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeekExt, Take};
|
||||||
use tokio_util::{
|
use tokio_util::{
|
||||||
bytes::BytesMut,
|
bytes::BytesMut,
|
||||||
codec::{BytesCodec, FramedRead},
|
codec::{BytesCodec, FramedRead},
|
||||||
@ -134,6 +135,8 @@ pub fn read_file(
|
|||||||
path: String,
|
path: String,
|
||||||
sub_path: String,
|
sub_path: String,
|
||||||
env: &Env,
|
env: &Env,
|
||||||
|
start: Option<u32>,
|
||||||
|
end: Option<u32>
|
||||||
) -> Option<ReadableStream<'static, BufferSlice<'static>>> {
|
) -> Option<ReadableStream<'static, BufferSlice<'static>>> {
|
||||||
let path = Path::new(&path);
|
let path = Path::new(&path);
|
||||||
let backend = create_backend_for_path(path).unwrap();
|
let backend = create_backend_for_path(path).unwrap();
|
||||||
@ -142,14 +145,27 @@ pub fn read_file(
|
|||||||
permission: 0, // Shouldn't matter
|
permission: 0, // Shouldn't matter
|
||||||
};
|
};
|
||||||
// Use `?` operator for cleaner error propagation from `Option`
|
// Use `?` operator for cleaner error propagation from `Option`
|
||||||
let reader = backend.reader(&version_file)?;
|
let mut reader = backend.reader(&version_file)?;
|
||||||
|
|
||||||
|
// Can't do this in tokio because it requires a .await, which we can't do here
|
||||||
|
if let Some(start) = start {
|
||||||
|
reader.seek(io::SeekFrom::Start(start as u64)).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
// Convert std::fs::File to tokio::fs::File for async operations
|
// Convert std::fs::File to tokio::fs::File for async operations
|
||||||
let reader = tokio::fs::File::from_std(reader);
|
let reader = tokio::fs::File::from_std(reader);
|
||||||
|
|
||||||
|
|
||||||
|
let boxed_reader: Box<dyn AsyncRead + Send + Unpin> = match end {
|
||||||
|
Some(end_val) => Box::new(reader.take(end_val as u64)),
|
||||||
|
None => Box::new(reader),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Create a FramedRead stream with BytesCodec for chunking
|
// Create a FramedRead stream with BytesCodec for chunking
|
||||||
|
|
||||||
let stream = FramedRead::new(reader, BytesCodec::new())
|
let stream = FramedRead::new(boxed_reader, BytesCodec::new())
|
||||||
// Use StreamExt::map to transform each Result item
|
// Use StreamExt::map to transform each Result item
|
||||||
.map(|result_item| {
|
.map(|result_item| {
|
||||||
result_item
|
result_item
|
||||||
|
|||||||
Reference in New Issue
Block a user