diff --git a/fableous-be/handlers/session.go b/fableous-be/handlers/session.go index 39ba4feb..27bbf893 100644 --- a/fableous-be/handlers/session.go +++ b/fableous-be/handlers/session.go @@ -16,7 +16,7 @@ import ( func (m *module) SessionGetAllByClassroomID(classroomID string) (sessionInfos []datatransfers.SessionInfo, err error) { var sessions []models.Session sessionInfos = make([]datatransfers.SessionInfo, 0) - if sessions, err = m.db.sessionOrmer.GetAllByClassroomID(classroomID); err == gorm.ErrRecordNotFound { + if sessions, err = m.db.sessionOrmer.GetAllCompletedByClassroomID(classroomID); err == gorm.ErrRecordNotFound { return sessionInfos, nil } else if err != nil { return sessionInfos, err diff --git a/fableous-be/handlers/websocket.go b/fableous-be/handlers/websocket.go index f5873c0c..1094b6ce 100644 --- a/fableous-be/handlers/websocket.go +++ b/fableous-be/handlers/websocket.go @@ -230,7 +230,9 @@ func (m *module) HubCommandWorker(conn *websocket.Conn, sess *activeSession) (er // check if CONTROL message clears a controller's canvas if clearedController := message.Data.(*pb.WSMessage_Control).Control.Clear; clearedController != pb.ControllerRole_NONE { _ = utils.SendMessage(sess.hubConn, message) - _ = utils.SendMessage(sess.controllerConn[clearedController], message) + if targetConn, ok := sess.controllerConn[clearedController]; ok { + _ = utils.SendMessage(targetConn, message) + } } // check if CONTROL message kicks a controller if kickedController := message.Data.(*pb.WSMessage_Control).Control.Kick; kickedController != pb.ControllerRole_NONE { diff --git a/fableous-be/utils/websocket.go b/fableous-be/utils/websocket.go index ce7f2481..f5a2766e 100644 --- a/fableous-be/utils/websocket.go +++ b/fableous-be/utils/websocket.go @@ -3,6 +3,7 @@ package utils import ( "encoding/base64" "strings" + "sync" "github.com/gorilla/websocket" "google.golang.org/protobuf/proto" @@ -10,12 +11,19 @@ import ( pb "github.com/deco-finter/fableous/fableous-be/protos" ) +var sendMutex sync.Mutex + // SendMessage sends a message to the WebSocket client. func SendMessage(conn *websocket.Conn, message *pb.WSMessage) (err error) { + if conn == nil { + return + } var bytes []byte if bytes, err = proto.Marshal(message); err != nil { return } + sendMutex.Lock() + defer sendMutex.Unlock() err = conn.WriteMessage(websocket.BinaryMessage, bytes) return }