public IClientConnection AcceptConnection( ITransportConnection connection, ClientConnectionDescriptor info) { var clientConnection = new ClientConnection(connection, info); lock (_connections) { if (_connections.ContainsKey(clientConnection.Id)) { throw new BrokerException($"Connection id already exists: {clientConnection.Id}"); } _connections[clientConnection.Id] = clientConnection; var appInstanceId = clientConnection.Info.ApplicationInstanceId; if (!_appInstanceConnections.TryGetValue(appInstanceId, out var connectionList)) { connectionList = new List <IClientConnection>(); _appInstanceConnections[appInstanceId] = connectionList; } connectionList.Add(clientConnection); clientConnection.Completion .ContinueWithSynchronously((Action <Task, object>)OnClientConnectionCompleted, clientConnection) .IgnoreAwait(Log); if (_connectionWaiters.TryGetValue(appInstanceId, out var waiter)) { waiter.TryComplete(clientConnection); } _connectionWaiters.Remove(info.ApplicationInstanceId); } return(clientConnection); }
public ClientConnection(ITransportConnection connection, ClientConnectionDescriptor clientInfo) { Id = connection.Id; _log = LogManager.GetLogger <ClientConnection>(Id.ToString()); Info = clientInfo; _connection = connection; var listen = new ProducingChannel <ITransportChannel>(1, ListenAsync); IncomingChannels = listen; Completion = TaskRunner.RunInBackground(ProcessAsync); }
public async Task <IClientConnection> HandleAsync(ITransportConnection connection) { Log.Trace("Accepting new connection {0}", connection.Id); var channel = await connection.IncomingChannels.ReadAsync().ConfigureAwait(false); var frame = await channel.In.ReadAsync().ConfigureAwait(false); using (var payload = frame.Payload) using (var connectRequest = _serializer.DeserializeConnectRequest(payload)) { if (!_registryService.IsApplicationDefined(connectRequest.ApplicationId)) { throw new BrokerException($"Connection rejected because application id is unknown to broker: {connectRequest.ApplicationId}"); } using (var connectResponse = _messageFactory.CreateConnectResponse(connection.Id)) { var serializedResponse = _serializer.Serialize(connectResponse); try { Log.Trace("Sending connect response ({0} bytes): {1}", connectResponse, serializedResponse.Count); await channel.Out.WriteAsync(new TransportMessageFrame(serializedResponse)).ConfigureAwait(false); } catch { serializedResponse.Dispose(); throw; } channel.Out.TryComplete(); await channel.Completion.ConfigureAwait(false); var info = new ClientConnectionDescriptor( connectResponse.ConnectionId, connectRequest.ApplicationId, connectRequest.ApplicationInstanceId); var clientConnection = _connectionTracker.AcceptConnection(connection, info); Log.Info("New connection accepted: {0}", clientConnection); return(clientConnection); } } }