diff --git a/src/dispatcher.rs b/src/dispatcher.rs index 671ef0f..1974256 100644 --- a/src/dispatcher.rs +++ b/src/dispatcher.rs @@ -554,6 +554,22 @@ 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 +738,13 @@ 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 e0ae947..065e836 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -197,6 +197,8 @@ 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)]