diff --git a/lib/fed/conn.go b/lib/fed/conn.go index 4f27d45a54c60942b1a38263e82318cf64312746..b82955b37e67cd0f2c5b832a0b5e60b9261d6e63 100644 --- a/lib/fed/conn.go +++ b/lib/fed/conn.go @@ -1,195 +1,61 @@ package fed import ( - "bufio" - "crypto/tls" - "encoding/binary" - "errors" - "io" - "net" - - "gfx.cafe/gfx/pggat/lib/util/slices" + "gfx.cafe/gfx/pggat/lib/util/decorator" "gfx.cafe/gfx/pggat/lib/util/strutil" ) -type Conn interface { - ReadWriter - - LocalAddr() net.Addr - RemoteAddr() net.Addr - - SSLEnabled() bool - User() string - Database() string - InitialParameters() map[strutil.CIString]string - BackendKey() [8]byte - - Close() error -} - -type NetConn struct { - conn net.Conn - writer bufio.Writer - reader bufio.Reader - sslEnabled bool - - user string - database string - initialParameters map[strutil.CIString]string - backendKey [8]byte - - headerBuf [5]byte -} - -func WrapNetConn(conn net.Conn) *NetConn { - c := &NetConn{ - conn: conn, - } - c.writer.Reset(conn) - c.reader.Reset(conn) - return c -} - -func (T *NetConn) LocalAddr() net.Addr { - return T.conn.LocalAddr() -} - -func (T *NetConn) RemoteAddr() net.Addr { - return T.conn.RemoteAddr() -} - -func (T *NetConn) SSLEnabled() bool { - return T.sslEnabled -} - -func (T *NetConn) User() string { - return T.user -} - -func (T *NetConn) SetUser(user string) { - T.user = user -} - -func (T *NetConn) Database() string { - return T.database -} - -func (T *NetConn) SetDatabase(database string) { - T.database = database -} - -func (T *NetConn) InitialParameters() map[strutil.CIString]string { - return T.initialParameters -} - -func (T *NetConn) SetInitialParameters(initialParameters map[strutil.CIString]string) { - T.initialParameters = initialParameters -} - -func (T *NetConn) BackendKey() [8]byte { - return T.backendKey -} - -func (T *NetConn) SetBackendKey(backendKey [8]byte) { - T.backendKey = backendKey -} +type Conn struct { + noCopy decorator.NoCopy -var errSSLAlreadyEnabled = errors.New("ssl is already enabled") + ReadWriteCloser -func (T *NetConn) EnableSSLClient(config *tls.Config) error { - if T.sslEnabled { - return errSSLAlreadyEnabled - } - T.sslEnabled = true + Middleware []Middleware - if err := T.writer.Flush(); err != nil { - return err - } - if T.reader.Buffered() > 0 { - return errors.New("expected empty read buffer") - } - sslConn := tls.Client(T.conn, config) - T.writer.Reset(sslConn) - T.reader.Reset(sslConn) - T.conn = sslConn - return sslConn.Handshake() + User string + Database string + InitialParameters map[strutil.CIString]string + Authenticated bool + BackendKey [8]byte } -func (T *NetConn) EnableSSLServer(config *tls.Config) error { - if T.sslEnabled { - return errSSLAlreadyEnabled +func NewConn(rw ReadWriteCloser) *Conn { + return &Conn{ + ReadWriteCloser: rw, } - T.sslEnabled = true - - if err := T.writer.Flush(); err != nil { - return err - } - if T.reader.Buffered() > 0 { - return errors.New("expected empty read buffer") - } - sslConn := tls.Server(T.conn, config) - T.writer.Reset(sslConn) - T.reader.Reset(sslConn) - T.conn = sslConn - return sslConn.Handshake() } -func (T *NetConn) ReadByte() (byte, error) { - if err := T.writer.Flush(); err != nil { - return 0, err - } - return T.reader.ReadByte() -} - -func (T *NetConn) ReadPacket(typed bool, buffer Packet) (packet Packet, err error) { +func (T *Conn) ReadPacket(typed bool, buffer Packet) (packet Packet, err error) { packet = buffer - - if err = T.writer.Flush(); err != nil { - return - } - - if typed { - _, err = io.ReadFull(&T.reader, T.headerBuf[:]) + for { + packet, err = T.ReadWriteCloser.ReadPacket(typed, buffer) if err != nil { return } - } else { - _, err = io.ReadFull(&T.reader, T.headerBuf[1:]) - if err != nil { + for _, middleware := range T.Middleware { + packet, err = middleware.ReadPacket(packet) + if err != nil { + return + } + if len(packet) == 0 { + break + } + } + if len(packet) != 0 { return } } - - length := binary.BigEndian.Uint32(T.headerBuf[1:]) - - packet = slices.Resize(buffer, int(length)+1) - copy(packet, T.headerBuf[:]) - - _, err = io.ReadFull(&T.reader, packet.Payload()) - if err != nil { - return - } - return } -func (T *NetConn) WriteByte(b byte) error { - return T.writer.WriteByte(b) -} - -func (T *NetConn) WritePacket(packet Packet) error { - _, err := T.writer.Write(packet.Bytes()) - return err -} - -func (T *NetConn) Close() error { - if err := T.writer.Flush(); err != nil { - return err +func (T *Conn) WritePacket(packet Packet) (err error) { + for _, middleware := range T.Middleware { + packet, err = middleware.ReadPacket(packet) + if err != nil || len(packet) == 0 { + return + } } - return T.conn.Close() + err = T.ReadWriteCloser.WritePacket(packet) + return } -var _ Conn = (*NetConn)(nil) -var _ SSLServer = (*NetConn)(nil) -var _ SSLClient = (*NetConn)(nil) -var _ io.ByteReader = (*NetConn)(nil) -var _ io.ByteWriter = (*NetConn)(nil) +var _ ReadWriteCloser = (*Conn)(nil) diff --git a/lib/fed/middleware.go b/lib/fed/middleware.go new file mode 100644 index 0000000000000000000000000000000000000000..c47a3f7043a23b693c72bacff6f43c6898ab283d --- /dev/null +++ b/lib/fed/middleware.go @@ -0,0 +1,7 @@ +package fed + +// Middleware intercepts packets and possibly changes them. Return a 0 length packet to cancel. +type Middleware interface { + ReadPacket(packet Packet) (Packet, error) + WritePacket(packet Packet) (Packet, error) +} diff --git a/lib/fed/middlewares/eqp/client.go b/lib/fed/middlewares/eqp/client.go new file mode 100644 index 0000000000000000000000000000000000000000..47417442094ac0b94e8304be45c5fb1af67a8cbd --- /dev/null +++ b/lib/fed/middlewares/eqp/client.go @@ -0,0 +1,25 @@ +package eqp + +import ( + "gfx.cafe/gfx/pggat/lib/fed" +) + +type Client struct { + state State +} + +func NewClient() *Client { + return new(Client) +} + +func (T *Client) ReadPacket(packet fed.Packet) (fed.Packet, error) { + T.state.C2S(packet) + return packet, nil +} + +func (T *Client) WritePacket(packet fed.Packet) (fed.Packet, error) { + T.state.S2C(packet) + return packet, nil +} + +var _ fed.Middleware = (*Client)(nil) diff --git a/lib/fed/middlewares/eqp/server.go b/lib/fed/middlewares/eqp/server.go new file mode 100644 index 0000000000000000000000000000000000000000..f1b9e7889ac2b5bf3fae74e07edf4e4c73080bcc --- /dev/null +++ b/lib/fed/middlewares/eqp/server.go @@ -0,0 +1,25 @@ +package eqp + +import ( + "gfx.cafe/gfx/pggat/lib/fed" +) + +type Server struct { + state State +} + +func NewServer() *Server { + return new(Server) +} + +func (T *Server) ReadPacket(packet fed.Packet) (fed.Packet, error) { + T.state.S2C(packet) + return packet, nil +} + +func (T *Server) WritePacket(packet fed.Packet) (fed.Packet, error) { + T.state.C2S(packet) + return packet, nil +} + +var _ fed.Middleware = (*Server)(nil) diff --git a/lib/middleware/middlewares/eqp/state.go b/lib/fed/middlewares/eqp/state.go similarity index 100% rename from lib/middleware/middlewares/eqp/state.go rename to lib/fed/middlewares/eqp/state.go diff --git a/lib/middleware/middlewares/eqp/sync.go b/lib/fed/middlewares/eqp/sync.go similarity index 100% rename from lib/middleware/middlewares/eqp/sync.go rename to lib/fed/middlewares/eqp/sync.go diff --git a/lib/middleware/middlewares/ps/client.go b/lib/fed/middlewares/ps/client.go similarity index 69% rename from lib/middleware/middlewares/ps/client.go rename to lib/fed/middlewares/ps/client.go index c0b4fca687d57a1c992325b781eb40f5de025da1..ecb819f992b19c47dbf313604db87df7e0f7b2d9 100644 --- a/lib/middleware/middlewares/ps/client.go +++ b/lib/fed/middlewares/ps/client.go @@ -5,7 +5,6 @@ import ( "gfx.cafe/gfx/pggat/lib/fed" packets "gfx.cafe/gfx/pggat/lib/fed/packets/v3.0" - "gfx.cafe/gfx/pggat/lib/middleware" "gfx.cafe/gfx/pggat/lib/util/strutil" ) @@ -20,29 +19,28 @@ func NewClient(parameters map[strutil.CIString]string) *Client { } } -func (T *Client) Read(_ middleware.Context, _ fed.Packet) error { - return nil +func (T *Client) ReadPacket(packet fed.Packet) (fed.Packet, error) { + return packet, nil } -func (T *Client) Write(ctx middleware.Context, packet fed.Packet) error { +func (T *Client) WritePacket(packet fed.Packet) (fed.Packet, error) { switch packet.Type() { case packets.TypeParameterStatus: var ps packets.ParameterStatus if !ps.ReadFromPacket(packet) { - return errors.New("bad packet format i") + return packet, errors.New("bad packet format i") } ikey := strutil.MakeCIString(ps.Key) if T.synced && T.parameters[ikey] == ps.Value { // already set - ctx.Cancel() - break + return packet[:0], nil } if T.parameters == nil { T.parameters = make(map[strutil.CIString]string) } T.parameters[ikey] = ps.Value } - return nil + return packet, nil } -var _ middleware.Middleware = (*Client)(nil) +var _ fed.Middleware = (*Client)(nil) diff --git a/lib/middleware/middlewares/ps/server.go b/lib/fed/middlewares/ps/server.go similarity index 68% rename from lib/middleware/middlewares/ps/server.go rename to lib/fed/middlewares/ps/server.go index dc11a6e14d8eeb44d87dec7313859f314cb06afd..f74f4f0c8c2c15414a34524984b83d313cc53159 100644 --- a/lib/middleware/middlewares/ps/server.go +++ b/lib/fed/middlewares/ps/server.go @@ -5,7 +5,6 @@ import ( "gfx.cafe/gfx/pggat/lib/fed" packets "gfx.cafe/gfx/pggat/lib/fed/packets/v3.0" - "gfx.cafe/gfx/pggat/lib/middleware" "gfx.cafe/gfx/pggat/lib/util/strutil" ) @@ -19,12 +18,12 @@ func NewServer(parameters map[strutil.CIString]string) *Server { } } -func (T *Server) Read(_ middleware.Context, packet fed.Packet) error { +func (T *Server) ReadPacket(packet fed.Packet) (fed.Packet, error) { switch packet.Type() { case packets.TypeParameterStatus: var ps packets.ParameterStatus if !ps.ReadFromPacket(packet) { - return errors.New("bad packet format j") + return packet, errors.New("bad packet format j") } ikey := strutil.MakeCIString(ps.Key) if T.parameters == nil { @@ -32,11 +31,11 @@ func (T *Server) Read(_ middleware.Context, packet fed.Packet) error { } T.parameters[ikey] = ps.Value } - return nil + return packet, nil } -func (T *Server) Write(_ middleware.Context, _ fed.Packet) error { - return nil +func (T *Server) WritePacket(packet fed.Packet) (fed.Packet, error) { + return packet, nil } -var _ middleware.Middleware = (*Server)(nil) +var _ fed.Middleware = (*Server)(nil) diff --git a/lib/middleware/middlewares/ps/sync.go b/lib/fed/middlewares/ps/sync.go similarity index 100% rename from lib/middleware/middlewares/ps/sync.go rename to lib/fed/middlewares/ps/sync.go diff --git a/lib/middleware/middlewares/unterminate/unterminate.go b/lib/fed/middlewares/unterminate/unterminate.go similarity index 60% rename from lib/middleware/middlewares/unterminate/unterminate.go rename to lib/fed/middlewares/unterminate/unterminate.go index dcd27cfd12fea58f3c58dd28f742478b7490d98d..f04fb06b5e66dd9556aad67f44255e4aa6d45129 100644 --- a/lib/middleware/middlewares/unterminate/unterminate.go +++ b/lib/fed/middlewares/unterminate/unterminate.go @@ -5,7 +5,6 @@ import ( "gfx.cafe/gfx/pggat/lib/fed" packets "gfx.cafe/gfx/pggat/lib/fed/packets/v3.0" - "gfx.cafe/gfx/pggat/lib/middleware" ) // Unterminate catches the Terminate packet and returns io.EOF instead. @@ -14,15 +13,15 @@ var Unterminate = unterm{} type unterm struct{} -func (unterm) Read(_ middleware.Context, packet fed.Packet) error { +func (unterm) ReadPacket(packet fed.Packet) (fed.Packet, error) { if packet.Type() == packets.TypeTerminate { - return io.EOF + return packet, io.EOF } - return nil + return packet, nil } -func (unterm) Write(_ middleware.Context, _ fed.Packet) error { - return nil +func (unterm) WritePacket(packet fed.Packet) (fed.Packet, error) { + return packet, nil } -var _ middleware.Middleware = unterm{} +var _ fed.Middleware = unterm{} diff --git a/lib/fed/netconn.go b/lib/fed/netconn.go new file mode 100644 index 0000000000000000000000000000000000000000..480edb12b2c66cca2eea13888daac31ca226c404 --- /dev/null +++ b/lib/fed/netconn.go @@ -0,0 +1,144 @@ +package fed + +import ( + "bufio" + "crypto/tls" + "encoding/binary" + "errors" + "io" + "net" + + "gfx.cafe/gfx/pggat/lib/util/slices" +) + +type NetConn struct { + conn net.Conn + writer bufio.Writer + reader bufio.Reader + sslEnabled bool + + headerBuf [5]byte +} + +func NewNetConn(conn net.Conn) *NetConn { + c := &NetConn{ + conn: conn, + } + c.writer.Reset(conn) + c.reader.Reset(conn) + return c +} + +func (T *NetConn) LocalAddr() net.Addr { + return T.conn.LocalAddr() +} + +func (T *NetConn) RemoteAddr() net.Addr { + return T.conn.RemoteAddr() +} + +// SSL + +var errSSLAlreadyEnabled = errors.New("ssl is already enabled") + +func (T *NetConn) SSL() bool { + return T.sslEnabled +} + +func (T *NetConn) EnableSSLClient(config *tls.Config) error { + if T.sslEnabled { + return errSSLAlreadyEnabled + } + T.sslEnabled = true + + if err := T.writer.Flush(); err != nil { + return err + } + if T.reader.Buffered() > 0 { + return errors.New("expected empty read buffer") + } + sslConn := tls.Client(T.conn, config) + T.writer.Reset(sslConn) + T.reader.Reset(sslConn) + T.conn = sslConn + return sslConn.Handshake() +} + +func (T *NetConn) EnableSSLServer(config *tls.Config) error { + if T.sslEnabled { + return errSSLAlreadyEnabled + } + T.sslEnabled = true + + if err := T.writer.Flush(); err != nil { + return err + } + if T.reader.Buffered() > 0 { + return errors.New("expected empty read buffer") + } + sslConn := tls.Server(T.conn, config) + T.writer.Reset(sslConn) + T.reader.Reset(sslConn) + T.conn = sslConn + return sslConn.Handshake() +} + +func (T *NetConn) ReadByte() (byte, error) { + if err := T.writer.Flush(); err != nil { + return 0, err + } + return T.reader.ReadByte() +} + +func (T *NetConn) ReadPacket(typed bool, buffer Packet) (packet Packet, err error) { + packet = buffer + + if err = T.writer.Flush(); err != nil { + return + } + + if typed { + _, err = io.ReadFull(&T.reader, T.headerBuf[:]) + if err != nil { + return + } + } else { + _, err = io.ReadFull(&T.reader, T.headerBuf[1:]) + if err != nil { + return + } + } + + length := binary.BigEndian.Uint32(T.headerBuf[1:]) + + packet = slices.Resize(buffer, int(length)+1) + copy(packet, T.headerBuf[:]) + + _, err = io.ReadFull(&T.reader, packet.Payload()) + if err != nil { + return + } + return +} + +func (T *NetConn) WriteByte(b byte) error { + return T.writer.WriteByte(b) +} + +func (T *NetConn) WritePacket(packet Packet) error { + _, err := T.writer.Write(packet.Bytes()) + return err +} + +func (T *NetConn) Close() error { + if err := T.writer.Flush(); err != nil { + return err + } + return T.conn.Close() +} + +var _ ReadWriteCloser = (*NetConn)(nil) +var _ SSLServer = (*NetConn)(nil) +var _ SSLClient = (*NetConn)(nil) +var _ io.ByteReader = (*NetConn)(nil) +var _ io.ByteWriter = (*NetConn)(nil) diff --git a/lib/fed/readwriter.go b/lib/fed/readwriter.go index e26d66f933db5e2e3368ace6f4ab398330c98f2e..bde9a0d17f45d0b48b682e4c87d2108b419ff9dd 100644 --- a/lib/fed/readwriter.go +++ b/lib/fed/readwriter.go @@ -13,7 +13,8 @@ type ReadWriter interface { Writer } -type CombinedReadWriter struct { - Reader - Writer +type ReadWriteCloser interface { + ReadWriter + + Close() error } diff --git a/lib/fed/ssl.go b/lib/fed/ssl.go index 580d83f983f4a5696610a2b643a5f8c9dec0a3e2..9b830d23ded6eef3b32461fb91053ec67a3d61ae 100644 --- a/lib/fed/ssl.go +++ b/lib/fed/ssl.go @@ -2,10 +2,18 @@ package fed import "crypto/tls" +type SSL interface { + SSL() bool +} + type SSLClient interface { + SSL + EnableSSLClient(config *tls.Config) error } type SSLServer interface { + SSL + EnableSSLServer(config *tls.Config) error } diff --git a/lib/gat/app.go b/lib/gat/app.go index 213cf39cd8c9bfe34887fb20946e8d3c96f57e53..b8be69410f8340a22b6f9ee43f69a6233406d55a 100644 --- a/lib/gat/app.go +++ b/lib/gat/app.go @@ -90,9 +90,8 @@ func (T *App) cancel(key [8]byte) { _ = p.Cancel(key) } -func (T *App) serve(server *Server, conn *fed.NetConn) { - initialParameters := conn.InitialParameters() - for key := range initialParameters { +func (T *App) serve(server *Server, conn *fed.Conn) { + for key := range conn.InitialParameters { if !slices.Contains(server.AllowedStartupParameters, key) { errResp := packets.ErrorResponse{ Error: perror.New( @@ -108,20 +107,20 @@ func (T *App) serve(server *Server, conn *fed.NetConn) { p := server.lookup(conn) if p == nil { - T.log.Warn("database not found", zap.String("user", conn.User()), zap.String("database", conn.Database())) + T.log.Warn("database not found", zap.String("user", conn.User), zap.String("database", conn.Database)) return } - backendKey, err := frontends.Authenticate(conn, p.Credentials()) + var err error + conn.BackendKey, err = frontends.Authenticate(conn.ReadWriteCloser, p.Credentials()) if err != nil { T.log.Warn("error authenticating client", zap.Error(err)) return } + conn.Authenticated = true - conn.SetBackendKey(backendKey) - - T.keys.Store(backendKey, p) - defer T.keys.Delete(backendKey) + T.keys.Store(conn.BackendKey, p) + defer T.keys.Delete(conn.BackendKey) if err2 := p.Serve(conn); err2 != nil && !errors.Is(err2, io.EOF) { T.log.Warn("error serving client", zap.Error(err2)) @@ -129,7 +128,7 @@ func (T *App) serve(server *Server, conn *fed.NetConn) { } } -func (T *App) accept(listener *Listener, conn *fed.NetConn) { +func (T *App) accept(listener *Listener, conn *fed.Conn) { defer func() { _ = conn.Close() }() @@ -139,7 +138,10 @@ func (T *App) accept(listener *Listener, conn *fed.NetConn) { tlsConfig = listener.ssl.ServerTLSConfig() } - cancelKey, isCanceling, _, user, database, initialParameters, err := frontends.Accept(conn, tlsConfig) + var cancelKey [8]byte + var isCanceling bool + var err error + cancelKey, isCanceling, _, conn.User, conn.Database, conn.InitialParameters, err = frontends.Accept(conn.ReadWriteCloser, tlsConfig) if err != nil { T.log.Warn("error accepting client", zap.Error(err)) return @@ -150,10 +152,6 @@ func (T *App) accept(listener *Listener, conn *fed.NetConn) { return } - conn.SetUser(user) - conn.SetDatabase(database) - conn.SetInitialParameters(initialParameters) - for _, server := range T.servers { if server.match == nil || server.match.Matches(conn) { T.serve(server, conn) @@ -161,7 +159,7 @@ func (T *App) accept(listener *Listener, conn *fed.NetConn) { } } - T.log.Warn("server not found", zap.String("user", conn.User()), zap.String("database", conn.Database())) + T.log.Warn("server not found", zap.String("user", conn.User), zap.String("database", conn.Database)) errResp := packets.ErrorResponse{ Error: perror.New( diff --git a/lib/gat/listen.go b/lib/gat/listen.go index dd0f28661af7d9ee259a9d87631968b1129d1ee7..deca26675bb73af8f608213e18f74d3565a5f353 100644 --- a/lib/gat/listen.go +++ b/lib/gat/listen.go @@ -27,12 +27,14 @@ type Listener struct { log *zap.Logger } -func (T *Listener) accept() (*fed.NetConn, error) { +func (T *Listener) accept() (*fed.Conn, error) { raw, err := T.listener.Accept() if err != nil { return nil, err } - return fed.WrapNetConn(raw), nil + return fed.NewConn( + fed.NewNetConn(raw), + ), nil } func (T *Listener) Provision(ctx caddy.Context) error { diff --git a/lib/gat/matcher.go b/lib/gat/matcher.go index 20c20618a96764dd4afd82bd961391e1a39c1ec5..6152f4e455f0b398a69340df1799f27fd3723682 100644 --- a/lib/gat/matcher.go +++ b/lib/gat/matcher.go @@ -3,5 +3,5 @@ package gat import "gfx.cafe/gfx/pggat/lib/fed" type Matcher interface { - Matches(conn fed.Conn) bool + Matches(conn *fed.Conn) bool } diff --git a/lib/gat/matchers/and.go b/lib/gat/matchers/and.go index 7dd683b1187356729f7de5af58583979c07b0d2b..e4106ed9846f357d87333f9688afd08735183e89 100644 --- a/lib/gat/matchers/and.go +++ b/lib/gat/matchers/and.go @@ -45,7 +45,7 @@ func (T *And) Provision(ctx caddy.Context) error { return nil } -func (T *And) Matches(conn fed.Conn) bool { +func (T *And) Matches(conn *fed.Conn) bool { for _, matcher := range T.and { if !matcher.Matches(conn) { return false diff --git a/lib/gat/matchers/database.go b/lib/gat/matchers/database.go index 0133a90e4c3631a39f81ddca4e4108b2e9eb43f3..d75731ac17771fb0caa23f6b0e918f5e5dae53b3 100644 --- a/lib/gat/matchers/database.go +++ b/lib/gat/matchers/database.go @@ -24,8 +24,8 @@ func (T *Database) CaddyModule() caddy.ModuleInfo { } } -func (T *Database) Matches(conn fed.Conn) bool { - return conn.Database() == T.Database +func (T *Database) Matches(conn *fed.Conn) bool { + return conn.Database == T.Database } var _ gat.Matcher = (*Database)(nil) diff --git a/lib/gat/matchers/localaddress.go b/lib/gat/matchers/localaddress.go index bd230eac89c5396847314e249aa4dae23ebf2ce4..c9ac3093f475bf7f3b6ddd3a9c6f128ff68f3933 100644 --- a/lib/gat/matchers/localaddress.go +++ b/lib/gat/matchers/localaddress.go @@ -47,8 +47,12 @@ func (T *LocalAddress) Provision(ctx caddy.Context) error { return err } -func (T *LocalAddress) Matches(conn fed.Conn) bool { - switch addr := conn.LocalAddr().(type) { +func (T *LocalAddress) Matches(conn *fed.Conn) bool { + netConn, ok := conn.ReadWriteCloser.(*fed.NetConn) + if !ok { + return false + } + switch addr := netConn.LocalAddr().(type) { case *net.TCPAddr: expected, ok := T.addr.(*net.TCPAddr) if !ok { diff --git a/lib/gat/matchers/or.go b/lib/gat/matchers/or.go index a8d0632c7ca726bba0c1e76e5301e51927d22f55..baf7e89f75d4669a52c2c924eb99ccac76f08059 100644 --- a/lib/gat/matchers/or.go +++ b/lib/gat/matchers/or.go @@ -45,7 +45,7 @@ func (T *Or) Provision(ctx caddy.Context) error { return nil } -func (T *Or) Matches(conn fed.Conn) bool { +func (T *Or) Matches(conn *fed.Conn) bool { for _, matcher := range T.or { if matcher.Matches(conn) { return true diff --git a/lib/gat/matchers/ssl.go b/lib/gat/matchers/ssl.go index eacd4090e6329eafbde15b655ab747a414a92ecf..57ae1a0acb907587d5c30070051af0a5a30d4017 100644 --- a/lib/gat/matchers/ssl.go +++ b/lib/gat/matchers/ssl.go @@ -24,8 +24,12 @@ func (T *SSL) CaddyModule() caddy.ModuleInfo { } } -func (T *SSL) Matches(conn fed.Conn) bool { - return conn.SSLEnabled() == T.SSL +func (T *SSL) Matches(conn *fed.Conn) bool { + sslConn, ok := conn.ReadWriteCloser.(fed.SSL) + if !ok { + return T.SSL == false + } + return sslConn.SSL() == T.SSL } var _ gat.Matcher = (*SSL)(nil) diff --git a/lib/gat/matchers/startupparameters.go b/lib/gat/matchers/startupparameters.go index addb92f48347ff802dcf56f311023c988cd6aeb7..975e4d6e7d27248d7c8f42fc31cf62578ce01cfe 100644 --- a/lib/gat/matchers/startupparameters.go +++ b/lib/gat/matchers/startupparameters.go @@ -36,10 +36,9 @@ func (T *StartupParameters) Provision(ctx caddy.Context) error { return nil } -func (T *StartupParameters) Matches(conn fed.Conn) bool { - initialParameters := conn.InitialParameters() +func (T *StartupParameters) Matches(conn *fed.Conn) bool { for key, value := range T.parameters { - if initialParameters[key] != value { + if conn.InitialParameters[key] != value { return false } } diff --git a/lib/gat/matchers/user.go b/lib/gat/matchers/user.go index a666a4bb12912a727b38dfc94ebdae23025b3a65..33f94cf09fd6cdfe626432452a9c4cf7bf231744 100644 --- a/lib/gat/matchers/user.go +++ b/lib/gat/matchers/user.go @@ -24,8 +24,8 @@ func (T *User) CaddyModule() caddy.ModuleInfo { } } -func (T *User) Matches(conn fed.Conn) bool { - return conn.User() == T.User +func (T *User) Matches(conn *fed.Conn) bool { + return conn.User == T.User } var _ gat.Matcher = (*User)(nil) diff --git a/lib/gat/pool/client.go b/lib/gat/pool/client.go index 72c6d8b6aa67741bbed6675b6eaf81755834fb4b..c6d3c76e45367c7843c3ad651a9bf694c538f3c8 100644 --- a/lib/gat/pool/client.go +++ b/lib/gat/pool/client.go @@ -2,11 +2,9 @@ package pool import ( "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" - "gfx.cafe/gfx/pggat/lib/middleware/interceptor" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/eqp" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/ps" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/unterminate" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/eqp" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/ps" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/unterminate" ) type pooledClient struct { @@ -18,31 +16,27 @@ type pooledClient struct { func newClient( options Config, - conn fed.Conn, + conn *fed.Conn, ) *pooledClient { - middlewares := []middleware.Middleware{ + conn.Middleware = append( + conn.Middleware, unterminate.Unterminate, - } + ) var psClient *ps.Client if options.ParameterStatusSync == ParameterStatusSyncDynamic { // add ps middleware - psClient = ps.NewClient(conn.InitialParameters()) - middlewares = append(middlewares, psClient) + psClient = ps.NewClient(conn.InitialParameters) + conn.Middleware = append(conn.Middleware, psClient) } var eqpClient *eqp.Client if options.ExtendedQuerySync { // add eqp middleware eqpClient = eqp.NewClient() - middlewares = append(middlewares, eqpClient) + conn.Middleware = append(conn.Middleware, eqpClient) } - conn = interceptor.NewInterceptor( - conn, - middlewares..., - ) - return &pooledClient{ pooledConn: makeConn( conn, diff --git a/lib/gat/pool/options.go b/lib/gat/pool/config.go similarity index 100% rename from lib/gat/pool/options.go rename to lib/gat/pool/config.go diff --git a/lib/gat/pool/conn.go b/lib/gat/pool/conn.go index 07b54699a0320510d8b8048730d3aae83115f7fd..065a645895951e6693e756a2054e03f45f89b031 100644 --- a/lib/gat/pool/conn.go +++ b/lib/gat/pool/conn.go @@ -15,9 +15,7 @@ import ( type pooledConn struct { id uuid.UUID - conn fed.Conn - // please someone fix runtime.convI2I - rw fed.ReadWriter + conn *fed.Conn // metrics @@ -35,12 +33,11 @@ type pooledConn struct { } func makeConn( - conn fed.Conn, + conn *fed.Conn, ) pooledConn { return pooledConn{ id: uuid.New(), conn: conn, - rw: conn, since: time.Now(), } @@ -50,21 +47,16 @@ func (T *pooledConn) GetID() uuid.UUID { return T.id } -func (T *pooledConn) GetConn() fed.Conn { +func (T *pooledConn) GetConn() *fed.Conn { return T.conn } -// GetReadWriter is the exact same as GetConn but bypasses the runtime.convI2I -func (T *pooledConn) GetReadWriter() fed.ReadWriter { - return T.rw -} - func (T *pooledConn) GetInitialParameters() map[strutil.CIString]string { - return T.conn.InitialParameters() + return T.conn.InitialParameters } func (T *pooledConn) GetBackendKey() [8]byte { - return T.conn.BackendKey() + return T.conn.BackendKey } func (T *pooledConn) TransactionComplete() { diff --git a/lib/gat/pool/flow.go b/lib/gat/pool/flow.go index 72f0025efb229a99689c028f325edbfa4118a0d1..e12636210e444859639229cf308bb4e48c2b6cec 100644 --- a/lib/gat/pool/flow.go +++ b/lib/gat/pool/flow.go @@ -3,10 +3,10 @@ package pool import ( "gfx.cafe/gfx/pggat/lib/bouncer/backends/v0" "gfx.cafe/gfx/pggat/lib/fed" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/eqp" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/ps" packets "gfx.cafe/gfx/pggat/lib/fed/packets/v3.0" "gfx.cafe/gfx/pggat/lib/gat/metrics" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/eqp" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/ps" "gfx.cafe/gfx/pggat/lib/util/slices" ) @@ -23,7 +23,7 @@ func pair(options Config, client *pooledClient, server *pooledServer) (clientErr switch options.ParameterStatusSync { case ParameterStatusSyncDynamic: - clientErr, serverErr = ps.Sync(options.TrackedParameters, client.GetReadWriter(), client.GetPS(), server.GetReadWriter(), server.GetPS()) + clientErr, serverErr = ps.Sync(options.TrackedParameters, client.GetConn(), client.GetPS(), server.GetConn(), server.GetPS()) case ParameterStatusSyncInitial: clientErr, serverErr = syncInitialParameters(options, client, server) } @@ -33,7 +33,7 @@ func pair(options Config, client *pooledClient, server *pooledServer) (clientErr } if options.ExtendedQuerySync { - serverErr = eqp.Sync(client.GetEQP(), server.GetReadWriter(), server.GetEQP()) + serverErr = eqp.Sync(client.GetEQP(), server.GetConn(), server.GetEQP()) } return @@ -80,7 +80,7 @@ func syncInitialParameters(options Config, client *pooledClient, server *pooledS continue } - serverErr, _, packet = backends.SetParameter(server.GetReadWriter(), nil, packet, key, value) + serverErr, _, packet = backends.SetParameter(server.GetConn(), nil, packet, key, value) if serverErr != nil { return } diff --git a/lib/gat/pool/pool.go b/lib/gat/pool/pool.go index dea718b7c1beb18385b9f642163dcda8eb40ec5d..91fc0ee3175e290a63f4c541e3ccffe034109ad8 100644 --- a/lib/gat/pool/pool.go +++ b/lib/gat/pool/pool.go @@ -267,7 +267,7 @@ func (T *Pool) releaseServer(server *pooledServer) { if T.config.ServerResetQuery != "" { server.SetState(metrics.ConnStateRunningResetQuery, uuid.Nil) - err, _, _ := backends.QueryString(server.GetReadWriter(), nil, nil, T.config.ServerResetQuery) + err, _, _ := backends.QueryString(server.GetConn(), nil, nil, T.config.ServerResetQuery) if err != nil { T.removeServer(server) return @@ -280,7 +280,7 @@ func (T *Pool) releaseServer(server *pooledServer) { } func (T *Pool) Serve( - conn fed.Conn, + conn *fed.Conn, ) error { defer func() { _ = conn.Close() @@ -297,7 +297,7 @@ func (T *Pool) Serve( // ServeBot is for clients that don't need initial parameters, cancelling queries, and are ready now. Use Serve for // real clients func (T *Pool) ServeBot( - conn fed.Conn, + conn fed.ReadWriteCloser, ) error { defer func() { _ = conn.Close() @@ -305,7 +305,9 @@ func (T *Pool) ServeBot( client := newClient( T.config, - conn, + &fed.Conn{ + ReadWriteCloser: conn, + }, ) return T.serve(client, true) @@ -369,7 +371,7 @@ func (T *Pool) serve(client *pooledClient, initialized bool) error { err, serverErr = pair(T.config, client, server) } if err == nil && serverErr == nil { - packet, err, serverErr = bouncers.Bounce(client.GetReadWriter(), server.GetReadWriter(), packet) + packet, err, serverErr = bouncers.Bounce(client.GetConn(), server.GetConn(), packet) } if serverErr != nil { return serverErr diff --git a/lib/gat/pool/recipe/options.go b/lib/gat/pool/recipe/config.go similarity index 100% rename from lib/gat/pool/recipe/options.go rename to lib/gat/pool/recipe/config.go diff --git a/lib/gat/pool/recipe/dialer.go b/lib/gat/pool/recipe/dialer.go index d40ad740a87251aff4dabdcb348beb80f5c9d135..e9392c118f25220fafe6691f409af7aaf6ddf004 100644 --- a/lib/gat/pool/recipe/dialer.go +++ b/lib/gat/pool/recipe/dialer.go @@ -25,16 +25,18 @@ type Dialer struct { StartupParameters map[strutil.CIString]string } -func (T Dialer) Dial() (fed.Conn, error) { +func (T Dialer) Dial() (*fed.Conn, error) { c, err := net.Dial(T.Network, T.Address) if err != nil { return nil, err } - conn := fed.WrapNetConn(c) - conn.SetUser(T.Username) - conn.SetDatabase(T.Database) - _, initialParameters, backendKey, err := backends.Accept( - conn, + conn := fed.NewConn( + fed.NewNetConn(c), + ) + conn.User = T.Username + conn.Database = T.Database + _, conn.InitialParameters, conn.BackendKey, err = backends.Accept( + conn.ReadWriteCloser, T.SSLMode, T.SSLConfig, T.Username, @@ -45,8 +47,6 @@ func (T Dialer) Dial() (fed.Conn, error) { if err != nil { return nil, err } - conn.SetInitialParameters(initialParameters) - conn.SetBackendKey(backendKey) return conn, nil } @@ -55,7 +55,7 @@ func (T Dialer) Cancel(key [8]byte) error { if err != nil { return err } - conn := fed.WrapNetConn(c) + conn := fed.NewNetConn(c) defer func() { _ = conn.Close() }() diff --git a/lib/gat/pool/recipe/recipe.go b/lib/gat/pool/recipe/recipe.go index d4e7165cf2fc96fcdc355c2dc6548af84d9cb438..ba02bd0906d9382f61be9ec10e03834c2bbb1308 100644 --- a/lib/gat/pool/recipe/recipe.go +++ b/lib/gat/pool/recipe/recipe.go @@ -66,7 +66,7 @@ func (T *Recipe) Free() { T.count-- } -func (T *Recipe) Dial() (fed.Conn, error) { +func (T *Recipe) Dial() (*fed.Conn, error) { return T.config.Dialer.Dial() } diff --git a/lib/gat/pool/server.go b/lib/gat/pool/server.go index 3921324468f4d688e35dda1a70575657b5842398..9afa7c994359bd6157c0df746dc368efd1c6500c 100644 --- a/lib/gat/pool/server.go +++ b/lib/gat/pool/server.go @@ -2,10 +2,8 @@ package pool import ( "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" - "gfx.cafe/gfx/pggat/lib/middleware/interceptor" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/eqp" - "gfx.cafe/gfx/pggat/lib/middleware/middlewares/ps" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/eqp" + "gfx.cafe/gfx/pggat/lib/fed/middlewares/ps" ) type pooledServer struct { @@ -20,29 +18,20 @@ type pooledServer struct { func newServer( options Config, recipe string, - conn fed.Conn, + conn *fed.Conn, ) *pooledServer { - var middlewares []middleware.Middleware - var psServer *ps.Server if options.ParameterStatusSync == ParameterStatusSyncDynamic { // add ps middleware - psServer = ps.NewServer(conn.InitialParameters()) - middlewares = append(middlewares, psServer) + psServer = ps.NewServer(conn.InitialParameters) + conn.Middleware = append(conn.Middleware, psServer) } var eqpServer *eqp.Server if options.ExtendedQuerySync { // add eqp middleware eqpServer = eqp.NewServer() - middlewares = append(middlewares, eqpServer) - } - - if len(middlewares) > 0 { - conn = interceptor.NewInterceptor( - conn, - middlewares..., - ) + conn.Middleware = append(conn.Middleware, eqpServer) } return &pooledServer{ diff --git a/lib/gat/provider.go b/lib/gat/provider.go index 127e16a76aa18deb3509bcc2e31eb6540fed7339..a3162f98501da019469f8ad005b700691573e940 100644 --- a/lib/gat/provider.go +++ b/lib/gat/provider.go @@ -7,6 +7,6 @@ import ( // Provider provides pool to the server type Provider interface { - Lookup(conn fed.Conn) *Pool + Lookup(conn *fed.Conn) *Pool ReadMetrics(metrics *metrics.Pools) } diff --git a/lib/gat/providers/discovery/discoverers/google_cloud_sql/discoverer.go b/lib/gat/providers/discovery/discoverers/google_cloud_sql/discoverer.go index b6b665383e8789effa9d6feb48f776d2edc1da3a..41ba08e46bf421edc240e9fc9c4c106edb3e88f7 100644 --- a/lib/gat/providers/discovery/discoverers/google_cloud_sql/discoverer.go +++ b/lib/gat/providers/discovery/discoverers/google_cloud_sql/discoverer.go @@ -97,7 +97,7 @@ func (T *Discoverer) instanceToCluster(primary *sqladmin.DatabaseInstance, repli return c, nil } - var admin fed.Conn + var admin *fed.Conn defer func() { if admin != nil { _ = admin.Close() diff --git a/lib/gat/providers/discovery/module.go b/lib/gat/providers/discovery/module.go index 07fe74dabba2c07d2592a4a21e3324ee3d9ff4f1..edeb339fe4287224cea1907acf6c062535d47667 100644 --- a/lib/gat/providers/discovery/module.go +++ b/lib/gat/providers/discovery/module.go @@ -524,8 +524,8 @@ func (T *Module) lookup(user, database string) *gat.Pool { return p } -func (T *Module) Lookup(conn fed.Conn) *gat.Pool { - return T.lookup(conn.User(), conn.Database()) +func (T *Module) Lookup(conn *fed.Conn) *gat.Pool { + return T.lookup(conn.User, conn.Database) } var _ gat.Provider = (*Module)(nil) diff --git a/lib/gat/providers/pgbouncer/module.go b/lib/gat/providers/pgbouncer/module.go index b3bdc582bc8708e1aaddc197a7c0728e83b2861d..a5705d76e6404f53a45389ea357226001258b6f3 100644 --- a/lib/gat/providers/pgbouncer/module.go +++ b/lib/gat/providers/pgbouncer/module.go @@ -273,8 +273,8 @@ func (T *Module) lookup(user, database string) *gat.Pool { return T.tryCreate(user, database) } -func (T *Module) Lookup(conn fed.Conn) *gat.Pool { - return T.lookup(conn.User(), conn.Database()) +func (T *Module) Lookup(conn *fed.Conn) *gat.Pool { + return T.lookup(conn.User, conn.Database) } func (T *Module) ReadMetrics(metrics *metrics.Pools) { diff --git a/lib/gat/server.go b/lib/gat/server.go index 23a01606feb046f8136c8e68ede24b6c7286747c..0464559287c7012ee9bfb0aa9baa7bd710a253ac 100644 --- a/lib/gat/server.go +++ b/lib/gat/server.go @@ -47,7 +47,7 @@ func (T *Server) Provision(ctx caddy.Context) error { return nil } -func (T *Server) lookup(conn fed.Conn) *pool.Pool { +func (T *Server) lookup(conn *fed.Conn) *pool.Pool { for _, route := range T.routes { if route.match != nil && !route.match.Matches(conn) { continue diff --git a/lib/gsql/client.go b/lib/gsql/client.go index f7adaccff9a6569e11236f830e9a427fcd19568e..de0a0630725fab6bf7b678fe490196a813a992f3 100644 --- a/lib/gsql/client.go +++ b/lib/gsql/client.go @@ -8,7 +8,6 @@ import ( "gfx.cafe/gfx/pggat/lib/fed" "gfx.cafe/gfx/pggat/lib/util/ring" "gfx.cafe/gfx/pggat/lib/util/slices" - "gfx.cafe/gfx/pggat/lib/util/strutil" ) type batch struct { @@ -144,32 +143,4 @@ func (T *Client) Close() error { return nil } -func (T *Client) LocalAddr() net.Addr { - return Addr{} -} - -func (T *Client) RemoteAddr() net.Addr { - return Addr{} -} - -func (T *Client) SSLEnabled() bool { - return false -} - -func (T *Client) User() string { - return "" -} - -func (T *Client) Database() string { - return "" -} - -func (T *Client) InitialParameters() map[strutil.CIString]string { - return nil -} - -func (T *Client) BackendKey() [8]byte { - return [8]byte{} -} - -var _ fed.Conn = (*Client)(nil) +var _ fed.ReadWriteCloser = (*Client)(nil) diff --git a/lib/middleware/context.go b/lib/middleware/context.go deleted file mode 100644 index be60aa0ee3fe8eb7f8ceaa6700e90b07f6f8dc9b..0000000000000000000000000000000000000000 --- a/lib/middleware/context.go +++ /dev/null @@ -1,11 +0,0 @@ -package middleware - -import "gfx.cafe/gfx/pggat/lib/fed" - -type Context interface { - // Cancel the current packet - Cancel() - - // Write packet to underlying connection - Write(packet fed.Packet) error -} diff --git a/lib/middleware/interceptor/context.go b/lib/middleware/interceptor/context.go deleted file mode 100644 index ea4c7a767aa8d606fe282fbfd4e463803830fad0..0000000000000000000000000000000000000000 --- a/lib/middleware/interceptor/context.go +++ /dev/null @@ -1,36 +0,0 @@ -package interceptor - -import ( - "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" - "gfx.cafe/gfx/pggat/lib/util/decorator" -) - -type Context struct { - noCopy decorator.NoCopy - - cancelled bool - - // for normal Write / WriteUntyped - rw fed.ReadWriter -} - -func makeContext(rw fed.ReadWriter) Context { - return Context{ - rw: rw, - } -} - -func (T *Context) reset() { - T.cancelled = false -} - -func (T *Context) Cancel() { - T.cancelled = true -} - -func (T *Context) Write(packet fed.Packet) error { - return T.rw.WritePacket(packet) -} - -var _ middleware.Context = (*Context)(nil) diff --git a/lib/middleware/interceptor/interceptor.go b/lib/middleware/interceptor/interceptor.go deleted file mode 100644 index 7336962a113d3c73fd9108c89ff3b14f2e79c1b2..0000000000000000000000000000000000000000 --- a/lib/middleware/interceptor/interceptor.go +++ /dev/null @@ -1,100 +0,0 @@ -package interceptor - -import ( - "net" - - "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" - "gfx.cafe/gfx/pggat/lib/util/strutil" -) - -type Interceptor struct { - middlewares []middleware.Middleware - context Context - conn fed.Conn -} - -func NewInterceptor(conn fed.Conn, middlewares ...middleware.Middleware) *Interceptor { - if v, ok := conn.(*Interceptor); ok { - v.middlewares = append(v.middlewares, middlewares...) - return v - } - return &Interceptor{ - middlewares: middlewares, - context: makeContext(conn), - conn: conn, - } -} - -func (T *Interceptor) ReadPacket(typed bool, packet fed.Packet) (fed.Packet, error) { -outer: - for { - var err error - packet, err = T.conn.ReadPacket(typed, packet) - if err != nil { - return packet, err - } - - for _, mw := range T.middlewares { - T.context.reset() - err = mw.Read(&T.context, packet) - if err != nil { - return packet, err - } - if T.context.cancelled { - continue outer - } - } - - return packet, nil - } -} - -func (T *Interceptor) WritePacket(packet fed.Packet) error { - for _, mw := range T.middlewares { - T.context.reset() - err := mw.Write(&T.context, packet) - if err != nil { - return err - } - if T.context.cancelled { - return nil - } - } - - return T.conn.WritePacket(packet) -} - -func (T *Interceptor) LocalAddr() net.Addr { - return T.conn.LocalAddr() -} - -func (T *Interceptor) RemoteAddr() net.Addr { - return T.conn.RemoteAddr() -} - -func (T *Interceptor) SSLEnabled() bool { - return T.conn.SSLEnabled() -} - -func (T *Interceptor) User() string { - return T.conn.User() -} - -func (T *Interceptor) Database() string { - return T.conn.Database() -} - -func (T *Interceptor) InitialParameters() map[strutil.CIString]string { - return T.conn.InitialParameters() -} - -func (T *Interceptor) BackendKey() [8]byte { - return T.conn.BackendKey() -} - -func (T *Interceptor) Close() error { - return T.conn.Close() -} - -var _ fed.Conn = (*Interceptor)(nil) diff --git a/lib/middleware/middleware.go b/lib/middleware/middleware.go deleted file mode 100644 index 63f5401dad430cd2aa11782bc4c1914bd9de6a80..0000000000000000000000000000000000000000 --- a/lib/middleware/middleware.go +++ /dev/null @@ -1,8 +0,0 @@ -package middleware - -import "gfx.cafe/gfx/pggat/lib/fed" - -type Middleware interface { - Read(ctx Context, packet fed.Packet) error - Write(ctx Context, packet fed.Packet) error -} diff --git a/lib/middleware/middlewares/eqp/client.go b/lib/middleware/middlewares/eqp/client.go deleted file mode 100644 index 89175b71897dbab224e41f673f8700b52cd797d4..0000000000000000000000000000000000000000 --- a/lib/middleware/middlewares/eqp/client.go +++ /dev/null @@ -1,26 +0,0 @@ -package eqp - -import ( - "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" -) - -type Client struct { - state State -} - -func NewClient() *Client { - return new(Client) -} - -func (T *Client) Read(_ middleware.Context, packet fed.Packet) error { - T.state.C2S(packet) - return nil -} - -func (T *Client) Write(_ middleware.Context, packet fed.Packet) error { - T.state.S2C(packet) - return nil -} - -var _ middleware.Middleware = (*Client)(nil) diff --git a/lib/middleware/middlewares/eqp/server.go b/lib/middleware/middlewares/eqp/server.go deleted file mode 100644 index 04a11d178597a9c1bafdf33cd476282aeb62bb0b..0000000000000000000000000000000000000000 --- a/lib/middleware/middlewares/eqp/server.go +++ /dev/null @@ -1,26 +0,0 @@ -package eqp - -import ( - "gfx.cafe/gfx/pggat/lib/fed" - "gfx.cafe/gfx/pggat/lib/middleware" -) - -type Server struct { - state State -} - -func NewServer() *Server { - return new(Server) -} - -func (T *Server) Read(_ middleware.Context, packet fed.Packet) error { - T.state.S2C(packet) - return nil -} - -func (T *Server) Write(_ middleware.Context, packet fed.Packet) error { - T.state.C2S(packet) - return nil -} - -var _ middleware.Middleware = (*Server)(nil)