@@ -22,8 +22,12 @@ public partial class WebsocketClient : IWebsocketClient
2222 private readonly ILogger < WebsocketClient > _logger ;
2323 private readonly WebsocketAsyncLock _locker = new WebsocketAsyncLock ( ) ;
2424 private readonly Func < Uri , CancellationToken , Task < WebSocket > > _connectionFactory ;
25- private static readonly RecyclableMemoryStreamManager _memoryStreamManager = new RecyclableMemoryStreamManager ( ) ;
25+ private readonly RecyclableMemoryStreamManager ? _memoryStreamManager ;
26+ private static readonly Lazy < RecyclableMemoryStreamManager > _globalMemoryStreamManager = new Lazy < RecyclableMemoryStreamManager > ( new RecyclableMemoryStreamManager ( ) ) ;
2627
28+ private RecyclableMemoryStreamManager MemoryStreamManager =>
29+ _memoryStreamManager ?? _globalMemoryStreamManager . Value ;
30+
2731 private Uri _url ;
2832 private Timer ? _lastChanceTimer ;
2933 private DateTime _lastReceivedMsg = DateTime . UtcNow ;
@@ -47,8 +51,9 @@ public partial class WebsocketClient : IWebsocketClient
4751 /// </summary>
4852 /// <param name="url">Target websocket url (wss://)</param>
4953 /// <param name="clientFactory">Optional factory for native ClientWebSocket, use it whenever you need some custom features (proxy, settings, etc)</param>
50- public WebsocketClient ( Uri url , Func < ClientWebSocket > ? clientFactory = null )
51- : this ( url , null , GetClientFactory ( clientFactory ) )
54+ /// <param name="memoryStreamManager">Optional memory stream manager that can be reused on multiple occasions</param>
55+ public WebsocketClient ( Uri url , Func < ClientWebSocket > ? clientFactory = null , RecyclableMemoryStreamManager ? memoryStreamManager = null )
56+ : this ( url , null , GetClientFactory ( clientFactory ) , memoryStreamManager )
5257 {
5358 }
5459
@@ -58,8 +63,9 @@ public WebsocketClient(Uri url, Func<ClientWebSocket>? clientFactory = null)
5863 /// <param name="url">Target websocket url (wss://)</param>
5964 /// <param name="logger">Logger instance, can be null</param>
6065 /// <param name="clientFactory">Optional factory for native ClientWebSocket, use it whenever you need some custom features (proxy, settings, etc)</param>
61- public WebsocketClient ( Uri url , ILogger < WebsocketClient > ? logger , Func < ClientWebSocket > ? clientFactory = null )
62- : this ( url , logger , GetClientFactory ( clientFactory ) )
66+ /// <param name="memoryStreamManager">Optional memory stream manager that can be reused on multiple occasions</param>
67+ public WebsocketClient ( Uri url , ILogger < WebsocketClient > ? logger , Func < ClientWebSocket > ? clientFactory = null , RecyclableMemoryStreamManager ? memoryStreamManager = null )
68+ : this ( url , logger , GetClientFactory ( clientFactory ) , memoryStreamManager )
6369 {
6470 }
6571
@@ -69,7 +75,8 @@ public WebsocketClient(Uri url, ILogger<WebsocketClient>? logger, Func<ClientWeb
6975 /// <param name="url">Target websocket url (wss://)</param>
7076 /// <param name="logger">Logger instance, can be null</param>
7177 /// <param name="connectionFactory">Optional factory for native creating and connecting to a websocket. The method should return a <see cref="WebSocket"/> which is connected. Use it whenever you need some custom features (proxy, settings, etc)</param>
72- public WebsocketClient ( Uri url , ILogger < WebsocketClient > ? logger , Func < Uri , CancellationToken , Task < WebSocket > > ? connectionFactory )
78+ /// <param name="memoryStreamManager">Optional memory stream manager that can be reused on multiple occasions</param>
79+ public WebsocketClient ( Uri url , ILogger < WebsocketClient > ? logger , Func < Uri , CancellationToken , Task < WebSocket > > ? connectionFactory , RecyclableMemoryStreamManager ? memoryStreamManager = null )
7380 {
7481 Validations . Validations . ValidateInput ( url , nameof ( url ) ) ;
7582
@@ -85,6 +92,7 @@ public WebsocketClient(Uri url, ILogger<WebsocketClient>? logger, Func<Uri, Canc
8592 await client . ConnectAsync ( uri , token ) . ConfigureAwait ( false ) ;
8693 return client ;
8794 } ) ;
95+ _memoryStreamManager = memoryStreamManager ;
8896 }
8997
9098 /// <inheritdoc />
@@ -458,7 +466,7 @@ private async Task Listen(WebSocket client, CancellationToken token)
458466 do
459467 {
460468 ValueWebSocketReceiveResult result ;
461- var ms = _memoryStreamManager . GetStream ( ) ;
469+ var ms = MemoryStreamManager . GetStream ( ) ;
462470
463471 while ( true )
464472 {
0 commit comments