public async Task HandleConnection(HttpContext context, WebSocket webSocket) { _webSocket = webSocket; //TODO: add keepalive and timeouts _manager = (CbusManager)context.RequestServices.GetService(typeof(CbusManager)); if (_manager.ConnectionState == CbusConnectionState.Connected) { var msgs = _manager.Messenger; if (msgs != null) { msgs.MessageReceived += CbusMessageReceived; msgs.MessageSent += CbusMessageSent; } } _manager.ConnectionStateChanged += ConnectionStateChanged; await SendCbusConnectionStatus(); var buffer = new byte[1024 * 4]; var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } _manager.ConnectionStateChanged -= ConnectionStateChanged; if (_manager.ConnectionState == CbusConnectionState.Connected) { _manager.Messenger.MessageReceived -= CbusMessageReceived; _manager.Messenger.MessageSent -= CbusMessageSent; } await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
public ManagerController(CbusManager manager, IConfiguration configuration) { _manager = manager; _configuration = configuration; }