code: func (r *Reader) handle(ws *websocket.Conn) {
  	// Close the connection when the client requests it, or when we finish streaming, whichever happens first
  	closeConnOnce := &sync.Once{}
  	closeConn := func() {
  		closeConnOnce.Do(func() {
  			ws.Close()
  		})
  	}
  
  	negotiated := ws.Config().Protocol
  	r.selectedProtocol = negotiated[0]
  	defer close(r.err)
  	defer closeConn()
  
  	go func() {
  		defer runtime.HandleCrash()
  		// This blocks until the connection is closed.
  		// Client should not send anything.
  		IgnoreReceives(ws, r.timeout)
  		// Once the client closes, we should also close
  		closeConn()
  	}()
  
  	r.err <- messageCopy(ws, r.r, !r.protocols[r.selectedProtocol].Binary, r.ping, r.timeout)
  }
docs: // handle implements a WebSocket handler.