예제 #1
0
        private async Task <MessageContext> ProcessMessage(IAgentContext agentContext, MessageContext messageContext)
        {
            UnpackResult           unpacked = null;
            UnpackedMessageContext inboundMessageContext = null;

            if (messageContext is PackedMessageContext packedMessageContext)
            {
                (inboundMessageContext, unpacked) = await UnpackAsync(agentContext, packedMessageContext);

                Logger.LogInformation($"Agent Message Received : {inboundMessageContext.ToJson()}");
            }

            if (Handlers.Where(handler => handler != null).FirstOrDefault(
                    handler => handler.SupportedMessageTypes.Any(
                        type => type == inboundMessageContext.GetMessageType())) is
                IMessageHandler messageHandler)
            {
                Logger.LogDebug("Processing message type {MessageType}, {MessageData}",
                                inboundMessageContext.GetMessageType(),
                                inboundMessageContext.Payload.GetUTF8String());

                // Process message in handler
                var response = await messageHandler.ProcessAsync(agentContext, inboundMessageContext);

                // Process message with any registered middlewares
                foreach (var middleware in Middlewares)
                {
                    await middleware.OnMessageAsync(agentContext, inboundMessageContext);
                }

                if (response != null)
                {
                    if (inboundMessageContext.ReturnRoutingRequested())
                    {
                        var result = inboundMessageContext.Connection != null
                            ? await CryptoUtils.PackAsync(agentContext.Wallet, inboundMessageContext.Connection.TheirVk, response.ToByteArray())
                            : await CryptoUtils.PackAsync(agentContext.Wallet, unpacked.SenderVerkey, response.ToByteArray());

                        return(new PackedMessageContext(result));
                    }
                    if (inboundMessageContext.Connection != null)
                    {
                        await MessageService.SendAsync(agentContext.Wallet, response, inboundMessageContext.Connection);
                    }
                    else
                    {
                        Logger.LogWarning("Return response available, but connection was not found or was in invalid state");
                    }
                }
                return(null);
            }

            throw new AriesFrameworkException(ErrorCode.InvalidMessage,
                                              $"Couldn't locate a message handler for type {inboundMessageContext.GetMessageType()}");
        }
예제 #2
0
        private async Task <(UnpackedMessageContext, UnpackResult)> UnpackAsync(IAgentContext agentContext, PackedMessageContext message)
        {
            UnpackResult unpacked;

            try
            {
                unpacked = await CryptoUtils.UnpackAsync(agentContext.Wallet, message.Payload);
            }
            catch (Exception e)
            {
                Logger.LogError("Failed to un-pack message", e);
                throw new AriesFrameworkException(ErrorCode.InvalidMessage, "Failed to un-pack message", e);
            }

            UnpackedMessageContext result = null;

            if (unpacked.SenderVerkey != null && message.Connection == null)
            {
                try
                {
                    if (await ConnectionService.ResolveByMyKeyAsync(agentContext, unpacked.RecipientVerkey) is ConnectionRecord connection)
                    {
                        result = new UnpackedMessageContext(unpacked.Message, connection);
                    }
                    else
                    {
                        result = new UnpackedMessageContext(unpacked.Message, unpacked.SenderVerkey);
                    }
                }
                catch (AriesFrameworkException ex) when(ex.ErrorCode == ErrorCode.RecordNotFound)
                {
                    // OK if not resolved. Example: authpacked forward message in routing agent.
                    // Downstream consumers should throw if Connection is required
                }
            }
            else
            {
                if (message.Connection != null)
                {
                    result = new UnpackedMessageContext(unpacked.Message, message.Connection);
                }
                else
                {
                    result = new UnpackedMessageContext(unpacked.Message, unpacked.SenderVerkey);
                }
            }

            return(result, unpacked);
        }
 /// <inheritdoc />
 public Task <AgentMessage> ProcessAsync(IAgentContext agentContext, UnpackedMessageContext messageContext) =>
 ProcessAsync(messageContext.GetMessage <T>(), agentContext, messageContext);
 /// <summary>
 /// Processes the incoming <see cref="AgentMessage"/>
 /// </summary>
 /// <param name="message">The message.</param>
 /// <param name="agentContext">The message agentContext.</param>
 /// <param name="messageContext">The message context.</param>
 /// <returns></returns>
 protected abstract Task <AgentMessage> ProcessAsync(T message, IAgentContext agentContext, UnpackedMessageContext messageContext);