From a259a685eeace399655b77b110d3b1edc7187d45 Mon Sep 17 00:00:00 2001 From: Maxime Augier <max@xolus.net> Date: Mon, 5 Aug 2024 15:39:42 +0200 Subject: [PATCH] Expect multiple SignalR messages per WebSocket message --- src/stream.rs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/stream.rs b/src/stream.rs index f09e2c0..ee86f68 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -31,9 +31,6 @@ pub enum RecvError { #[error("Bad message type")] BadMessageType, - #[error("Not a SignalR message: {0:?}")] - NotSignalRMessage(String), - #[error("Invalid json: {0}")] InvalidJson(#[from] serde_json::Error), @@ -41,7 +38,9 @@ pub enum RecvError { TungsteniteError(#[from] tungstenite::Error), } -pub struct Stream { sock: WebSocket<MaybeTlsStream<TcpStream>> } +pub struct Stream { + sock: WebSocket<MaybeTlsStream<TcpStream>>, +} impl Stream { pub fn open(ctx: &mut Context) -> Result<Stream, NegotiateError> { @@ -88,15 +87,15 @@ impl Stream { self.sock.send(Message::Text(msg)) } - pub fn recv(&mut self) -> Result<serde_json::Value, RecvError> { + pub fn recv(&mut self) -> Result<Vec<serde_json::Value>, RecvError> { let msg = self.sock.read()?; let Message::Text(txt) = msg else { return Err(RecvError::BadMessageType) }; - let json: &str = match txt.strip_suffix("\x1E") { - None => return Err(RecvError::NotSignalRMessage(txt)), - Some(json) => json - }; - dbg!(&json); - Ok(serde_json::from_str(json)?) + + let msgs = txt.split_terminator('\x1E') + .filter_map(|s| serde_json::from_str(s).ok()) + .collect(); + + Ok(msgs) } pub fn subscribe(&mut self, id: &str) -> Result<(), tungstenite::Error> {