@payburner/keyburner-sidewinder-core
Version:
Core library for Keyburner Sidewinder
134 lines • 8.62 kB
JavaScript
"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