diff --git a/src/dispatcher.rs b/src/dispatcher.rs index 671ef0f..30c8767 100644 --- a/src/dispatcher.rs +++ b/src/dispatcher.rs @@ -554,6 +554,27 @@ impl Dispatcher { } } } + + fn on_foreign_function( + &self, + context_id: u32, + function_id: u32, + arugments_size: usize, + ) { + if let Some(http_stream) = self.http_streams.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + http_stream.on_foreign_function(function_id, arugments_size) + } else if let Some(stream) = self.streams.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + stream.on_foreign_function(function_id, arugments_size) + } else if let Some(root) = self.roots.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + root.on_foreign_function(function_id, arugments_size) + } + } } #[no_mangle] @@ -722,3 +743,14 @@ pub extern "C" fn proxy_on_grpc_receive_trailing_metadata( pub extern "C" fn proxy_on_grpc_close(_context_id: u32, token_id: u32, status_code: u32) { DISPATCHER.with(|dispatcher| dispatcher.on_grpc_close(token_id, status_code)) } + +#[no_mangle] +pub extern "C" fn proxy_on_foreign_function( + context_id: u32, + function_id: u32, + arguments_size: usize, +) { + DISPATCHER.with(|dispatcher| { + dispatcher.on_foreign_function(context_id, function_id, arguments_size) + }) +} diff --git a/src/traits.rs b/src/traits.rs index bd54bcb..7945340 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -197,6 +197,13 @@ pub trait Context { hostcalls::get_grpc_status().unwrap() } + fn on_foreign_function( + &mut self, + _function_id: u32, + _arguments_size: usize, + ) { + } + fn call_foreign_function( &self, function_name: &str, diff --git a/src/types.rs b/src/types.rs index 7407d3c..4272ba9 100644 --- a/src/types.rs +++ b/src/types.rs @@ -81,6 +81,7 @@ pub enum BufferType { GrpcReceiveBuffer = 5, VmConfiguration = 6, PluginConfiguration = 7, + CallData = 8, } #[repr(u32)]