Crates.io | holochain_websocket |
lib.rs | holochain_websocket |
version | 0.5.0-dev.4 |
source | src |
created_at | 2021-06-30 22:02:12.427627 |
updated_at | 2024-11-06 02:18:58.750054 |
description | Holochain utilities for serving and connection with websockets |
homepage | https://github.com/holochain/holochain |
repository | |
max_upload_size | |
id | 417144 |
size | 63,684 |
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.
use holochain_serialized_bytes::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.try_into().unwrap();
// If this message is a request then we can respond
if resp.is_request() {
let msg = TestMessage(format!("echo: {}", msg.0));
resp.respond(msg.try_into().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,);
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.
Copyright (C) 2019 - 2024, Holochain Foundation
License: Apache-2.0