code: func NewRemote(
  	sess *protos.Session,
  	reply string,
  	rpcClient cluster.RPCClient,
  	encoder codec.PacketEncoder,
  	serializer serialize.Serializer,
  	serviceDiscovery cluster.ServiceDiscovery,
  	frontendID string,
  	messageEncoder message.Encoder,
  ) (*Remote, error) {
  	a := &Remote{
  		chDie:            make(chan struct{}),
  		reply:            reply, // TODO this is totally coupled with NATS
  		serializer:       serializer,
  		encoder:          encoder,
  		rpcClient:        rpcClient,
  		serviceDiscovery: serviceDiscovery,
  		frontendID:       frontendID,
  		messageEncoder:   messageEncoder,
  	}
  
  	// binding session
  	s := session.New(a, false, sess.GetUid())
  	s.SetFrontendData(frontendID, sess.GetId())
  	err := s.SetDataEncoded(sess.GetData())
  	if err != nil {
  		return nil, err
  	}
  	a.Session = s
  
  	return a, nil
  }
docs: // NewRemote create new Remote instance