code: func (c *wsConn) readPump() {
  	defer func() {
  		c.sh.wsHub.unregister <- c
  		c.ws.Close()
  	}()
  	c.ws.SetReadLimit(maxMessageSize)
  	c.ws.SetReadDeadline(time.Now().Add(pongWait))
  	c.ws.SetPongHandler(func(string) error { c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil })
  	for {
  		_, message, err := c.ws.ReadMessage()
  		if err != nil {
  			break
  		}
  		if debug {
  			log.Printf("websocket: got message %#q", message)
  		}
  		cm := new(wsClientMessage)
  		if err := json.Unmarshal(message, cm); err != nil {
  			log.Printf("Ignoring bogus websocket message. Err: %v", err)
  			continue
  		}
  		c.sh.wsHub.watchReq <- watchReq{
  			conn: c,
  			tag:  cm.Tag,
  			q:    cm.Query,
  		}
  	}
  }
docs: // readPump pumps messages from the websocket connection to the hub.