@@ -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"
@@ -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 = [
@@ -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
@@ -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<Vec<u8>> {
- 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<PathBuf> {
let url = if let Some(asset_name) = WASI_SDK_ASSET_NAME {
format!("{WASI_SDK_URL}/{asset_name}")