pub trait Captures<'a> {}
impl<'a, T> Captures<'a> for T {}
fn handle_message<'a: 'c,'b: 'c,'c> (
message: &'a Message,
//send_msg: &'b Fn(Message) -> Result<(), SendError<Message>>
sink: &'b mut Sink<SinkItem = Message, SinkError = Error>
) -> impl Future<Output = ()> + Captures<'a> + Captures<'b> + 'c {
async move {
let result = if let Ok(message_body) = message.to_text() {
sink.start_send(Message::from(message_body));
};
}
}
async fn handle_stream(ws_stream: WebSocketStream<TcpStream>) {
let (mut sink, mut stream) = ws_stream.split();
tokio::spawn_async(
async move {
let _ = sink.start_send(Message::from("Hello World!"));
while let Some(message) = await!(stream.next()) {
let message = message.unwrap();
await!(handle_message(&message, &mut sink));
}
}
)
}
outputs this error
error[E0277]: `dyn futures::sink::Sink<SinkError=tungstenite::error::Error, SinkItem=tungstenite::protocol::message::Message>` cannot be sent between threads safely
--> server\src\game_server\mod.rs:62:22
|
20 | let thread = tokio::spawn_async(
| ^^^^^^^^^^^^^^^^^^ `dyn futures::sink::Sink<SinkError=tungstenite::error::Error, SinkItem=tungstenite::protocol::message::Message>` cannot be sent between threads safely
|
Interestingly, if the call to handle message is substituted with
async {
let result = if let Ok(message_body) = message.to_text() {
sink.start_send(Message::from(message_body));
};
}
the program compiles.
Any idea why putting that code into its own method triggers an error, and what I can do to rectify it?