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); }
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)); }
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 }); } } }