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> {