public async Task RunAsync(DeviceSessionIdentifier deviceSessionIdentifier, WebSocket webSocket, CancellationToken cancellationToken)
        {
            if (webSocket == null)
            {
                throw new ArgumentNullException(nameof(webSocket));
            }

            var channel = new ConnectorChannel(webSocket, _logger);

            try
            {
                var deviceSession = new DeviceSession(deviceSessionIdentifier, channel, _logger);
                _sessions[deviceSessionIdentifier.ToString()] = deviceSession;

                await deviceSession.RunAsync(cancellationToken).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Error while connecting device.");
            }
            finally
            {
                _sessions.TryRemove(deviceSessionIdentifier.ToString(), out _);
            }
        }
        public void ResetChannelStatistics(DeviceSessionIdentifier deviceSessionIdentifier)
        {
            if (!_sessions.TryGetValue(deviceSessionIdentifier.ToString(), out var deviceSession))
            {
                return;
            }

            deviceSession.ResetStatistics();
        }
        public ConnectorChannelStatistics GetChannelStatistics(DeviceSessionIdentifier deviceSessionIdentifier)
        {
            if (!_sessions.TryGetValue(deviceSessionIdentifier.ToString(), out var deviceSession))
            {
                return(null);
            }

            return(deviceSession.GetStatistics());
        }
Esempio n. 4
0
        public async Task <CloudMessage> Invoke(DeviceSessionIdentifier deviceSessionIdentifier, CloudMessage requestMessage, CancellationToken cancellationToken)
        {
            if (deviceSessionIdentifier == null)
            {
                throw new ArgumentNullException(nameof(deviceSessionIdentifier));
            }
            if (requestMessage == null)
            {
                throw new ArgumentNullException(nameof(requestMessage));
            }

            DeviceSession deviceSession;

            lock (_deviceSessions)
            {
                if (!_deviceSessions.TryGetValue(deviceSessionIdentifier.ToString(), out deviceSession))
                {
                    throw new DeviceSessionNotFoundException(deviceSessionIdentifier);
                }
            }

            requestMessage.CorrelationId = Guid.NewGuid().ToString();

            var resultAwaiter = new TaskCompletionSource <CloudMessage>();

            try
            {
                deviceSession.AddAwaiter(requestMessage.CorrelationId, resultAwaiter);

                using (cancellationToken.Register(() =>
                {
                    resultAwaiter.TrySetCanceled();
                }))
                {
                    await deviceSession.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

                    return(await resultAwaiter.Task.ConfigureAwait(false));
                }
            }
            finally
            {
                deviceSession.RemoveAwaiter(requestMessage.CorrelationId);
            }
        }
Esempio n. 5
0
 public DeviceSession(DeviceSessionIdentifier identifier, ConnectorChannel channel, ILogger logger)
 {
     _identifier = identifier ?? throw new ArgumentNullException(nameof(identifier));
     _channel    = channel ?? throw new ArgumentNullException(nameof(channel));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
 public DeviceSessionNotFoundException(DeviceSessionIdentifier identifier)
     : base($"Device session '{identifier}' not found.")
 {
 }