From 9b314f9f30c2fe6b8455b49b04058a6d4d939cc6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pit-claudel@epfl.ch>
Date: Fri, 27 Dec 2024 23:59:15 +0100
Subject: [PATCH] server: Detect channel closure and disconnect client

Not all channel closures come with a .Close() message.  Not processing channel
closures meant that we left dangling channels that then created long streams of
error messages every time we tried to send to them.

This commit fixes that issue, but not the stack traces printed by the tests
introduced in 8a6361a.

Co-authored-by: @azuz.
---
 jvm/src/main/scala/cs214/webapp/server/web/ServerApp.scala | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/jvm/src/main/scala/cs214/webapp/server/web/ServerApp.scala b/jvm/src/main/scala/cs214/webapp/server/web/ServerApp.scala
index 021e7b5..d57b4fe 100644
--- a/jvm/src/main/scala/cs214/webapp/server/web/ServerApp.scala
+++ b/jvm/src/main/scala/cs214/webapp/server/web/ServerApp.scala
@@ -89,6 +89,9 @@ private[web] abstract class ServerApp:
         case cask.Ws.Close(code, reason) =>
           println(f"[${appInfo.id}/$instanceId/$userId] close: $code/$reason")
           disconnect(userId, channel)
+        case cask.Ws.ChannelClosed() =>
+          println(f"[${appInfo.id}/$instanceId/$userId] channel closed")
+          disconnect(userId, channel)
         case cask.Ws.Text(data) =>
           handleMessage(userId, ujson.read(data))
       }
-- 
GitLab