Skip to content

Commit b216881

Browse files
OdonnoMarfusios
andauthored
Add ability to reuse an external RecyclableMemoryStreamManager (#147)
Co-authored-by: Mariusz Kotas <m@mkotas.cz>
1 parent 1bc98f0 commit b216881

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

src/Websocket.Client/WebsocketClient.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)