diff options
Diffstat (limited to 'core/network.go')
| -rw-r--r-- | core/network.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/core/network.go b/core/network.go index 50c398f..c662981 100644 --- a/core/network.go +++ b/core/network.go @@ -3,7 +3,10 @@ package core import ( "encoding/binary" "fmt" + "io" + "log" "net" + "time" ) func Send(conn net.Conn, dataType DataType, data Marshaler) error { @@ -19,3 +22,54 @@ func Send(conn net.Conn, dataType DataType, data Marshaler) error { return nil } + +func Read(r io.Reader) (any, error) { + dType, err := ReadDataType(r) + if err != nil { + return nil, fmt.Errorf("cannot read data type", err) + } + + switch dType { + case TypeUnknown: + return nil, fmt.Errorf("cannot read data type 0x00 (TypeUnknown)") + case TypeHandshake: + return ReadHandshake(r) + case TypePing: + return Ping{}, nil + case TypePong: + return ReadPong(r) + case TypeTest: + return ReadTest(r) + default: + return nil, fmt.Errorf("unsupported type: %v", dType) + } +} + +func Loop(conn net.Conn) error { + for { + d, err := Read(conn) + if err != nil { + return fmt.Errorf("cannot read data: %v", err) + } + + if err := handleEvent(d, conn); err != nil { + return fmt.Errorf("cannot handle event: %v", err) + } + } +} + +func handleEvent(data any, conn net.Conn) error { + switch v := data.(type) { + case Handshake: + case Ping: + log.Print("received ping") + return Send(conn, TypePong, Pong{time.Now()}) + case Pong: + log.Print("received pong ", v.Timestamp) + case Test: + default: + return fmt.Errorf("unknown type") + } + + return nil +} |
