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);
        }
Exemple #2
0
 public ManagerController(CbusManager manager, IConfiguration configuration)
 {
     _manager       = manager;
     _configuration = configuration;
 }