1
- // Below is roughly originated from eszip@0.72.2 /src/v2.rs
1
+ // Below is roughly originated from eszip@fix-pub-vis-0-80-1 /src/v2.rs
2
2
3
3
use std:: collections:: HashMap ;
4
4
use std:: sync:: Arc ;
@@ -10,6 +10,7 @@ use eszip::v2::EszipNpmPackageIndex;
10
10
use eszip:: v2:: EszipV2Module ;
11
11
use eszip:: v2:: EszipV2Modules ;
12
12
use eszip:: v2:: EszipV2SourceSlot ;
13
+ use eszip:: v2:: EszipVersion ;
13
14
use eszip:: v2:: Options ;
14
15
use eszip:: v2:: Section ;
15
16
use eszip:: EszipV2 ;
@@ -20,22 +21,28 @@ use futures::AsyncRead;
20
21
use futures:: AsyncReadExt ;
21
22
use hashlink:: LinkedHashMap ;
22
23
23
- const ESZIP_V2_MAGIC : & [ u8 ; 8 ] = b"ESZIP_V2" ;
24
- const ESZIP_V2_2_MAGIC : & [ u8 ; 8 ] = b"ESZIP2.2" ;
25
-
26
24
pub async fn parse_v2_header < R : AsyncRead + Unpin > (
27
- mut reader : & mut BufReader < R > ,
25
+ reader : & mut BufReader < R > ,
28
26
) -> Result < EszipV2 , ParseError > {
29
27
let mut magic = [ 0u8 ; 8 ] ;
30
28
reader. read_exact ( & mut magic) . await ?;
31
29
32
- if ! EszipV2 :: has_magic ( & magic) {
30
+ let Some ( version ) = EszipVersion :: from_magic ( & magic) else {
33
31
return Err ( ParseError :: InvalidV2 ) ;
34
- }
32
+ } ;
33
+
34
+ parse_v2_header_inner ( version, reader) . await
35
+ }
36
+
37
+ // parse_with_version
38
+ async fn parse_v2_header_inner < R : AsyncRead + Unpin > (
39
+ version : EszipVersion ,
40
+ mut reader : & mut BufReader < R > ,
41
+ ) -> Result < EszipV2 , ParseError > {
42
+ let supports_npm = version != EszipVersion :: V2 ;
43
+ let supports_options = version >= EszipVersion :: V2_2 ;
35
44
36
- let supports_npm = magic != * ESZIP_V2_MAGIC ;
37
- let supports_options = magic == * ESZIP_V2_2_MAGIC ;
38
- let mut options = Options :: default_for_version ( & magic) ;
45
+ let mut options = Options :: default_for_version ( version) ;
39
46
40
47
if supports_options {
41
48
let mut pre_options = options;
@@ -82,8 +89,8 @@ pub async fn parse_v2_header<R: AsyncRead + Unpin>(
82
89
}
83
90
}
84
91
85
- let header = Section :: read ( & mut reader, options) . await ?;
86
- if !header . is_checksum_valid ( ) {
92
+ let modules_header = Section :: read ( & mut reader, options) . await ?;
93
+ if !modules_header . is_checksum_valid ( ) {
87
94
return Err ( ParseError :: InvalidV2HeaderHash ) ;
88
95
}
89
96
@@ -97,16 +104,16 @@ pub async fn parse_v2_header<R: AsyncRead + Unpin>(
97
104
// error.
98
105
macro_rules! read {
99
106
( $n: expr, $err: expr) => { {
100
- if read + $n > header . content_len( ) {
107
+ if read + $n > modules_header . content_len( ) {
101
108
return Err ( ParseError :: InvalidV2Header ( $err) ) ;
102
109
}
103
110
let start = read;
104
111
read += $n;
105
- & header . content( ) [ start..read]
112
+ & modules_header . content( ) [ start..read]
106
113
} } ;
107
114
}
108
115
109
- while read < header . content_len ( ) {
116
+ while read < modules_header . content_len ( ) {
110
117
let specifier_len =
111
118
u32:: from_be_bytes ( read ! ( 4 , "specifier len" ) . try_into ( ) . unwrap ( ) )
112
119
as usize ;
@@ -130,6 +137,7 @@ pub async fn parse_v2_header<R: AsyncRead + Unpin>(
130
137
1 => ModuleKind :: Json ,
131
138
2 => ModuleKind :: Jsonc ,
132
139
3 => ModuleKind :: OpaqueData ,
140
+ 4 => ModuleKind :: Wasm ,
133
141
n => return Err ( ParseError :: InvalidV2ModuleKind ( n, read) ) ,
134
142
} ;
135
143
let source = if source_offset == 0 && source_len == 0 {
0 commit comments