diff --git a/cws/cws.go b/cws/cws.go index 42a484e3..56e393d5 100644 --- a/cws/cws.go +++ b/cws/cws.go @@ -68,6 +68,12 @@ func (c *Client) Send(request WSPacket, callback func(response WSPacket)) { // Wrap callback with sessionID and packetID if callback != nil { wrapperCallback := func(resp WSPacket) { + defer func() { + if err := recover(); err != nil { + log.Println("Recovered from err", err) + } + }() + resp.PacketID = request.PacketID resp.SessionID = request.SessionID callback(resp) @@ -76,8 +82,6 @@ func (c *Client) Send(request WSPacket, callback func(response WSPacket)) { c.sendCallback[request.PacketID] = wrapperCallback c.sendCallbackLock.Unlock() } - //log.Println("Registered requested callback", "ID :", request.ID, "PacketID: ", request.PacketID) - //log.Println("Callback waiting list:", c.id, c.sendCallback) c.sendLock.Lock() c.conn.WriteMessage(websocket.TextMessage, data) @@ -87,11 +91,16 @@ func (c *Client) Send(request WSPacket, callback func(response WSPacket)) { // Receive receive and response back func (c *Client) Receive(id string, f func(response WSPacket) (request WSPacket)) { c.recvCallback[id] = func(response WSPacket) { + defer func() { + if err := recover(); err != nil { + log.Println("Recovered from err", err) + } + }() + req := f(response) // Add Meta data req.PacketID = response.PacketID req.SessionID = response.SessionID - //log.Println("Sending back request", req, "PacketID: ", req.PacketID, "SessionID: ", req.SessionID) // Skip rqeuest if it is EmptyPacket if req == EmptyPacket { diff --git a/handler/browser.go b/handler/browser.go index bec09503..51961944 100644 --- a/handler/browser.go +++ b/handler/browser.go @@ -85,6 +85,20 @@ func (s *Session) RouteBrowser() { return req }) + browserClient.Receive("quit", func(resp cws.WSPacket) (req cws.WSPacket) { + log.Println("Received quit", req) + s.GameName = resp.Data + s.RoomID = resp.RoomID + s.PlayerIndex = resp.PlayerIndex + + room := s.handler.getRoom(s.RoomID) + if room.IsPCInRoom(s.peerconnection) { + s.handler.detachPeerConn(s.peerconnection) + } + + return cws.EmptyPacket + }) + browserClient.Receive("start", func(resp cws.WSPacket) (req cws.WSPacket) { s.GameName = resp.Data s.RoomID = resp.RoomID diff --git a/handler/room/room.go b/handler/room/room.go index eedd8587..501ef723 100644 --- a/handler/room/room.go +++ b/handler/room/room.go @@ -176,6 +176,9 @@ func (r *Room) removeSession(w *webrtc.WebRTC) { // TODO: Reuse for remove Session func (r *Room) IsPCInRoom(w *webrtc.WebRTC) bool { + if r == nil { + return false + } for _, s := range r.rtcSessions { if s.ID == w.ID { return true diff --git a/static/js/controller.js b/static/js/controller.js index 406cffe2..4d44855c 100644 --- a/static/js/controller.js +++ b/static/js/controller.js @@ -142,6 +142,8 @@ function doButtonUp(name) { showMenuScreen(); // TODO: Stop game screen = document.getElementById("game-screen"); + room_id = $("#room-txt").val() + conn.send(JSON.stringify({ "id": "quit", "data": "", "room_id": room_id})); $("#room-txt").val(""); } } diff --git a/static/js/ws.js b/static/js/ws.js index 3741309e..576c7deb 100644 --- a/static/js/ws.js +++ b/static/js/ws.js @@ -156,8 +156,6 @@ function startWebRTC() { } - // - pc.oniceconnectionstatechange = e => { log(`iceConnectionState: ${pc.iceConnectionState}`);