private void UpdateStateOnMessage(TestHarnessPresentationExchange THPresentationExchange, TestHarnessPresentationExchangeState nextState, Func <ServiceMessageProcessingEvent, bool> predicate) { _eventAggregator.GetEventByType <ServiceMessageProcessingEvent>() .Where(predicate) .Take(1) .Subscribe(_ => { THPresentationExchange.State = nextState; }); }
/// <inheritdoc /> public async Task OnMessageAsync(IAgentContext agentContext, UnpackedMessageContext messageContext) { // TrustPingMessage event aggregator event doesn't include the connection so we can't verify whether the // received trust ping comes from the connection we send the connection response to. // For this reason we handle this specific case through a middleware where we do have the // connection from which the trust ping message came if (messageContext.GetMessageType() == MessageTypes.TrustPingMessageType) { var message = messageContext.GetMessage <TrustPingMessage>(); var THConnection = _cache.Get <TestHarnessConnection>(messageContext.Connection.Id); if (THConnection != null && THConnection.State == TestHarnessConnectionState.Responded) { THConnection.State = TestHarnessConnectionState.Complete; } } // When we receive a request presentation message we need to create a TestHarnessPresentationExchange and // store it in the cache for future use. This allow us to keep track of the current state of the presentation exchange else if (messageContext.GetMessageType() == MessageTypes.PresentProofNames.RequestPresentation) { var message = messageContext.GetMessage <RequestPresentationMessage>(); var proofRecord = await _proofService.GetByThreadIdAsync(agentContext, message.GetThreadId()); var THPresentationExchange = new TestHarnessPresentationExchange { ThreadId = message.GetThreadId(), RecordId = proofRecord.Id, State = TestHarnessPresentationExchangeState.RequestReceived, }; _cache.Set(THPresentationExchange.ThreadId, THPresentationExchange); } }
public async Task <IActionResult> SendPresentationRequestAsync(OperationBody body) { // NOTE: AATH can only start from presentation request, not respond to previous message var context = await _agentContextProvider.GetContextAsync(); var presentationRequest = body.Data; var connectionId = (string)presentationRequest["connection_id"]; var presentationRequestMessage = presentationRequest["presentation_proposal"]["request_presentations~attach"]["data"]; var proofRequest = new ProofRequest { Name = (string)presentationRequestMessage["name"] ?? "test proof", Version = (string)presentationRequestMessage["version"] ?? "1.0", Nonce = await AnonCreds.GenerateNonceAsync(), RequestedAttributes = presentationRequestMessage["requested_attributes"]?.ToObject <Dictionary <string, ProofAttributeInfo> >() ?? new Dictionary <string, ProofAttributeInfo> { }, RequestedPredicates = presentationRequestMessage["requested_predicates"]?.ToObject <Dictionary <string, ProofPredicateInfo> >() ?? new Dictionary <string, ProofPredicateInfo> { } }; _logger.LogInformation("SendPresentationRequest {proofRequest}", proofRequest.ToJson()); var(requestPresentationMessage, proofRecord) = await _proofService.CreateRequestAsync(context, proofRequest, connectionId); var connection = await _connectionService.GetAsync(context, connectionId); var THPresentationExchange = new TestHarnessPresentationExchange { RecordId = proofRecord.Id, ThreadId = proofRecord.GetTag(TagConstants.LastThreadId), State = TestHarnessPresentationExchangeState.RequestSent }; _proofCache.Set(THPresentationExchange.ThreadId, THPresentationExchange); UpdateStateOnMessage(THPresentationExchange, TestHarnessPresentationExchangeState.PresentationReceived, _ => _.MessageType == MessageTypes.PresentProofNames.Presentation && _.ThreadId == THPresentationExchange.ThreadId); _logger.LogDebug("Send Presentation Request {requestPresentationMessage}", requestPresentationMessage.ToJson()); await _messageService.SendAsync(context, requestPresentationMessage, connection); return(Ok(THPresentationExchange)); }