public WebSocketConnection(WebSocket socket, IWebSocketCompressionProvider socketCompressionProvider, ITextWebSocketSubProtocol textSubProtocol, int receivePayloadBufferSize) { _webSocket = socket ?? throw new ArgumentNullException(nameof(socket)); _webSocketCompressionProvider = socketCompressionProvider ?? throw new ArgumentNullException(nameof(socketCompressionProvider)); _textSubProtocol = textSubProtocol ?? throw new ArgumentNullException(nameof(textSubProtocol)); _receivePayloadBufferSize = receivePayloadBufferSize; }
public async Task Invoke(HttpContext context) { if (context.WebSockets.IsWebSocketRequest) { if (ValidateOrigin(context)) { ITextWebSocketSubprotocol textSubProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols); IWebSocketCompressionProvider webSocketCompressionProvider = _compressionService.NegotiateCompression(context); WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(textSubProtocol?.SubProtocol); WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, webSocketCompressionProvider, textSubProtocol ?? _options.DefaultSubProtocol, _options.ReceivePayloadBufferSize); webSocketConnection.ReceiveText += async(sender, message) => { await webSocketConnection.SendAsync(message, CancellationToken.None); }; _connectionsService.AddConnection(webSocketConnection); await webSocketConnection.ReceiveMessagesUntilCloseAsync(); if (webSocketConnection.CloseStatus.HasValue) { await webSocket.CloseAsync(webSocketConnection.CloseStatus.Value, webSocketConnection.CloseStatusDescription, CancellationToken.None); } _connectionsService.RemoveConnection(webSocketConnection.Id); } else { context.Response.StatusCode = StatusCodes.Status403Forbidden; } } else { context.Response.StatusCode = StatusCodes.Status400BadRequest; } }
public virtual Task SendAsync(string message, WebSocket webSocket, IWebSocketCompressionProvider webSocketCompressionProvider, CancellationToken cancellationToken) { return(webSocketCompressionProvider.CompressTextMessageAsync(webSocket, message, cancellationToken)); }
public override Task SendAsync(string message, WebSocket socket, IWebSocketCompressionProvider socketCompressionProvider, CancellationToken cancellationToken) { var jsonMessage = JsonConvert.SerializeObject(new { message, timestamp = DateTime.UtcNow }); return(base.SendAsync(jsonMessage, socket, socketCompressionProvider, cancellationToken)); }