From f0e97329a4d41389bd9c5934d8d7d52760f96367 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 7 Oct 2024 15:56:40 -0300 Subject: [PATCH 01/27] feat: basic sketch for QUICAcceptor --- pkg/acceptor/quic_acceptor.go | 167 ++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 pkg/acceptor/quic_acceptor.go diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go new file mode 100644 index 00000000..97a0562b --- /dev/null +++ b/pkg/acceptor/quic_acceptor.go @@ -0,0 +1,167 @@ +// Copyright (c) nano Author and TFG Co. All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package acceptor + +import ( + "context" + "crypto/tls" + "net" + + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/http3" + "github.com/topfreegames/pitaya/v3/pkg/conn/codec" + "github.com/topfreegames/pitaya/v3/pkg/constants" + "github.com/topfreegames/pitaya/v3/pkg/logger" +) + +// QUICAcceptor struct +type QUICAcceptor struct { + addr string + connChan chan PlayerConn + listener quic.Listener + running bool + tlsConfig *tls.Config + quicConfig *quic.Config +} + +type quicPlayerConn struct { + quic.Connection + remoteAddr net.Addr +} + +func (q *quicPlayerConn) RemoteAddr() net.Addr { + return q.remoteAddr +} + +// GetNextMessage reads the next message available in the stream +func (q *quicPlayerConn) GetNextMessage() (b []byte, err error) { + stream, err := q.OpenStreamSync(context.Background()) + if err != nil { + return nil, err + } + + header, err := codec.ReadBytes(stream, codec.HeadLength) + if err != nil { + return nil, err + } + + if len(header) == 0 { + return nil, constants.ErrConnectionClosed + } + + msgSize, _, err := codec.ParseHeader(header) + if err != nil { + return nil, err + } + + msgData, err := codec.ReadBytes(stream, int(msgSize)) + if err != nil { + return nil, err + } + + if len(msgData) < msgSize { + return nil, constants.ErrReceivedMsgSmallerThanExpected + } + + return append(header, msgData...), nil +} + +// NewQUICAcceptor creates a new instance of QUIC acceptor +func NewQUICAcceptor(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) *QUICAcceptor { + return &QUICAcceptor{ + addr: addr, + connChan: make(chan PlayerConn), + running: false, + tlsConfig: tlsConfig, + quicConfig: quicConfig, + } +} + +// GetAddr returns the address the acceptor will listen on +func (q *QUICAcceptor) GetAddr() string { + if q.listener != nil { + return q.listener.Addr().String() + } + return "" +} + +// GetConnChan gets a connection channel +func (q *QUICAcceptor) GetConnChan() chan PlayerConn { + return q.connChan +} + +// Stop stops the acceptor +func (q *QUICAcceptor) Stop() { + q.running = false + q.listener.Close() +} + +// ListenAndServe starts the QUIC listener +func (q *QUICAcceptor) ListenAndServe() { + listener, err := quic.ListenAddr(q.addr, q.tlsConfig, q.quicConfig) + if err != nil { + logger.Log.Fatalf("Failed to listen: %s", err.Error()) + } + + q.listener = listener + q.running = true + q.serve() +} + +func (q *QUICAcceptor) serve() { + defer q.Stop() + for q.running { + session, err := q.listener.Accept(context.Background()) + if err != nil { + logger.Log.Errorf("Failed to accept QUIC connection: %s", err.Error()) + continue + } + + q.connChan <- &quicPlayerConn{ + Connection: session, + remoteAddr: session.RemoteAddr(), + } + } +} + +// IsRunning checks if the acceptor is running +func (q *QUICAcceptor) IsRunning() bool { + return q.running +} + +func (q *QUICAcceptor) GetConfiguredAddress() string { + return q.addr +} + +// ServeHTTP3 starts an HTTP/3 server with the QUIC listener +func (q *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { + httpServer := http3.Server{ + Addr: q.addr, + TLSConfig: q.tlsConfig, + Handler: handler, + } + + err := httpServer.ListenAndServeTLS(certFile, keyFile) + if err != nil { + logger.Log.Fatalf("Failed to serve HTTP/3: %s", err.Error()) + } +} + From c7c961c43cba183c337e3470ac6129c96d20aec1 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 7 Oct 2024 16:09:12 -0300 Subject: [PATCH 02/27] refactor: add TODO for HTTP/3 integration while awaiting testing --- pkg/acceptor/quic_acceptor.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 97a0562b..a8317eef 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -151,17 +151,7 @@ func (q *QUICAcceptor) GetConfiguredAddress() string { return q.addr } -// ServeHTTP3 starts an HTTP/3 server with the QUIC listener -func (q *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { - httpServer := http3.Server{ - Addr: q.addr, - TLSConfig: q.tlsConfig, - Handler: handler, - } - - err := httpServer.ListenAndServeTLS(certFile, keyFile) - if err != nil { - logger.Log.Fatalf("Failed to serve HTTP/3: %s", err.Error()) - } -} +// TODO +// func (q *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { +// } From b6ebaf3325c693514d9e2329543a223ca780841b Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 7 Oct 2024 16:10:15 -0300 Subject: [PATCH 03/27] refactor: add TODO for HTTP/3 integration while awaiting testing --- pkg/acceptor/quic_acceptor.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index a8317eef..b8d1f8c4 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -151,7 +151,18 @@ func (q *QUICAcceptor) GetConfiguredAddress() string { return q.addr } -// TODO -// func (q *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { -// } - +// ServeHTTP3 starts an HTTP/3 server with the QUIC listener +// TODO: Implement and test HTTP/3 server integration +func (a *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { + // Commenting out HTTP/3 functionality for now until testing is done + // httpServer := http3.Server{ + // Addr: a.addr, + // TLSConfig: a.tlsConfig, + // Handler: handler, + // } + + // err := httpServer.ListenAndServeTLS(certFile, keyFile) + // if err != nil { + // logger.Log.Fatalf("Failed to serve HTTP/3: %s", err.Error()) + // } +} From 996c7c9354526b64e02914c36eb4eac8e83db4a8 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Tue, 8 Oct 2024 15:08:25 -0300 Subject: [PATCH 04/27] refactor: update QUIC acceptor to use quic-go, add connection wrapper with timeout support --- pkg/acceptor/quic_acceptor.go | 211 +++++++++++++++------------------- 1 file changed, 93 insertions(+), 118 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index b8d1f8c4..4c845bd7 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -21,148 +21,123 @@ package acceptor import ( - "context" - "crypto/tls" - "net" - - "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/http3" - "github.com/topfreegames/pitaya/v3/pkg/conn/codec" - "github.com/topfreegames/pitaya/v3/pkg/constants" - "github.com/topfreegames/pitaya/v3/pkg/logger" + "context" + "crypto/tls" + "errors" + "net" + "time" + + "github.com/quic-go/quic-go" ) -// QUICAcceptor struct -type QUICAcceptor struct { - addr string - connChan chan PlayerConn - listener quic.Listener - running bool - tlsConfig *tls.Config - quicConfig *quic.Config -} +var ( + // ErrListenerNotInitialized é retornado se o listener QUIC ainda não foi inicializado + ErrListenerNotInitialized = errors.New("listener not initialized") + // ErrConnClosed é retornado quando a conexão QUIC está fechada + ErrConnClosed = errors.New("connection is closed") +) -type quicPlayerConn struct { - quic.Connection - remoteAddr net.Addr +// QuicAcceptor estrutura que representa um acceptor QUIC +type QuicAcceptor struct { + addr string + listener *quic.Listener + tlsConf *tls.Config + quicConf *quic.Config } -func (q *quicPlayerConn) RemoteAddr() net.Addr { - return q.remoteAddr +// NewQuicAcceptor cria um novo QuicAcceptor +func NewQuicAcceptor(addr string, tlsConf *tls.Config, quicConf *quic.Config) *QuicAcceptor { + return &QuicAcceptor{ + addr: addr, + tlsConf: tlsConf, + quicConf: quicConf, + } } -// GetNextMessage reads the next message available in the stream -func (q *quicPlayerConn) GetNextMessage() (b []byte, err error) { - stream, err := q.OpenStreamSync(context.Background()) - if err != nil { - return nil, err - } - - header, err := codec.ReadBytes(stream, codec.HeadLength) - if err != nil { - return nil, err - } - - if len(header) == 0 { - return nil, constants.ErrConnectionClosed - } - - msgSize, _, err := codec.ParseHeader(header) - if err != nil { - return nil, err - } - - msgData, err := codec.ReadBytes(stream, int(msgSize)) - if err != nil { - return nil, err - } - - if len(msgData) < msgSize { - return nil, constants.ErrReceivedMsgSmallerThanExpected - } - - return append(header, msgData...), nil +// Listen inicia o listener QUIC para aceitar novas conexões +func (a *QuicAcceptor) Listen() error { + // Criando um listener QUIC no endereço especificado + listener, err := quic.ListenAddr(a.addr, a.tlsConf, a.quicConf) + if err != nil { + return err + } + a.listener = listener + return nil } -// NewQUICAcceptor creates a new instance of QUIC acceptor -func NewQUICAcceptor(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) *QUICAcceptor { - return &QUICAcceptor{ - addr: addr, - connChan: make(chan PlayerConn), - running: false, - tlsConfig: tlsConfig, - quicConfig: quicConfig, - } +// Accept aceita novas conexões QUIC +func (a *QuicAcceptor) Accept() (quic.Connection, error) { + if a.listener == nil { + return nil, ErrListenerNotInitialized + } + + // Contexto com timeout para aceitar conexões + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + conn, err := a.listener.Accept(ctx) + if err != nil { + return nil, err + } + + return conn, nil } -// GetAddr returns the address the acceptor will listen on -func (q *QUICAcceptor) GetAddr() string { - if q.listener != nil { - return q.listener.Addr().String() - } - return "" +// Close fecha o listener QUIC +func (a *QuicAcceptor) Close() error { + if a.listener != nil { + return a.listener.Close() + } + return nil } -// GetConnChan gets a connection channel -func (q *QUICAcceptor) GetConnChan() chan PlayerConn { - return q.connChan +// QuicConnWrapper é um wrapper para uma conexão QUIC, permitindo o uso de deadlines +type QuicConnWrapper struct { + conn quic.Connection } -// Stop stops the acceptor -func (q *QUICAcceptor) Stop() { - q.running = false - q.listener.Close() +// NewQuicConnWrapper cria um novo wrapper para uma conexão QUIC +func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { + return &QuicConnWrapper{conn: conn} } -// ListenAndServe starts the QUIC listener -func (q *QUICAcceptor) ListenAndServe() { - listener, err := quic.ListenAddr(q.addr, q.tlsConfig, q.quicConfig) - if err != nil { - logger.Log.Fatalf("Failed to listen: %s", err.Error()) - } +// Read lê dados da conexão com um deadline definido +func (q *QuicConnWrapper) Read(p []byte, readTimeout time.Duration) (int, error) { + ctx, cancel := context.WithTimeout(context.Background(), readTimeout) + defer cancel() + + stream, err := q.conn.AcceptStream(ctx) + if err != nil { + return 0, err + } - q.listener = listener - q.running = true - q.serve() + return stream.Read(p) } -func (q *QUICAcceptor) serve() { - defer q.Stop() - for q.running { - session, err := q.listener.Accept(context.Background()) - if err != nil { - logger.Log.Errorf("Failed to accept QUIC connection: %s", err.Error()) - continue - } - - q.connChan <- &quicPlayerConn{ - Connection: session, - remoteAddr: session.RemoteAddr(), - } - } +// Write escreve dados na conexão com um deadline definido +func (q *QuicConnWrapper) Write(p []byte, writeTimeout time.Duration) (int, error) { + ctx, cancel := context.WithTimeout(context.Background(), writeTimeout) + defer cancel() + + stream, err := q.conn.OpenStreamSync(ctx) + if err != nil { + return 0, err + } + + return stream.Write(p) } -// IsRunning checks if the acceptor is running -func (q *QUICAcceptor) IsRunning() bool { - return q.running +// Close fecha a conexão QUIC +func (q *QuicConnWrapper) Close() error { + return q.conn.CloseWithError(0, "closed") } -func (q *QUICAcceptor) GetConfiguredAddress() string { - return q.addr +// LocalAddr retorna o endereço local da conexão +func (q *QuicConnWrapper) LocalAddr() net.Addr { + return q.conn.LocalAddr() } -// ServeHTTP3 starts an HTTP/3 server with the QUIC listener -// TODO: Implement and test HTTP/3 server integration -func (a *QUICAcceptor) ServeHTTP3(certFile, keyFile string, handler http.Handler) { - // Commenting out HTTP/3 functionality for now until testing is done - // httpServer := http3.Server{ - // Addr: a.addr, - // TLSConfig: a.tlsConfig, - // Handler: handler, - // } - - // err := httpServer.ListenAndServeTLS(certFile, keyFile) - // if err != nil { - // logger.Log.Fatalf("Failed to serve HTTP/3: %s", err.Error()) - // } +// RemoteAddr retorna o endereço remoto da conexão +func (q *QuicConnWrapper) RemoteAddr() net.Addr { + return q.conn.RemoteAddr() } From 952f6553ddc84541ebe4477cbb08fc011706cbcc Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Tue, 8 Oct 2024 16:04:18 -0300 Subject: [PATCH 05/27] feat: Refactor QUIC acceptor - Modified GetAddr, GetConnChan - Added EnableProxyProtocol, IsRunning, GetConfiguredAddress, ListenAndServe - Updated Read, Write methods - Implemented GetNextMessage - Removed SetDeadline methods --- examples/demo/cluster_grpc/main.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 767fdaff..031880df 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "crypto/tls" "flag" "fmt" "strconv" @@ -17,6 +18,7 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/constants" "github.com/topfreegames/pitaya/v3/pkg/groups" "github.com/topfreegames/pitaya/v3/pkg/modules" + "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/route" ) @@ -129,8 +131,15 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) - builder.AddAcceptor(tcp) + // Define TLS and QUIC configurations here + tlsConf := &tls.Config{ + // Configure your TLS settings, such as certificates, here + } + quicConf := &quic.Config{ + // Set any specific QUIC configuration options here, or leave nil for defaults + } + quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) + builder.AddAcceptor(quicAcceptor) } return builder.Build(), bs From 3093d379085aed2dee4f0da641a903f3fc74eae9 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Tue, 8 Oct 2024 16:05:51 -0300 Subject: [PATCH 06/27] feat: Refactor QUIC acceptor - Modified GetAddr, GetConnChan - Added EnableProxyProtocol, IsRunning, GetConfiguredAddress, ListenAndServe - Updated Read, Write methods - Implemented GetNextMessage - Removed SetDeadline methods --- pkg/acceptor/quic_acceptor.go | 192 +++++++++++++++++++++++++--------- 1 file changed, 144 insertions(+), 48 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 4c845bd7..3b69b795 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -1,81 +1,79 @@ -// Copyright (c) nano Author and TFG Co. All Rights Reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - package acceptor import ( "context" "crypto/tls" "errors" + "fmt" "net" "time" "github.com/quic-go/quic-go" + "github.com/topfreegames/pitaya/v3/pkg/conn/codec" + "github.com/topfreegames/pitaya/v3/pkg/constants" ) var ( - // ErrListenerNotInitialized é retornado se o listener QUIC ainda não foi inicializado + // ErrListenerNotInitialized is returned if the QUIC listener is not initialized ErrListenerNotInitialized = errors.New("listener not initialized") - // ErrConnClosed é retornado quando a conexão QUIC está fechada + // ErrConnClosed is returned when the QUIC connection is closed ErrConnClosed = errors.New("connection is closed") ) -// QuicAcceptor estrutura que representa um acceptor QUIC +// QuicAcceptor represents a QUIC acceptor type QuicAcceptor struct { addr string - listener *quic.Listener + connChan chan PlayerConn + listener *quic.Listener // Using a pointer to quic.Listener + running bool tlsConf *tls.Config quicConf *quic.Config } -// NewQuicAcceptor cria um novo QuicAcceptor +// NewQuicAcceptor creates a new QuicAcceptor func NewQuicAcceptor(addr string, tlsConf *tls.Config, quicConf *quic.Config) *QuicAcceptor { return &QuicAcceptor{ - addr: addr, - tlsConf: tlsConf, + addr: addr, + tlsConf: tlsConf, quicConf: quicConf, + connChan: make(chan PlayerConn), + } +} + +func (a *QuicAcceptor) GetAddr() string { + if a.listener != nil { // Correct comparison, since listener is a pointer + return (*a.listener).Addr().String() // Accessing the value pointed to by the pointer } + return "" } -// Listen inicia o listener QUIC para aceitar novas conexões +// GetConnChan gets a connection channel +func (a *QuicAcceptor) GetConnChan() chan PlayerConn { + return a.connChan +} + +// Listen starts the QUIC listener to accept new connections func (a *QuicAcceptor) Listen() error { - // Criando um listener QUIC no endereço especificado + // Creating a QUIC listener at the specified address listener, err := quic.ListenAddr(a.addr, a.tlsConf, a.quicConf) if err != nil { return err } - a.listener = listener + a.listener = listener // Storing the pointer to quic.Listener return nil } -// Accept aceita novas conexões QUIC +// Accept accepts new QUIC connections func (a *QuicAcceptor) Accept() (quic.Connection, error) { - if a.listener == nil { + if a.listener == nil { // Correct comparison return nil, ErrListenerNotInitialized } - // Contexto com timeout para aceitar conexões + // Context with timeout for accepting connections ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - conn, err := a.listener.Accept(ctx) + conn, err := (*a.listener).Accept(ctx) if err != nil { return nil, err } @@ -83,27 +81,68 @@ func (a *QuicAcceptor) Accept() (quic.Connection, error) { return conn, nil } -// Close fecha o listener QUIC +// Close closes the QUIC listener func (a *QuicAcceptor) Close() error { - if a.listener != nil { - return a.listener.Close() + if a.listener != nil { // Correct comparison + return (*a.listener).Close() } return nil } -// QuicConnWrapper é um wrapper para uma conexão QUIC, permitindo o uso de deadlines +// EnableProxyProtocol not implemented for QUIC, keep as No-op or implement as needed +func (a *QuicAcceptor) EnableProxyProtocol() { + // No-op: Implement this method if needed for Proxy Protocol support +} + +func (a *QuicAcceptor) IsRunning() bool { + return a.running +} + +func (a *QuicAcceptor) GetConfiguredAddress() string { + return a.addr +} + +func (a *QuicAcceptor) ListenAndServe() { + // Start the QUIC listener + err := a.Listen() + if err != nil { + fmt.Printf("Failed to start QUIC listener: %s\n", err) + return + } + + // Loop to continuously accept connections + for a.IsRunning() { + conn, err := a.Accept() + if err != nil { + if errors.Is(err, ErrListenerNotInitialized) { + fmt.Println("Listener not initialized") + continue + } + fmt.Printf("Failed to accept connection: %s\n", err) + continue + } + + // Send the connection to the channel for further processing + go func(c quic.Connection) { + playerConn := NewQuicConnWrapper(c) + a.connChan <- playerConn + }(conn) + } +} + +// QuicConnWrapper is a wrapper for a QUIC connection, allowing the use of deadlines type QuicConnWrapper struct { conn quic.Connection } -// NewQuicConnWrapper cria um novo wrapper para uma conexão QUIC +// NewQuicConnWrapper creates a new wrapper for a QUIC connection func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { return &QuicConnWrapper{conn: conn} } -// Read lê dados da conexão com um deadline definido -func (q *QuicConnWrapper) Read(p []byte, readTimeout time.Duration) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), readTimeout) +// Read reads data from the QUIC connection +func (q *QuicConnWrapper) Read(p []byte) (int, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 10 seconds timeout as an example defer cancel() stream, err := q.conn.AcceptStream(ctx) @@ -114,9 +153,9 @@ func (q *QuicConnWrapper) Read(p []byte, readTimeout time.Duration) (int, error) return stream.Read(p) } -// Write escreve dados na conexão com um deadline definido -func (q *QuicConnWrapper) Write(p []byte, writeTimeout time.Duration) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), writeTimeout) +// Write writes data to the connection with a defined deadline +func (q *QuicConnWrapper) Write(p []byte) (int, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 10 seconds timeout as an example defer cancel() stream, err := q.conn.OpenStreamSync(ctx) @@ -127,17 +166,74 @@ func (q *QuicConnWrapper) Write(p []byte, writeTimeout time.Duration) (int, erro return stream.Write(p) } -// Close fecha a conexão QUIC +// Close closes the QUIC connection func (q *QuicConnWrapper) Close() error { return q.conn.CloseWithError(0, "closed") } -// LocalAddr retorna o endereço local da conexão +// LocalAddr returns the local address of the connection func (q *QuicConnWrapper) LocalAddr() net.Addr { return q.conn.LocalAddr() } -// RemoteAddr retorna o endereço remoto da conexão +// RemoteAddr returns the remote address of the connection func (q *QuicConnWrapper) RemoteAddr() net.Addr { return q.conn.RemoteAddr() } + +// GetNextMessage reads the next message available in the QUIC stream +func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { + // Define a context with timeout + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Accept a new stream + stream, err := q.conn.AcceptStream(ctx) + if err != nil { + return nil, err + } + + // Read data from the stream + msgBytes := make([]byte, codec.HeadLength) + _, err = stream.Read(msgBytes) + if err != nil { + return nil, err + } + + if len(msgBytes) < codec.HeadLength { + return nil, constants.ErrConnectionClosed // Use the appropriate error for your application + } + + msgSize, _, err := codec.ParseHeader(msgBytes) + if err != nil { + return nil, err + } + + dataLen := len(msgBytes[codec.HeadLength:]) + if dataLen < msgSize { + return nil, constants.ErrReceivedMsgSmallerThanExpected + } else if dataLen > msgSize { + return nil, constants.ErrReceivedMsgBiggerThanExpected + } + + return msgBytes, nil +} + +func (q *QuicConnWrapper) SetDeadline(t time.Time) error { + // If necessary, you can implement some logic related to the deadline + return nil +} +func (q *QuicConnWrapper) SetReadDeadline(t time.Time) error { + // If necessary, you can implement some logic related to the deadline + return nil +} + +func (q *QuicConnWrapper) SetWriteDeadline(t time.Time) error { + // If necessary, you can implement some logic related to the deadline + return nil +} + +func (a *QuicAcceptor) Stop() { + a.running = false + a.listener.Close() +} From 52b3d8cf812d9a53062ea23ebb4df9978917cd82 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Tue, 8 Oct 2024 16:12:32 -0300 Subject: [PATCH 07/27] fix: increase context timeout in Accept method to prevent deadline exceeded errors --- go.mod | 24 +++++++++++++++--------- go.sum | 27 +++++++++++++++++++++++++++ go.work.sum | 32 +++++++++++++++++++++++++++++++- pkg/acceptor/quic_acceptor.go | 23 ++++++++++++++++++++++- 4 files changed, 95 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 75f94ce7..80052909 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/nats-io/nats-server/v2 v2.10.18 github.com/nats-io/nats.go v1.36.0 github.com/nats-io/nuid v1.0.1 - github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/client_golang v1.19.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.9.0 @@ -31,7 +31,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 go.opentelemetry.io/otel/sdk v1.28.0 go.opentelemetry.io/otel/trace v1.28.0 - golang.org/x/net v0.27.0 + golang.org/x/net v0.28.0 google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.2 ) @@ -58,11 +58,13 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/gomodule/redigo v1.9.2 // indirect github.com/google/btree v1.0.1 // indirect + github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect @@ -85,12 +87,14 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nats-io/jwt/v2 v2.5.8 // indirect github.com/nats-io/nkeys v0.4.7 // indirect + github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.7 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.43.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/quic-go/quic-go v0.47.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/soheilhy/cmux v0.1.5 // indirect @@ -113,13 +117,15 @@ require ( go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.5.3 // indirect + go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.25.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect golang.org/x/mod v0.19.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/go.sum b/go.sum index f6f79173..64d3140d 100644 --- a/go.sum +++ b/go.sum @@ -134,6 +134,8 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -201,6 +203,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -309,7 +313,10 @@ github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDm github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -323,13 +330,19 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us= github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y= +github.com/quic-go/quic-go v0.47.0/go.mod h1:3bCapYsJvXGZcipOHuu7plYtaV6tnF+z7wIFsU0WK9E= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= @@ -369,6 +382,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -442,6 +456,8 @@ go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnw go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= @@ -460,6 +476,8 @@ golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -470,6 +488,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -538,6 +558,8 @@ golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -562,6 +584,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -616,6 +640,8 @@ golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -627,6 +653,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/go.work.sum b/go.work.sum index e596e38f..16aefc8d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -128,6 +128,7 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzS github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= github.com/Soontao/goHttpDigestClient v0.0.0-20170320082612-6d28bb1415c5/go.mod h1:5Q4+CyR7+Q3VMG8f78ou+QSX/BNUNUx5W48eFRat8DQ= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= @@ -135,9 +136,12 @@ github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/chromedp/cdproto v0.0.0-20221023212508-67ada9507fb2/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= @@ -148,6 +152,8 @@ github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= @@ -191,18 +197,27 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/mstoykov/k6-taskqueue-lib v0.1.0/go.mod h1:PXdINulapvmzF545Auw++SCD69942FeNvUztaa9dVe4= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/orfjackal/nanospec.go v0.0.0-20120727230329-de4694c1d701/go.mod h1:VtBIF1XX0c1nKkeAPk8i4aXkYopqQgfDqolHUIHPwNI= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= @@ -241,8 +256,11 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto/x509roots/fallback v0.0.0-20240604170348-d4e7c9cb6cb8/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= @@ -252,10 +270,15 @@ golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2 golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -265,10 +288,16 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= @@ -306,6 +335,7 @@ google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJai google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 3b69b795..30b59dcb 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -1,3 +1,23 @@ +// Copyright (c) nano Author and TFG Co. All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package acceptor import ( @@ -55,6 +75,7 @@ func (a *QuicAcceptor) GetConnChan() chan PlayerConn { // Listen starts the QUIC listener to accept new connections func (a *QuicAcceptor) Listen() error { // Creating a QUIC listener at the specified address + a.running = true listener, err := quic.ListenAddr(a.addr, a.tlsConf, a.quicConf) if err != nil { return err @@ -70,7 +91,7 @@ func (a *QuicAcceptor) Accept() (quic.Connection, error) { } // Context with timeout for accepting connections - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() conn, err := (*a.listener).Accept(ctx) From 5fe9bc7c1250936d0f4705aa4daaff7927d8b803 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Wed, 9 Oct 2024 14:22:54 -0300 Subject: [PATCH 08/27] refact: TLS config --- examples/demo/client.go | 56 ++++++++++++++++++++++++++++++ examples/demo/cluster_grpc/main.go | 20 ++++++++--- pkg/acceptor/quic_acceptor.go | 7 ++-- 3 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 examples/demo/client.go diff --git a/examples/demo/client.go b/examples/demo/client.go new file mode 100644 index 00000000..ce47dff2 --- /dev/null +++ b/examples/demo/client.go @@ -0,0 +1,56 @@ +package main + +import ( + "context" + "crypto/tls" + "fmt" + "log" + "time" + + "github.com/quic-go/quic-go" +) + +func main() { + tlsConfig := &tls.Config{ + InsecureSkipVerify: false, // Skip certificate verification for testing + } + + quicConfig := &quic.Config{ + // QUIC specific settings can be placed here + } + + // Create a context with a timeout + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Start the QUIC connection + conn, err := quic.DialAddr(ctx, "127.0.0.1:3250", tlsConfig, quicConfig) + if err != nil { + log.Fatalf("Failed to dial: %v", err) + } + // Defer closing the connection using CloseWithError + defer conn.CloseWithError(0, "client done") + + // Open a stream + stream, err := conn.OpenStreamSync(ctx) + if err != nil { + log.Fatalf("Failed to open stream: %v", err) + } + + // Send a message + message := []byte("Hello from QUIC client!") + _, err = stream.Write(message) + if err != nil { + log.Fatalf("Failed to write to stream: %v", err) + } + + // Read the response + response := make([]byte, 1024) // Adjust buffer size as needed + n, err := stream.Read(response) + if err != nil { + log.Fatalf("Failed to read from stream: %v", err) + } + + // Print the response + fmt.Printf("Received response: %s\n", string(response[:n])) +} diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 031880df..06b660d0 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -6,9 +6,9 @@ import ( "flag" "fmt" "strconv" - "strings" + "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" pitaya "github.com/topfreegames/pitaya/v3/pkg" "github.com/topfreegames/pitaya/v3/pkg/acceptor" @@ -18,7 +18,6 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/constants" "github.com/topfreegames/pitaya/v3/pkg/groups" "github.com/topfreegames/pitaya/v3/pkg/modules" - "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/route" ) @@ -131,12 +130,13 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - // Define TLS and QUIC configurations here tlsConf := &tls.Config{ - // Configure your TLS settings, such as certificates, here + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, } quicConf := &quic.Config{ - // Set any specific QUIC configuration options here, or leave nil for defaults + // QUIC specific settings can be placed here } quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) builder.AddAcceptor(quicAcceptor) @@ -144,3 +144,13 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, return builder.Build(), bs } + +func loadTLSCertificates() tls.Certificate { + certPath := "../../../pkg/acceptor/fixtures/server.crt" + keyPath := "../../../pkg/acceptor/fixtures/server.key" + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + panic(fmt.Sprintf("Error loading TLS certificates: %v", err)) + } + return cert +} diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 30b59dcb..d2abdbca 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -30,6 +30,7 @@ import ( "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/conn/codec" + "github.com/topfreegames/pitaya/v3/pkg/conn/packet" "github.com/topfreegames/pitaya/v3/pkg/constants" ) @@ -222,7 +223,7 @@ func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { } if len(msgBytes) < codec.HeadLength { - return nil, constants.ErrConnectionClosed // Use the appropriate error for your application + return nil, packet.ErrInvalidPomeloHeader } msgSize, _, err := codec.ParseHeader(msgBytes) @@ -241,16 +242,14 @@ func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { } func (q *QuicConnWrapper) SetDeadline(t time.Time) error { - // If necessary, you can implement some logic related to the deadline return nil } + func (q *QuicConnWrapper) SetReadDeadline(t time.Time) error { - // If necessary, you can implement some logic related to the deadline return nil } func (q *QuicConnWrapper) SetWriteDeadline(t time.Time) error { - // If necessary, you can implement some logic related to the deadline return nil } From 51a72c120b86dabc55df65da5ffd286e07a7c0fb Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Thu, 10 Oct 2024 11:34:09 -0300 Subject: [PATCH 09/27] refactor: adjust time --- examples/demo/cluster_grpc/main.go | 2 +- pkg/acceptor/quic_acceptor.go | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 06b660d0..148e94d5 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -136,7 +136,7 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, }, } quicConf := &quic.Config{ - // QUIC specific settings can be placed here + Allow0RTT: true, } quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) builder.AddAcceptor(quicAcceptor) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index d2abdbca..ef7db071 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -33,7 +33,6 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/conn/packet" "github.com/topfreegames/pitaya/v3/pkg/constants" ) - var ( // ErrListenerNotInitialized is returned if the QUIC listener is not initialized ErrListenerNotInitialized = errors.New("listener not initialized") @@ -164,7 +163,7 @@ func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { // Read reads data from the QUIC connection func (q *QuicConnWrapper) Read(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 10 seconds timeout as an example + ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Second) // 1000 seconds timeout as an example defer cancel() stream, err := q.conn.AcceptStream(ctx) @@ -177,7 +176,7 @@ func (q *QuicConnWrapper) Read(p []byte) (int, error) { // Write writes data to the connection with a defined deadline func (q *QuicConnWrapper) Write(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 10 seconds timeout as an example + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 1000 seconds timeout as an example defer cancel() stream, err := q.conn.OpenStreamSync(ctx) From 046174cb571c98eee4ce1f3e2d47011402f5ee31 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 14 Oct 2024 14:33:03 -0300 Subject: [PATCH 10/27] feat: adding a server that uses NewQuicAcceptor but does not follow the main pattern --- examples/demo/client.go | 97 +++++++-------- examples/demo/cluster_grpc/default_main.go | 137 +++++++++++++++++++++ examples/demo/cluster_grpc/main.go | 5 +- examples/demo/cluster_grpc/server.go | 84 +++++++++++++ 4 files changed, 273 insertions(+), 50 deletions(-) create mode 100644 examples/demo/cluster_grpc/default_main.go create mode 100644 examples/demo/cluster_grpc/server.go diff --git a/examples/demo/client.go b/examples/demo/client.go index ce47dff2..da84fd62 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -1,56 +1,57 @@ package main import ( - "context" - "crypto/tls" - "fmt" - "log" - "time" + "context" + "crypto/tls" + "fmt" + "log" + "time" - "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go" ) func main() { - tlsConfig := &tls.Config{ - InsecureSkipVerify: false, // Skip certificate verification for testing - } - - quicConfig := &quic.Config{ - // QUIC specific settings can be placed here - } - - // Create a context with a timeout - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - // Start the QUIC connection - conn, err := quic.DialAddr(ctx, "127.0.0.1:3250", tlsConfig, quicConfig) - if err != nil { - log.Fatalf("Failed to dial: %v", err) - } - // Defer closing the connection using CloseWithError - defer conn.CloseWithError(0, "client done") - - // Open a stream - stream, err := conn.OpenStreamSync(ctx) - if err != nil { - log.Fatalf("Failed to open stream: %v", err) - } - - // Send a message - message := []byte("Hello from QUIC client!") - _, err = stream.Write(message) - if err != nil { - log.Fatalf("Failed to write to stream: %v", err) - } - - // Read the response - response := make([]byte, 1024) // Adjust buffer size as needed - n, err := stream.Read(response) - if err != nil { - log.Fatalf("Failed to read from stream: %v", err) - } - - // Print the response - fmt.Printf("Received response: %s\n", string(response[:n])) + // Define TLS configurations + tlsConf := &tls.Config{ + InsecureSkipVerify: true, // Only for testing, do not use in production + } + + // Create context + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Define QUIC configurations (can be nil if not needed) + quicConf := &quic.Config{} + + // Connect to the server using QUIC + addr := "localhost:3250" + session, err := quic.DialAddr(ctx, addr, tlsConf, quicConf) + if err != nil { + log.Fatalf("Failed to connect to server: %v", err) + } + defer session.CloseWithError(0, "connection closed") + + // Open a stream to send data + stream, err := session.OpenStreamSync(ctx) + if err != nil { + log.Fatalf("Failed to open stream: %v", err) + } + defer stream.Close() + + // Send message to the server + message := "Hello from QUIC client!" + fmt.Printf("Sending message: %s\n", message) + _, err = stream.Write([]byte(message)) + if err != nil { + log.Fatalf("Failed to send data: %v", err) + } + + // Receive response from the server + buffer := make([]byte, 1024) + n, err := stream.Read(buffer) + if err != nil { + log.Fatalf("Failed to read response: %v", err) + } + + fmt.Printf("Response from server: %s\n", string(buffer[:n])) } diff --git a/examples/demo/cluster_grpc/default_main.go b/examples/demo/cluster_grpc/default_main.go new file mode 100644 index 00000000..0423a495 --- /dev/null +++ b/examples/demo/cluster_grpc/default_main.go @@ -0,0 +1,137 @@ +package main + +import ( + "context" + "flag" + "fmt" + "strconv" + + "strings" + + "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" + pitaya "github.com/topfreegames/pitaya/v3/pkg" + "github.com/topfreegames/pitaya/v3/pkg/acceptor" + "github.com/topfreegames/pitaya/v3/pkg/cluster" + "github.com/topfreegames/pitaya/v3/pkg/component" + "github.com/topfreegames/pitaya/v3/pkg/config" + "github.com/topfreegames/pitaya/v3/pkg/constants" + "github.com/topfreegames/pitaya/v3/pkg/groups" + "github.com/topfreegames/pitaya/v3/pkg/modules" + "github.com/topfreegames/pitaya/v3/pkg/route" +) + +var app pitaya.Pitaya + +func configureBackend() { + room := services.NewRoom(app) + app.Register(room, + component.WithName("room"), + component.WithNameFunc(strings.ToLower), + ) + + app.RegisterRemote(room, + component.WithName("room"), + component.WithNameFunc(strings.ToLower), + ) +} + +func configureFrontend(port int) { + app.Register(services.NewConnector(app), + component.WithName("connector"), + component.WithNameFunc(strings.ToLower), + ) + app.RegisterRemote(&services.ConnectorRemote{}, + component.WithName("connectorremote"), + component.WithNameFunc(strings.ToLower), + ) + + err := app.AddRoute("room", func( + ctx context.Context, + route *route.Route, + payload []byte, + servers map[string]*cluster.Server, + ) (*cluster.Server, error) { + // will return the first server + for k := range servers { + return servers[k], nil + } + return nil, nil + }) + + if err != nil { + fmt.Printf("error adding route %s\n", err.Error()) + } + + err = app.SetDictionary(map[string]uint16{ + "connector.getsessiondata": 1, + "connector.setsessiondata": 2, + "room.room.getsessiondata": 3, + "onMessage": 4, + "onMembers": 5, + }) + + if err != nil { + fmt.Printf("error setting route dictionary %s\n", err.Error()) + } +} + +func main() { + port := flag.Int("port", 3250, "the port to listen") + svType := flag.String("type", "connector", "the server type") + isFrontend := flag.Bool("frontend", true, "if server is frontend") + rpcServerPort := flag.Int("rpcsvport", 3434, "the port that grpc server will listen") + + flag.Parse() + + meta := map[string]string{ + constants.GRPCHostKey: "127.0.0.1", + constants.GRPCPortKey: strconv.Itoa(*rpcServerPort), + } + + var bs *modules.ETCDBindingStorage + app, bs = createApp(*port, *isFrontend, *svType, meta, *rpcServerPort) + + defer app.Shutdown() + + app.RegisterModule(bs, "bindingsStorage") + if !*isFrontend { + configureBackend() + } else { + configureFrontend(*port) + } + app.Start() +} + +func createApp(port int, isFrontend bool, svType string, meta map[string]string, rpcServerPort int) (pitaya.Pitaya, *modules.ETCDBindingStorage) { + builder := pitaya.NewDefaultBuilder(isFrontend, svType, pitaya.Cluster, meta, *config.NewDefaultPitayaConfig()) + + grpcServerConfig := builder.Config.Cluster.RPC.Server.Grpc + grpcServerConfig.Port = rpcServerPort + gs, err := cluster.NewGRPCServer(grpcServerConfig, builder.Server, builder.MetricsReporters) + if err != nil { + panic(err) + } + builder.RPCServer = gs + builder.Groups = groups.NewMemoryGroupService(builder.Config.Groups.Memory) + + bs := modules.NewETCDBindingStorage(builder.Server, builder.SessionPool, builder.Config.Modules.BindingStorage.Etcd) + + gc, err := cluster.NewGRPCClient( + builder.Config.Cluster.RPC.Client.Grpc, + builder.Server, + builder.MetricsReporters, + bs, + cluster.NewInfoRetriever(builder.Config.Cluster.Info), + ) + if err != nil { + panic(err) + } + builder.RPCClient = gc + + if isFrontend { + tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) + builder.AddAcceptor(tcp) + } + + return builder.Build(), bs +} \ No newline at end of file diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 148e94d5..dc0e3fc2 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -130,13 +130,14 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { + // Configurações de TLS e QUIC tlsConf := &tls.Config{ Certificates: []tls.Certificate{ loadTLSCertificates(), }, } quicConf := &quic.Config{ - Allow0RTT: true, + // Configurações específicas do QUIC podem ser colocadas aqui } quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) builder.AddAcceptor(quicAcceptor) @@ -150,7 +151,7 @@ func loadTLSCertificates() tls.Certificate { keyPath := "../../../pkg/acceptor/fixtures/server.key" cert, err := tls.LoadX509KeyPair(certPath, keyPath) if err != nil { - panic(fmt.Sprintf("Error loading TLS certificates: %v", err)) + panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) } return cert } diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go new file mode 100644 index 00000000..939f7e9e --- /dev/null +++ b/examples/demo/cluster_grpc/server.go @@ -0,0 +1,84 @@ +package main + +import ( + "context" + "crypto/tls" + "fmt" + "log" + + "github.com/quic-go/quic-go" + "github.com/topfreegames/pitaya/v3/pkg/acceptor" +) + +func main() { + tlsConf := &tls.Config{ + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, + } + + quicConf := &quic.Config{ + Allow0RTT: true, + } + + // Inicializar o QuicAcceptor + quicAcceptor := acceptor.NewQuicAcceptor(":3250", tlsConf, quicConf) + err := quicAcceptor.Listen() + if err != nil { + log.Fatalf("Falha ao iniciar o servidor QUIC: %v", err) + } + defer quicAcceptor.Close() + + fmt.Println("Servidor QUIC escutando na porta 3250") + + // Loop de aceitação de conexões + for { + conn, err := quicAcceptor.Accept() + if err != nil { + log.Printf("Erro ao aceitar conexão: %v", err) + continue + } + + // Manusear conexão em uma goroutine separada + go handleConnection(conn) + } +} + +func handleConnection(conn quic.Connection) { + defer conn.CloseWithError(0, "sessão encerrada") + + // Aceitar um stream + stream, err := conn.AcceptStream(context.Background()) + if err != nil { + log.Printf("Erro ao aceitar stream: %v", err) + return + } + + // Ler dados do cliente + buff := make([]byte, 1024) + n, err := stream.Read(buff) + if err != nil { + log.Printf("Erro ao ler do stream: %v", err) + return + } + fmt.Printf("Mensagem recebida: %s\n", string(buff[:n])) + + // Enviar resposta ao cliente + response := "Olá, cliente QUIC!" + _, err = stream.Write([]byte(response)) + if err != nil { + log.Printf("Erro ao enviar resposta: %v", err) + return + } + fmt.Println("Resposta enviada ao cliente") +} + +func loadTLSCertificates() tls.Certificate { + certPath := "../../../pkg/acceptor/fixtures/server.crt" + keyPath := "../../../pkg/acceptor/fixtures/server.key" + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) + } + return cert +} \ No newline at end of file From f83a633bf9404ee6bf35b7086ff7f8463d7faa2a Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Mon, 14 Oct 2024 16:57:46 -0300 Subject: [PATCH 11/27] feat: created connectToQUIC logic --- examples/demo/client.go | 43 +++++++++++----------------- examples/demo/cluster_grpc/server.go | 12 ++------ pkg/acceptor/quic_acceptor.go | 11 +++---- pkg/client/client.go | 26 +++++++++++++++++ pkg/client/pitayaclient.go | 2 ++ 5 files changed, 52 insertions(+), 42 deletions(-) diff --git a/examples/demo/client.go b/examples/demo/client.go index da84fd62..ac42af2c 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -1,13 +1,13 @@ package main import ( - "context" "crypto/tls" "fmt" "log" - "time" + "github.com/sirupsen/logrus" "github.com/quic-go/quic-go" + "github.com/topfreegames/pitaya/v3/pkg/client" ) func main() { @@ -16,41 +16,32 @@ func main() { InsecureSkipVerify: true, // Only for testing, do not use in production } - // Create context - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - // Define QUIC configurations (can be nil if not needed) quicConf := &quic.Config{} - // Connect to the server using QUIC - addr := "localhost:3250" - session, err := quic.DialAddr(ctx, addr, tlsConf, quicConf) - if err != nil { + c := client.New(logrus.InfoLevel) + + conn, err := c.ConnectToQUIC("localhost:3250", tlsConf, quicConf) + + if(err != nil) { log.Fatalf("Failed to connect to server: %v", err) } - defer session.CloseWithError(0, "connection closed") + + msg := "Hello from QUIC client!" + fmt.Printf("Sending message: %v\n", msg) + _, err = conn.Write([]byte(msg)) - // Open a stream to send data - stream, err := session.OpenStreamSync(ctx) - if err != nil { - log.Fatalf("Failed to open stream: %v", err) + if(err != nil) { + log.Fatalf("Failed to send data: %v\n", err) } - defer stream.Close() - // Send message to the server - message := "Hello from QUIC client!" - fmt.Printf("Sending message: %s\n", message) - _, err = stream.Write([]byte(message)) - if err != nil { - log.Fatalf("Failed to send data: %v", err) - } + fmt.Printf("it's all ok\n") - // Receive response from the server buffer := make([]byte, 1024) - n, err := stream.Read(buffer) + n, err := conn.Read(buffer) + if err != nil { - log.Fatalf("Failed to read response: %v", err) + log.Fatalf("Failed to read response data: %v\n", err) } fmt.Printf("Response from server: %s\n", string(buffer[:n])) diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go index 939f7e9e..b686902f 100644 --- a/examples/demo/cluster_grpc/server.go +++ b/examples/demo/cluster_grpc/server.go @@ -1,7 +1,6 @@ package main import ( - "context" "crypto/tls" "fmt" "log" @@ -45,18 +44,13 @@ func main() { } func handleConnection(conn quic.Connection) { - defer conn.CloseWithError(0, "sessão encerrada") // Aceitar um stream - stream, err := conn.AcceptStream(context.Background()) - if err != nil { - log.Printf("Erro ao aceitar stream: %v", err) - return - } + c := acceptor.NewQuicConnWrapper(conn) // Ler dados do cliente buff := make([]byte, 1024) - n, err := stream.Read(buff) + n, err := c.Read(buff) if err != nil { log.Printf("Erro ao ler do stream: %v", err) return @@ -65,7 +59,7 @@ func handleConnection(conn quic.Connection) { // Enviar resposta ao cliente response := "Olá, cliente QUIC!" - _, err = stream.Write([]byte(response)) + _, err = c.Write([]byte(response)) if err != nil { log.Printf("Erro ao enviar resposta: %v", err) return diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index ef7db071..0c8fe97f 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -94,7 +94,7 @@ func (a *QuicAcceptor) Accept() (quic.Connection, error) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - conn, err := (*a.listener).Accept(ctx) + conn, err := a.listener.Accept(ctx) if err != nil { return nil, err } @@ -125,8 +125,7 @@ func (a *QuicAcceptor) GetConfiguredAddress() string { func (a *QuicAcceptor) ListenAndServe() { // Start the QUIC listener - err := a.Listen() - if err != nil { + if err := a.Listen(); err != nil { fmt.Printf("Failed to start QUIC listener: %s\n", err) return } @@ -163,8 +162,7 @@ func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { // Read reads data from the QUIC connection func (q *QuicConnWrapper) Read(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Second) // 1000 seconds timeout as an example - defer cancel() + ctx, _ := context.WithTimeout(context.Background(), 1000*time.Second) // 1000 seconds timeout as an example stream, err := q.conn.AcceptStream(ctx) if err != nil { @@ -176,8 +174,7 @@ func (q *QuicConnWrapper) Read(p []byte) (int, error) { // Write writes data to the connection with a defined deadline func (q *QuicConnWrapper) Write(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // 1000 seconds timeout as an example - defer cancel() + ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) // 1000 seconds timeout as an example stream, err := q.conn.OpenStreamSync(ctx) if err != nil { diff --git a/pkg/client/client.go b/pkg/client/client.go index c98b1199..e9afb449 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -22,6 +22,7 @@ package client import ( "bytes" + "context" "crypto/tls" "encoding/json" "errors" @@ -34,6 +35,7 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/acceptor" + "github.com/quic-go/quic-go" "github.com/gorilla/websocket" "github.com/sirupsen/logrus" "github.com/topfreegames/pitaya/v3/pkg" @@ -282,6 +284,7 @@ func (c *Client) readPackets(buf *bytes.Buffer) ([]*packet.Packet, error) { } buf.Write(data[:n]) } + fmt.Printf("Response from server: %s\n", string(data[:n])) packets, err := c.packetDecoder.Decode(buf.Bytes()) if err != nil { logger.Log.Errorf("error decoding packet from server: %s", err.Error()) @@ -366,6 +369,29 @@ func (c *Client) ConnectTo(addr string, tlsConfig ...*tls.Config) error { return nil } +func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) (net.Conn, error) { + ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) + + conn, err := quic.DialAddr(ctx, addr, tlsConfig, quicConfig) + if err != nil { + fmt.Printf("Failed to connect to server: %v", err) + return nil, err; + } + + c.conn = acceptor.NewQuicConnWrapper(conn); + + c.IncomingMsgChan = make(chan *message.Message, 10) + + c.closeChan = make(chan struct{}) + + /*go c.sendHeartbeats(30) + go c.handleServerMessages() + go c.handlePackets() + go c.pendingRequestsReaper()*/ + + return c.conn, nil +} + // ConnectToWS connects using webshocket protocol func (c *Client) ConnectToWS(addr string, path string, tlsConfig ...*tls.Config) error { u := url.URL{Scheme: "ws", Host: addr, Path: path} diff --git a/pkg/client/pitayaclient.go b/pkg/client/pitayaclient.go index dec4b925..7846cdfc 100644 --- a/pkg/client/pitayaclient.go +++ b/pkg/client/pitayaclient.go @@ -25,12 +25,14 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/conn/message" "github.com/topfreegames/pitaya/v3/pkg/session" + "github.com/quic-go/quic-go" ) // PitayaClient iface type PitayaClient interface { ConnectTo(addr string, tlsConfig ...*tls.Config) error ConnectToWS(addr string, path string, tlsConfig ...*tls.Config) error + ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) error ConnectedStatus() bool Disconnect() MsgChannel() chan *message.Message From 98a3e1986a1346c7886bc210d8fe993ce441adf1 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Tue, 15 Oct 2024 12:27:21 -0300 Subject: [PATCH 12/27] feat: receiving and sending encoded messages --- examples/demo/client.go | 25 ++++++++-------------- examples/demo/cluster_grpc/server.go | 31 +++++++++++++++++++++++++++- pkg/acceptor/quic_acceptor.go | 31 ++++++++++++---------------- pkg/client/client.go | 28 ++++++++++++------------- 4 files changed, 65 insertions(+), 50 deletions(-) diff --git a/examples/demo/client.go b/examples/demo/client.go index ac42af2c..4e747053 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -19,30 +19,23 @@ func main() { // Define QUIC configurations (can be nil if not needed) quicConf := &quic.Config{} - c := client.New(logrus.InfoLevel) + c := client.New(logrus.DebugLevel) - conn, err := c.ConnectToQUIC("localhost:3250", tlsConf, quicConf) + err := c.ConnectToQUIC("localhost:3250", tlsConf, quicConf) if(err != nil) { log.Fatalf("Failed to connect to server: %v", err) } - - msg := "Hello from QUIC client!" - fmt.Printf("Sending message: %v\n", msg) - _, err = conn.Write([]byte(msg)) + + + id, err := c.SendRequest("", []byte("Olá, server!")); if(err != nil) { - log.Fatalf("Failed to send data: %v\n", err) + log.Fatalf("Request failed: %v", err) } + + fmt.Printf("It's all ok: id %v!\n", id) - fmt.Printf("it's all ok\n") - - buffer := make([]byte, 1024) - n, err := conn.Read(buffer) - - if err != nil { - log.Fatalf("Failed to read response data: %v\n", err) - } + for {} - fmt.Printf("Response from server: %s\n", string(buffer[:n])) } diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go index b686902f..3c4bcb8d 100644 --- a/examples/demo/cluster_grpc/server.go +++ b/examples/demo/cluster_grpc/server.go @@ -7,6 +7,9 @@ import ( "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/acceptor" + "github.com/topfreegames/pitaya/v3/pkg/conn/codec" + "github.com/topfreegames/pitaya/v3/pkg/conn/message" + "github.com/topfreegames/pitaya/v3/pkg/conn/packet" ) func main() { @@ -59,7 +62,33 @@ func handleConnection(conn quic.Connection) { // Enviar resposta ao cliente response := "Olá, cliente QUIC!" - _, err = c.Write([]byte(response)) + + packetEncoder := codec.NewPomeloPacketEncoder() + messageEncoder := message.NewMessagesEncoder(false) + + // buildPacket + m := message.Message{ + Type: message.Response, + ID: 2, + Route: "", + Data: []byte(response), + Err: false, + } + + encMsg, err := messageEncoder.Encode(&m) + + fmt.Printf("message encoded\n") + if err != nil { + return + } + p, err := packetEncoder.Encode(packet.Data, encMsg) + + fmt.Printf("packet encoded\n") + if err != nil { + return + } + + _, err = c.Write([]byte(p)) if err != nil { log.Printf("Erro ao enviar resposta: %v", err) return diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 0c8fe97f..27d8a0cc 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -162,8 +162,9 @@ func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { // Read reads data from the QUIC connection func (q *QuicConnWrapper) Read(p []byte) (int, error) { - ctx, _ := context.WithTimeout(context.Background(), 1000*time.Second) // 1000 seconds timeout as an example - + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + stream, err := q.conn.AcceptStream(ctx) if err != nil { return 0, err @@ -174,7 +175,8 @@ func (q *QuicConnWrapper) Read(p []byte) (int, error) { // Write writes data to the connection with a defined deadline func (q *QuicConnWrapper) Write(p []byte) (int, error) { - ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) // 1000 seconds timeout as an example + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // 5 seconds timeout as an example + defer cancel() stream, err := q.conn.OpenStreamSync(ctx) if err != nil { @@ -201,33 +203,26 @@ func (q *QuicConnWrapper) RemoteAddr() net.Addr { // GetNextMessage reads the next message available in the QUIC stream func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { - // Define a context with timeout - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() + // Read data from the stream + msgBytes := make([]byte, 1024) - // Accept a new stream - stream, err := q.conn.AcceptStream(ctx) + n, err := q.Read(msgBytes) if err != nil { return nil, err } - // Read data from the stream - msgBytes := make([]byte, codec.HeadLength) - _, err = stream.Read(msgBytes) - if err != nil { - return nil, err - } + msg := msgBytes[:n] - if len(msgBytes) < codec.HeadLength { + if len(msg) < codec.HeadLength { return nil, packet.ErrInvalidPomeloHeader } + header := msg[:codec.HeadLength] - msgSize, _, err := codec.ParseHeader(msgBytes) + msgSize, _, err := codec.ParseHeader(header) if err != nil { return nil, err } - - dataLen := len(msgBytes[codec.HeadLength:]) + dataLen := len(msg[codec.HeadLength:]) if dataLen < msgSize { return nil, constants.ErrReceivedMsgSmallerThanExpected } else if dataLen > msgSize { diff --git a/pkg/client/client.go b/pkg/client/client.go index e9afb449..ca19d50a 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -193,10 +193,10 @@ func (c *Client) handleHandshakeResponse() error { c.Connected = true - go c.sendHeartbeats(handshake.Sys.Heartbeat) + //go c.sendHeartbeats(handshake.Sys.Heartbeat) go c.handleServerMessages() go c.handlePackets() - go c.pendingRequestsReaper() + //go c.pendingRequestsReaper() return nil } @@ -244,7 +244,7 @@ func (c *Client) handlePackets() { switch p.Type { case packet.Data: //handle data - logger.Log.Debug("got data: %s", string(p.Data)) + logger.Log.Debug("got data: ", string(p.Data)) m, err := message.Decode(p.Data) if err != nil { logger.Log.Errorf("error decoding msg from sv: %s", string(m.Data)) @@ -276,7 +276,6 @@ func (c *Client) readPackets(buf *bytes.Buffer) ([]*packet.Packet, error) { data := make([]byte, 1024) n := len(data) var err error - for n == len(data) { n, err = c.conn.Read(data) if err != nil { @@ -284,7 +283,7 @@ func (c *Client) readPackets(buf *bytes.Buffer) ([]*packet.Packet, error) { } buf.Write(data[:n]) } - fmt.Printf("Response from server: %s\n", string(data[:n])) + packets, err := c.packetDecoder.Decode(buf.Bytes()) if err != nil { logger.Log.Errorf("error decoding packet from server: %s", err.Error()) @@ -369,27 +368,26 @@ func (c *Client) ConnectTo(addr string, tlsConfig ...*tls.Config) error { return nil } -func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) (net.Conn, error) { - ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) - - conn, err := quic.DialAddr(ctx, addr, tlsConfig, quicConfig) +func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) error { + conn, err := quic.DialAddr(context.Background(), addr, tlsConfig, quicConfig) if err != nil { fmt.Printf("Failed to connect to server: %v", err) - return nil, err; + return err; } c.conn = acceptor.NewQuicConnWrapper(conn); c.IncomingMsgChan = make(chan *message.Message, 10) - c.closeChan = make(chan struct{}) - - /*go c.sendHeartbeats(30) go c.handleServerMessages() go c.handlePackets() - go c.pendingRequestsReaper()*/ + go c.pendingRequestsReaper() + + c.Connected = true - return c.conn, nil + c.closeChan = make(chan struct{}) + + return nil } // ConnectToWS connects using webshocket protocol From 5af9cdbe2259e2585681370e03feab2dea01a67a Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Tue, 15 Oct 2024 14:24:56 -0300 Subject: [PATCH 13/27] refactor: message pattern --- examples/demo/cluster_grpc/server.go | 38 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go index 3c4bcb8d..05bff1cb 100644 --- a/examples/demo/cluster_grpc/server.go +++ b/examples/demo/cluster_grpc/server.go @@ -23,50 +23,50 @@ func main() { Allow0RTT: true, } - // Inicializar o QuicAcceptor + // Initialize the QuicAcceptor quicAcceptor := acceptor.NewQuicAcceptor(":3250", tlsConf, quicConf) err := quicAcceptor.Listen() if err != nil { - log.Fatalf("Falha ao iniciar o servidor QUIC: %v", err) + log.Fatalf("Failed to start QUIC server: %v", err) } defer quicAcceptor.Close() - fmt.Println("Servidor QUIC escutando na porta 3250") + fmt.Println("QUIC server listening on port 3250") - // Loop de aceitação de conexões + // Connection acceptance loop for { conn, err := quicAcceptor.Accept() if err != nil { - log.Printf("Erro ao aceitar conexão: %v", err) + log.Printf("Error accepting connection: %v", err) continue } - // Manusear conexão em uma goroutine separada + // Handle connection in a separate goroutine go handleConnection(conn) } } func handleConnection(conn quic.Connection) { - // Aceitar um stream + // Accept a stream c := acceptor.NewQuicConnWrapper(conn) - // Ler dados do cliente + // Read data from the client buff := make([]byte, 1024) n, err := c.Read(buff) if err != nil { - log.Printf("Erro ao ler do stream: %v", err) + log.Printf("Error reading from stream: %v", err) return } - fmt.Printf("Mensagem recebida: %s\n", string(buff[:n])) + fmt.Printf("Message received: %s\n", string(buff[:n])) - // Enviar resposta ao cliente - response := "Olá, cliente QUIC!" + // Send response to the client + response := "Hello, QUIC client!" packetEncoder := codec.NewPomeloPacketEncoder() messageEncoder := message.NewMessagesEncoder(false) - // buildPacket + // Build packet m := message.Message{ Type: message.Response, ID: 2, @@ -77,23 +77,23 @@ func handleConnection(conn quic.Connection) { encMsg, err := messageEncoder.Encode(&m) - fmt.Printf("message encoded\n") + fmt.Printf("Message encoded\n") if err != nil { return } p, err := packetEncoder.Encode(packet.Data, encMsg) - fmt.Printf("packet encoded\n") + fmt.Printf("Packet encoded\n") if err != nil { return } _, err = c.Write([]byte(p)) if err != nil { - log.Printf("Erro ao enviar resposta: %v", err) + log.Printf("Error sending response: %v", err) return } - fmt.Println("Resposta enviada ao cliente") + fmt.Println("Response sent to client") } func loadTLSCertificates() tls.Certificate { @@ -101,7 +101,7 @@ func loadTLSCertificates() tls.Certificate { keyPath := "../../../pkg/acceptor/fixtures/server.key" cert, err := tls.LoadX509KeyPair(certPath, keyPath) if err != nil { - panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) + panic(fmt.Sprintf("Error loading TLS certificates: %v", err)) } return cert -} \ No newline at end of file +} From d7cdb0e6ca57b29b1aacefe5672ae7a0e4679be6 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Tue, 15 Oct 2024 14:36:47 -0300 Subject: [PATCH 14/27] feat: adding heartbeat to keep connection alive --- examples/demo/client.go | 2 + examples/demo/cluster_grpc/server.go | 89 +++++++++++++++++----------- pkg/acceptor/quic_acceptor.go | 5 +- pkg/client/client.go | 5 +- 4 files changed, 61 insertions(+), 40 deletions(-) diff --git a/examples/demo/client.go b/examples/demo/client.go index 4e747053..3e40fd41 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -36,6 +36,8 @@ func main() { fmt.Printf("It's all ok: id %v!\n", id) + id, err = c.SendRequest("", []byte("Olá, sou o cliente de novo!")); + for {} } diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go index 3c4bcb8d..93d164bb 100644 --- a/examples/demo/cluster_grpc/server.go +++ b/examples/demo/cluster_grpc/server.go @@ -48,52 +48,73 @@ func main() { func handleConnection(conn quic.Connection) { + packetDecoder := codec.NewPomeloPacketDecoder() + packetEncoder := codec.NewPomeloPacketEncoder() + messageEncoder := message.NewMessagesEncoder(false) + // Aceitar um stream c := acceptor.NewQuicConnWrapper(conn) // Ler dados do cliente - buff := make([]byte, 1024) - n, err := c.Read(buff) - if err != nil { - log.Printf("Erro ao ler do stream: %v", err) - return - } - fmt.Printf("Mensagem recebida: %s\n", string(buff[:n])) + for { + buff := make([]byte, 1024) + n, err := c.Read(buff) + if err != nil { + log.Printf("Erro ao ler do stream: %v", err) + return + } - // Enviar resposta ao cliente - response := "Olá, cliente QUIC!" + packets, err := packetDecoder.Decode(buff[:n]) + if err != nil { + fmt.Printf("%v", err) + break + } - packetEncoder := codec.NewPomeloPacketEncoder() - messageEncoder := message.NewMessagesEncoder(false) + for _, p := range packets { + switch p.Type { + case packet.Data: + m, err := message.Decode(p.Data) + if err != nil { + fmt.Printf("error decoding msg from sv: %v\n", string(m.Data)) + } + fmt.Printf("got data from client: %v\n", string(m.Data)) + case packet.Heartbeat: + fmt.Printf("got heartbeat from client!\n") + } + } - // buildPacket - m := message.Message{ - Type: message.Response, - ID: 2, - Route: "", - Data: []byte(response), - Err: false, - } + // Enviar resposta ao cliente + response := "Olá, cliente QUIC!" - encMsg, err := messageEncoder.Encode(&m) + // buildPacket + m := message.Message{ + Type: message.Response, + ID: 2, + Route: "", + Data: []byte(response), + Err: false, + } - fmt.Printf("message encoded\n") - if err != nil { - return - } - p, err := packetEncoder.Encode(packet.Data, encMsg) + encMsg, err := messageEncoder.Encode(&m) - fmt.Printf("packet encoded\n") - if err != nil { - return - } + fmt.Printf("message encoded\n") + if err != nil { + return + } + p, err := packetEncoder.Encode(packet.Data, encMsg) - _, err = c.Write([]byte(p)) - if err != nil { - log.Printf("Erro ao enviar resposta: %v", err) - return + fmt.Printf("packet encoded\n") + if err != nil { + return + } + + _, err = c.Write([]byte(p)) + if err != nil { + log.Printf("Erro ao enviar resposta: %v", err) + return + } + fmt.Println("Resposta enviada ao cliente") } - fmt.Println("Resposta enviada ao cliente") } func loadTLSCertificates() tls.Certificate { diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 27d8a0cc..b4e146e1 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -162,10 +162,7 @@ func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { // Read reads data from the QUIC connection func (q *QuicConnWrapper) Read(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - stream, err := q.conn.AcceptStream(ctx) + stream, err := q.conn.AcceptStream(context.Background()) if err != nil { return 0, err } diff --git a/pkg/client/client.go b/pkg/client/client.go index ca19d50a..c2deab3d 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -193,10 +193,10 @@ func (c *Client) handleHandshakeResponse() error { c.Connected = true - //go c.sendHeartbeats(handshake.Sys.Heartbeat) + go c.sendHeartbeats(handshake.Sys.Heartbeat) go c.handleServerMessages() go c.handlePackets() - //go c.pendingRequestsReaper() + go c.pendingRequestsReaper() return nil } @@ -379,6 +379,7 @@ func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *q c.IncomingMsgChan = make(chan *message.Message, 10) + go c.sendHeartbeats(25) go c.handleServerMessages() go c.handlePackets() go c.pendingRequestsReaper() From 025e85c410fa35d779f97fda971b51106e39be44 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Wed, 16 Oct 2024 12:07:04 -0300 Subject: [PATCH 15/27] feat: making client work for cluster_grpc server --- examples/demo/client.go | 27 +++++++++++++++++++++++---- examples/demo/cluster_grpc/main.go | 3 +++ pkg/acceptor/quic_acceptor.go | 8 ++------ pkg/client/client.go | 11 +++++------ 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/examples/demo/client.go b/examples/demo/client.go index 3e40fd41..ee008d53 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -4,6 +4,7 @@ import ( "crypto/tls" "fmt" "log" + "time" "github.com/sirupsen/logrus" "github.com/quic-go/quic-go" @@ -28,16 +29,34 @@ func main() { } - id, err := c.SendRequest("", []byte("Olá, server!")); + id, err := c.SendRequest("connector.getsessiondata", []byte{}); if(err != nil) { log.Fatalf("Request failed: %v", err) } - fmt.Printf("It's all ok: id %v!\n", id) + fmt.Printf("Request was sent to server: reqUid %v!\n", id) - id, err = c.SendRequest("", []byte("Olá, sou o cliente de novo!")); + id, err = c.SendRequest("connector.setsessiondata", []byte("{\"Data\":{\"ipversion\":\"ipv4\", \"novoDado\":\"QuicClient\"}}")); - for {} + if(err != nil) { + log.Fatalf("Request failed: %v", err) + } + + fmt.Printf("Request was sent to server: reqUid %v!\n", id) + + time.Sleep(2 * time.Second); + + id, err = c.SendRequest("connector.getsessiondata", []byte{}); + + if(err != nil) { + log.Fatalf("Request failed: %v", err) + } + + fmt.Printf("Request was sent to server: reqUid %v!\n", id) + + time.Sleep(65 * time.Second); + + c.Disconnect(); } diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index dc0e3fc2..be01a601 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -7,6 +7,7 @@ import ( "fmt" "strconv" "strings" + "time" "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" @@ -137,6 +138,8 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, }, } quicConf := &quic.Config{ + MaxIdleTimeout: 35 * time.Second, + EnableDatagrams: true, // Configurações específicas do QUIC podem ser colocadas aqui } quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index b4e146e1..6e6f5a63 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -90,11 +90,7 @@ func (a *QuicAcceptor) Accept() (quic.Connection, error) { return nil, ErrListenerNotInitialized } - // Context with timeout for accepting connections - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - conn, err := a.listener.Accept(ctx) + conn, err := a.listener.Accept(context.Background()) if err != nil { return nil, err } @@ -226,7 +222,7 @@ func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { return nil, constants.ErrReceivedMsgBiggerThanExpected } - return msgBytes, nil + return msg, nil } func (q *QuicConnWrapper) SetDeadline(t time.Time) error { diff --git a/pkg/client/client.go b/pkg/client/client.go index c2deab3d..a96265fa 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -324,6 +324,7 @@ func (c *Client) sendHeartbeats(interval int) { case <-t.C: p, _ := c.packetEncoder.Encode(packet.Heartbeat, []byte{}) _, err := c.conn.Write(p) + logger.Log.Debug("Heartbeat was sent to server!") if err != nil { logger.Log.Errorf("error sending heartbeat to server: %s", err.Error()) return @@ -337,6 +338,7 @@ func (c *Client) sendHeartbeats(interval int) { // Disconnect disconnects the client func (c *Client) Disconnect() { if c.Connected { + logger.Log.Debug("Disconnecting!") c.Connected = false close(c.closeChan) c.conn.Close() @@ -379,12 +381,9 @@ func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *q c.IncomingMsgChan = make(chan *message.Message, 10) - go c.sendHeartbeats(25) - go c.handleServerMessages() - go c.handlePackets() - go c.pendingRequestsReaper() - - c.Connected = true + if err = c.handleHandshake(); err != nil { + return err + } c.closeChan = make(chan struct{}) From 4f0a099ce850754feaf08bf017c893b9936c5ba9 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Thu, 17 Oct 2024 11:23:31 -0300 Subject: [PATCH 16/27] feat: making connectToQuic in pitaya-cli --- examples/demo/client.go | 20 +++++++++++++++++++- go.mod | 8 ++++---- go.sum | 5 +++++ pkg/acceptor/quic_acceptor.go | 11 ++++++----- pkg/client/client.go | 17 +++++++++++++---- pkg/client/pitayaclient.go | 2 +- repl/helpers.go | 20 ++++++++++++-------- 7 files changed, 60 insertions(+), 23 deletions(-) diff --git a/examples/demo/client.go b/examples/demo/client.go index ee008d53..5127ae2b 100644 --- a/examples/demo/client.go +++ b/examples/demo/client.go @@ -22,7 +22,7 @@ func main() { c := client.New(logrus.DebugLevel) - err := c.ConnectToQUIC("localhost:3250", tlsConf, quicConf) + err := c.ConnectToQUIC("localhost:3250", quicConf, tlsConf) if(err != nil) { log.Fatalf("Failed to connect to server: %v", err) @@ -55,6 +55,24 @@ func main() { fmt.Printf("Request was sent to server: reqUid %v!\n", id) + id, err = c.SendRequest("requestor.room.entry", []byte{}); + + if(err != nil) { + log.Fatalf("Request failed: %v", err) + } + + fmt.Printf("Request was sent to server: reqUid %v!\n", id) + + time.Sleep(2 * time.Second) + + id, err = c.SendRequest("requestor.room.join", []byte{}); + + if(err != nil) { + log.Fatalf("Request failed: %v", err) + } + + fmt.Printf("Request was sent to server: reqUid %v!\n", id) + time.Sleep(65 * time.Second); c.Disconnect(); diff --git a/go.mod b/go.mod index 80052909..8aee1ac9 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ toolchain go1.22.4 require ( github.com/DataDog/datadog-go v4.8.3+incompatible + github.com/abiosoft/ishell/v2 v2.0.2 github.com/go-playground/validator/v10 v10.13.0 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 @@ -13,12 +14,15 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/jhump/protoreflect v1.15.1 github.com/mailgun/proxyproto v1.0.0 + github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.5.0 github.com/nats-io/nats-server/v2 v2.10.18 github.com/nats-io/nats.go v1.36.0 github.com/nats-io/nuid v1.0.1 github.com/prometheus/client_golang v1.19.1 + github.com/quic-go/quic-go v0.47.0 github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.4.0 github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.9.0 github.com/topfreegames/go-workers v1.2.1 @@ -38,7 +42,6 @@ require ( require ( github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/abiosoft/ishell/v2 v2.0.2 // indirect github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -82,7 +85,6 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/minio/highwayhash v1.0.3 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nats-io/jwt/v2 v2.5.8 // indirect @@ -94,13 +96,11 @@ require ( github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/quic-go/quic-go v0.47.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.4.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect diff --git a/go.sum b/go.sum index 64d3140d..10c4a171 100644 --- a/go.sum +++ b/go.sum @@ -330,16 +330,20 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us= github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y= github.com/quic-go/quic-go v0.47.0/go.mod h1:3bCapYsJvXGZcipOHuu7plYtaV6tnF+z7wIFsU0WK9E= @@ -653,6 +657,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 6e6f5a63..5b45989d 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -33,6 +33,7 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/conn/packet" "github.com/topfreegames/pitaya/v3/pkg/constants" ) + var ( // ErrListenerNotInitialized is returned if the QUIC listener is not initialized ErrListenerNotInitialized = errors.New("listener not initialized") @@ -44,7 +45,7 @@ var ( type QuicAcceptor struct { addr string connChan chan PlayerConn - listener *quic.Listener // Using a pointer to quic.Listener + listener *quic.Listener running bool tlsConf *tls.Config quicConf *quic.Config @@ -61,8 +62,8 @@ func NewQuicAcceptor(addr string, tlsConf *tls.Config, quicConf *quic.Config) *Q } func (a *QuicAcceptor) GetAddr() string { - if a.listener != nil { // Correct comparison, since listener is a pointer - return (*a.listener).Addr().String() // Accessing the value pointed to by the pointer + if a.listener != nil { + return a.listener.Addr().String() } return "" } @@ -80,7 +81,7 @@ func (a *QuicAcceptor) Listen() error { if err != nil { return err } - a.listener = listener // Storing the pointer to quic.Listener + a.listener = listener return nil } @@ -101,7 +102,7 @@ func (a *QuicAcceptor) Accept() (quic.Connection, error) { // Close closes the QUIC listener func (a *QuicAcceptor) Close() error { if a.listener != nil { // Correct comparison - return (*a.listener).Close() + return a.listener.Close() } return nil } diff --git a/pkg/client/client.go b/pkg/client/client.go index a96265fa..075968ae 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -370,15 +370,24 @@ func (c *Client) ConnectTo(addr string, tlsConfig ...*tls.Config) error { return nil } -func (c *Client) ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) error { - conn, err := quic.DialAddr(context.Background(), addr, tlsConfig, quicConfig) +func (c *Client) ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig ...*tls.Config) error { + var conn quic.Connection + var err error + if(len(tlsConfig) > 0) { + conn, err = quic.DialAddr(context.Background(), addr, tlsConfig[0], quicConfig) + } else { + tls := &tls.Config{ + InsecureSkipVerify: true, + } + conn, err = quic.DialAddr(context.Background(), addr, tls, quicConfig) + } + if err != nil { - fmt.Printf("Failed to connect to server: %v", err) return err; } c.conn = acceptor.NewQuicConnWrapper(conn); - + c.IncomingMsgChan = make(chan *message.Message, 10) if err = c.handleHandshake(); err != nil { diff --git a/pkg/client/pitayaclient.go b/pkg/client/pitayaclient.go index 7846cdfc..ff3d63c4 100644 --- a/pkg/client/pitayaclient.go +++ b/pkg/client/pitayaclient.go @@ -32,7 +32,7 @@ import ( type PitayaClient interface { ConnectTo(addr string, tlsConfig ...*tls.Config) error ConnectToWS(addr string, path string, tlsConfig ...*tls.Config) error - ConnectToQUIC(addr string, tlsConfig *tls.Config, quicConfig *quic.Config) error + ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig ...*tls.Config) error ConnectedStatus() bool Disconnect() MsgChannel() chan *message.Message diff --git a/repl/helpers.go b/repl/helpers.go index 3a5016e9..a3e1d782 100644 --- a/repl/helpers.go +++ b/repl/helpers.go @@ -26,6 +26,7 @@ import ( "fmt" "os" + "github.com/quic-go/quic-go" "github.com/abiosoft/ishell/v2" "github.com/mitchellh/go-homedir" "github.com/sirupsen/logrus" @@ -50,15 +51,18 @@ func protoClient(log Log, addr string) error { } func tryConnect(addr string) error { - if err := pClient.ConnectToWS(addr, "", &tls.Config{ - InsecureSkipVerify: true, + if err := pClient.ConnectToQUIC(addr, &quic.Config{ }); err != nil { - if err := pClient.ConnectToWS(addr, ""); err != nil { - if err := pClient.ConnectTo(addr, &tls.Config{ - InsecureSkipVerify: true, - }); err != nil { - if err := pClient.ConnectTo(addr); err != nil { - return err + if err := pClient.ConnectToWS(addr, "", &tls.Config{ + InsecureSkipVerify: true, + }); err != nil { + if err := pClient.ConnectToWS(addr, ""); err != nil { + if err := pClient.ConnectTo(addr, &tls.Config{ + InsecureSkipVerify: true, + }); err != nil { + if err := pClient.ConnectTo(addr); err != nil { + return err + } } } } From f0bfa2f7d164c9dba073cf54fb25340661087a3d Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Mon, 28 Oct 2024 15:22:23 -0300 Subject: [PATCH 17/27] feat: changing xk6-pitaya client to connect via QUIC --- examples/demo/cluster/main_quic.go | 135 ++++++++++++++++++++++++++ go.mod | 10 +- go.sum | 77 ++------------- go.work.sum | 19 ++-- xk6-pitaya/client.go | 22 +++++ xk6-pitaya/examples/scenario2_QUIC.js | 62 ++++++++++++ xk6-pitaya/examples/scenario2_TCP.js | 62 ++++++++++++ 7 files changed, 303 insertions(+), 84 deletions(-) create mode 100644 examples/demo/cluster/main_quic.go create mode 100644 xk6-pitaya/examples/scenario2_QUIC.js create mode 100644 xk6-pitaya/examples/scenario2_TCP.js diff --git a/examples/demo/cluster/main_quic.go b/examples/demo/cluster/main_quic.go new file mode 100644 index 00000000..1339cb7f --- /dev/null +++ b/examples/demo/cluster/main_quic.go @@ -0,0 +1,135 @@ +package main + +import ( + "context" + "crypto/tls" + "flag" + "fmt" + "time" + + "strings" + + "github.com/quic-go/quic-go" + "github.com/sirupsen/logrus" + "github.com/topfreegames/pitaya/v3/examples/demo/cluster/services" + pitaya "github.com/topfreegames/pitaya/v3/pkg" + "github.com/topfreegames/pitaya/v3/pkg/acceptor" + "github.com/topfreegames/pitaya/v3/pkg/cluster" + "github.com/topfreegames/pitaya/v3/pkg/component" + "github.com/topfreegames/pitaya/v3/pkg/config" + "github.com/topfreegames/pitaya/v3/pkg/groups" + "github.com/topfreegames/pitaya/v3/pkg/route" + "github.com/topfreegames/pitaya/v3/pkg/tracing" +) + +var app pitaya.Pitaya + +func configureBackend() { + room := services.NewRoom(app) + app.Register(room, + component.WithName("room"), + component.WithNameFunc(strings.ToLower), + ) + + app.RegisterRemote(room, + component.WithName("room"), + component.WithNameFunc(strings.ToLower), + ) +} + +func configureFrontend(port int) { + app.Register(services.NewConnector(app), + component.WithName("connector"), + component.WithNameFunc(strings.ToLower), + ) + + app.RegisterRemote(services.NewConnectorRemote(app), + component.WithName("connectorremote"), + component.WithNameFunc(strings.ToLower), + ) + + err := app.AddRoute("room", func( + ctx context.Context, + route *route.Route, + payload []byte, + servers map[string]*cluster.Server, + ) (*cluster.Server, error) { + // will return the first server + for k := range servers { + return servers[k], nil + } + return nil, nil + }) + + if err != nil { + fmt.Printf("error adding route %s\n", err.Error()) + } + + err = app.SetDictionary(map[string]uint16{ + "connector.getsessiondata": 1, + "connector.setsessiondata": 2, + "room.room.getsessiondata": 3, + "onMessage": 4, + "onMembers": 5, + }) + + if err != nil { + fmt.Printf("error setting route dictionary %s\n", err.Error()) + } +} + +func configureOpenTelemetry(logger logrus.FieldLogger) { + err := tracing.InitializeOtel() + if err != nil { + logger.Errorf("Failed to initialize OpenTelemetry: %v", err) + } +} + +func main() { + port := flag.Int("port", 3250, "the port to listen") + svType := flag.String("type", "connector", "the server type") + isFrontend := flag.Bool("frontend", true, "if server is frontend") + + flag.Parse() + + configureOpenTelemetry(logrus.New()) + + builder := pitaya.NewDefaultBuilder(*isFrontend, *svType, pitaya.Cluster, map[string]string{}, *config.NewDefaultPitayaConfig()) + if *isFrontend { + // Configurações de TLS e QUIC + tlsConf := &tls.Config{ + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, + } + quicConf := &quic.Config{ + MaxIdleTimeout: 35 * time.Second, + EnableDatagrams: true, + // Configurações específicas do QUIC podem ser colocadas aqui + } + quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) + builder.AddAcceptor(quicAcceptor) + } + builder.Groups = groups.NewMemoryGroupService(builder.Config.Groups.Memory) + app = builder.Build() + + defer app.Shutdown() + + if !*isFrontend { + configureBackend() + } else { + configureFrontend(*port) + } + + app.Start() +} + +func loadTLSCertificates() tls.Certificate { + certPath := "../../../pkg/acceptor/fixtures/server.crt" + keyPath := "../../../pkg/acceptor/fixtures/server.key" + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) + } + return cert +} diff --git a/go.mod b/go.mod index 8aee1ac9..596fcf4f 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,9 @@ require ( ) require ( + github.com/BurntSushi/toml v1.3.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/abiosoft/ishell v2.0.0+incompatible // indirect github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -51,7 +53,6 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.13.0 // indirect @@ -77,13 +78,10 @@ require ( github.com/jonboulle/clockwork v0.2.2 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/ksubedi/gomove v0.0.0-20200106182546-e1fa47256217 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -96,8 +94,6 @@ require ( github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect @@ -105,7 +101,6 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect - github.com/urfave/cli v1.22.15 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect go.etcd.io/bbolt v1.3.8 // indirect go.etcd.io/etcd/client/v2 v2.305.11 // indirect @@ -116,7 +111,6 @@ require ( go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.5.3 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect diff --git a/go.sum b/go.sum index 10c4a171..c9b339c0 100644 --- a/go.sum +++ b/go.sum @@ -41,14 +41,16 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/abiosoft/ishell v2.0.0+incompatible h1:zpwIuEHc37EzrsIYah3cpevrIc8Oma7oZPxr03tlmmw= +github.com/abiosoft/ishell v2.0.0+incompatible/go.mod h1:HQR9AqF2R3P4XXpMpI0NAzgHf/aS6+zVXRj14cVk9qg= github.com/abiosoft/ishell/v2 v2.0.2 h1:5qVfGiQISaYM8TkbBl7RFO6MddABoXpATrsFbVI+SNo= github.com/abiosoft/ishell/v2 v2.0.2/go.mod h1:E4oTCXfo6QjoCart0QYa5m9w4S+deXs/P/9jA77A9Bs= github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db h1:CjPUSXOiYptLbTdr1RceuZgSFDQ7U15ITERUGrUORx8= @@ -67,8 +69,10 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -82,10 +86,7 @@ github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/customerio/gospec v0.0.0-20130710230057-a5cc0e48aa39 h1:O0YTztXI3XeJXlFhSo4wNb0VBVqSgT+hi/CjNWKvMnY= github.com/customerio/gospec v0.0.0-20130710230057-a5cc0e48aa39/go.mod h1:OzYUFhPuL2JbjwFwrv6CZs23uBawekc6OZs+g19F0mY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -243,8 +244,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= -github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -256,32 +255,21 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/ksubedi/gomove v0.0.0-20200106182546-e1fa47256217 h1:CYk3GRunz2nSWbGNXpDxlr5uU/YTkBf1p9zorauMvvc= -github.com/ksubedi/gomove v0.0.0-20200106182546-e1fa47256217/go.mod h1:yq7Mn2Ip7t9irYr+JskEuBYdF3tKnikTKG49Qn5aDuY= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailgun/proxyproto v1.0.0 h1:CZTX/NM0qSq2JSatnowAhXmsHCXVu9JY6CDouOxJIQ4= github.com/mailgun/proxyproto v1.0.0/go.mod h1:4r+sqMZLJWs8HRnFYcpYH/Cb+P2QGAQt+bV76JJkS4I= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -293,32 +281,24 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a h1:lem6QCvxR0Y28gth9P+wV2K/zYUUAkJ+55U8cpS0p5I= -github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/jwt/v2 v2.5.8 h1:uvdSzwWiEGWGXf+0Q+70qv6AQdvcvxrv9hPM0RiPamE= github.com/nats-io/jwt/v2 v2.5.8/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A= -github.com/nats-io/nats-server/v2 v2.8.4 h1:0jQzze1T9mECg8YZEl8+WYUXb9JKluJfCBriPUtluB4= -github.com/nats-io/nats-server/v2 v2.8.4/go.mod h1:8zZa+Al3WsESfmgSs98Fi06dRWLH5Bnq90m5bKD/eT4= github.com/nats-io/nats-server/v2 v2.10.18 h1:tRdZmBuWKVAFYtayqlBB2BuCHNGAQPvoQIXOKwU3WSM= github.com/nats-io/nats-server/v2 v2.10.18/go.mod h1:97Qyg7YydD8blKlR8yBsUlPlWyZKjA7Bp5cl3MUE9K8= -github.com/nats-io/nats.go v1.25.0 h1:t5/wCPGciR7X3Mu8QOi4jiJaXaWM8qtkLu4lzGZvYHE= -github.com/nats-io/nats.go v1.25.0/go.mod h1:D2WALIhz7V8M0pH8Scx8JZXlg6Oqz5VG+nQkK8nJdvg= github.com/nats-io/nats.go v1.36.0 h1:suEUPuWzTSse/XhESwqLxXGuj8vGRuPRoG7MoRN/qyU= github.com/nats-io/nats.go v1.36.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= -github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= @@ -328,21 +308,13 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us= -github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y= @@ -351,11 +323,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -392,7 +360,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -402,9 +369,6 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4 github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/topfreegames/go-workers v1.2.1 h1:Jkkir3NngId7XHBP8JxcrqFDR22gLmfzaZlJO0IgCzU= github.com/topfreegames/go-workers v1.2.1/go.mod h1:Ayopyg9jGJyQ0nEXH8W7iBBBV6rLxwwMKFAdwCD1TSs= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM= -github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -455,8 +419,6 @@ go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -473,13 +435,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -518,8 +475,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -558,10 +513,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -586,15 +537,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -640,10 +587,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -655,15 +599,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -688,7 +628,6 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191204214957-d79e56da46fe/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -719,8 +658,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.work.sum b/go.work.sum index 16aefc8d..7c32e3d5 100644 --- a/go.work.sum +++ b/go.work.sum @@ -141,6 +141,7 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= @@ -150,6 +151,7 @@ github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/Ir github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -198,32 +200,35 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/ksubedi/gomove v0.0.0-20200106182546-e1fa47256217/go.mod h1:yq7Mn2Ip7t9irYr+JskEuBYdF3tKnikTKG49Qn5aDuY= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mstoykov/k6-taskqueue-lib v0.1.0/go.mod h1:PXdINulapvmzF545Auw++SCD69942FeNvUztaa9dVe4= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/orfjackal/nanospec.go v0.0.0-20120727230329-de4694c1d701/go.mod h1:VtBIF1XX0c1nKkeAPk8i4aXkYopqQgfDqolHUIHPwNI= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= @@ -249,6 +254,7 @@ go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxt go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= @@ -257,6 +263,7 @@ golang.org/x/crypto/x509roots/fallback v0.0.0-20240604170348-d4e7c9cb6cb8/go.mod golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -294,11 +301,11 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= google.golang.org/api v0.164.0/go.mod h1:2OatzO7ZDQsoS7IFf3rvsE17/TldiU3F/zxFHeqUB5o= diff --git a/xk6-pitaya/client.go b/xk6-pitaya/client.go index 6286838e..9b6eadfc 100644 --- a/xk6-pitaya/client.go +++ b/xk6-pitaya/client.go @@ -11,6 +11,7 @@ import ( "time" "github.com/dop251/goja" + "github.com/quic-go/quic-go" pitayaclient "github.com/topfreegames/pitaya/v3/pkg/client" pitayamessage "github.com/topfreegames/pitaya/v3/pkg/conn/message" "github.com/topfreegames/pitaya/v3/pkg/session" @@ -62,6 +63,27 @@ func (c *Client) Connect(addr string) error { return err } +// Connect connects to the server +// addr is the address of the server to connect to +func (c *Client) ConnectToQUIC(addr string) error { + vuState := c.vu.State() + + if vuState == nil { + return errors.New("connecting to a pitaya server in the init context is not supported") + } + + var err error + tlsConfig := &tls.Config{GetConfigForClient: func(*tls.ClientHelloInfo) (*tls.Config, error) { return nil, nil }, InsecureSkipVerify: true} + err = c.client.ConnectToQUIC(addr, &quic.Config{}, tlsConfig) + + if err != nil { + return err + } + go c.listen() + + return err +} + // IsConnected returns true if the client is connected to the server func (c *Client) IsConnected() bool { res := reflect.ValueOf(c.client).Elem().FieldByName("Connected") diff --git a/xk6-pitaya/examples/scenario2_QUIC.js b/xk6-pitaya/examples/scenario2_QUIC.js new file mode 100644 index 00000000..8cb1acbc --- /dev/null +++ b/xk6-pitaya/examples/scenario2_QUIC.js @@ -0,0 +1,62 @@ +import pitaya from 'k6/x/pitaya'; +import { check, sleep } from 'k6'; + +const opts = { + handshakeData: { + sys: { + clientBuildNumber: "1", + clientVersion: "9.0.0", + platform: "ios" + }, + user: { + bundleId: "com.cronus.monkeys.inhouse", + deviceType: "MacBook Pro", + fiu: "d58360c4-b5b0-4bb2-8dae-4a30d6c8d1b1", + language: "en", + osVersion: "1.0", + region: "US" + } + }, + requestTimeoutMs: 1000, + useTLS: true, +} + +export let options = { + stages: [ + { target: 10, duration: '5s' }, + ], + thresholds: { + pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms + }, +} + +const pitayaClient = new pitaya.Client(opts) + +export default async () => { + if (!pitayaClient.isConnected()) { + pitayaClient.connectToQUIC("localhost:3250") + } + + check(pitayaClient.isConnected(), { 'pitaya client is connected': (r) => r === true }) + + var res = await pitayaClient.request("requestor.room.entry") + check(res.result, { 'contains an result field': (r) => r !== undefined }) + check(res.result, { 'result is ok': (r) => r === "ok" }) + + res = await pitayaClient.request("connector.setsessiondata", { data: { "testKey": "testVal" } }) + check(res.Msg, { 'res is success': (r) => r === "success" }) + + res = await pitayaClient.request("connector.getsessiondata") + check(res.Data, { 'res contains set data': (r) => r.testKey === "testVal" }) + + res = await pitayaClient.request("requestor.room.join") + res = await pitayaClient.consumePush("onMembers", 1000) + check(res.members, { 'res contains a member group': (m) => m !== undefined }) + + sleep(2) + + pitayaClient.disconnect() +} + +export function teardown() { +} \ No newline at end of file diff --git a/xk6-pitaya/examples/scenario2_TCP.js b/xk6-pitaya/examples/scenario2_TCP.js new file mode 100644 index 00000000..d22fd51b --- /dev/null +++ b/xk6-pitaya/examples/scenario2_TCP.js @@ -0,0 +1,62 @@ +import pitaya from 'k6/x/pitaya'; +import { check, sleep } from 'k6'; + +const opts = { + handshakeData: { + sys: { + clientBuildNumber: "1", + clientVersion: "9.0.0", + platform: "ios" + }, + user: { + bundleId: "com.cronus.monkeys.inhouse", + deviceType: "MacBook Pro", + fiu: "d58360c4-b5b0-4bb2-8dae-4a30d6c8d1b1", + language: "en", + osVersion: "1.0", + region: "US" + } + }, + requestTimeoutMs: 1000, + useTLS: false, +} + +export let options = { + stages: [ + { target: 10, duration: '5s' }, + ], + thresholds: { + pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms + }, +} + +const pitayaClient = new pitaya.Client(opts) + +export default async () => { + if (!pitayaClient.isConnected()) { + pitayaClient.connect("localhost:3250") + } + + check(pitayaClient.isConnected(), { 'pitaya client is connected': (r) => r === true }) + + var res = await pitayaClient.request("requestor.room.entry") + check(res.result, { 'contains an result field': (r) => r !== undefined }) + check(res.result, { 'result is ok': (r) => r === "ok" }) + + res = await pitayaClient.request("connector.setsessiondata", { data: { "testKey": "testVal" } }) + check(res.Msg, { 'res is success': (r) => r === "success" }) + + res = await pitayaClient.request("connector.getsessiondata") + check(res.Data, { 'res contains set data': (r) => r.testKey === "testVal" }) + + res = await pitayaClient.request("requestor.room.join") + res = await pitayaClient.consumePush("onMembers", 1000) + check(res.members, { 'res contains a member group': (m) => m !== undefined }) + + sleep(2) + + pitayaClient.disconnect() +} + +export function teardown() { +} \ No newline at end of file From 85d044cde7238342e328c352d17daeca01eddc48 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Thu, 7 Nov 2024 17:29:52 -0300 Subject: [PATCH 18/27] refactor: housecleaning - deleting files that were not being used anymore --- examples/demo/client.go | 80 ----------- examples/demo/cluster/main_quic.go | 135 ------------------ examples/demo/cluster_grpc/main.go | 31 +--- .../{default_main.go => main_quic.go} | 31 +++- examples/demo/cluster_grpc/server.go | 130 ----------------- xk6-pitaya/examples/scenario2_QUIC.js | 3 +- xk6-pitaya/examples/scenario2_TCP.js | 3 +- 7 files changed, 35 insertions(+), 378 deletions(-) delete mode 100644 examples/demo/client.go delete mode 100644 examples/demo/cluster/main_quic.go rename examples/demo/cluster_grpc/{default_main.go => main_quic.go} (81%) delete mode 100644 examples/demo/cluster_grpc/server.go diff --git a/examples/demo/client.go b/examples/demo/client.go deleted file mode 100644 index 5127ae2b..00000000 --- a/examples/demo/client.go +++ /dev/null @@ -1,80 +0,0 @@ -package main - -import ( - "crypto/tls" - "fmt" - "log" - "time" - "github.com/sirupsen/logrus" - - "github.com/quic-go/quic-go" - "github.com/topfreegames/pitaya/v3/pkg/client" -) - -func main() { - // Define TLS configurations - tlsConf := &tls.Config{ - InsecureSkipVerify: true, // Only for testing, do not use in production - } - - // Define QUIC configurations (can be nil if not needed) - quicConf := &quic.Config{} - - c := client.New(logrus.DebugLevel) - - err := c.ConnectToQUIC("localhost:3250", quicConf, tlsConf) - - if(err != nil) { - log.Fatalf("Failed to connect to server: %v", err) - } - - - id, err := c.SendRequest("connector.getsessiondata", []byte{}); - - if(err != nil) { - log.Fatalf("Request failed: %v", err) - } - - fmt.Printf("Request was sent to server: reqUid %v!\n", id) - - id, err = c.SendRequest("connector.setsessiondata", []byte("{\"Data\":{\"ipversion\":\"ipv4\", \"novoDado\":\"QuicClient\"}}")); - - if(err != nil) { - log.Fatalf("Request failed: %v", err) - } - - fmt.Printf("Request was sent to server: reqUid %v!\n", id) - - time.Sleep(2 * time.Second); - - id, err = c.SendRequest("connector.getsessiondata", []byte{}); - - if(err != nil) { - log.Fatalf("Request failed: %v", err) - } - - fmt.Printf("Request was sent to server: reqUid %v!\n", id) - - id, err = c.SendRequest("requestor.room.entry", []byte{}); - - if(err != nil) { - log.Fatalf("Request failed: %v", err) - } - - fmt.Printf("Request was sent to server: reqUid %v!\n", id) - - time.Sleep(2 * time.Second) - - id, err = c.SendRequest("requestor.room.join", []byte{}); - - if(err != nil) { - log.Fatalf("Request failed: %v", err) - } - - fmt.Printf("Request was sent to server: reqUid %v!\n", id) - - time.Sleep(65 * time.Second); - - c.Disconnect(); - -} diff --git a/examples/demo/cluster/main_quic.go b/examples/demo/cluster/main_quic.go deleted file mode 100644 index 1339cb7f..00000000 --- a/examples/demo/cluster/main_quic.go +++ /dev/null @@ -1,135 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "flag" - "fmt" - "time" - - "strings" - - "github.com/quic-go/quic-go" - "github.com/sirupsen/logrus" - "github.com/topfreegames/pitaya/v3/examples/demo/cluster/services" - pitaya "github.com/topfreegames/pitaya/v3/pkg" - "github.com/topfreegames/pitaya/v3/pkg/acceptor" - "github.com/topfreegames/pitaya/v3/pkg/cluster" - "github.com/topfreegames/pitaya/v3/pkg/component" - "github.com/topfreegames/pitaya/v3/pkg/config" - "github.com/topfreegames/pitaya/v3/pkg/groups" - "github.com/topfreegames/pitaya/v3/pkg/route" - "github.com/topfreegames/pitaya/v3/pkg/tracing" -) - -var app pitaya.Pitaya - -func configureBackend() { - room := services.NewRoom(app) - app.Register(room, - component.WithName("room"), - component.WithNameFunc(strings.ToLower), - ) - - app.RegisterRemote(room, - component.WithName("room"), - component.WithNameFunc(strings.ToLower), - ) -} - -func configureFrontend(port int) { - app.Register(services.NewConnector(app), - component.WithName("connector"), - component.WithNameFunc(strings.ToLower), - ) - - app.RegisterRemote(services.NewConnectorRemote(app), - component.WithName("connectorremote"), - component.WithNameFunc(strings.ToLower), - ) - - err := app.AddRoute("room", func( - ctx context.Context, - route *route.Route, - payload []byte, - servers map[string]*cluster.Server, - ) (*cluster.Server, error) { - // will return the first server - for k := range servers { - return servers[k], nil - } - return nil, nil - }) - - if err != nil { - fmt.Printf("error adding route %s\n", err.Error()) - } - - err = app.SetDictionary(map[string]uint16{ - "connector.getsessiondata": 1, - "connector.setsessiondata": 2, - "room.room.getsessiondata": 3, - "onMessage": 4, - "onMembers": 5, - }) - - if err != nil { - fmt.Printf("error setting route dictionary %s\n", err.Error()) - } -} - -func configureOpenTelemetry(logger logrus.FieldLogger) { - err := tracing.InitializeOtel() - if err != nil { - logger.Errorf("Failed to initialize OpenTelemetry: %v", err) - } -} - -func main() { - port := flag.Int("port", 3250, "the port to listen") - svType := flag.String("type", "connector", "the server type") - isFrontend := flag.Bool("frontend", true, "if server is frontend") - - flag.Parse() - - configureOpenTelemetry(logrus.New()) - - builder := pitaya.NewDefaultBuilder(*isFrontend, *svType, pitaya.Cluster, map[string]string{}, *config.NewDefaultPitayaConfig()) - if *isFrontend { - // Configurações de TLS e QUIC - tlsConf := &tls.Config{ - Certificates: []tls.Certificate{ - loadTLSCertificates(), - }, - } - quicConf := &quic.Config{ - MaxIdleTimeout: 35 * time.Second, - EnableDatagrams: true, - // Configurações específicas do QUIC podem ser colocadas aqui - } - quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) - builder.AddAcceptor(quicAcceptor) - } - builder.Groups = groups.NewMemoryGroupService(builder.Config.Groups.Memory) - app = builder.Build() - - defer app.Shutdown() - - if !*isFrontend { - configureBackend() - } else { - configureFrontend(*port) - } - - app.Start() -} - -func loadTLSCertificates() tls.Certificate { - certPath := "../../../pkg/acceptor/fixtures/server.crt" - keyPath := "../../../pkg/acceptor/fixtures/server.key" - cert, err := tls.LoadX509KeyPair(certPath, keyPath) - if err != nil { - panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) - } - return cert -} diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index be01a601..0423a495 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -2,14 +2,12 @@ package main import ( "context" - "crypto/tls" "flag" "fmt" "strconv" + "strings" - "time" - "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" pitaya "github.com/topfreegames/pitaya/v3/pkg" "github.com/topfreegames/pitaya/v3/pkg/acceptor" @@ -131,30 +129,9 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - // Configurações de TLS e QUIC - tlsConf := &tls.Config{ - Certificates: []tls.Certificate{ - loadTLSCertificates(), - }, - } - quicConf := &quic.Config{ - MaxIdleTimeout: 35 * time.Second, - EnableDatagrams: true, - // Configurações específicas do QUIC podem ser colocadas aqui - } - quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) - builder.AddAcceptor(quicAcceptor) + tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) + builder.AddAcceptor(tcp) } return builder.Build(), bs -} - -func loadTLSCertificates() tls.Certificate { - certPath := "../../../pkg/acceptor/fixtures/server.crt" - keyPath := "../../../pkg/acceptor/fixtures/server.key" - cert, err := tls.LoadX509KeyPair(certPath, keyPath) - if err != nil { - panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) - } - return cert -} +} \ No newline at end of file diff --git a/examples/demo/cluster_grpc/default_main.go b/examples/demo/cluster_grpc/main_quic.go similarity index 81% rename from examples/demo/cluster_grpc/default_main.go rename to examples/demo/cluster_grpc/main_quic.go index 0423a495..be01a601 100644 --- a/examples/demo/cluster_grpc/default_main.go +++ b/examples/demo/cluster_grpc/main_quic.go @@ -2,12 +2,14 @@ package main import ( "context" + "crypto/tls" "flag" "fmt" "strconv" - "strings" + "time" + "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" pitaya "github.com/topfreegames/pitaya/v3/pkg" "github.com/topfreegames/pitaya/v3/pkg/acceptor" @@ -129,9 +131,30 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) - builder.AddAcceptor(tcp) + // Configurações de TLS e QUIC + tlsConf := &tls.Config{ + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, + } + quicConf := &quic.Config{ + MaxIdleTimeout: 35 * time.Second, + EnableDatagrams: true, + // Configurações específicas do QUIC podem ser colocadas aqui + } + quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) + builder.AddAcceptor(quicAcceptor) } return builder.Build(), bs -} \ No newline at end of file +} + +func loadTLSCertificates() tls.Certificate { + certPath := "../../../pkg/acceptor/fixtures/server.crt" + keyPath := "../../../pkg/acceptor/fixtures/server.key" + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) + } + return cert +} diff --git a/examples/demo/cluster_grpc/server.go b/examples/demo/cluster_grpc/server.go deleted file mode 100644 index c0c96430..00000000 --- a/examples/demo/cluster_grpc/server.go +++ /dev/null @@ -1,130 +0,0 @@ -package main - -import ( - "crypto/tls" - "fmt" - "log" - - "github.com/quic-go/quic-go" - "github.com/topfreegames/pitaya/v3/pkg/acceptor" - "github.com/topfreegames/pitaya/v3/pkg/conn/codec" - "github.com/topfreegames/pitaya/v3/pkg/conn/message" - "github.com/topfreegames/pitaya/v3/pkg/conn/packet" -) - -func main() { - tlsConf := &tls.Config{ - Certificates: []tls.Certificate{ - loadTLSCertificates(), - }, - } - - quicConf := &quic.Config{ - Allow0RTT: true, - } - - // Initialize the QuicAcceptor - quicAcceptor := acceptor.NewQuicAcceptor(":3250", tlsConf, quicConf) - err := quicAcceptor.Listen() - if err != nil { - log.Fatalf("Failed to start QUIC server: %v", err) - } - defer quicAcceptor.Close() - - fmt.Println("QUIC server listening on port 3250") - - // Connection acceptance loop - for { - conn, err := quicAcceptor.Accept() - if err != nil { - log.Printf("Error accepting connection: %v", err) - continue - } - - // Handle connection in a separate goroutine - go handleConnection(conn) - } -} - -func handleConnection(conn quic.Connection) { - - packetDecoder := codec.NewPomeloPacketDecoder() - packetEncoder := codec.NewPomeloPacketEncoder() - messageEncoder := message.NewMessagesEncoder(false) - - // Aceitar um stream - c := acceptor.NewQuicConnWrapper(conn) - - // Ler dados do cliente - for { - buff := make([]byte, 1024) - n, err := c.Read(buff) - // Read data from the client - if err != nil { - log.Printf("Error reading from stream: %v", err) - return - } - - packets, err := packetDecoder.Decode(buff[:n]) - if err != nil { - fmt.Printf("%v", err) - break - } - - for _, p := range packets { - switch p.Type { - case packet.Data: - m, err := message.Decode(p.Data) - if err != nil { - fmt.Printf("error decoding msg from sv: %v\n", string(m.Data)) - } - fmt.Printf("message received from client: %v\n", string(m.Data)) - case packet.Heartbeat: - fmt.Printf("got heartbeat from client!\n") - } - } - - // Send response to the client - response := "Hello, QUIC client!" - - // buildPacket - m := message.Message{ - Type: message.Response, - ID: 2, - Route: "", - Data: []byte(response), - Err: false, - } - - encMsg, err := messageEncoder.Encode(&m) - - fmt.Printf("message encoded\n") - if err != nil { - return - } - p, err := packetEncoder.Encode(packet.Data, encMsg) - - fmt.Printf("packet encoded\n") - if err != nil { - return - } - - _, err = c.Write([]byte(p)) - if err != nil { - log.Printf("Error sending response: %v", err) - return - } - fmt.Println("Response sent to client") - } - -} - -func loadTLSCertificates() tls.Certificate { - certPath := "../../../pkg/acceptor/fixtures/server.crt" - keyPath := "../../../pkg/acceptor/fixtures/server.key" - cert, err := tls.LoadX509KeyPair(certPath, keyPath) - if err != nil { - panic(fmt.Sprintf("Error loading TLS certificates: %v", err)) - } - return cert -} diff --git a/xk6-pitaya/examples/scenario2_QUIC.js b/xk6-pitaya/examples/scenario2_QUIC.js index 8cb1acbc..5e7031d0 100644 --- a/xk6-pitaya/examples/scenario2_QUIC.js +++ b/xk6-pitaya/examples/scenario2_QUIC.js @@ -23,7 +23,7 @@ const opts = { export let options = { stages: [ - { target: 10, duration: '5s' }, + { target: 10, duration: '10s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -33,6 +33,7 @@ export let options = { const pitayaClient = new pitaya.Client(opts) export default async () => { + sleep(1); if (!pitayaClient.isConnected()) { pitayaClient.connectToQUIC("localhost:3250") } diff --git a/xk6-pitaya/examples/scenario2_TCP.js b/xk6-pitaya/examples/scenario2_TCP.js index d22fd51b..d6af7e5d 100644 --- a/xk6-pitaya/examples/scenario2_TCP.js +++ b/xk6-pitaya/examples/scenario2_TCP.js @@ -23,7 +23,7 @@ const opts = { export let options = { stages: [ - { target: 10, duration: '5s' }, + { target: 10, duration: '10s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -33,6 +33,7 @@ export let options = { const pitayaClient = new pitaya.Client(opts) export default async () => { + sleep(1); if (!pitayaClient.isConnected()) { pitayaClient.connect("localhost:3250") } From c6b21b0e0cf866aeadf56c3cd2c568d82bab63fe Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Thu, 7 Nov 2024 17:34:07 -0300 Subject: [PATCH 19/27] refactor: removing forgotten debug logs --- pkg/client/client.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 075968ae..ed3b1f4d 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -35,10 +35,10 @@ import ( "github.com/topfreegames/pitaya/v3/pkg/acceptor" - "github.com/quic-go/quic-go" "github.com/gorilla/websocket" + "github.com/quic-go/quic-go" "github.com/sirupsen/logrus" - "github.com/topfreegames/pitaya/v3/pkg" + pitaya "github.com/topfreegames/pitaya/v3/pkg" "github.com/topfreegames/pitaya/v3/pkg/conn/codec" "github.com/topfreegames/pitaya/v3/pkg/conn/message" "github.com/topfreegames/pitaya/v3/pkg/conn/packet" @@ -244,7 +244,7 @@ func (c *Client) handlePackets() { switch p.Type { case packet.Data: //handle data - logger.Log.Debug("got data: ", string(p.Data)) + logger.Log.Debug("got data: %s", string(p.Data)) m, err := message.Decode(p.Data) if err != nil { logger.Log.Errorf("error decoding msg from sv: %s", string(m.Data)) @@ -283,7 +283,6 @@ func (c *Client) readPackets(buf *bytes.Buffer) ([]*packet.Packet, error) { } buf.Write(data[:n]) } - packets, err := c.packetDecoder.Decode(buf.Bytes()) if err != nil { logger.Log.Errorf("error decoding packet from server: %s", err.Error()) @@ -324,7 +323,6 @@ func (c *Client) sendHeartbeats(interval int) { case <-t.C: p, _ := c.packetEncoder.Encode(packet.Heartbeat, []byte{}) _, err := c.conn.Write(p) - logger.Log.Debug("Heartbeat was sent to server!") if err != nil { logger.Log.Errorf("error sending heartbeat to server: %s", err.Error()) return @@ -338,7 +336,6 @@ func (c *Client) sendHeartbeats(interval int) { // Disconnect disconnects the client func (c *Client) Disconnect() { if c.Connected { - logger.Log.Debug("Disconnecting!") c.Connected = false close(c.closeChan) c.conn.Close() @@ -373,7 +370,7 @@ func (c *Client) ConnectTo(addr string, tlsConfig ...*tls.Config) error { func (c *Client) ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig ...*tls.Config) error { var conn quic.Connection var err error - if(len(tlsConfig) > 0) { + if len(tlsConfig) > 0 { conn, err = quic.DialAddr(context.Background(), addr, tlsConfig[0], quicConfig) } else { tls := &tls.Config{ @@ -382,12 +379,12 @@ func (c *Client) ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig . conn, err = quic.DialAddr(context.Background(), addr, tls, quicConfig) } - if err != nil { - return err; - } + if err != nil { + return err + } + + c.conn = acceptor.NewQuicConnWrapper(conn) - c.conn = acceptor.NewQuicConnWrapper(conn); - c.IncomingMsgChan = make(chan *message.Message, 10) if err = c.handleHandshake(); err != nil { From 79d5738248095661000bd4f64d557894ed44cb34 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 11 Nov 2024 15:01:50 -0300 Subject: [PATCH 20/27] refactor: remove main_quic and simplify to a single main --- examples/demo/cluster_grpc/main.go | 31 ++++- examples/demo/cluster_grpc/main_quic.go | 160 ------------------------ 2 files changed, 27 insertions(+), 164 deletions(-) delete mode 100644 examples/demo/cluster_grpc/main_quic.go diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 0423a495..be01a601 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -2,12 +2,14 @@ package main import ( "context" + "crypto/tls" "flag" "fmt" "strconv" - "strings" + "time" + "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" pitaya "github.com/topfreegames/pitaya/v3/pkg" "github.com/topfreegames/pitaya/v3/pkg/acceptor" @@ -129,9 +131,30 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) - builder.AddAcceptor(tcp) + // Configurações de TLS e QUIC + tlsConf := &tls.Config{ + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, + } + quicConf := &quic.Config{ + MaxIdleTimeout: 35 * time.Second, + EnableDatagrams: true, + // Configurações específicas do QUIC podem ser colocadas aqui + } + quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) + builder.AddAcceptor(quicAcceptor) } return builder.Build(), bs -} \ No newline at end of file +} + +func loadTLSCertificates() tls.Certificate { + certPath := "../../../pkg/acceptor/fixtures/server.crt" + keyPath := "../../../pkg/acceptor/fixtures/server.key" + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) + } + return cert +} diff --git a/examples/demo/cluster_grpc/main_quic.go b/examples/demo/cluster_grpc/main_quic.go deleted file mode 100644 index be01a601..00000000 --- a/examples/demo/cluster_grpc/main_quic.go +++ /dev/null @@ -1,160 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "flag" - "fmt" - "strconv" - "strings" - "time" - - "github.com/quic-go/quic-go" - "github.com/topfreegames/pitaya/v3/examples/demo/cluster_grpc/services" - pitaya "github.com/topfreegames/pitaya/v3/pkg" - "github.com/topfreegames/pitaya/v3/pkg/acceptor" - "github.com/topfreegames/pitaya/v3/pkg/cluster" - "github.com/topfreegames/pitaya/v3/pkg/component" - "github.com/topfreegames/pitaya/v3/pkg/config" - "github.com/topfreegames/pitaya/v3/pkg/constants" - "github.com/topfreegames/pitaya/v3/pkg/groups" - "github.com/topfreegames/pitaya/v3/pkg/modules" - "github.com/topfreegames/pitaya/v3/pkg/route" -) - -var app pitaya.Pitaya - -func configureBackend() { - room := services.NewRoom(app) - app.Register(room, - component.WithName("room"), - component.WithNameFunc(strings.ToLower), - ) - - app.RegisterRemote(room, - component.WithName("room"), - component.WithNameFunc(strings.ToLower), - ) -} - -func configureFrontend(port int) { - app.Register(services.NewConnector(app), - component.WithName("connector"), - component.WithNameFunc(strings.ToLower), - ) - app.RegisterRemote(&services.ConnectorRemote{}, - component.WithName("connectorremote"), - component.WithNameFunc(strings.ToLower), - ) - - err := app.AddRoute("room", func( - ctx context.Context, - route *route.Route, - payload []byte, - servers map[string]*cluster.Server, - ) (*cluster.Server, error) { - // will return the first server - for k := range servers { - return servers[k], nil - } - return nil, nil - }) - - if err != nil { - fmt.Printf("error adding route %s\n", err.Error()) - } - - err = app.SetDictionary(map[string]uint16{ - "connector.getsessiondata": 1, - "connector.setsessiondata": 2, - "room.room.getsessiondata": 3, - "onMessage": 4, - "onMembers": 5, - }) - - if err != nil { - fmt.Printf("error setting route dictionary %s\n", err.Error()) - } -} - -func main() { - port := flag.Int("port", 3250, "the port to listen") - svType := flag.String("type", "connector", "the server type") - isFrontend := flag.Bool("frontend", true, "if server is frontend") - rpcServerPort := flag.Int("rpcsvport", 3434, "the port that grpc server will listen") - - flag.Parse() - - meta := map[string]string{ - constants.GRPCHostKey: "127.0.0.1", - constants.GRPCPortKey: strconv.Itoa(*rpcServerPort), - } - - var bs *modules.ETCDBindingStorage - app, bs = createApp(*port, *isFrontend, *svType, meta, *rpcServerPort) - - defer app.Shutdown() - - app.RegisterModule(bs, "bindingsStorage") - if !*isFrontend { - configureBackend() - } else { - configureFrontend(*port) - } - app.Start() -} - -func createApp(port int, isFrontend bool, svType string, meta map[string]string, rpcServerPort int) (pitaya.Pitaya, *modules.ETCDBindingStorage) { - builder := pitaya.NewDefaultBuilder(isFrontend, svType, pitaya.Cluster, meta, *config.NewDefaultPitayaConfig()) - - grpcServerConfig := builder.Config.Cluster.RPC.Server.Grpc - grpcServerConfig.Port = rpcServerPort - gs, err := cluster.NewGRPCServer(grpcServerConfig, builder.Server, builder.MetricsReporters) - if err != nil { - panic(err) - } - builder.RPCServer = gs - builder.Groups = groups.NewMemoryGroupService(builder.Config.Groups.Memory) - - bs := modules.NewETCDBindingStorage(builder.Server, builder.SessionPool, builder.Config.Modules.BindingStorage.Etcd) - - gc, err := cluster.NewGRPCClient( - builder.Config.Cluster.RPC.Client.Grpc, - builder.Server, - builder.MetricsReporters, - bs, - cluster.NewInfoRetriever(builder.Config.Cluster.Info), - ) - if err != nil { - panic(err) - } - builder.RPCClient = gc - - if isFrontend { - // Configurações de TLS e QUIC - tlsConf := &tls.Config{ - Certificates: []tls.Certificate{ - loadTLSCertificates(), - }, - } - quicConf := &quic.Config{ - MaxIdleTimeout: 35 * time.Second, - EnableDatagrams: true, - // Configurações específicas do QUIC podem ser colocadas aqui - } - quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) - builder.AddAcceptor(quicAcceptor) - } - - return builder.Build(), bs -} - -func loadTLSCertificates() tls.Certificate { - certPath := "../../../pkg/acceptor/fixtures/server.crt" - keyPath := "../../../pkg/acceptor/fixtures/server.key" - cert, err := tls.LoadX509KeyPair(certPath, keyPath) - if err != nil { - panic(fmt.Sprintf("Erro ao carregar certificados TLS: %v", err)) - } - return cert -} From 3d2a7dc930f4828d20a9278d3a800300102433f4 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 11 Nov 2024 15:52:12 -0300 Subject: [PATCH 21/27] refactor: Make QuicConnWrapper timeout configurable with default of 100ms --- pkg/acceptor/quic_acceptor.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index 5b45989d..e2be9951 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -141,7 +141,7 @@ func (a *QuicAcceptor) ListenAndServe() { // Send the connection to the channel for further processing go func(c quic.Connection) { - playerConn := NewQuicConnWrapper(c) + playerConn := NewQuicConnWrapper(c, 100*time.Millisecond) a.connChan <- playerConn }(conn) } @@ -150,11 +150,12 @@ func (a *QuicAcceptor) ListenAndServe() { // QuicConnWrapper is a wrapper for a QUIC connection, allowing the use of deadlines type QuicConnWrapper struct { conn quic.Connection + writeTimeout time.Duration // Timeout configurável para escrita } // NewQuicConnWrapper creates a new wrapper for a QUIC connection -func NewQuicConnWrapper(conn quic.Connection) *QuicConnWrapper { - return &QuicConnWrapper{conn: conn} +func NewQuicConnWrapper(conn quic.Connection, timeout time.Duration) *QuicConnWrapper { + return &QuicConnWrapper{conn: conn, writeTimeout: timeout} } // Read reads data from the QUIC connection @@ -169,7 +170,7 @@ func (q *QuicConnWrapper) Read(p []byte) (int, error) { // Write writes data to the connection with a defined deadline func (q *QuicConnWrapper) Write(p []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // 5 seconds timeout as an example + ctx, cancel := context.WithTimeout(context.Background(), q.writeTimeout) defer cancel() stream, err := q.conn.OpenStreamSync(ctx) From 836417227b5f86a09172d4c34fd644506d8bac12 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Mon, 11 Nov 2024 17:01:39 -0300 Subject: [PATCH 22/27] refactor: enhance QUIC stream message handling with header parsing, timeout, and error handling --- pkg/acceptor/quic_acceptor.go | 95 ++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 41 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index e2be9951..db91acb2 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -27,10 +27,10 @@ import ( "fmt" "net" "time" + "io" "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/conn/codec" - "github.com/topfreegames/pitaya/v3/pkg/conn/packet" "github.com/topfreegames/pitaya/v3/pkg/constants" ) @@ -141,7 +141,7 @@ func (a *QuicAcceptor) ListenAndServe() { // Send the connection to the channel for further processing go func(c quic.Connection) { - playerConn := NewQuicConnWrapper(c, 100*time.Millisecond) + playerConn := NewQuicConnWrapper(c, 100*time.Millisecond, 100*time.Millisecond) a.connChan <- playerConn }(conn) } @@ -150,26 +150,43 @@ func (a *QuicAcceptor) ListenAndServe() { // QuicConnWrapper is a wrapper for a QUIC connection, allowing the use of deadlines type QuicConnWrapper struct { conn quic.Connection - writeTimeout time.Duration // Timeout configurável para escrita + stream quic.Stream + writeTimeout time.Duration + readTimeout time.Duration } // NewQuicConnWrapper creates a new wrapper for a QUIC connection -func NewQuicConnWrapper(conn quic.Connection, timeout time.Duration) *QuicConnWrapper { - return &QuicConnWrapper{conn: conn, writeTimeout: timeout} +func NewQuicConnWrapper(conn quic.Connection, writeTimeout, readTimeout time.Duration) *QuicConnWrapper { + return &QuicConnWrapper{conn: conn, + writeTimeout: writeTimeout, + readTimeout: readTimeout, + } } -// Read reads data from the QUIC connection -func (q *QuicConnWrapper) Read(p []byte) (int, error) { - stream, err := q.conn.AcceptStream(context.Background()) - if err != nil { - return 0, err +// Read reads data from the QUIC connection with a timeout +func (q *QuicConnWrapper) Read(b []byte) (n int, err error) { + if q.stream == nil { + ctx, cancel := context.WithTimeout(context.Background(), q.readTimeout) + defer cancel() + stream, err := q.conn.AcceptStream(ctx) + if err != nil { + return 0, err + } + q.stream = stream } - return stream.Read(p) + n, err = q.stream.Read(b) + if err == io.EOF { + q.stream = nil + } else if err != nil { + return n, err + } + + return n, err } // Write writes data to the connection with a defined deadline -func (q *QuicConnWrapper) Write(p []byte) (int, error) { +func (q *QuicConnWrapper) Write(b []byte) (int, error) { ctx, cancel := context.WithTimeout(context.Background(), q.writeTimeout) defer cancel() @@ -178,7 +195,7 @@ func (q *QuicConnWrapper) Write(p []byte) (int, error) { return 0, err } - return stream.Write(p) + return stream.Write(b) } // Close closes the QUIC connection @@ -196,35 +213,31 @@ func (q *QuicConnWrapper) RemoteAddr() net.Addr { return q.conn.RemoteAddr() } -// GetNextMessage reads the next message available in the QUIC stream +// GetNextMessage reads the next message available in the stream func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { - // Read data from the stream - msgBytes := make([]byte, 1024) - - n, err := q.Read(msgBytes) - if err != nil { - return nil, err - } - - msg := msgBytes[:n] - - if len(msg) < codec.HeadLength { - return nil, packet.ErrInvalidPomeloHeader - } - header := msg[:codec.HeadLength] - - msgSize, _, err := codec.ParseHeader(header) - if err != nil { - return nil, err - } - dataLen := len(msg[codec.HeadLength:]) - if dataLen < msgSize { - return nil, constants.ErrReceivedMsgSmallerThanExpected - } else if dataLen > msgSize { - return nil, constants.ErrReceivedMsgBiggerThanExpected - } - - return msg, nil + stream, err := q.conn.AcceptStream(context.Background()) + if err != nil { + return nil, err + } + header, err := io.ReadAll(io.LimitReader(stream, codec.HeadLength)) + if err != nil { + return nil, err + } + if len(header) == 0 { + return nil, constants.ErrConnectionClosed + } + msgSize, _, err := codec.ParseHeader(header) + if err != nil { + return nil, err + } + msgData, err := io.ReadAll(io.LimitReader(stream, int64(msgSize))) + if err != nil { + return nil, err + } + if len(msgData) < msgSize { + return nil, constants.ErrReceivedMsgSmallerThanExpected + } + return append(header, msgData...), nil } func (q *QuicConnWrapper) SetDeadline(t time.Time) error { From 8ac55ef1c3742770927cb21cce708b8ff99b6278 Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Thu, 21 Nov 2024 09:19:44 -0300 Subject: [PATCH 23/27] refactor: fix xk6 build and modified scenarios for quic server --- pkg/client/client.go | 2 +- xk6-pitaya/examples/scenario2_QUIC.js | 60 +++++++++++++++++++------- xk6-pitaya/examples/scenario2_TCP.js | 62 ++++++++++++++++++++------- 3 files changed, 92 insertions(+), 32 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index ed3b1f4d..bec4f8b9 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -383,7 +383,7 @@ func (c *Client) ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig . return err } - c.conn = acceptor.NewQuicConnWrapper(conn) + c.conn = acceptor.NewQuicConnWrapper(conn, c.requestTimeout, c.requestTimeout) c.IncomingMsgChan = make(chan *message.Message, 10) diff --git a/xk6-pitaya/examples/scenario2_QUIC.js b/xk6-pitaya/examples/scenario2_QUIC.js index 5e7031d0..8d755e3b 100644 --- a/xk6-pitaya/examples/scenario2_QUIC.js +++ b/xk6-pitaya/examples/scenario2_QUIC.js @@ -1,5 +1,6 @@ import pitaya from 'k6/x/pitaya'; import { check, sleep } from 'k6'; +import { Trend } from 'k6/metrics'; const opts = { handshakeData: { @@ -21,9 +22,13 @@ const opts = { useTLS: true, } +let requestTimeEntryRoomTrend = new Trend('request_time_entry_room'); +let requestTimeSessionDataTrend = new Trend('request_time_session_data'); +let requestTimeJoinRoomTrend = new Trend('request_time_join_room'); + export let options = { stages: [ - { target: 10, duration: '10s' }, + { target: 5, duration: '5s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -32,31 +37,56 @@ export let options = { const pitayaClient = new pitaya.Client(opts) -export default async () => { - sleep(1); - if (!pitayaClient.isConnected()) { - pitayaClient.connectToQUIC("localhost:3250") - } +async function connectToServer() { + await pitayaClient.connectToQUIC("localhost:3250") check(pitayaClient.isConnected(), { 'pitaya client is connected': (r) => r === true }) +} +async function entryRoom() { + let startTime = Date.now(); var res = await pitayaClient.request("requestor.room.entry") - check(res.result, { 'contains an result field': (r) => r !== undefined }) - check(res.result, { 'result is ok': (r) => r === "ok" }) + let duration = Date.now() - startTime; + requestTimeEntryRoomTrend.add(duration); + if (res.msg != "session is already bound to an uid") { + check(res.result, { 'contains an result field': (r) => r !== undefined }) + check(res.result, { 'result is ok': (r) => r === "ok" }) + } +} - res = await pitayaClient.request("connector.setsessiondata", { data: { "testKey": "testVal" } }) +async function setAndRetrieveSessionData(sessionData) { + let startTime = Date.now(); + var res = await pitayaClient.request("connector.setsessiondata", sessionData) + let duration = Date.now() - startTime; + requestTimeSessionDataTrend.add(duration); check(res.Msg, { 'res is success': (r) => r === "success" }) res = await pitayaClient.request("connector.getsessiondata") - check(res.Data, { 'res contains set data': (r) => r.testKey === "testVal" }) + check(res.Data, { 'res contains set data': (r) => r.testKey === sessionData.data.testKey }) +} - res = await pitayaClient.request("requestor.room.join") - res = await pitayaClient.consumePush("onMembers", 1000) - check(res.members, { 'res contains a member group': (m) => m !== undefined }) +async function joinRoom() { + let startTime = Date.now(); + var res = await pitayaClient.request("requestor.room.join") + let duration = Date.now() - startTime; + requestTimeJoinRoomTrend.add(duration); + if (res.msg === "onclose callbacks are not allowed on backend servers") { + res = await pitayaClient.consumePush("onMembers", 1000) + check(res.members, { 'res contains a member group': (m) => m !== undefined }) + } +} + +export default async () => { - sleep(2) + await connectToServer(); + + sleep(1); + await entryRoom(); + + sleep(1); + await setAndRetrieveSessionData({ data: { "testKey": "testVal" } }); - pitayaClient.disconnect() + await pitayaClient.disconnect() } export function teardown() { diff --git a/xk6-pitaya/examples/scenario2_TCP.js b/xk6-pitaya/examples/scenario2_TCP.js index d6af7e5d..346c299d 100644 --- a/xk6-pitaya/examples/scenario2_TCP.js +++ b/xk6-pitaya/examples/scenario2_TCP.js @@ -1,5 +1,6 @@ import pitaya from 'k6/x/pitaya'; import { check, sleep } from 'k6'; +import { Trend } from 'k6/metrics'; const opts = { handshakeData: { @@ -18,12 +19,16 @@ const opts = { } }, requestTimeoutMs: 1000, - useTLS: false, + useTLS: true, } +let requestTimeEntryRoomTrend = new Trend('request_time_entry_room'); +let requestTimeSessionDataTrend = new Trend('request_time_session_data'); +let requestTimeJoinRoomTrend = new Trend('request_time_join_room'); + export let options = { stages: [ - { target: 10, duration: '10s' }, + { target: 5, duration: '5s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -32,31 +37,56 @@ export let options = { const pitayaClient = new pitaya.Client(opts) -export default async () => { - sleep(1); - if (!pitayaClient.isConnected()) { - pitayaClient.connect("localhost:3250") - } +async function connectToServer() { + await pitayaClient.connect("localhost:3250") check(pitayaClient.isConnected(), { 'pitaya client is connected': (r) => r === true }) +} +async function entryRoom() { + let startTime = Date.now(); var res = await pitayaClient.request("requestor.room.entry") - check(res.result, { 'contains an result field': (r) => r !== undefined }) - check(res.result, { 'result is ok': (r) => r === "ok" }) + let duration = Date.now() - startTime; + requestTimeEntryRoomTrend.add(duration); + if (res.msg != "session is already bound to an uid") { + check(res.result, { 'contains an result field': (r) => r !== undefined }) + check(res.result, { 'result is ok': (r) => r === "ok" }) + } +} - res = await pitayaClient.request("connector.setsessiondata", { data: { "testKey": "testVal" } }) +async function setAndRetrieveSessionData(sessionData) { + let startTime = Date.now(); + var res = await pitayaClient.request("connector.setsessiondata", sessionData) + let duration = Date.now() - startTime; + requestTimeSessionDataTrend.add(duration); check(res.Msg, { 'res is success': (r) => r === "success" }) res = await pitayaClient.request("connector.getsessiondata") - check(res.Data, { 'res contains set data': (r) => r.testKey === "testVal" }) + check(res.Data, { 'res contains set data': (r) => r.testKey === sessionData.data.testKey }) +} - res = await pitayaClient.request("requestor.room.join") - res = await pitayaClient.consumePush("onMembers", 1000) - check(res.members, { 'res contains a member group': (m) => m !== undefined }) +async function joinRoom() { + let startTime = Date.now(); + var res = await pitayaClient.request("requestor.room.join") + let duration = Date.now() - startTime; + requestTimeJoinRoomTrend.add(duration); + if (res.msg === "onclose callbacks are not allowed on backend servers") { + res = await pitayaClient.consumePush("onMembers", 1000) + check(res.members, { 'res contains a member group': (m) => m !== undefined }) + } +} + +export default async () => { - sleep(2) + await connectToServer(); + + sleep(1); + await entryRoom(); + + sleep(1); + await setAndRetrieveSessionData({ data: { "testKey": "testVal" } }); - pitayaClient.disconnect() + await pitayaClient.disconnect() } export function teardown() { From 817eb4139bbb8c0b2982f5ce80dccfc52b8d3227 Mon Sep 17 00:00:00 2001 From: "junior.silva" Date: Thu, 21 Nov 2024 11:26:54 -0300 Subject: [PATCH 24/27] feat: Add flag to select TCP or QUIC as acceptor This change introduces a new `--acceptor` flag, allowing users to choose between TCP and QUIC protocols when running the server. Examples: - For TCP: `go run main.go --acceptor=tcp` - For QUIC: `go run main.go --acceptor=quic` --- examples/demo/cluster_grpc/main.go | 35 +++++++++++++++++----------- xk6-pitaya/examples/scenario2_TCP.js | 2 +- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index be01a601..08f4c372 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -82,6 +82,7 @@ func main() { svType := flag.String("type", "connector", "the server type") isFrontend := flag.Bool("frontend", true, "if server is frontend") rpcServerPort := flag.Int("rpcsvport", 3434, "the port that grpc server will listen") + acceptorType := flag.String("acceptor", "tcp", "the type of acceptor to use (tcp or quic)") flag.Parse() @@ -91,7 +92,7 @@ func main() { } var bs *modules.ETCDBindingStorage - app, bs = createApp(*port, *isFrontend, *svType, meta, *rpcServerPort) + app, bs = createApp(*port, *isFrontend, *svType, meta, *rpcServerPort, *acceptorType) defer app.Shutdown() @@ -104,7 +105,7 @@ func main() { app.Start() } -func createApp(port int, isFrontend bool, svType string, meta map[string]string, rpcServerPort int) (pitaya.Pitaya, *modules.ETCDBindingStorage) { +func createApp(port int, isFrontend bool, svType string, meta map[string]string, rpcServerPort int, acceptorType string) (pitaya.Pitaya, *modules.ETCDBindingStorage) { builder := pitaya.NewDefaultBuilder(isFrontend, svType, pitaya.Cluster, meta, *config.NewDefaultPitayaConfig()) grpcServerConfig := builder.Config.Cluster.RPC.Server.Grpc @@ -131,19 +132,25 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, builder.RPCClient = gc if isFrontend { - // Configurações de TLS e QUIC - tlsConf := &tls.Config{ - Certificates: []tls.Certificate{ - loadTLSCertificates(), - }, + switch acceptorType { + case "quic": + tlsConf := &tls.Config{ + Certificates: []tls.Certificate{ + loadTLSCertificates(), + }, + } + quicConf := &quic.Config{ + MaxIdleTimeout: 35 * time.Second, + EnableDatagrams: true, + } + quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) + builder.AddAcceptor(quicAcceptor) + case "tcp": + tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", port)) + builder.AddAcceptor(tcp) + default: + panic(fmt.Sprintf("Invalid acceptor type: %s. Use 'tcp' or 'quic'.", acceptorType)) } - quicConf := &quic.Config{ - MaxIdleTimeout: 35 * time.Second, - EnableDatagrams: true, - // Configurações específicas do QUIC podem ser colocadas aqui - } - quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) - builder.AddAcceptor(quicAcceptor) } return builder.Build(), bs diff --git a/xk6-pitaya/examples/scenario2_TCP.js b/xk6-pitaya/examples/scenario2_TCP.js index 346c299d..1f79efb7 100644 --- a/xk6-pitaya/examples/scenario2_TCP.js +++ b/xk6-pitaya/examples/scenario2_TCP.js @@ -19,7 +19,7 @@ const opts = { } }, requestTimeoutMs: 1000, - useTLS: true, + useTLS: false, } let requestTimeEntryRoomTrend = new Trend('request_time_entry_room'); From 7d6b91484f4410a5c55a3e025945f9fcb157d33d Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Thu, 21 Nov 2024 16:00:47 -0300 Subject: [PATCH 25/27] fix: fixing requests timeouts --- pkg/acceptor/quic_acceptor.go | 71 ++++++++++++++------------- xk6-pitaya/examples/scenario2_QUIC.js | 4 +- xk6-pitaya/examples/scenario2_TCP.js | 3 +- 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/pkg/acceptor/quic_acceptor.go b/pkg/acceptor/quic_acceptor.go index db91acb2..1d8f032a 100644 --- a/pkg/acceptor/quic_acceptor.go +++ b/pkg/acceptor/quic_acceptor.go @@ -25,9 +25,9 @@ import ( "crypto/tls" "errors" "fmt" + "io" "net" "time" - "io" "github.com/quic-go/quic-go" "github.com/topfreegames/pitaya/v3/pkg/conn/codec" @@ -149,10 +149,10 @@ func (a *QuicAcceptor) ListenAndServe() { // QuicConnWrapper is a wrapper for a QUIC connection, allowing the use of deadlines type QuicConnWrapper struct { - conn quic.Connection - stream quic.Stream + conn quic.Connection + stream quic.Stream writeTimeout time.Duration - readTimeout time.Duration + readTimeout time.Duration } // NewQuicConnWrapper creates a new wrapper for a QUIC connection @@ -187,15 +187,24 @@ func (q *QuicConnWrapper) Read(b []byte) (n int, err error) { // Write writes data to the connection with a defined deadline func (q *QuicConnWrapper) Write(b []byte) (int, error) { - ctx, cancel := context.WithTimeout(context.Background(), q.writeTimeout) - defer cancel() + if q.stream == nil { + ctx, cancel := context.WithTimeout(context.Background(), q.writeTimeout) + defer cancel() + stream, err := q.conn.OpenStreamSync(ctx) + if err != nil { + return 0, err + } + q.stream = stream + } - stream, err := q.conn.OpenStreamSync(ctx) - if err != nil { - return 0, err + n, err := q.stream.Write(b) + if err == io.EOF { + q.stream = nil + } else if err != nil { + return n, err } - return stream.Write(b) + return n, err } // Close closes the QUIC connection @@ -215,29 +224,25 @@ func (q *QuicConnWrapper) RemoteAddr() net.Addr { // GetNextMessage reads the next message available in the stream func (q *QuicConnWrapper) GetNextMessage() (b []byte, err error) { - stream, err := q.conn.AcceptStream(context.Background()) - if err != nil { - return nil, err - } - header, err := io.ReadAll(io.LimitReader(stream, codec.HeadLength)) - if err != nil { - return nil, err - } - if len(header) == 0 { - return nil, constants.ErrConnectionClosed - } - msgSize, _, err := codec.ParseHeader(header) - if err != nil { - return nil, err - } - msgData, err := io.ReadAll(io.LimitReader(stream, int64(msgSize))) - if err != nil { - return nil, err - } - if len(msgData) < msgSize { - return nil, constants.ErrReceivedMsgSmallerThanExpected - } - return append(header, msgData...), nil + header, err := io.ReadAll(io.LimitReader(q, codec.HeadLength)) + if err != nil { + return nil, err + } + if len(header) == 0 { + return nil, constants.ErrConnectionClosed + } + msgSize, _, err := codec.ParseHeader(header) + if err != nil { + return nil, err + } + msgData, err := io.ReadAll(io.LimitReader(q, int64(msgSize))) + if err != nil { + return nil, err + } + if len(msgData) < msgSize { + return nil, constants.ErrReceivedMsgSmallerThanExpected + } + return append(header, msgData...), nil } func (q *QuicConnWrapper) SetDeadline(t time.Time) error { diff --git a/xk6-pitaya/examples/scenario2_QUIC.js b/xk6-pitaya/examples/scenario2_QUIC.js index 8d755e3b..353223b2 100644 --- a/xk6-pitaya/examples/scenario2_QUIC.js +++ b/xk6-pitaya/examples/scenario2_QUIC.js @@ -28,7 +28,7 @@ let requestTimeJoinRoomTrend = new Trend('request_time_join_room'); export let options = { stages: [ - { target: 5, duration: '5s' }, + { target: 15, duration: '5s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -77,7 +77,6 @@ async function joinRoom() { } export default async () => { - await connectToServer(); sleep(1); @@ -86,6 +85,7 @@ export default async () => { sleep(1); await setAndRetrieveSessionData({ data: { "testKey": "testVal" } }); + sleep(1); await pitayaClient.disconnect() } diff --git a/xk6-pitaya/examples/scenario2_TCP.js b/xk6-pitaya/examples/scenario2_TCP.js index 1f79efb7..9f305ccf 100644 --- a/xk6-pitaya/examples/scenario2_TCP.js +++ b/xk6-pitaya/examples/scenario2_TCP.js @@ -28,7 +28,7 @@ let requestTimeJoinRoomTrend = new Trend('request_time_join_room'); export let options = { stages: [ - { target: 5, duration: '5s' }, + { target: 15, duration: '5s' }, ], thresholds: { pitaya_client_request_duration_ms: ['p(95)<200'], // 95% of requests should be below 200ms @@ -86,6 +86,7 @@ export default async () => { sleep(1); await setAndRetrieveSessionData({ data: { "testKey": "testVal" } }); + sleep(1); await pitayaClient.disconnect() } From 7b6b5f77e209221f92513592f42660c8095e8bbf Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Fri, 14 Feb 2025 09:09:36 -0300 Subject: [PATCH 26/27] feat: adding ALPN h3 to both client and server --- examples/demo/cluster_grpc/main.go | 3 ++- pkg/client/client.go | 1 + repl/helpers.go | 27 ++++++++++++++++----------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/examples/demo/cluster_grpc/main.go b/examples/demo/cluster_grpc/main.go index 08f4c372..b220fa67 100644 --- a/examples/demo/cluster_grpc/main.go +++ b/examples/demo/cluster_grpc/main.go @@ -138,9 +138,10 @@ func createApp(port int, isFrontend bool, svType string, meta map[string]string, Certificates: []tls.Certificate{ loadTLSCertificates(), }, + NextProtos: []string{"h3"}, } quicConf := &quic.Config{ - MaxIdleTimeout: 35 * time.Second, + MaxIdleTimeout: 35 * time.Second, EnableDatagrams: true, } quicAcceptor := acceptor.NewQuicAcceptor(fmt.Sprintf(":%d", port), tlsConf, quicConf) diff --git a/pkg/client/client.go b/pkg/client/client.go index bec4f8b9..624d4c4b 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -375,6 +375,7 @@ func (c *Client) ConnectToQUIC(addr string, quicConfig *quic.Config, tlsConfig . } else { tls := &tls.Config{ InsecureSkipVerify: true, + NextProtos: []string{"h3"}, } conn, err = quic.DialAddr(context.Background(), addr, tls, quicConfig) } diff --git a/repl/helpers.go b/repl/helpers.go index a3e1d782..dc0a35b1 100644 --- a/repl/helpers.go +++ b/repl/helpers.go @@ -26,9 +26,9 @@ import ( "fmt" "os" - "github.com/quic-go/quic-go" "github.com/abiosoft/ishell/v2" "github.com/mitchellh/go-homedir" + "github.com/quic-go/quic-go" "github.com/sirupsen/logrus" "github.com/topfreegames/pitaya/v3/pkg/client" ) @@ -51,17 +51,22 @@ func protoClient(log Log, addr string) error { } func tryConnect(addr string) error { - if err := pClient.ConnectToQUIC(addr, &quic.Config{ + if err := pClient.ConnectToQUIC(addr, &quic.Config{}, &tls.Config{ + InsecureSkipVerify: true, + NextProtos: []string{"h3"}, }); err != nil { - if err := pClient.ConnectToWS(addr, "", &tls.Config{ - InsecureSkipVerify: true, - }); err != nil { - if err := pClient.ConnectToWS(addr, ""); err != nil { - if err := pClient.ConnectTo(addr, &tls.Config{ - InsecureSkipVerify: true, - }); err != nil { - if err := pClient.ConnectTo(addr); err != nil { - return err + if err := pClient.ConnectToQUIC(addr, &quic.Config{}); err != nil { + fmt.Println(err) + if err := pClient.ConnectToWS(addr, "", &tls.Config{ + InsecureSkipVerify: true, + }); err != nil { + if err := pClient.ConnectToWS(addr, ""); err != nil { + if err := pClient.ConnectTo(addr, &tls.Config{ + InsecureSkipVerify: true, + }); err != nil { + if err := pClient.ConnectTo(addr); err != nil { + return err + } } } } From 552fcd1fbc9441a70e5e686325b01704cd2ac48e Mon Sep 17 00:00:00 2001 From: "Victor Emanuel Barbosa Rodrigues (EXT)" Date: Wed, 26 Feb 2025 14:49:16 -0300 Subject: [PATCH 27/27] feat: adding .der certificate file --- pkg/acceptor/fixtures/server.der | Bin 0 -> 888 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pkg/acceptor/fixtures/server.der diff --git a/pkg/acceptor/fixtures/server.der b/pkg/acceptor/fixtures/server.der new file mode 100644 index 0000000000000000000000000000000000000000..46120b11f6d87fc3d7bef599de928733ce3a262b GIT binary patch literal 888 zcmXqLVlFXgVv1qnWVkP^_Sb-=cb@?-8>d#AN85K^Mn-N{27?+yZUas>=1>+kVJ4>_ z7>9$0DL4SeVFz>gfjWW8xOmtCGD{LG6Ac9n_&@^OJnT-1$=RuSDTYD@0w57)9?qQn zVNAP><}5pEmv@{$(`uvK`~44D z*$V_zit?6oXU}n+EmUgo-+1=MtSgIE)~(xgL&Ut~w6S53i{Ac8U$*_d!_k;N&#s7h zPFNIUPS&HFF83O@Wiu^R>r#iopDo3lu;^ArC_7r&T}7r%-!|j z!>8baJzM`tt)J}Lz;>naquC6*eL5*`Jg;nd`6)EZoV9L=eo)MOh?F+ zp!u)YyKg=gm*T3{!m9x*N9%3_DxDNHUH*W59`KL6I3ijW%^!xGHkeT%-WuD;yKAT%F@;f zflEB|Edp4cNgFCXfBwNja3b5nIt9PJRY7v=zE^9{V!W>tC>F#oFTBup>B5M*vXC{a HE_(m~TEstU literal 0 HcmV?d00001