code: func (s *Session) Close() error {
  	s.shutdownLock.Lock()
  	defer s.shutdownLock.Unlock()
  
  	if s.shutdown {
  		return nil
  	}
  	s.shutdown = true
  	if s.shutdownErr == nil {
  		s.shutdownErr = ErrSessionShutdown
  	}
  	close(s.shutdownCh)
  	s.conn.Close()
  	<-s.recvDoneCh
  
  	s.streamLock.Lock()
  	defer s.streamLock.Unlock()
  	for _, stream := range s.streams {
  		stream.forceClose()
  	}
  	return nil
  }
docs: // Close is used to close the session and all streams.
  // Attempts to send a GoAway before closing the connection.