holochain_websocket

Holochain utilities for websocket serving and connecting.

To establish an outgoing connection, use [connect] which will return a tuple ([WebsocketSender], [WebsocketReceiver])

To open a listening socket, use [WebsocketListener::bind] which will give you a [WebsocketListener] which is an async Stream whose items resolve to that same tuple ( WebsocketSender, WebsocketReceiver ).

If you want to be able to shutdown the stream use [WebsocketListener::bind_with_handle] which will give you a tuple ([ListenerHandle], [ListenerStream]). You can use [ListenerHandle::close] to close immediately or [ListenerHandle::close_on] to close on a future completing.

Example

```rust use holochainserializedbytes::prelude::; use holochain_websocket::;

use std::convert::TryInto; use tokio_stream::StreamExt; use url2::prelude::*;

[derive(serde::Serialize, serde::Deserialize, SerializedBytes, Debug)]

struct TestMessage(pub String);

// Create a new server listening for connections let mut server = WebsocketListener::bind( url2!("ws://127.0.0.1:0"), std::sync::Arc::new(WebsocketConfig::default()), ) .await .unwrap();

// Get the address of the server let binding = server.local_addr().clone();

tokio::task::spawn(async move { // Handle new connections while let Some(Ok((send, mut recv))) = server.next().await { tokio::task::spawn(async move { // Receive a message and echo it back if let Some((msg, resp)) = recv.next().await { // Deserialize the message let msg: TestMessage = msg.tryinto().unwrap(); // If this message is a request then we can respond if resp.isrequest() { let msg = TestMessage(format!("echo: {}", msg.0)); resp.respond(msg.tryinto().unwrap()).await.unwrap(); } } }); } });

// Connect the client to the server let (mut send, _recv) = connect(binding, std::sync::Arc::new(WebsocketConfig::default())) .await .unwrap();

let msg = TestMessage("test".to_string()); // Make a request and get the echoed response let rsp: TestMessage = send.request(msg).await.unwrap();

assert_eq!("echo: test", &rsp.0,); ```

Contribute

Holochain is an open source project. We welcome all sorts of participation and are actively working on increasing surface area to accept it. Please see our contributing guidelines for our general practices and protocols on participating in the community, as well as specific expectations around things like code formatting, testing practices, continuous integration, etc.

License

License: Apache-2.0

Copyright (C) 2019 - 2022, Holochain Foundation

License: Apache-2.0