@@ -16,9 +16,10 @@ public class WebSocketTransport(Uri _uri) : ITransport, IDisposable
1616 private readonly ClientWebSocket _webSocket = new ( ) ;
1717 private readonly ArraySegment < byte > _receiveBuffer = new ( new byte [ 1024 * 8 ] ) ;
1818
19+ private readonly SemaphoreSlim _socketSendSemaphoreSlim = new ( 1 , 1 ) ;
20+
1921 public async Task ConnectAsync ( CancellationToken cancellationToken )
2022 {
21- _webSocket . Options . SetBuffer ( _receiveBuffer . Count , _receiveBuffer . Count , _receiveBuffer ) ;
2223 await _webSocket . ConnectAsync ( _uri , cancellationToken ) . ConfigureAwait ( false ) ;
2324 }
2425
@@ -32,8 +33,9 @@ public async Task<T> ReceiveAsJsonAsync<T>(JsonSerializerOptions jsonSerializerO
3233 {
3334 result = await _webSocket . ReceiveAsync ( _receiveBuffer , cancellationToken ) . ConfigureAwait ( false ) ;
3435
35- await ms . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count ) . ConfigureAwait ( false ) ;
36- } while ( ! result . EndOfMessage ) ;
36+ await ms . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count , cancellationToken ) . ConfigureAwait ( false ) ;
37+ }
38+ while ( ! result . EndOfMessage ) ;
3739
3840 ms . Seek ( 0 , SeekOrigin . Begin ) ;
3941
@@ -51,12 +53,21 @@ public async Task SendAsJsonAsync(Command command, JsonSerializerOptions jsonSer
5153 {
5254 var buffer = JsonSerializer . SerializeToUtf8Bytes ( command , typeof ( Command ) , jsonSerializerOptions ) ;
5355
54- if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
56+ await _socketSendSemaphoreSlim . WaitAsync ( cancellationToken ) ;
57+
58+ try
5559 {
56- _logger . Trace ( $ "BiDi SND >> { buffer . Length } > { Encoding . UTF8 . GetString ( buffer ) } ") ;
57- }
60+ if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
61+ {
62+ _logger . Trace ( $ "BiDi SND >> { buffer . Length } > { Encoding . UTF8 . GetString ( buffer ) } ") ;
63+ }
5864
59- await _webSocket . SendAsync ( new ArraySegment < byte > ( buffer ) , WebSocketMessageType . Text , true , cancellationToken ) . ConfigureAwait ( false ) ;
65+ await _webSocket . SendAsync ( new ArraySegment < byte > ( buffer ) , WebSocketMessageType . Text , true , cancellationToken ) . ConfigureAwait ( false ) ;
66+ }
67+ finally
68+ {
69+ _socketSendSemaphoreSlim . Release ( ) ;
70+ }
6071 }
6172
6273 public void Dispose ( )
0 commit comments