openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
149 lines (120 loc) • 4.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setupAgenda = undefined;
exports.reachedMaxAttempts = reachedMaxAttempts;
exports.queueForRetry = queueForRetry;
var _winston = require('winston');
var _winston2 = _interopRequireDefault(_winston);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _autoRetry = require('./model/autoRetry');
var _tasks = require('./model/tasks');
var _channels = require('./model/channels');
var Channels = _interopRequireWildcard(_channels);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const { ChannelModel } = Channels;
function reachedMaxAttempts(tx, channel) {
return channel.autoRetryMaxAttempts != null && channel.autoRetryMaxAttempts > 0 && tx.autoRetryAttempt >= channel.autoRetryMaxAttempts;
}
async function queueForRetry(tx) {
const retry = new _autoRetry.AutoRetryModel({
transactionID: tx._id,
channelID: tx.channelID,
requestTimestamp: tx.request.timestamp
});
try {
await retry.save();
} catch (err) {
_winston2.default.error(`Failed to queue transaction ${tx._id} for auto retry: ${err}`);
}
}
const getChannels = callback => ChannelModel.find({ autoRetryEnabled: true, status: 'enabled' }, callback);
function popTransactions(channel, callback) {
const to = (0, _moment2.default)().subtract(channel.autoRetryPeriodMinutes - 1, 'minutes');
const query = {
$and: [{ channelID: channel._id }, {
requestTimestamp: {
$lte: to.toDate()
}
}]
};
_winston2.default.debug(`Executing query autoRetry.findAndRemove(${JSON.stringify(query)})`);
_autoRetry.AutoRetryModel.find(query, (err, transactions) => {
if (err) {
return callback(err);
}
if (transactions.length === 0) {
return callback(null, []);
}
_autoRetry.AutoRetryModel.remove({ _id: { $in: transactions.map(t => t._id) } }, err => {
if (err) {
return callback(err);
}
return callback(null, transactions);
});
});
}
function createRerunTask(transactionIDs, callback) {
_winston2.default.info(`Rerunning failed transactions: ${transactionIDs}`);
const task = new _tasks.TaskModel({
transactions: transactionIDs.map(t => ({ tid: t })),
totalTransactions: transactionIDs.length,
remainingTransactions: transactionIDs.length,
user: 'internal'
});
task.save(err => {
if (err) {
_winston2.default.error(err);
}
return callback();
});
}
function autoRetryTask(job, done) {
const _taskStart = new Date();
const transactionsToRerun = [];
getChannels((err, channels) => {
if (err) {
return done(err);
}
const promises = channels.map(channel => {
return new Promise((resolve, reject) => {
popTransactions(channel, (err, transactions) => {
if (err) {
_winston2.default.error(err);
return reject(err);
} else if (transactions != null) {
const tranIDs = transactions.map(r => r.transactionID);
transactionsToRerun.push(...tranIDs);
}
return resolve();
});
});
});
Promise.all(promises).then(() => {
function end() {
_winston2.default.debug(`Auto retry task total time: ${new Date() - _taskStart} ms`);
return done();
}
if (transactionsToRerun.length > 0) {
return createRerunTask(transactionsToRerun, end);
} else {
end();
}
}).catch(done);
});
}
function setupAgenda(agenda) {
agenda.define('auto retry failed transactions', (job, done) => autoRetryTask(job, done));
return agenda.every('1 minutes', 'auto retry failed transactions');
}
exports.setupAgenda = setupAgenda;
if (process.env.NODE_ENV === 'test') {
exports.getChannels = getChannels;
exports.popTransactions = popTransactions;
exports.createRerunTask = createRerunTask;
exports.autoRetryTask = autoRetryTask;
}
//# sourceMappingURL=autoRetry.js.map