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
 | 
						|
}
 |