From 92db82934c4011be8185f4b4db83c87ed41d1daf Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Wed, 18 Dec 2024 00:23:27 +0800 Subject: [PATCH] feat: webrtc leave --- server/handlers/websocket.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/server/handlers/websocket.go b/server/handlers/websocket.go index 81ac04b2..9d23e56e 100644 --- a/server/handlers/websocket.go +++ b/server/handlers/websocket.go @@ -38,6 +38,14 @@ func NewWebSocketHandler(wss *utils.WebSocket) gin.HandlerFunc { } } +func isNormalCloseError(err error) bool { + var we *websocket.CloseError + if !errors.As(err, &we) { + return false + } + return we.Code == websocket.CloseNormalClosure +} + func NewWSMessageHandler(u *op.User, r *op.Room, l *log.Entry) func(c *websocket.Conn) error { return func(c *websocket.Conn) error { client, err := r.NewClient(u, c) @@ -67,6 +75,9 @@ func NewWSMessageHandler(u *op.User, r *op.Room, l *log.Entry) func(c *websocket go func() { if err := handleReaderMessage(client, l); err != nil { + if isNormalCloseError(err) { + return + } l.Errorf("ws: handle reader message error: %v", err) } }() @@ -117,6 +128,21 @@ func writeMessage(c *op.Client, v op.Message) error { func handleReaderMessage(c *op.Client, l *log.Entry) error { defer func() { + if c.RTCJoined() { + c.SetRTCJoined(false) + _ = c.Broadcast(&pb.Message{ + Type: pb.MessageType_WEBRTC_LEAVE, + Sender: &pb.Sender{ + Username: c.User().Username, + UserId: c.User().ID, + }, + Payload: &pb.Message_WebrtcData{ + WebrtcData: &pb.WebRTCData{ + From: fmt.Sprintf("%s:%s", c.User().ID, c.ConnID()), + }, + }, + }) + } c.Close() if r := recover(); r != nil { l.Errorf("ws: panic: %v", r) @@ -126,6 +152,9 @@ func handleReaderMessage(c *op.Client, l *log.Entry) error { for { msg, err := readMessage(c) if err != nil { + if isNormalCloseError(err) { + return nil + } l.Errorf("ws: read message error: %v", err) return err }