public TransactionResultTypes AddClientTransaction(ClientTransactionMessage message, ClientConnection connection)
        {
            var transaction  = message.Transaction;
            var requestCode  = message.RequestCode;
            var sendResponse = requestCode != 0;

            var check = PreCheck(transaction);

            if (check != TransactionResultTypes.Ok)
            {
                return(check);
            }

            if (transaction.IsCoreTransaction())
            {
                lock (_lock)
                    _coreTransactions.Add(new CoreItem(message.RequestCode, SenderTypes.Client, transaction as CoreTransaction, connection));
                return(TransactionResultTypes.Ok);
            }
            if (transaction.IsServiceTransaction())
            {
                lock (_lock)
                    _serviceTransactions.Add(new ServiceItem(message.RequestCode, SenderTypes.Client, transaction as ServiceTransaction, connection));
                return(TransactionResultTypes.Ok);
            }
            if (transaction.IsDataTransaction())
            {
                lock (_lock)
                    _dataTransactions.Add(new DataItem(message.RequestCode, SenderTypes.Client, transaction as DataTransaction, null, connection));
                return(TransactionResultTypes.Ok);
            }

            return(TransactionResultTypes.InvalidTransaction);
        }
Esempio n. 2
0
        protected async Task <HeleusClientResponse> SendTransaction(Transaction transaction, bool awaitResponse)
        {
            try
            {
                var message = new ClientTransactionMessage(transaction)
                {
                    SignKey = _clientKey
                };
                if (!awaitResponse)
                {
                    message.SetRequestCode(0);
                }
                Log.Trace($"Sending transaction {transaction.GetType().Name} to connected node.", this);

                if (!await SendMessage(transaction.AccountId, message))
                {
                    return(new HeleusClientResponse(HeleusClientResultTypes.ConnectionFailed));
                }

                if (awaitResponse && await WaitResponse(message) is ClientTransactionResponseMessage response)
                {
                    if (!response.IsMessageValid(_lastNodeInfo.NodeKey))
                    {
                        Log.Trace($"Sending transaction {transaction.GetType().Name} failed, signature error.", this);
                        return(new HeleusClientResponse(HeleusClientResultTypes.EndpointSignatureError));
                    }

                    Log.Trace($"Sending transaction {transaction.GetType().Name} result: {response.ResultType}, usercode: {response.UserCode}.", this);
                    return(new HeleusClientResponse(HeleusClientResultTypes.Ok, response.ResultType, response.Operation, response.UserCode));
                }

                if (!awaitResponse)
                {
                    return(new HeleusClientResponse(HeleusClientResultTypes.Ok));
                }
            }
            catch (TaskCanceledException)
            {
                Log.Trace($"Sending transaction {transaction.GetType().Name} failed, timeout.", this);
                return(new HeleusClientResponse(HeleusClientResultTypes.Timeout));
            }
            catch (Exception ex)
            {
                Log.Trace($"Sending transaction {transaction.GetType().Name} failed: {ex.Message}.", this);
                Log.HandleException(ex, this);
            }

            Log.Trace($"Sending transaction {transaction.GetType().Name} failed, internal error.", this);
            return(new HeleusClientResponse(HeleusClientResultTypes.InternalError));
        }
Esempio n. 3
0
        async Task OnClientTransaction(ClientTransactionMessage message, ClientConnection connection)
        {
            var check = _transactionManager.AddClientTransaction(message, connection);

            var transaction = message.Transaction;
            var requestCode = message.RequestCode;

            if (requestCode != 0)
            {
                if (check == TransactionResultTypes.Ok)
                {
                    var identifier = transaction.UniqueIdentifier;
                    _clientResponses[identifier] = new ClientResponseData(requestCode, connection.ConnectionId, identifier);
                }
                else
                {
                    await connection.Send(new ClientTransactionResponseMessage(requestCode, check, null) { SignKey = _configuration.LocaleNodePrivateKey });
                }
            }
        }