From 6142a4905f979afb754c726614761b05c93ee21f Mon Sep 17 00:00:00 2001 From: Jure Bogunovic Date: Wed, 17 May 2023 14:57:37 +0200 Subject: [PATCH 1/2] split core Client trait into Invoker + WrapLoader + WrapInvoker + UriResolverHandler --- packages/client/src/client.rs | 81 ++++++++++++++++--------------- packages/client/src/subinvoker.rs | 3 ++ packages/core/src/client.rs | 27 ++--------- packages/core/src/invoker.rs | 5 +- packages/core/src/lib.rs | 2 + packages/core/src/wrap_invoker.rs | 13 +++++ packages/core/src/wrap_loader.rs | 11 +++++ packages/native/src/client.rs | 2 +- 8 files changed, 81 insertions(+), 63 deletions(-) create mode 100644 packages/core/src/wrap_invoker.rs create mode 100644 packages/core/src/wrap_loader.rs diff --git a/packages/client/src/client.rs b/packages/client/src/client.rs index 87f78ead8..67c5a09ec 100644 --- a/packages/client/src/client.rs +++ b/packages/client/src/client.rs @@ -12,7 +12,7 @@ use polywrap_core::{ uri_resolver::{UriResolver, UriResolverHandler}, helpers::get_env_from_resolution_path, }, uri::Uri, - wrapper::Wrapper, + wrapper::Wrapper, wrap_loader::WrapLoader, wrap_invoker::WrapInvoker, }; use polywrap_msgpack::decode; use serde::de::DeserializeOwned; @@ -148,9 +148,7 @@ impl Invoker for PolywrapClient { None } -} -impl Client for PolywrapClient { fn get_env_by_uri(&self, uri: &Uri) -> Option<&Env> { if let Some(envs) = &self.envs { return envs.get(&uri.to_string()); @@ -158,44 +156,48 @@ impl Client for PolywrapClient { None } +} +impl WrapLoader for PolywrapClient { fn load_wrapper( - &self, - uri: &Uri, - resolution_context: Option<&mut UriResolutionContext>, - ) -> Result, Error> { - let mut empty_res_context = UriResolutionContext::new(); - let mut resolution_context = match resolution_context { - None => &mut empty_res_context, - Some(ctx) => ctx, - }; - - let uri_package_or_wrapper = self - .try_resolve_uri(uri, Some(&mut resolution_context)) - .map_err(|e| Error::ResolutionError(e.to_string()))?; - - match uri_package_or_wrapper { - UriPackageOrWrapper::Uri(uri) => Err(Error::ResolutionError(format!( - "Failed to resolve wrapper: {uri}" - ))), - UriPackageOrWrapper::Wrapper(_, wrapper) => Ok(wrapper), - UriPackageOrWrapper::Package(_, package) => { - let wrapper = package - .create_wrapper() - .map_err(|e| Error::WrapperCreateError(e.to_string()))?; - Ok(wrapper) - } - } + &self, + uri: &Uri, + resolution_context: Option<&mut UriResolutionContext>, + ) -> Result, Error> { + let mut empty_res_context = UriResolutionContext::new(); + let mut resolution_context = match resolution_context { + None => &mut empty_res_context, + Some(ctx) => ctx, + }; + + let uri_package_or_wrapper = self + .try_resolve_uri(uri, Some(&mut resolution_context)) + .map_err(|e| Error::ResolutionError(e.to_string()))?; + + match uri_package_or_wrapper { + UriPackageOrWrapper::Uri(uri) => Err(Error::ResolutionError(format!( + "Failed to resolve wrapper: {uri}" + ))), + UriPackageOrWrapper::Wrapper(_, wrapper) => Ok(wrapper), + UriPackageOrWrapper::Package(_, package) => { + let wrapper = package + .create_wrapper() + .map_err(|e| Error::WrapperCreateError(e.to_string()))?; + Ok(wrapper) + } + } } +} +impl WrapInvoker for PolywrapClient { fn invoke_wrapper_raw( - &self, - wrapper: &dyn Wrapper, - uri: &Uri, - method: &str, - args: Option<&[u8]>, - env: Option<&Env>, - resolution_context: Option<&mut UriResolutionContext>, + &self, + wrapper: &dyn Wrapper, + uri: &Uri, + method: &str, + args: Option<&[u8]>, + env: Option<&Env>, + resolution_context: Option<&mut UriResolutionContext>, ) -> Result, Error> { let mut empty_res_context = UriResolutionContext::new(); let resolution_context = match resolution_context { @@ -252,11 +254,14 @@ impl UriResolverHandler for PolywrapClient { } } +impl Client for PolywrapClient { +} + #[cfg(test)] mod client_tests { use crate::client::Env; use polywrap_core::{ - client::{ClientConfig, Client}, + client::ClientConfig, error::Error, invoker::Invoker, resolvers::{ @@ -264,7 +269,7 @@ mod client_tests { uri_resolver::{UriResolver, UriResolverHandler}, }, uri::Uri, - wrapper::{GetFileOptions, Wrapper}, + wrapper::{GetFileOptions, Wrapper}, wrap_loader::WrapLoader, }; use std::sync::Arc; diff --git a/packages/client/src/subinvoker.rs b/packages/client/src/subinvoker.rs index 8868aeb31..75369a535 100644 --- a/packages/client/src/subinvoker.rs +++ b/packages/client/src/subinvoker.rs @@ -40,4 +40,7 @@ impl Invoker for Subinvoker { fn get_interfaces(&self) -> Option { self.invoker.get_interfaces() } + fn get_env_by_uri(&self, uri: &Uri) -> Option<&Env> { + self.invoker.get_env_by_uri(uri) + } } diff --git a/packages/core/src/client.rs b/packages/core/src/client.rs index 8656ee5a6..1645ba03a 100644 --- a/packages/core/src/client.rs +++ b/packages/core/src/client.rs @@ -1,13 +1,12 @@ use std::sync::Arc; -use crate::error::Error; -use crate::invoker::Invoker; -use crate::resolvers::uri_resolution_context::UriResolutionContext; use crate::uri::Uri; use crate::interface_implementation::InterfaceImplementations; use crate::resolvers::uri_resolver::{UriResolverHandler, UriResolver}; -use crate::env::{Envs, Env}; -use crate::wrapper::Wrapper; +use crate::env::Envs; +use crate::invoker::Invoker; +use crate::wrap_invoker::WrapInvoker; +use crate::wrap_loader::WrapLoader; #[derive(Clone,Debug)] pub struct UriRedirect { @@ -28,20 +27,4 @@ pub struct ClientConfig { pub interfaces: Option } -pub trait Client: Invoker + UriResolverHandler { - fn get_env_by_uri(&self, uri: &Uri) -> Option<&Env>; - fn load_wrapper( - &self, - uri: &Uri, - resolution_context: Option<&mut UriResolutionContext>, - ) -> Result, Error>; - fn invoke_wrapper_raw( - &self, - wrapper: &dyn Wrapper, - uri: &Uri, - method: &str, - args: Option<&[u8]>, - env: Option<&Env>, - resolution_context: Option<&mut UriResolutionContext>, -) -> Result, Error>; -} +pub trait Client: Invoker + WrapLoader + WrapInvoker + UriResolverHandler {} diff --git a/packages/core/src/invoker.rs b/packages/core/src/invoker.rs index c1e491603..00707de41 100644 --- a/packages/core/src/invoker.rs +++ b/packages/core/src/invoker.rs @@ -1,7 +1,7 @@ use crate::{ - error::Error, uri::Uri, resolvers::uri_resolution_context::UriResolutionContext, env::{Env}, interface_implementation::InterfaceImplementations, + error::Error, uri::Uri, resolvers::uri_resolution_context::UriResolutionContext, env::Env, + interface_implementation::InterfaceImplementations, }; - pub trait Invoker: Send + Sync { fn invoke_raw( &self, @@ -13,4 +13,5 @@ pub trait Invoker: Send + Sync { ) -> Result, Error>; fn get_implementations(&self, uri: &Uri) -> Result, Error>; fn get_interfaces(&self) -> Option; + fn get_env_by_uri(&self, uri: &Uri) -> Option<&Env>; } diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index 26ae84030..7a572be88 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -3,6 +3,8 @@ pub mod error; pub mod client; pub mod wrapper; pub mod invoker; +pub mod wrap_loader; +pub mod wrap_invoker; pub mod redirects; pub mod package; pub mod file_reader; diff --git a/packages/core/src/wrap_invoker.rs b/packages/core/src/wrap_invoker.rs new file mode 100644 index 000000000..22270bc01 --- /dev/null +++ b/packages/core/src/wrap_invoker.rs @@ -0,0 +1,13 @@ +use crate::{resolvers::uri_resolution_context::UriResolutionContext, error::Error, wrapper::Wrapper, uri::Uri, env::Env}; + +pub trait WrapInvoker: Send + Sync { + fn invoke_wrapper_raw( + &self, + wrapper: &dyn Wrapper, + uri: &Uri, + method: &str, + args: Option<&[u8]>, + env: Option<&Env>, + resolution_context: Option<&mut UriResolutionContext>, + ) -> Result, Error>; +} diff --git a/packages/core/src/wrap_loader.rs b/packages/core/src/wrap_loader.rs new file mode 100644 index 000000000..2026d0244 --- /dev/null +++ b/packages/core/src/wrap_loader.rs @@ -0,0 +1,11 @@ +use std::sync::Arc; + +use crate::{resolvers::uri_resolution_context::UriResolutionContext, error::Error, wrapper::Wrapper, uri::Uri}; + +pub trait WrapLoader: Send + Sync { + fn load_wrapper( + &self, + uri: &Uri, + resolution_context: Option<&mut UriResolutionContext>, + ) -> Result, Error>; +} diff --git a/packages/native/src/client.rs b/packages/native/src/client.rs index 1d8f4d0d0..bc1348a1f 100644 --- a/packages/native/src/client.rs +++ b/packages/native/src/client.rs @@ -93,7 +93,7 @@ impl FFIClient { &_decoded_env }); - self.inner_client.invoke_wrapper_raw(wrapper.0.clone(), uri.as_ref(), method, args, env, None) + self.inner_client.invoke_wrapper_raw(&*wrapper.0.clone(), uri.as_ref(), method, args, env, None) } pub fn load_wrapper(&self, uri: Arc) -> Result, Error> { From d6930fecdf416a006e0e1664e962564bef4c443c Mon Sep 17 00:00:00 2001 From: Jure Bogunovic Date: Thu, 18 May 2023 16:16:49 +0200 Subject: [PATCH 2/2] fixed tests --- packages/wasm/tests/test_runtime.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/wasm/tests/test_runtime.rs b/packages/wasm/tests/test_runtime.rs index 9c040c85f..19936f642 100644 --- a/packages/wasm/tests/test_runtime.rs +++ b/packages/wasm/tests/test_runtime.rs @@ -71,6 +71,10 @@ impl Invoker for MockInvoker { let i = HashMap::new(); Some(i) } + + fn get_env_by_uri(&self, _: &Uri) -> Option<&Env> { + None + } } #[test]