@@ -78,51 +78,86 @@ private async Task<byte[]> PrepareFramesBytesAsync(byte[] body, IDictionary<stri
7878 return body ;
7979 }
8080
81- private Task SendAsync ( WebSocketTransport transport , WebSocketMessageDescriptor descriptor )
81+ private async Task SendMessageAsync ( WebSocket webSocket , byte [ ] bytes , WebSocketMessageType messageType )
8282 {
83- if ( descriptor == null )
83+ if ( bytes == null )
8484 {
85- throw new ArgumentNullException ( nameof ( descriptor ) ) ;
85+ return ;
8686 }
8787
88- if ( descriptor . Segments == null )
88+ var length = bytes . Length ;
89+ if ( length < ChunkSize )
8990 {
90- throw new ArgumentNullException ( nameof ( descriptor . Segments ) ) ;
91+ var segments = new ArraySegment < byte > ( bytes , 0 , length ) ;
92+ if ( ! webSocket . CloseStatus . HasValue )
93+ {
94+ await webSocket . SendAsync ( segments ,
95+ messageType ,
96+ true ,
97+ CancellationToken . None ) ;
98+ }
99+
100+ return ;
91101 }
92102
93- if ( ! transport . WebSocket . CloseStatus . HasValue )
103+ using ( var ms = new MemoryStream ( bytes ) )
94104 {
95- return transport . WebSocket . SendAsync ( descriptor . Segments ,
96- descriptor . MessageType ,
97- descriptor . EndOfMessage ,
98- descriptor . CancellationToken ) ;
99- }
105+ using ( var br = new BinaryReader ( ms ) )
106+ {
107+ byte [ ] chunkedBytes = null ;
108+ do
109+ {
110+ chunkedBytes = br . ReadBytes ( ChunkSize ) ;
111+ var endOfMessage = false ;
100112
101- return Task . CompletedTask ;
113+ if ( chunkedBytes . Length < ChunkSize )
114+ endOfMessage = true ;
115+
116+ var segments = new ArraySegment < byte > ( chunkedBytes ) ;
117+
118+ if ( ! webSocket . CloseStatus . HasValue )
119+ {
120+ await webSocket . SendAsync ( segments ,
121+ messageType ,
122+ endOfMessage ,
123+ CancellationToken . None ) ;
124+ }
125+
126+ if ( endOfMessage )
127+ break ;
128+
129+ } while ( chunkedBytes . Length <= ChunkSize ) ;
130+ }
131+ }
102132 }
103133
104- private Task SendBinaryAsync ( WebSocketTransport transport , byte [ ] chunkedBytes , bool endOfMessage )
134+ private async Task BroadcastMessageAsync ( byte [ ] bytes , WebSocketMessageType messageType )
105135 {
106- if ( transport == null )
136+ if ( bytes == null )
107137 {
108- throw new ArgumentNullException ( nameof ( transport ) ) ;
138+ return ;
109139 }
110140
111- var segments = new ArraySegment < byte > ( chunkedBytes ) ;
112-
113- if ( ! transport . WebSocket . CloseStatus . HasValue )
141+ var length = bytes . Length ;
142+ if ( length < ChunkSize )
114143 {
115- return transport . WebSocket . SendAsync ( segments ,
116- WebSocketMessageType . Binary ,
117- endOfMessage ,
118- CancellationToken . None ) ;
119- }
144+ var segments = new ArraySegment < byte > ( bytes , 0 , length ) ;
120145
121- return Task . CompletedTask ;
122- }
146+ foreach ( var connection in Connections )
147+ {
148+ var webSocket = connection . Value . WebSocket ;
149+ if ( ! webSocket . CloseStatus . HasValue )
150+ {
151+ await webSocket . SendAsync ( segments ,
152+ messageType ,
153+ true ,
154+ CancellationToken . None ) ;
155+ }
156+ }
157+
158+ return ;
159+ }
123160
124- private async Task SendConcurrentBinaryAsync ( byte [ ] bytes )
125- {
126161 using ( var ms = new MemoryStream ( bytes ) )
127162 {
128163 using ( var br = new BinaryReader ( ms ) )
@@ -136,9 +171,19 @@ private async Task SendConcurrentBinaryAsync(byte[] bytes)
136171 if ( chunkedBytes . Length < ChunkSize )
137172 endOfMessage = true ;
138173
174+ var segments = new ArraySegment < byte > ( chunkedBytes ) ;
175+
139176 foreach ( var connection in Connections )
140177 {
141- await SendBinaryAsync ( connection . Value , chunkedBytes , endOfMessage ) ;
178+ var webSocket = connection . Value . WebSocket ;
179+
180+ if ( ! webSocket . CloseStatus . HasValue )
181+ {
182+ await webSocket . SendAsync ( segments ,
183+ messageType ,
184+ endOfMessage ,
185+ CancellationToken . None ) ;
186+ }
142187 }
143188
144189 if ( endOfMessage )
@@ -198,18 +243,7 @@ public async Task BroadcastAsync(WebSocketMessageContext context)
198243 return ;
199244 }
200245
201- var segments = context . ToSegment ( ) ;
202- var descriptor = new WebSocketMessageDescriptor
203- {
204- Segments = segments ,
205- EndOfMessage = true ,
206- MessageType = WebSocketMessageType . Text
207- } ;
208-
209- foreach ( var connection in Connections )
210- {
211- await SendAsync ( connection . Value , descriptor ) ;
212- }
246+ await BroadcastMessageAsync ( context . ToBytes ( ) , WebSocketMessageType . Text ) ;
213247 }
214248
215249 public async Task BroadcastBinaryAsync ( byte [ ] inputs , IDictionary < string , object > properties )
@@ -220,7 +254,7 @@ public async Task BroadcastBinaryAsync(byte[] inputs, IDictionary<string, object
220254 }
221255
222256 var bytes = await PrepareFramesBytesAsync ( inputs , properties ) ;
223- await SendConcurrentBinaryAsync ( bytes ) ;
257+ await BroadcastMessageAsync ( bytes , WebSocketMessageType . Binary ) ;
224258 }
225259
226260 public Task SendAsync ( string connectionId , WebSocketMessageContext context )
@@ -236,15 +270,7 @@ public Task SendAsync(string connectionId, WebSocketMessageContext context)
236270 }
237271
238272 _headerProvider . Invoke ( context . Header ) ;
239- var segments = context . ToSegment ( ) ;
240- var descriptor = new WebSocketMessageDescriptor
241- {
242- Segments = segments ,
243- EndOfMessage = true ,
244- MessageType = WebSocketMessageType . Text
245- } ;
246-
247- return SendAsync ( transport , descriptor ) ;
273+ return SendMessageAsync ( transport . WebSocket , context . ToBytes ( ) , WebSocketMessageType . Text ) ;
248274 }
249275
250276 public async Task SendBinaryAsync ( string connectionId , byte [ ] input , IDictionary < string , object > properties )
@@ -261,31 +287,7 @@ public async Task SendBinaryAsync(string connectionId, byte[] input, IDictionary
261287
262288 byte [ ] bytes = await PrepareFramesBytesAsync ( input , properties ) ;
263289
264- using ( var ms = new MemoryStream ( bytes ) )
265- {
266- using ( BinaryReader br = new BinaryReader ( ms ) )
267- {
268- byte [ ] chunkBytes = null ;
269- do
270- {
271- chunkBytes = br . ReadBytes ( ChunkSize ) ;
272- var segments = new ArraySegment < byte > ( chunkBytes ) ;
273- var endOfMessage = false ;
274-
275- if ( chunkBytes . Length < ChunkSize )
276- endOfMessage = true ;
277-
278- await transport . WebSocket . SendAsync ( segments ,
279- WebSocketMessageType . Binary ,
280- endOfMessage ,
281- CancellationToken . None ) ;
282-
283- if ( endOfMessage )
284- break ;
285-
286- } while ( chunkBytes . Length <= ChunkSize ) ;
287- }
288- }
290+ await SendMessageAsync ( transport . WebSocket , bytes , WebSocketMessageType . Binary ) ;
289291 }
290292
291293 public void CloseConnection ( string connectionId , bool keepAlive )
0 commit comments