Files
Archive/echo/internal/transporter/interface.go
2024-03-05 02:32:38 -08:00

64 lines
1.7 KiB
Go

package transporter
import (
"fmt"
"net"
"github.com/Ehco1996/ehco/internal/cmgr"
"github.com/Ehco1996/ehco/internal/constant"
"github.com/Ehco1996/ehco/internal/relay/conf"
"github.com/Ehco1996/ehco/pkg/lb"
)
// RelayTransporter
type RelayTransporter interface {
// UDP相关
GetOrCreateBufferCh(uaddr *net.UDPAddr) *BufferCh
HandleUDPConn(uaddr *net.UDPAddr, local *net.UDPConn)
// TCP相关
dialRemote(remote *lb.Node) (net.Conn, error)
HandleTCPConn(c net.Conn, remote *lb.Node) error
GetRemote() *lb.Node
}
func NewRelayTransporter(cfg *conf.Config, connMgr cmgr.Cmgr) RelayTransporter {
tcpNodeList := make([]*lb.Node, len(cfg.TCPRemotes))
for idx, addr := range cfg.TCPRemotes {
tcpNodeList[idx] = &lb.Node{
Address: addr,
Label: fmt.Sprintf("%s-%s", cfg.Label, addr),
}
}
udpNodeList := make([]*lb.Node, len(cfg.UDPRemotes))
for idx, addr := range cfg.UDPRemotes {
udpNodeList[idx] = &lb.Node{
Address: addr,
Label: fmt.Sprintf("%s-%s", cfg.Label, addr),
}
}
raw := newRaw(cfg.Label, lb.NewRoundRobin(tcpNodeList), lb.NewRoundRobin(udpNodeList), connMgr)
switch cfg.TransportType {
case constant.Transport_RAW:
return raw
case constant.Transport_WS:
return &Ws{Raw: raw}
case constant.Transport_WSS:
return &Wss{Raw: raw}
case constant.Transport_MWSS:
logger := raw.l.Named("MWSSClient")
mWSSClient := NewMWSSClient(logger)
mwss := &Mwss{mtp: NewSmuxTransporter(logger, mWSSClient.InitNewSession)}
mwss.Raw = raw
return mwss
case constant.Transport_MTCP:
logger := raw.l.Named("MTCPClient")
mTCPClient := NewMTCPClient(logger)
mtcp := &MTCP{mtp: NewSmuxTransporter(logger, mTCPClient.InitNewSession)}
mtcp.Raw = raw
return mtcp
}
return nil
}