/// <summary>
        /// Finds the decorator with the specified name or returns <code>null</code>.
        /// </summary>
        /// <typeparam name="T">Type to cast the decorator to.</typeparam>
        /// <param name="messageContext">Message Context.</param>
        /// <param name="name">The name.</param>
        /// <returns>The requested decorator or null</returns>
        public static T FindDecorator <T>(this UnpackedMessageContext messageContext, string name) where T : class
        {
            if (messageContext.Packed)
            {
                throw new AriesFrameworkException(ErrorCode.InvalidMessage, "Cannot fetch decorator from packed message.");
            }

            var jObject = JsonConvert.DeserializeObject <JObject>(messageContext.GetMessageJson());

            var decorator = jObject.Properties().FirstOrDefault(_ => _.Name == $"~{name}");

            return(decorator?.Value.ToObject <T>());
        }
        public async Task <AgentMessage> ProcessAsync(IAgentContext agentContext, UnpackedMessageContext messageContext)
        {
            var msgJson = messageContext.GetMessageJson();

            switch (messageContext.GetMessageType())
            {
            case BackupTypeNames.RetrieveBackupAgentMessage:
            {
                var message = messageContext.GetMessage <RetrieveBackupAgentMessage>();

                var signature = message.Signature.GetBytesFromBase64();
                var backupId  = Multibase.Base58.Decode(message.BackupId);

                var result = await Crypto.VerifyAsync(
                    message.BackupId,
                    backupId,
                    signature);


                if (!result)
                {
                    throw new ArgumentException($"{nameof(result)} signature does not match the signer");
                }

                var backupAttachments = await _storageService.RetrieveBackupAsync(message.BackupId);

                return(new RetrieveBackupResponseAgentMessage
                    {
                        Payload = backupAttachments
                    });
            }

            case BackupTypeNames.ListBackupsAgentMessage:
            {
                var message    = messageContext.GetMessage <ListBackupsAgentMessage>();
                var backupList = await _storageService.ListBackupsAsync(message.BackupId);

                var timestampList = backupList.Select(p => new DirectoryInfo(p).Name);

                return(new ListBackupsResponseAgentMessage
                    {
                        BackupList = timestampList
                                     .Select(x => long.Parse(x))
                                     .OrderByDescending(x => x)
                                     .ToList()
                    });
            }
            }

            return(null);
        }