UNPKG

@payburner/keyburner-sidewinder-core

Version:
134 lines 8.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CoreProcessorIntake = void 0; const npm_1 = require("@payburner/keyburner-core/dist/npm"); const npm_2 = require("@payburner/keyburner-sidewinder-model/dist/npm"); const CreateTokenTransactionProcessor_1 = require("./CreateTokenTransactionProcessor"); const UpdateTokenTransactionProcessor_1 = require("./UpdateTokenTransactionProcessor"); const UpdateTokenAccountTransactionProcessor_1 = require("./UpdateTokenAccountTransactionProcessor"); const TransferTransactionProcessor_1 = require("./TransferTransactionProcessor"); const CommonErrorCodes_1 = require("../model/CommonErrorCodes"); const OnRampTransactionProcessor_1 = require("./OnRampTransactionProcessor"); const OffRampRequestTransactionProcessor_1 = require("./OffRampRequestTransactionProcessor"); const OffRampResultTransactionProcessor_1 = require("./OffRampResultTransactionProcessor"); class CoreProcessorIntake { constructor(globalAccountService, tokenService, underlyingTransactionService) { this.transactionProcessors = []; this.keyburner = null; this.globalAccountService = null; this.keyburner = new npm_1.KeyBurner(); this.globalAccountService = globalAccountService; this.transactionProcessors.push(new CreateTokenTransactionProcessor_1.CreateTokenTransactionProcessor(globalAccountService, tokenService), new TransferTransactionProcessor_1.TransferTransactionProcessor(globalAccountService, tokenService), new UpdateTokenTransactionProcessor_1.UpdateTokenTransactionProcessor(globalAccountService, tokenService), new UpdateTokenAccountTransactionProcessor_1.UpdateTokenAccountTransactionProcessor(globalAccountService, tokenService), new OnRampTransactionProcessor_1.OnRampTransactionProcessor(globalAccountService, tokenService), new OffRampRequestTransactionProcessor_1.OffRampRequestTransactionProcessor(globalAccountService, tokenService), new OffRampResultTransactionProcessor_1.OffRampResultTransactionProcessor(globalAccountService, tokenService, underlyingTransactionService)); } getTransactionType(decodedTransaction) { return decodedTransaction.payload.transaction_type; } decodeAndProcessTransaction(signedTransaction) { const self = this; return new Promise((resolve, reject) => { const items = []; const decodedTransaction = self.keyburner.decodeTransaction(signedTransaction); items.push({ Put: { TableName: 'sidewinder_sequence', Item: { address_uri: npm_2.AccountUtils.calculateEnvironmentAddress(decodedTransaction.payload.environment, decodedTransaction.address), environment: decodedTransaction.payload.environment, address: decodedTransaction.address, sequence: decodedTransaction.payload.sequence, last_txn_id: decodedTransaction.id }, ConditionExpression: "attribute_not_exists(address_uri) OR (#seq = :sequence AND last_txn_id = :last_txn_id)", ExpressionAttributeNames: { "#seq": "sequence" }, ExpressionAttributeValues: { ":sequence": decodedTransaction.payload.sequence - 1, ":last_txn_id": typeof decodedTransaction.payload.last_txn_id !== 'undefined' && decodedTransaction.payload.last_txn_id !== null ? decodedTransaction.payload.last_txn_id : 'NONE' } } }); self.processTransaction(decodedTransaction) .then((response) => { items.push({ Put: { TableName: 'sidewinder_transactions', Item: { id: decodedTransaction.id, address_uri: npm_2.AccountUtils.calculateEnvironmentAddress(decodedTransaction.payload.environment, decodedTransaction.address), environment: decodedTransaction.payload.environment, raw: decodedTransaction.raw, sequence: decodedTransaction.payload.sequence, verified: decodedTransaction.verified, last_txn_id: typeof decodedTransaction.payload.last_txn_id !== 'undefined' && decodedTransaction.payload.last_txn_id !== null ? decodedTransaction.payload.last_txn_id : 'NONE', address: decodedTransaction.address, signingKey: decodedTransaction.signingKey, environment_processing_stage: decodedTransaction.payload.environment + '_' + (response.serviceResponse.status === 200 ? 'PENDING' : 'PROCESSED'), signature: decodedTransaction.signature, status: response.serviceResponse.status, error_code: response.serviceResponse.error_code, error: response.serviceResponse.error, processing_stage: response.serviceResponse.status === 200 ? 'PENDING' : 'PROCESSED', timestamp: new Date().getTime() }, ConditionExpression: "attribute_not_exists(id)" } }); resolve({ serviceResponse: response.serviceResponse, transactionItems: items, decodedTransaction: decodedTransaction }); }).catch((error) => { items.push({ Put: { TableName: 'sidewinder_transactions', Item: { id: decodedTransaction.id, address_uri: npm_2.AccountUtils.calculateEnvironmentAddress(decodedTransaction.payload.environment, decodedTransaction.address), environment: decodedTransaction.payload.environment, raw: decodedTransaction.raw, sequence: decodedTransaction.payload.sequence, verified: decodedTransaction.verified, address: decodedTransaction.address, signingKey: decodedTransaction.signingKey, environment_processing_stage: decodedTransaction.payload.environment + '_PROCESSED', signature: decodedTransaction.signature, status: CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_UNKNOWN.status, error_code: CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_UNKNOWN.error_code, error: CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_UNKNOWN.error, processing_stage: 'PROCESSED', timestamp: new Date().getTime() }, ConditionExpression: "attribute_not_exists(id)" } }); resolve({ serviceResponse: CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_UNKNOWN, transactionItems: items, decodedTransaction: decodedTransaction }); }); }); } processTransaction(decodedTransaction) { const self = this; return new Promise((resolve, reject) => { if (decodedTransaction.verified) { const transactionType = this.getTransactionType(decodedTransaction); let found = false; self.transactionProcessors.forEach((transactionProcessor) => { if (transactionProcessor.getTransactionType() === transactionType) { found = true; } }); if (!found) { resolve({ serviceResponse: CommonErrorCodes_1.CommonErrorCodes.UNKNOWN_TRANSACTION_TYPE, transactionItems: [] }); } else { resolve({ serviceResponse: { status: 200 }, transactionItems: [] }); } } else { resolve({ serviceResponse: CommonErrorCodes_1.CommonErrorCodes.TRANSACTION_INVALID, transactionItems: [] }); } }); } } exports.CoreProcessorIntake = CoreProcessorIntake; //# sourceMappingURL=CoreProcessorIntake.js.map