add new context.rs to separate the code a little

This commit is contained in:
Ivan Folgueira Bande 2024-11-22 14:20:35 +01:00
parent e86b325bc9
commit 14aca7f403
No known key found for this signature in database
GPG Key ID: 3C117481F89E24A7
8 changed files with 56 additions and 55 deletions

View File

@ -0,0 +1,48 @@
use std::ffi::c_void;
use std::sync::{Arc, Mutex};
use crate::utils::{get_trampoline, LibwakuResponse};
pub struct WakuNodeContext {
obj_ptr: *mut c_void,
msg_observer: Arc<Mutex<Box<dyn FnMut(LibwakuResponse) + Send + Sync>>>,
}
impl WakuNodeContext {
pub fn new(obj_ptr: *mut c_void) -> Self {
Self {
obj_ptr: obj_ptr,
msg_observer: Arc::new(Mutex::new(Box::new(|_response| {
println!("msg observer not set")
}))),
}
}
pub fn get_ptr(&self) -> *mut c_void {
self.obj_ptr
}
/// Register callback to act as event handler and receive application events,
/// which are used to react to asynchronous events in Waku
pub fn waku_set_event_callback<F: FnMut(LibwakuResponse) + 'static + Sync + Send>(
&self,
closure: F,
) -> Result<(), String> {
if let Ok(mut boxed_closure) = self.msg_observer.lock() {
*boxed_closure = Box::new(closure);
unsafe {
let cb = get_trampoline(&(*boxed_closure));
waku_sys::waku_set_event_callback(
self.obj_ptr,
cb,
&mut (*boxed_closure) as *mut _ as *mut c_void,
)
};
Ok(())
} else {
Err(format!(
"Failed to acquire lock in waku_set_event_callback!"
))
}
}
}

View File

@ -4,24 +4,14 @@
//! An example of an asynchronous event that might be emitted is receiving a message.
//! When an event is emitted, this callback will be triggered receiving an [`Event`]
// std
use std::ffi::c_void;
// crates
use serde::{Deserialize, Serialize};
// internal
use crate::general::WakuMessage;
use std::str;
use crate::utils::{get_trampoline, LibwakuResponse};
use crate::MessageHash;
use std::sync::{Arc, Mutex};
pub struct WakuNodeContext {
obj_ptr: *mut c_void,
msg_observer: Arc<Mutex<Box<dyn FnMut(LibwakuResponse) + Send + Sync>>>,
}
/// Waku event
/// For now just WakuMessage is supported
#[non_exhaustive]
@ -45,45 +35,6 @@ pub struct WakuMessageEvent {
pub waku_message: WakuMessage,
}
impl WakuNodeContext {
pub fn new(obj_ptr: *mut c_void) -> Self {
Self {
obj_ptr: obj_ptr,
msg_observer: Arc::new(Mutex::new(Box::new(|_response| {
println!("msg observer not set")
}))),
}
}
pub fn get_ptr(&self) -> *mut c_void {
self.obj_ptr
}
/// Register callback to act as event handler and receive application events,
/// which are used to react to asynchronous events in Waku
pub fn waku_set_event_callback<F: FnMut(LibwakuResponse) + 'static + Sync + Send>(
&self,
closure: F,
) -> Result<(), String> {
if let Ok(mut boxed_closure) = self.msg_observer.lock() {
*boxed_closure = Box::new(closure);
unsafe {
let cb = get_trampoline(&(*boxed_closure));
waku_sys::waku_set_event_callback(
self.obj_ptr,
cb,
&mut (*boxed_closure) as *mut _ as *mut c_void,
)
};
Ok(())
} else {
Err(format!(
"Failed to acquire lock in waku_set_event_callback!"
))
}
}
}
#[cfg(test)]
mod tests {
use crate::Event;

View File

@ -6,7 +6,7 @@ use std::ffi::CString;
use libc::*;
// internal
use crate::general::Result;
use crate::node::events::WakuNodeContext;
use crate::node::context::WakuNodeContext;
use crate::utils::{get_trampoline, handle_no_response, LibwakuResponse};
pub fn waku_filter_subscribe(

View File

@ -6,7 +6,7 @@ use std::ffi::CString;
use libc::*;
// internal
use crate::general::{MessageHash, Result, WakuMessage};
use crate::node::events::WakuNodeContext;
use crate::node::context::WakuNodeContext;
use crate::utils::{get_trampoline, handle_response, LibwakuResponse};
pub fn waku_lightpush_publish_message(

View File

@ -8,7 +8,7 @@ use multiaddr::Multiaddr;
// internal
use super::config::WakuNodeConfig;
use crate::general::Result;
use crate::node::events::WakuNodeContext;
use crate::node::context::WakuNodeContext;
use crate::utils::LibwakuResponse;
use crate::utils::WakuDecode;
use crate::utils::{get_trampoline, handle_json_response, handle_no_response, handle_response};

View File

@ -1,6 +1,7 @@
//! Waku node implementation
mod config;
mod context;
mod events;
mod filter;
mod lightpush;
@ -18,7 +19,8 @@ use crate::general::{MessageHash, Result, WakuMessage};
pub use config::RLNConfig;
pub use config::WakuNodeConfig;
pub use events::{Event, WakuMessageEvent, WakuNodeContext};
pub use context::WakuNodeContext;
pub use events::{Event, WakuMessageEvent};
pub use relay::waku_create_content_topic;
use crate::Encoding;

View File

@ -8,7 +8,7 @@ use libc::*;
use multiaddr::Multiaddr;
// internal
use crate::general::Result;
use crate::node::events::WakuNodeContext;
use crate::node::context::WakuNodeContext;
use crate::utils::LibwakuResponse;
use crate::utils::{get_trampoline, handle_no_response};

View File

@ -7,7 +7,7 @@ use std::time::Duration;
use libc::*;
// internal
use crate::general::{Encoding, MessageHash, Result, WakuContentTopic, WakuMessage};
use crate::node::events::WakuNodeContext;
use crate::node::context::WakuNodeContext;
use crate::utils::{get_trampoline, handle_no_response, handle_response, LibwakuResponse};
/// Create a content topic according to [RFC 23](https://rfc.vac.dev/spec/23/)