UNPKG

@actionforest/taskrunner

Version:

ActionForest taskrunner in Pomegranate

129 lines 5.55 kB
"use strict"; /** * @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