private void UpdateStateOnMessage(TestHarnessConnection THConnection, TestHarnessConnectionState nextState, Func <ServiceMessageProcessingEvent, bool> predicate)
 {
     _eventAggregator.GetEventByType <ServiceMessageProcessingEvent>()
     .Where(predicate)
     .Take(1)
     .Subscribe(_ => { THConnection.State = nextState; });
 }
        public async Task <IActionResult> ReceiveInvitationAsync(OperationBody body)
        {
            var invitation = body.Data.ToObject <ConnectionInvitationMessage>();
            var context    = await _agentContextProvider.GetContextAsync();

            var(request, record) = await _connectionService.CreateRequestAsync(context, invitation);

            var THConnection = new TestHarnessConnection
            {
                ConnectionId = record.Id,
                State        = TestHarnessConnectionState.Invited,
                Request      = request
            };

            _connectionCache.Set(record.Id, THConnection);

            return(Ok(THConnection));
        }
        public async Task <IActionResult> CreateInvitationAsync()
        {
            var context = await _agentContextProvider.GetContextAsync();

            var(invitation, connection) = await _connectionService.CreateInvitationAsync(context);

            var testHarnessConnection = new TestHarnessConnection
            {
                ConnectionId = connection.Id,
                State        = TestHarnessConnectionState.Invited
            };

            _connectionCache.Set(connection.Id, testHarnessConnection);

            // Listen for connection request to update the state
            UpdateStateOnMessage(testHarnessConnection, TestHarnessConnectionState.Requested, _ => _.MessageType == MessageTypes.ConnectionRequest && _.RecordId == connection.Id);

            return(Ok(new { connection_id = testHarnessConnection.ConnectionId, state = testHarnessConnection.State, invitation }));
        }