@actionforest/taskrunner
Version:
ActionForest taskrunner in Pomegranate
129 lines • 5.55 kB
JavaScript
;
/**
* @file ActionRunner
* @author Jim Bulkowski <jim.b@paperelectron.com>
* @project taskrunner
* @license MIT {@link http://opensource.org/licenses/MIT}
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const plugin_tools_1 = require("@pomegranate/plugin-tools");
const fp_1 = require("lodash/fp");
let hasCorrelation = (stats) => {
return fp_1.has('callerMetadata.replyTo', stats) && fp_1.has('callerMetadata.correlationId', stats);
};
exports.ActionRunner = plugin_tools_1.CreatePlugin('action')
.configuration({
name: 'ActionRunner',
depends: ['@pomofficial/RabbitMQ', '@actionforest/ActionTree']
})
.variables({
actionQueue: 'actionForest'
})
.hooks({
load: (PluginLateError, PluginStore, PluginVariables, PluginLogger, RabbitMQ, ActionTree, DispatchAction, ActionReply) => __awaiter(this, void 0, void 0, function* () {
let taskHooks = {
requeue: (stats, requeueData) => {
PluginLogger.log(`${stats.name}: ${stats.uuid} will requeue.`);
return DispatchAction.to(PluginVariables.actionQueue).write(requeueData);
},
success: (stats, requeueData) => __awaiter(this, void 0, void 0, function* () {
if (hasCorrelation(stats)) {
try {
yield ActionReply({
rpc_auto_success: stats.state
}, stats.callerMetadata);
}
catch (e) {
PluginLogger.error(e);
}
}
PluginLogger.log(`${stats.name}: ${stats.uuid} complete`);
}),
failure: (stats, requeueData) => __awaiter(this, void 0, void 0, function* () {
if (hasCorrelation(stats)) {
try {
yield ActionReply({
rpc_auto_failure: { message: stats.transitionError.message, stack: stats.transitionError.stack }
}, stats.callerMetadata);
}
catch (e) {
PluginLogger.error(e);
}
}
PluginLogger.error('error', stats.callerMetadata);
PluginLogger.error(`${stats.name}: ${stats.uuid} permanently failed.`);
})
};
ActionTree.registerTaskHooks(taskHooks);
PluginStore.taskHandler = function (msg) {
if (fp_1.isNull(msg)) {
PluginLogger.warn('Message string was null, discarding');
this.ack(msg);
}
let parsedMsg;
try {
parsedMsg = JSON.parse(msg.content.toString());
if (parsedMsg == null) {
throw new Error('Parsed Message was null.');
}
let correlationId = msg.properties.correlationId;
let replyTo = msg.properties.replyTo;
if (correlationId && replyTo) {
parsedMsg.RPCmetadata = {
correlationId: correlationId,
replyTo: replyTo
};
}
if (parsedMsg.metadata) {
return ActionTree.runTask(parsedMsg, parsedMsg.RPCmetadata)
.then((res) => {
this.ack(msg);
})
.catch((error) => {
PluginLogger.error(error);
this.ack(msg);
});
}
else {
throw new Error('Message Did not contain a metadata property.');
}
}
catch (e) {
PluginLogger.warn(`Unable to handle message "${msg.content}", ${e.message}`);
this.ack(msg);
return;
}
this.ack(msg);
};
let queueName = DispatchAction.to(PluginVariables.actionQueue).getQueueName();
let taskChannel = yield RabbitMQ.createChannel();
taskChannel.on('error', (error) => {
PluginLateError(error);
});
taskChannel.prefetch(1000);
taskChannel.assertQueue(queueName, { durable: true });
PluginStore.queueName = queueName;
PluginStore.taskChannel = taskChannel;
return null;
}),
start: (PluginLogger, PluginStore) => {
PluginStore.taskChannel.consume(PluginStore.queueName, PluginStore.taskHandler.bind(PluginStore.taskChannel));
},
stop: (PluginStore, PluginLogger) => {
if (PluginStore.taskChannel) {
return PluginStore.taskChannel.close().then(() => {
PluginLogger.log('Closed RabbitMQ channel');
return null;
});
}
}
});
//# sourceMappingURL=ActionRunner.js.map