1
+ use crate :: config:: WasmOptLevel ;
2
+ use crate :: { CliSettings , Result , WasmOptConfig , Workspace } ;
1
3
use anyhow:: { anyhow, Context } ;
2
4
use flate2:: read:: GzDecoder ;
5
+ use std:: path:: { Path , PathBuf } ;
3
6
use tar:: Archive ;
4
7
use tempfile:: NamedTempFile ;
5
- use tokio:: fs;
6
-
7
- use crate :: config:: WasmOptLevel ;
8
- use crate :: { CliSettings , Result , WasmOptConfig , Workspace } ;
9
- use std:: path:: { Path , PathBuf } ;
10
8
11
9
/// Write these wasm bytes with a particular set of optimizations
12
10
pub async fn write_wasm ( bytes : & [ u8 ] , output_path : & Path , cfg : & WasmOptConfig ) -> Result < ( ) > {
@@ -16,7 +14,9 @@ pub async fn write_wasm(bytes: &[u8], output_path: &Path, cfg: &WasmOptConfig) -
16
14
}
17
15
18
16
pub async fn optimize ( input_path : & Path , output_path : & Path , cfg : & WasmOptConfig ) -> Result < ( ) > {
19
- let wasm_opt = WasmOpt :: new ( input_path, output_path, cfg) . await ?;
17
+ let wasm_opt = WasmOpt :: new ( input_path, output_path, cfg)
18
+ . await
19
+ . inspect_err ( |err| tracing:: error!( "Failed to create wasm-opt instance: {}" , err) ) ?;
20
20
wasm_opt. optimize ( ) . await ?;
21
21
22
22
Ok ( ( ) )
@@ -127,6 +127,20 @@ impl WasmOpt {
127
127
128
128
// Find the URL for the latest binaryen release that contains wasm-opt
129
129
async fn find_latest_wasm_opt_download_url ( ) -> anyhow:: Result < String > {
130
+ // Find the platform identifier based on the current OS and architecture
131
+ // hardcoded for now to get around github api rate limits
132
+ if cfg ! ( all( target_os = "windows" , target_arch = "x86_64" ) ) {
133
+ return Ok ( "https://github.com/WebAssembly/binaryen/releases/download/version_123/binaryen-version_123-x86_64-windows.tar.gz" . to_string ( ) ) ;
134
+ } else if cfg ! ( all( target_os = "linux" , target_arch = "x86_64" ) ) {
135
+ return Ok ( "https://github.com/WebAssembly/binaryen/releases/download/version_123/binaryen-version_123-x86_64-linux.tar.gz" . to_string ( ) ) ;
136
+ } else if cfg ! ( all( target_os = "linux" , target_arch = "aarch64" ) ) {
137
+ return Ok ( "https://github.com/WebAssembly/binaryen/releases/download/version_123/binaryen-version_123-aarch64-linux.tar.gz" . to_string ( ) ) ;
138
+ } else if cfg ! ( all( target_os = "macos" , target_arch = "x86_64" ) ) {
139
+ return Ok ( "https://github.com/WebAssembly/binaryen/releases/download/version_123/binaryen-version_123-x86_64-macos.tar.gz" . to_string ( ) ) ;
140
+ } else if cfg ! ( all( target_os = "macos" , target_arch = "aarch64" ) ) {
141
+ return Ok ( "https://github.com/WebAssembly/binaryen/releases/download/version_123/binaryen-version_123-arm64-macos.tar.gz" . to_string ( ) ) ;
142
+ } ;
143
+
130
144
let url = "https://api.github.com/repos/WebAssembly/binaryen/releases/latest" ;
131
145
let client = reqwest:: Client :: new ( ) ;
132
146
let response = client
@@ -136,6 +150,9 @@ async fn find_latest_wasm_opt_download_url() -> anyhow::Result<String> {
136
150
. await ?
137
151
. json :: < serde_json:: Value > ( )
138
152
. await ?;
153
+
154
+ tracing:: trace!( "Response from GitHub: {:#?}" , response) ;
155
+
139
156
let assets = response
140
157
. get ( "assets" )
141
158
. and_then ( |assets| assets. as_array ( ) )
@@ -165,7 +182,7 @@ async fn find_latest_wasm_opt_download_url() -> anyhow::Result<String> {
165
182
asset
166
183
. get ( "name" )
167
184
. and_then ( |name| name. as_str ( ) )
168
- . is_some_and ( |name| name. contains ( platform) )
185
+ . is_some_and ( |name| name. contains ( platform) && !name . ends_with ( "sha256" ) )
169
186
} )
170
187
. ok_or_else ( || {
171
188
anyhow:: anyhow!(
@@ -185,31 +202,30 @@ async fn find_latest_wasm_opt_download_url() -> anyhow::Result<String> {
185
202
186
203
/// Get the path to the wasm-opt binary, downloading it if necessary
187
204
async fn get_binary_path ( ) -> anyhow:: Result < PathBuf > {
188
- let existing_path = which:: which ( "wasm-opt" ) ;
189
-
190
- match existing_path {
191
- // If wasm-opt is already in the PATH, return its path
192
- Ok ( path) => Ok ( path) ,
193
- // If wasm-opt is not found in the path and we prefer no downloads, return an error
194
- Err ( _) if CliSettings :: prefer_no_downloads ( ) => Err ( anyhow ! ( "Missing wasm-opt" ) ) ,
195
- // Otherwise, try to install it
196
- Err ( _) => {
197
- let install_dir = install_dir ( ) . await ?;
198
- let install_path = installed_bin_path ( & install_dir) ;
199
- if !install_path. exists ( ) {
200
- tracing:: info!( "Installing wasm-opt" ) ;
201
- install_github ( & install_dir) . await ?;
202
- tracing:: info!( "wasm-opt installed from Github" ) ;
203
- }
204
- Ok ( install_path)
205
+ let install_dir = install_dir ( ) ;
206
+ let install_path = installed_bin_path ( & install_dir) ;
207
+
208
+ if install_path. exists ( ) {
209
+ return Ok ( install_path) ;
210
+ }
211
+
212
+ if CliSettings :: prefer_no_downloads ( ) {
213
+ if let Ok ( existing) = which:: which ( "wasm-opt" ) {
214
+ return Ok ( existing) ;
215
+ } else {
216
+ return Err ( anyhow ! ( "Missing wasm-opt" ) ) ;
205
217
}
206
218
}
219
+
220
+ tracing:: info!( "Installing wasm-opt" ) ;
221
+ install_github ( & install_dir) . await ?;
222
+ tracing:: info!( "wasm-opt installed from Github" ) ;
223
+
224
+ Ok ( install_path)
207
225
}
208
226
209
- async fn install_dir ( ) -> anyhow:: Result < PathBuf > {
210
- let bindgen_dir = Workspace :: dioxus_home_dir ( ) . join ( "binaryen" ) ;
211
- fs:: create_dir_all ( & bindgen_dir) . await ?;
212
- Ok ( bindgen_dir)
227
+ fn install_dir ( ) -> PathBuf {
228
+ Workspace :: dioxus_home_dir ( ) . join ( "binaryen" )
213
229
}
214
230
215
231
fn installed_bin_name ( ) -> & ' static str {
@@ -221,14 +237,15 @@ fn installed_bin_name() -> &'static str {
221
237
}
222
238
223
239
fn installed_bin_path ( install_dir : & Path ) -> PathBuf {
224
- let bin_name = installed_bin_name ( ) ;
225
- install_dir. join ( "bin" ) . join ( bin_name)
240
+ install_dir. join ( "bin" ) . join ( installed_bin_name ( ) )
226
241
}
227
242
228
243
/// Install wasm-opt from GitHub releases into the specified directory
229
244
async fn install_github ( install_dir : & Path ) -> anyhow:: Result < ( ) > {
230
245
tracing:: trace!( "Attempting to install wasm-opt from GitHub" ) ;
231
246
247
+ std:: fs:: create_dir_all ( install_dir) ?;
248
+
232
249
let url = find_latest_wasm_opt_download_url ( )
233
250
. await
234
251
. context ( "Failed to find latest wasm-opt download URL" ) ?;
0 commit comments