mirror of
https://github.com/ehang-io/nps.git
synced 2025-07-02 04:00:42 +00:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package client
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"ehang.io/nps/lib/cert"
|
|
"ehang.io/nps/lib/logger"
|
|
"ehang.io/nps/lib/pb"
|
|
uuid "github.com/satori/go.uuid"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// StartNpc is used to connect to bridge
|
|
// proto is quic or tcp
|
|
// tlsConfig must contain a npc cert
|
|
func StartNpc(proto string, bridgeAddr string, tlsConfig *tls.Config) error {
|
|
id, err := cert.GetCertSnFromConfig(tlsConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var creator TunnelCreator
|
|
if proto == "quic" {
|
|
creator = QUICTunnelCreator{}
|
|
} else {
|
|
creator = TcpTunnelCreator{}
|
|
}
|
|
connId := uuid.NewV1().String()
|
|
retry:
|
|
logger.Info("start connecting to bridge")
|
|
controlLn, err := creator.NewMux(bridgeAddr,
|
|
&pb.ConnRequest{Id: id, ConnType: &pb.ConnRequest_NpcInfo{NpcInfo: &pb.NpcInfo{TunnelId: connId, IsControlTunnel: true}}}, tlsConfig)
|
|
if err != nil {
|
|
logger.Error("new control connection error", zap.Error(err))
|
|
goto retry
|
|
}
|
|
dataLn, err := creator.NewMux(bridgeAddr,
|
|
&pb.ConnRequest{Id: id, ConnType: &pb.ConnRequest_NpcInfo{NpcInfo: &pb.NpcInfo{TunnelId: connId, IsControlTunnel: false}}}, tlsConfig)
|
|
if err != nil {
|
|
logger.Error("new data connection error", zap.Error(err))
|
|
goto retry
|
|
}
|
|
c := NewClient(controlLn, dataLn)
|
|
c.Run()
|
|
goto retry
|
|
}
|