This repository has been archived on 2024-07-06. You can view files and clone it, but cannot push or open issues or pull requests.
go-playit/tunnel/control_feed.go
Matheus Sampaio Queiroga a3c4994e66
Common
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2024-05-21 23:11:16 -03:00

111 lines
2.6 KiB
Go

package tunnel
import (
"encoding/binary"
"encoding/json"
"fmt"
"io"
)
type ClaimInstructions struct {
Address AddressPort
Token []byte
}
func (w *ClaimInstructions) WriteTo(I io.Writer) error {
if err := w.Address.WriteTo(I); err != nil {
return err
} else if err := WriteU64(I, uint64(len(w.Token))); err != nil {
return err
} else if err = binary.Write(I, binary.BigEndian, w.Token); err != nil {
return err
}
return nil
}
func (w *ClaimInstructions) ReadFrom(I io.Reader) error {
w.Address = AddressPort{}
if err := w.Address.ReadFrom(I); err != nil {
return err
}
w.Token = make([]byte, ReadU64(I))
if err := ReadBuff(I, w.Token); err != nil {
return err
}
return nil
}
type NewClient struct {
ConnectAddr AddressPort
PeerAddr AddressPort
ClaimInstructions ClaimInstructions
TunnelServerId uint64
DataCenterId uint32
}
func (w *NewClient) WriteTo(I io.Writer) error {
if err := w.ConnectAddr.WriteTo(I); err != nil {
return err
} else if w.PeerAddr.WriteTo(I); err != nil {
return err
} else if w.ClaimInstructions.WriteTo(I); err != nil {
return err
} else if err := WriteU64(I, w.TunnelServerId); err != nil {
return err
} else if err := WriteU32(I, w.DataCenterId); err != nil {
return err
}
return nil
}
func (w *NewClient) ReadFrom(I io.Reader) error {
w.ConnectAddr, w.PeerAddr = AddressPort{}, AddressPort{}
if err := w.ConnectAddr.ReadFrom(I); err != nil {
return err
} else if err := w.PeerAddr.ReadFrom(I); err != nil {
return err
} else if err := w.ClaimInstructions.ReadFrom(I); err != nil {
return err
}
w.TunnelServerId, w.DataCenterId = ReadU64(I), ReadU32(I)
return nil
}
type ControlFeed struct {
Response *ControlRpcMessage[*ControlResponse]
NewClient *NewClient
}
func (w *ControlFeed) WriteTo(I io.Writer) error {
defer func(){
d, _ := json.MarshalIndent(w, "", " ")
LogDebug.Printf("Write Feed: %s\n", string(d))
}()
if w.Response != nil {
if err := WriteU32(I, 1); err != nil {
return err
}
return w.Response.WriteTo(I)
} else if w.NewClient != nil {
if err := WriteU32(I, 2); err != nil {
return err
}
return w.NewClient.WriteTo(I)
}
return fmt.Errorf("set ResponseControl or NewClient")
}
func (w *ControlFeed) ReadFrom(I io.Reader) error {
defer func(){
d, _ := json.MarshalIndent(w, "", " ")
LogDebug.Printf("Read Feed: %s\n", string(d))
}()
switch ReadU32(I) {
case 1:
w.Response = &ControlRpcMessage[*ControlResponse]{}
w.Response.Content = &ControlResponse{}
return w.Response.ReadFrom(I)
case 2:
w.NewClient = &NewClient{}
return w.NewClient.ReadFrom(I)
}
return fmt.Errorf("invalid ControlFeed id")
}