code: func (s *Session) waitForSendErr(hdr header, body io.Reader, errCh chan error) error {
  	t := timerPool.Get()
  	timer := t.(*time.Timer)
  	timer.Reset(s.config.ConnectionWriteTimeout)
  	defer func() {
  		timer.Stop()
  		select {
  		case <-timer.C:
  		default:
  		}
  		timerPool.Put(t)
  	}()
  
  	ready := sendReady{Hdr: hdr, Body: body, Err: errCh}
  	select {
  	case s.sendCh <- ready:
  	case <-s.shutdownCh:
  		return ErrSessionShutdown
  	case <-timer.C:
  		return ErrConnectionWriteTimeout
  	}
  
  	select {
  	case err := <-errCh:
  		return err
  	case <-s.shutdownCh:
  		return ErrSessionShutdown
  	case <-timer.C:
  		return ErrConnectionWriteTimeout
  	}
  }
docs: // waitForSendErr waits to send a header with optional data, checking for a
  // potential shutdown. Since there's the expectation that sends can happen
  // in a timely manner, we enforce the connection write timeout here.