use futures_util::FutureExt;
use wasm_bindgen_test::*;
#[web_rpc::service]
pub trait Greeter {
fn greet(&self, name: &str, greeting: &str) -> String;
fn count_bytes(&self, data: &[u8]) -> usize;
fn mixed(&self, name: &str, id: u32) -> String;
fn notify(&self, message: &str);
}
struct GreeterServiceImpl;
impl Greeter for GreeterServiceImpl {
fn greet(&self, name: &str, greeting: &str) -> String {
format!("{greeting}, {name}!")
}
fn count_bytes(&self, data: &[u8]) -> usize {
data.len()
}
fn mixed(&self, name: &str, id: u32) -> String {
format!("{name}#{id}")
}
fn notify(&self, _message: &str) {}
}
#[wasm_bindgen_test]
async fn borrowing() {
console_error_panic_hook::set_once();
let channel = web_sys::MessageChannel::new().unwrap();
let (server_interface, client_interface) = futures_util::future::join(
web_rpc::Interface::new(channel.port1()),
web_rpc::Interface::new(channel.port2()),
)
.await;
let (server, _server_handle) = web_rpc::Builder::new(server_interface)
.with_service::<GreeterService<_>>(GreeterServiceImpl)
.build()
.remote_handle();
wasm_bindgen_futures::spawn_local(server);
let client = web_rpc::Builder::new(client_interface)
.with_client::<GreeterClient>()
.build();
assert_eq!(client.greet("World", "Hello").await, "Hello, World!");
assert_eq!(client.count_bytes(&[1, 2, 3, 4, 5]).await, 5);
assert_eq!(client.mixed("Alice", 42).await, "Alice#42");
client.notify("test");
}