code: func (nc *Conn) processConnectInit() error {
  
  	// Set our deadline for the whole connect process
  	nc.conn.SetDeadline(time.Now().Add(nc.Opts.Timeout))
  	defer nc.conn.SetDeadline(time.Time{})
  
  	// Set our status to connecting.
  	nc.status = CONNECTING
  
  	// Process the INFO protocol received from the server
  	err := nc.processExpectedInfo()
  	if err != nil {
  		return err
  	}
  
  	// Send the CONNECT protocol along with the initial PING protocol.
  	// Wait for the PONG response (or any error that we get from the server).
  	err = nc.sendConnect()
  	if err != nil {
  		return err
  	}
  
  	// Reset the number of PING sent out
  	nc.pout = 0
  
  	// Start or reset Timer
  	if nc.Opts.PingInterval > 0 {
  		if nc.ptmr == nil {
  			nc.ptmr = time.AfterFunc(nc.Opts.PingInterval, nc.processPingTimer)
  		} else {
  			nc.ptmr.Reset(nc.Opts.PingInterval)
  		}
  	}
  
  	// Start the readLoop and flusher go routines, we will wait on both on a reconnect event.
  	nc.wg.Add(2)
  	go nc.readLoop()
  	go nc.flusher()
  
  	return nil
  }
docs: // Process a connected connection and initialize properly.