From 6a34d7be01256df472015564a655d8253acd8724 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Wed, 27 Nov 2024 12:52:22 +0200 Subject: Refactored server infrastructure --- internal/packet/packet.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'internal/packet/packet.go') diff --git a/internal/packet/packet.go b/internal/packet/packet.go index 8eb1a86..7476056 100644 --- a/internal/packet/packet.go +++ b/internal/packet/packet.go @@ -222,14 +222,14 @@ func (p Packet) DecodedPayload() (Payload, error) { } var ( - PacketUnsupportedVersion error = errors.New("packet error: unsupported version") - PacketUnsupportedEncoding error = errors.New("packet error: unsupported encoding") - PacketUnsupportedType error = errors.New("packet error: unsupported type") + ErrUnsupportedVersion error = errors.New("packet error: unsupported version") + ErrUnsupportedEncoding error = errors.New("packet error: unsupported encoding") + ErrUnsupportedType error = errors.New("packet error: unsupported type") ) type PacketFramer struct { - buffer []byte Out chan Packet + buffer []byte } func NewFramer() PacketFramer { @@ -239,13 +239,22 @@ func NewFramer() PacketFramer { } func (f *PacketFramer) Push(ctx context.Context, data []byte) error { + if ctx.Err() != nil { + return ctx.Err() + } + f.buffer = append(f.buffer, data...) for { + if ctx.Err() != nil { + return ctx.Err() + } + packet, err := f.parse() if packet == nil || err != nil { return err } + select { case f.Out <- *packet: case <-ctx.Done(): @@ -260,17 +269,17 @@ func (f *PacketFramer) parse() (*Packet, error) { } if f.buffer[VERSION_OFFSET] != VERSION { - return nil, PacketUnsupportedVersion + return nil, ErrUnsupportedVersion } encoding := Encoding(f.buffer[ENCODING_OFFSET] >> 6) if !encoding.IsSupported() { - return nil, PacketUnsupportedEncoding + return nil, ErrUnsupportedEncoding } packetType := PacketType(f.buffer[TYPE_OFFSET] & 63) if !packetType.IsSupported() { - return nil, PacketUnsupportedType + return nil, ErrUnsupportedType } length := binary.BigEndian.Uint16(f.buffer[LENGTH_OFFSET:]) -- cgit v1.3.1