private Task SendAsync(WebSocketTransport transport, WebSocketMessageDescriptor descriptor) { if (descriptor == null) { throw new ArgumentNullException(nameof(descriptor)); } if (descriptor.Segments == null) { throw new ArgumentNullException(nameof(descriptor.Segments)); } if (!transport.WebSocket.CloseStatus.HasValue) { return(transport.WebSocket.SendAsync(descriptor.Segments, descriptor.MessageType, descriptor.EndOfMessage, CancellationToken.None)); } else { // Only text messages _lifetimeManager.AddQueue(transport.ConnectionId, new MessageHolder { Segments = descriptor.Segments, KeepTime = DateTime.Now.AddMinutes(3) }); return(TaskCache.CompletedTask); } }
public async Task BroadcastAsync(WebSocketMessageContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (context.Value == null) { throw new ArgumentNullException(nameof(context.Value)); } if (!Connections.Any()) { return; } var segments = context.ToSegment(); var descriptor = new WebSocketMessageDescriptor { Segments = segments, EndOfMessage = true, MessageType = WebSocketMessageType.Text }; _sendFrameAsyncLock.Wait(); foreach (var connection in Connections) { await SendAsync(connection.Value, descriptor); } _sendFrameAsyncLock.Release(); }
public Task SendAsync(string connectionId, WebSocketMessageContext context) { if (!Connections.Any()) { return(TaskCache.CompletedTask); } WebSocketTransport transport = null; if (!Connections.TryGetValue(connectionId, out transport)) { throw new ArgumentOutOfRangeException(nameof(transport)); } var segments = context.ToSegment(); var descriptor = new WebSocketMessageDescriptor { Segments = segments, EndOfMessage = true, MessageType = WebSocketMessageType.Text }; return(SendAsync(transport, descriptor)); }