Skip to content

Commit cb7af2b

Browse files
committed
detect from magic numbers
1 parent 1ea5893 commit cb7af2b

File tree

4 files changed

+25
-13
lines changed

4 files changed

+25
-13
lines changed

crates/napi/src/next_api/project.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,18 @@ pub fn project_new(
412412
let trace_file;
413413
let (trace_writer, trace_writer_guard) = match compress {
414414
Compression::None => {
415-
trace_file = internal_dir.join("diagnostics/trace-turbopack");
415+
trace_file = internal_dir.join("trace-turbopack");
416416
let trace_writer = std::fs::File::create(trace_file.clone()).unwrap();
417417
TraceWriter::new(trace_writer)
418418
}
419419
Compression::GzipFast => {
420-
trace_file = internal_dir.join("diagnostics/trace-turbopack.gz");
420+
trace_file = internal_dir.join("trace-turbopack");
421421
let trace_writer = std::fs::File::create(trace_file.clone()).unwrap();
422422
let trace_writer = GzEncoder::new(trace_writer, flate2::Compression::fast());
423423
TraceWriter::new(trace_writer)
424424
}
425425
Compression::GzipBest => {
426-
trace_file = internal_dir.join("diagnostics/trace-turbopack.gz");
426+
trace_file = internal_dir.join("trace-turbopack");
427427
let trace_writer = std::fs::File::create(trace_file.clone()).unwrap();
428428
let trace_writer = GzEncoder::new(trace_writer, flate2::Compression::best());
429429
TraceWriter::new(trace_writer)

turbopack/crates/turbopack-trace-server/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![feature(iter_intersperse)]
22
#![feature(box_patterns)]
3+
#![feature(bufreader_peek)]
34

45
use std::{hash::BuildHasherDefault, path::PathBuf, sync::Arc};
56

turbopack/crates/turbopack-trace-server/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![feature(iter_intersperse)]
22
#![feature(box_patterns)]
3+
#![feature(bufreader_peek)]
34

45
use std::{hash::BuildHasherDefault, sync::Arc};
56

turbopack/crates/turbopack-trace-server/src/reader/mod.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ impl ObjectSafeTraceFormat for ErasedTraceFormat {
7575

7676
#[derive(Default)]
7777
enum TraceFile {
78-
Raw(File),
78+
Raw(BufReader<File>),
7979
Zstd(zstd::Decoder<'static, BufReader<File>>),
8080
Gz(GzDecoder<BufReader<File>>),
8181
#[default]
@@ -112,7 +112,7 @@ impl TraceFile {
112112

113113
fn size(&mut self) -> io::Result<u64> {
114114
match self {
115-
Self::Raw(file) => file.metadata().map(|m| m.len()),
115+
Self::Raw(file) => file.get_ref().metadata().map(|m| m.len()),
116116
Self::Zstd(decoder) => decoder.get_mut().get_ref().metadata().map(|m| m.len()),
117117
Self::Gz(decoder) => decoder.get_mut().get_ref().metadata().map(|m| m.len()),
118118
Self::Unloaded => unreachable!(),
@@ -145,13 +145,21 @@ impl TraceReader {
145145

146146
fn trace_file_from_file(&self, file: File) -> io::Result<TraceFile> {
147147
let path = &self.path.to_string_lossy();
148-
Ok(if path.ends_with(".zst") {
149-
TraceFile::Zstd(zstd::Decoder::new(file)?)
150-
} else if path.ends_with(".gz") {
151-
TraceFile::Gz(GzDecoder::new(BufReader::new(file)))
152-
} else {
153-
TraceFile::Raw(file)
154-
})
148+
let mut file = BufReader::with_capacity(
149+
// zstd max block size (1 << 17) + block header (3) + magic bytes (4)
150+
1 << 17 + 7,
151+
file,
152+
);
153+
let magic_bytes = file.peek(4)?;
154+
Ok(
155+
if path.ends_with(".zst") || magic_bytes == [0x27, 0xb5, 0x2f, 0xfd] {
156+
TraceFile::Zstd(zstd::Decoder::with_buffer(file)?)
157+
} else if path.ends_with(".gz") || matches!(magic_bytes, [0x1f, 0x8b, _, _]) {
158+
TraceFile::Gz(GzDecoder::new(file))
159+
} else {
160+
TraceFile::Raw(file)
161+
},
162+
)
155163
}
156164

157165
fn try_read(&mut self) -> bool {
@@ -293,7 +301,9 @@ impl TraceReader {
293301
}
294302
}
295303
Err(err) => {
296-
if err.kind() == io::ErrorKind::UnexpectedEof {
304+
if err.kind() == io::ErrorKind::UnexpectedEof
305+
|| err.kind() == io::ErrorKind::InvalidInput
306+
{
297307
if let Some(value) = self.wait_for_more_data(
298308
&mut file,
299309
&mut initial_read,

0 commit comments

Comments
 (0)