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 a87c638a5f..6de9eb453e 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 29a43d69c8..97c076eb89 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 eae0147632..f712f837d3 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 c6636f03d2..34bf30363a 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}")