Files
go-playit/proto/control_feed.go

94 lines
2.2 KiB
Go

package proto
import (
"fmt"
"io"
"net/netip"
"sirherobrine23.com.br/go-bds/go-playit/xcode"
)
var (
_ xcode.DecodeMessage = (*ControlFeed)(nil)
_ xcode.EncodeMessage = (*ControlFeed)(nil)
)
type ControlFeed struct {
Response *ControlRpcMessage[ControlResponse]
NewClient *NewClient
NewClientOld *NewClientOld
}
func (cf ControlFeed) WriteMessage(_ io.Writer, DefaultWrite func(any) error) (err error) {
switch {
case cf.Response != nil:
if err = DefaultWrite(uint32(1)); err != nil {
return
}
return DefaultWrite(cf.Response)
case cf.NewClientOld != nil:
if err = DefaultWrite(uint32(2)); err != nil {
return
}
return DefaultWrite(cf.NewClientOld)
case cf.NewClient != nil:
if err = DefaultWrite(uint32(3)); err != nil {
return
}
return DefaultWrite(cf.NewClient)
default:
return fmt.Errorf("no field set in ControlFeed")
}
}
func (cf *ControlFeed) ReadMessage(_ io.Reader, Decode *xcode.DecodeReader) (err error) {
typeof, err := Decode.ReadUint32()
if err != nil {
return err
}
switch typeof {
case 1:
cf.Response = new(ControlRpcMessage[ControlResponse])
return Decode.Decode(cf.Response)
case 2:
cf.NewClientOld = new(NewClientOld)
return Decode.Decode(cf.NewClientOld)
case 3:
cf.NewClient = new(NewClient)
return Decode.Decode(cf.NewClient)
default:
return fmt.Errorf("unknown type %d in ControlFeed", typeof)
}
}
type NewClient struct {
ConnectAddr, PeerAddr netip.AddrPort
DataCenterID uint32 // Original user data center connection
TunnelID uint64 // Tunnel ID
PortOffset uint16 // Port to get correctly port
ClaimInstructions ClaimInstructions // Instructions to connect and auth
}
type NewClientOld struct {
ConnectAddr, PeerAddr netip.AddrPort
ClaimInstructions ClaimInstructions
TunnelServerID uint64
DataCenterID uint32
}
func (old NewClientOld) ToNew() *NewClient {
return &NewClient{
ConnectAddr: old.ConnectAddr,
PeerAddr: old.PeerAddr,
DataCenterID: old.DataCenterID,
ClaimInstructions: old.ClaimInstructions,
TunnelID: 0,
PortOffset: 0,
}
}
type ClaimInstructions struct {
Address netip.AddrPort
Token []byte
}