/// <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 ); }
/// <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); } } }
/// <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); }