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()); }
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); } }
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.") { }