94 lines
2.2 KiB
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
|
|
}
|