/// <summary>
        /// Handle websocket connection
        /// </summary>
        /// <param name="socket">socket</param>
        /// <param name="cancellationToken">Cancellation token</param>
        public async Task HandleAsync(IdentifiableWebSocket socket, CancellationToken cancellationToken)
        {
            _webSocketConnectionManager.AddSocket(socket);

            await Receive(socket,
                          async (result, buffer) =>
            {
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    await OnMessageReceive(socket, result, buffer, cancellationToken);
                    return;
                }
                else if (result.MessageType == WebSocketMessageType.Close)
                {
                    await OnDisconnected(socket, cancellationToken);
                    return;
                }
            },
                          async (socket) =>
            {
                await OnDisconnected(socket, cancellationToken);
            },
                          cancellationToken
                          );
        }
Beispiel #2
0
        /// <summary>
        /// Invoke in asp.net core pipeline
        /// </summary>
        /// <param name="context">Http context</param>
        /// <param name="webSocketHandler">Websocket handler</param>
        /// <param name="idGenerator">Unique Id generator</param>
        public async Task Invoke(HttpContext context, IWebSocketHandler webSocketHandler, IUniqueIdentifierGenerator idGenerator)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                return;
            }

            var socket = new IdentifiableWebSocket(idGenerator, await context.WebSockets.AcceptWebSocketAsync());

            await webSocketHandler.HandleAsync(socket, _cancellationToken);
        }
        private async Task OnMessageReceive(IdentifiableWebSocket socket, WebSocketReceiveResult result, byte[] buffer, CancellationToken cancellationToken)
        {
            var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
            var request = JsonSerializer.Deserialize <ClientRequest>(message);

            if (request.Action == RequestedClientActionEnum.Show)
            {
                await socket.SendMessageAsync(JsonSerializer.Serialize(_provider.GetProcesses()), cancellationToken);
            }
            else if (request.Action == RequestedClientActionEnum.Subscribe)
            {
                socket.Subscribed = true;
            }
            else if (request.Action == RequestedClientActionEnum.Unsubscribe)
            {
                socket.Subscribed = false;
            }
        }
        private async Task Receive(IdentifiableWebSocket socket,
                                   Action <WebSocketReceiveResult, byte[]> handleMessageCallback, Action <IdentifiableWebSocket> exceptionCallback, CancellationToken cancellationToken)
        {
            var buffer = new byte[1024 * 4];

            while (socket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var result = await socket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);

                    handleMessageCallback?.Invoke(result, buffer);
                }
                catch (Exception)
                {
                    exceptionCallback(socket);
                }
            }
        }
Beispiel #5
0
 /// <summary>
 /// Add socket to list
 /// </summary>
 /// <param name="socket">socket to add</param>
 public void AddSocket(IdentifiableWebSocket socket)
 {
     _sockets.TryAdd(socket.Id, socket);
 }
 private async Task OnDisconnected(IdentifiableWebSocket socket, CancellationToken cancellationToken)
 {
     await _webSocketConnectionManager.RemoveSocket(socket.Id, cancellationToken);
 }