Пример #1
0
        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);
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
        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));
        }