diff --git a/federation.go b/federation.go index 9b609c8..d1ac58b 100644 --- a/federation.go +++ b/federation.go @@ -46,6 +46,8 @@ const ( var ( ErrFederationNotSupported = NewError("federation_unsupported", "The target server does not support federation.") + + federationWriteBufferPool = &sync.Pool{} ) func isClosedError(err error) bool { @@ -102,7 +104,9 @@ func NewFederationClient(ctx context.Context, hub *Hub, session *ClientSession, return nil, fmt.Errorf("expected federation room message, got %+v", message) } - var dialer websocket.Dialer + dialer := &websocket.Dialer{ + WriteBufferPool: federationWriteBufferPool, + } if hub.skipFederationVerify { dialer.TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, @@ -130,7 +134,7 @@ func NewFederationClient(ctx context.Context, hub *Hub, session *ClientSession, reconnectDelay: initialFederationReconnectInterval, - dialer: &dialer, + dialer: dialer, url: url, closer: NewCloser(), } diff --git a/hub.go b/hub.go index e7143c6..4b00a38 100644 --- a/hub.go +++ b/hub.go @@ -105,6 +105,8 @@ var ( websocketReadBufferSize = 4096 websocketWriteBufferSize = 4096 + websocketWriteBufferPool = &sync.Pool{} + // Delay after which a screen publisher should be cleaned up. cleanupScreenPublisherDelay = time.Second @@ -322,6 +324,7 @@ func NewHub(config *goconf.ConfigFile, events AsyncEvents, rpcServer *GrpcServer upgrader: websocket.Upgrader{ ReadBufferSize: websocketReadBufferSize, WriteBufferSize: websocketWriteBufferSize, + WriteBufferPool: websocketWriteBufferPool, }, cookie: NewSessionIdCodec([]byte(hashKey), blockBytes), info: NewWelcomeServerMessage(version, DefaultFeatures...), diff --git a/hub_test.go b/hub_test.go index 4213655..b364623 100644 --- a/hub_test.go +++ b/hub_test.go @@ -767,7 +767,7 @@ func TestWebsocketFeatures(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), testTimeout) defer cancel() - conn, response, err := websocket.DefaultDialer.DialContext(ctx, getWebsocketUrl(server.URL), nil) + conn, response, err := testClientDialer.DialContext(ctx, getWebsocketUrl(server.URL), nil) require.NoError(err) defer conn.Close() // nolint diff --git a/janus_client.go b/janus_client.go index 5716bef..33a7ec2 100644 --- a/janus_client.go +++ b/janus_client.go @@ -119,8 +119,9 @@ const ( var ( janusDialer = websocket.Dialer{ - Subprotocols: []string{"janus-protocol"}, - Proxy: http.ProxyFromEnvironment, + Subprotocols: []string{"janus-protocol"}, + Proxy: http.ProxyFromEnvironment, + WriteBufferPool: &sync.Pool{}, } ) diff --git a/testclient_test.go b/testclient_test.go index 9078bcc..836fb6a 100644 --- a/testclient_test.go +++ b/testclient_test.go @@ -49,6 +49,10 @@ var ( testInternalSecret = []byte("internal-secret") ErrNoMessageReceived = fmt.Errorf("no message was received by the server") + + testClientDialer = websocket.Dialer{ + WriteBufferPool: &sync.Pool{}, + } ) type TestBackendClientAuthParams struct { @@ -226,7 +230,7 @@ type TestClient struct { func NewTestClientContext(ctx context.Context, t *testing.T, server *httptest.Server, hub *Hub) *TestClient { // Reference "hub" to prevent compiler error. - conn, _, err := websocket.DefaultDialer.DialContext(ctx, getWebsocketUrl(server.URL), nil) + conn, _, err := testClientDialer.DialContext(ctx, getWebsocketUrl(server.URL), nil) require.NoError(t, err) messageChan := make(chan []byte)