Prevent heartbeat from sending on nil websocket.

This commit is contained in:
Chris Rhodes 2016-01-21 11:15:44 -08:00
parent d6d6c749ea
commit ddddfa3644

View file

@ -204,7 +204,7 @@ func (s *Session) event(messageType int, message []byte) (err error) {
case "READY": case "READY":
var st *Ready var st *Ready
if err = unmarshalEvent(e, &st); err == nil { if err = unmarshalEvent(e, &st); err == nil {
go s.heartbeat(st.HeartbeatInterval) go s.heartbeat(s.wsConn, s.listening, st.HeartbeatInterval)
if s.StateEnabled { if s.StateEnabled {
s.State.OnReady(st) s.State.OnReady(st)
} }
@ -554,32 +554,25 @@ type heartbeatOp struct {
Data int `json:"d"` Data int `json:"d"`
} }
func (s *Session) sendHeartbeat() error { func (s *Session) sendHeartbeat(wsConn *websocket.Conn) error {
return s.wsConn.WriteJSON(heartbeatOp{1, int(time.Now().Unix())}) return wsConn.WriteJSON(heartbeatOp{1, int(time.Now().Unix())})
} }
// heartbeat sends regular heartbeats to Discord so it knows the client // heartbeat sends regular heartbeats to Discord so it knows the client
// is still connected. If you do not send these heartbeats Discord will // is still connected. If you do not send these heartbeats Discord will
// disconnect the websocket connection after a few seconds. // disconnect the websocket connection after a few seconds.
func (s *Session) heartbeat(i time.Duration) { func (s *Session) heartbeat(wsConn *websocket.Conn, listening <-chan interface{}, i time.Duration) {
s.Lock() if listening == nil || wsConn == nil {
// We have been closed between the first Ready event, abort.
if s.listening == nil {
s.Unlock()
return return
} }
// Keep a reference, as s.listening can be nilled out. s.Lock()
listening := s.listening
s.DataReady = true s.DataReady = true
s.Unlock() s.Unlock()
// Send first heartbeat immediately because lag could put the // Send first heartbeat immediately because lag could put the
// first heartbeat outside the required heartbeat interval window. // first heartbeat outside the required heartbeat interval window.
err := s.sendHeartbeat() err := s.sendHeartbeat(wsConn)
if err != nil { if err != nil {
fmt.Println("Error sending initial heartbeat:", err) fmt.Println("Error sending initial heartbeat:", err)
return return
@ -589,7 +582,7 @@ func (s *Session) heartbeat(i time.Duration) {
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
err := s.sendHeartbeat() err := s.sendHeartbeat(wsConn)
if err != nil { if err != nil {
fmt.Println("Error sending heartbeat:", err) fmt.Println("Error sending heartbeat:", err)
return return