From 355266988d929b6aa31f3233ede5d90ec3adf727 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Thu, 15 May 2025 19:10:13 +0200 Subject: [PATCH] extension: Update wasi preview adapter (#30759) Replace dynamic downloading of WASI adapter with the provided crate. More importantly, this makes sure we are using the same adapter version as our version of wasmtime, which includes several fixes. Arguably we could also at this point update to wasm32-wasip2 target and remove this dependency as well if we want, but that might need further testing. Release Notes: - N/A --- Cargo.lock | 7 ++++ Cargo.toml | 1 + crates/extension/Cargo.toml | 1 + crates/extension/src/extension_builder.rs | 41 +++-------------------- 4 files changed, 14 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a87c638a5f19c17bc907be1c225897ea3b354fb9..6de9eb453e695da5b553e01e0367a9748c9099b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5065,6 +5065,7 @@ dependencies = [ "task", "toml 0.8.20", "util", + "wasi-preview1-component-adapter-provider", "wasm-encoder 0.221.3", "wasmparser 0.221.3", "wit-component 0.221.3", @@ -16211,6 +16212,12 @@ dependencies = [ "wit-bindgen-rt 0.39.0", ] +[[package]] +name = "wasi-preview1-component-adapter-provider" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcd9f21bbde82ba59e415a8725e6ad0d0d7e9e460b1a3ccbca5bdee952c1a324" + [[package]] name = "wasite" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 29a43d69c820e6afa1aa43b353fcf7b9ba30089a..97c076eb89d91ffc38d526cb86914354df7a5094 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -594,6 +594,7 @@ url = "2.2" urlencoding = "2.1.2" uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] } walkdir = "2.3" +wasi-preview1-component-adapter-provider = "29" wasm-encoder = "0.221" wasmparser = "0.221" wasmtime = { version = "29", default-features = false, features = [ diff --git a/crates/extension/Cargo.toml b/crates/extension/Cargo.toml index eae0147632dae1f91c71bb98f204e753767651e1..f712f837d35c2145a628f3126a101e75581d20d8 100644 --- a/crates/extension/Cargo.toml +++ b/crates/extension/Cargo.toml @@ -33,6 +33,7 @@ serde_json.workspace = true task.workspace = true toml.workspace = true util.workspace = true +wasi-preview1-component-adapter-provider.workspace = true wasm-encoder.workspace = true wasmparser.workspace = true wit-component.workspace = true diff --git a/crates/extension/src/extension_builder.rs b/crates/extension/src/extension_builder.rs index c6636f03d2bde4c0b2612819e2dfbcf6935761ff..34bf30363a9d24face15c4c6e8cccd7bf5b391b2 100644 --- a/crates/extension/src/extension_builder.rs +++ b/crates/extension/src/extension_builder.rs @@ -4,7 +4,6 @@ use crate::{ use anyhow::{Context as _, Result, anyhow, bail}; use async_compression::futures::bufread::GzipDecoder; use async_tar::Archive; -use futures::AsyncReadExt; use futures::io::BufReader; use heck::ToSnakeCase; use http_client::{self, AsyncBody, HttpClient}; @@ -15,6 +14,7 @@ use std::{ process::Stdio, sync::Arc, }; +use wasi_preview1_component_adapter_provider::WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER; use wasm_encoder::{ComponentSectionId, Encode as _, RawSection, Section as _}; use wasmparser::Parser; use wit_component::ComponentEncoder; @@ -26,7 +26,6 @@ use wit_component::ComponentEncoder; /// Once Rust 1.78 is released, there will be a `wasm32-wasip2` target available, so we will /// not need the adapter anymore. const RUST_TARGET: &str = "wasm32-wasip1"; -const WASI_ADAPTER_URL: &str = "https://github.com/bytecodealliance/wasmtime/releases/download/v18.0.2/wasi_snapshot_preview1.reactor.wasm"; /// Compiling Tree-sitter parsers from C to WASM requires Clang 17, and a WASM build of libc /// and clang's runtime library. The `wasi-sdk` provides these binaries. @@ -137,7 +136,6 @@ impl ExtensionBuilder { options: CompileExtensionOptions, ) -> Result<(), anyhow::Error> { self.install_rust_wasm_target_if_needed()?; - let adapter_bytes = self.install_wasi_preview1_adapter_if_needed().await?; let cargo_toml_content = fs::read_to_string(extension_dir.join("Cargo.toml"))?; let cargo_toml: CargoToml = toml::from_str(&cargo_toml_content)?; @@ -186,7 +184,10 @@ impl ExtensionBuilder { let mut encoder = ComponentEncoder::default() .module(&wasm_bytes)? - .adapter("wasi_snapshot_preview1", &adapter_bytes) + .adapter( + "wasi_snapshot_preview1", + WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER, + ) .context("failed to load adapter module")? .validate(true); @@ -395,38 +396,6 @@ impl ExtensionBuilder { Ok(()) } - async fn install_wasi_preview1_adapter_if_needed(&self) -> Result> { - let cache_path = self.cache_dir.join("wasi_snapshot_preview1.reactor.wasm"); - if let Ok(content) = fs::read(&cache_path) { - if Parser::is_core_wasm(&content) { - return Ok(content); - } - } - - fs::remove_file(&cache_path).ok(); - - log::info!( - "downloading wasi adapter module to {}", - cache_path.display() - ); - let mut response = self - .http - .get(WASI_ADAPTER_URL, AsyncBody::default(), true) - .await?; - - let mut content = Vec::new(); - let mut body = BufReader::new(response.body_mut()); - body.read_to_end(&mut content).await?; - - fs::write(&cache_path, &content) - .with_context(|| format!("failed to save file {}", cache_path.display()))?; - - if !Parser::is_core_wasm(&content) { - bail!("downloaded wasi adapter is invalid"); - } - Ok(content) - } - async fn install_wasi_sdk_if_needed(&self) -> Result { let url = if let Some(asset_name) = WASI_SDK_ASSET_NAME { format!("{WASI_SDK_URL}/{asset_name}")