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}")