func (c *Client) sendHeartbeat(conn *websocket.Conn) error { hbMsg := Event{ Topic: "phoenix", Event: "heartbeat", Payload: []byte("{}"), Ref: c.makeRef(), } return conn.WriteJSON(&hbMsg) }
func (c *Client) receiveMsg(conn *websocket.Conn, recvc chan<- eventOrError) { event := &Event{} if err := conn.ReadJSON(event); err != nil { recvc <- eventOrError{err: err} close(recvc) return } recvc <- eventOrError{event: event} }
func writer(ws *websocket.Conn, lastMod time.Time) { lastError := "" pingTicker := time.NewTicker(pingPeriod) fileTicker := time.NewTicker(filePeriod) defer func() { pingTicker.Stop() fileTicker.Stop() ws.Close() }() for { select { case <-fileTicker.C: var p []byte var err error p, lastMod, err = readFileIfModified(lastMod) if err != nil { if s := err.Error(); s != lastError { lastError = s p = []byte(lastError) } } else { lastError = "" } if p != nil { ws.SetWriteDeadline(time.Now().Add(writeWait)) if err := ws.WriteMessage(websocket.TextMessage, p); err != nil { return } } case <-pingTicker.C: ws.SetWriteDeadline(time.Now().Add(writeWait)) if err := ws.WriteMessage(websocket.PingMessage, []byte{}); err != nil { return } } } }
func reader(ws *websocket.Conn) { defer ws.Close() ws.SetReadLimit(512) ws.SetReadDeadline(time.Now().Add(pongWait)) ws.SetPongHandler(func(string) error { ws.SetReadDeadline(time.Now().Add(pongWait)); return nil }) for { _, _, err := ws.ReadMessage() if err != nil { break } } }