diff --git a/wrappers/src/fdw/wasm_fdw/mod.rs b/wrappers/src/fdw/wasm_fdw/mod.rs index d6c2ed4e..4e530b19 100644 --- a/wrappers/src/fdw/wasm_fdw/mod.rs +++ b/wrappers/src/fdw/wasm_fdw/mod.rs @@ -14,6 +14,9 @@ use self::bindings::supabase::wrappers::types::FdwError as GuestFdwError; #[derive(Error, Debug)] enum WasmFdwError { + #[error("invalid WebAssembly component")] + InvalidWasmComponent, + #[error("guest fdw error: {0}")] GuestFdw(GuestFdwError), diff --git a/wrappers/src/fdw/wasm_fdw/wasm_fdw.rs b/wrappers/src/fdw/wasm_fdw/wasm_fdw.rs index 5dbc028b..edc8ee4d 100644 --- a/wrappers/src/fdw/wasm_fdw/wasm_fdw.rs +++ b/wrappers/src/fdw/wasm_fdw/wasm_fdw.rs @@ -33,6 +33,14 @@ fn check_version_requirement(ver_req: &str) -> WasmFdwResult<()> { Ok(()) } +// compiles a new WebAssembly component from a wasm file +fn load_component_from_file( + engine: &Engine, + file_path: impl AsRef, +) -> WasmFdwResult { + Component::from_file(engine, file_path).map_err(|_| WasmFdwError::InvalidWasmComponent) +} + // Download wasm component package from warg registry or custom url. // The url protoal can be 'file://', 'warg(s)://' or 'http(s)://'. fn download_component( @@ -44,7 +52,7 @@ fn download_component( checksum: Option<&str>, ) -> WasmFdwResult { if let Some(file_path) = url.strip_prefix("file://") { - return Ok(Component::from_file(engine, file_path)?); + return load_component_from_file(engine, file_path); } if url.starts_with("warg://") || url.starts_with("wargs://") { @@ -69,7 +77,7 @@ fn download_component( .block_on(client.download(&pkg_name, &ver))? .ok_or(format!("{}@{} not found on {}", name, version, url))?; - return Ok(Component::from_file(engine, pkg.path)?); + return load_component_from_file(engine, pkg.path); } // otherwise, download from custom url if it is not in local cache @@ -107,10 +115,10 @@ fn download_component( fs::write(&path, bytes)?; } - Ok(Component::from_file(engine, &path).inspect_err(|_| { + load_component_from_file(engine, &path).inspect_err(|_| { // remove the cache file if it cannot be loaded as component let _ = fs::remove_file(&path); - })?) + }) } #[wrappers_fdw(