UNPKG

@cumulus/message

Version:

Utilities for building and parsing Cumulus messages

194 lines 7.62 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generatePdrApiRecordFromMessage = exports.getPdrPercentCompletion = exports.getMessagePdrStats = exports.getMessagePdrFailedExecutions = exports.getMessagePdrCompletedExecutions = exports.getMessagePdrRunningExecutions = exports.getMessagePdrName = exports.getMessagePdrPANMessage = exports.getMessagePdrPANSent = exports.messageHasPdr = exports.getMessagePdr = void 0; const errors_1 = require("@cumulus/errors"); const logger_1 = __importDefault(require("@cumulus/logger")); const Collections_1 = require("./Collections"); const Executions_1 = require("./Executions"); const Providers_1 = require("./Providers"); const workflows_1 = require("./workflows"); const logger = new logger_1.default({ sender: '@cumulus/message/PDRs' }); /** * Get the PDR object from a workflow message, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message object * @returns {undefined|Object} The PDR object * * @alias module:PDRs */ const getMessagePdr = (message) => message.payload?.pdr; exports.getMessagePdr = getMessagePdr; /** * Determine if message has a PDR. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message object * @returns {boolean} true if message has a PDR * * @alias module:PDRs */ const messageHasPdr = (message) => (0, exports.getMessagePdr)(message) !== undefined; exports.messageHasPdr = messageHasPdr; /** * Get the PAN sent status from a workflow message, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {boolean} The PAN sent status * * @alias module:PDRs */ const getMessagePdrPANSent = (message) => (0, exports.getMessagePdr)(message)?.PANSent ?? false; exports.getMessagePdrPANSent = getMessagePdrPANSent; /** * Get the PAN message status from a workflow message, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {string} The PAN message * * @alias module:PDRs */ const getMessagePdrPANMessage = (message) => (0, exports.getMessagePdr)(message)?.PANmessage ?? 'N/A'; exports.getMessagePdrPANMessage = getMessagePdrPANMessage; /** * Get the PDR name from a workflow message, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {string} The PDR name * * @alias module:PDRs */ const getMessagePdrName = (message) => (0, exports.getMessagePdr)(message)?.name; exports.getMessagePdrName = getMessagePdrName; /** * Get the number of running executions for a PDR, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {number} Number of running executions * * @alias module:PDRs */ const getMessagePdrRunningExecutions = (message) => (message.payload.running ?? []).length; exports.getMessagePdrRunningExecutions = getMessagePdrRunningExecutions; /** * Get the number of completed executions for a PDR, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {number} Number of completed executions * * @alias module:PDRs */ const getMessagePdrCompletedExecutions = (message) => (message.payload.completed ?? []).length; exports.getMessagePdrCompletedExecutions = getMessagePdrCompletedExecutions; /** * Get the number of failed executions for a PDR, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {number} Number of failed executions * * @alias module:PDRs */ const getMessagePdrFailedExecutions = (message) => (message.payload.failed ?? []).length; exports.getMessagePdrFailedExecutions = getMessagePdrFailedExecutions; /** * Get the PDR stats from a workflow message, if any. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message * @returns {PdrStats} * Object tracking the status of executions triggered by the PDR * * @alias module:PDRs */ const getMessagePdrStats = (message) => { const processing = (0, exports.getMessagePdrRunningExecutions)(message); const completed = (0, exports.getMessagePdrCompletedExecutions)(message); const failed = (0, exports.getMessagePdrFailedExecutions)(message); const stats = { processing, completed, failed, total: processing + completed + failed, }; return stats; }; exports.getMessagePdrStats = getMessagePdrStats; /** * Get the percent completion of PDR executions * * @param {PdrStats} stats - Stats tracking PDR executions * @returns {number} Percent completion of PDR executions * * @alias module:PDRs */ const getPdrPercentCompletion = (stats) => { let progress = 0; if (stats.processing > 0 && stats.total > 0) { progress = ((stats.total - stats.processing) / stats.total) * 100; } else if (stats.processing === 0 && stats.total > 0) { progress = 100; } return progress; }; exports.getPdrPercentCompletion = getPdrPercentCompletion; /** * Generate a PDR record for the API from the message. * * @param {MessageWithOptionalPayloadPdr} message - A workflow message object * @param {string} [updatedAt] - Optional updated timestamp to apply to record * @returns {ApiPdr} An PDR API record * * @alias module:Executions */ const generatePdrApiRecordFromMessage = (message, updatedAt = Date.now()) => { const pdr = (0, exports.getMessagePdr)(message); // We got a message with no PDR (OK) if (!pdr) { logger.info('No PDRs to process on the message'); return undefined; } // We got a message with a PDR but no name to identify it (Not OK) if (!pdr.name) { throw new errors_1.CumulusMessageError(`Could not find name on PDR object ${JSON.stringify(pdr)}`); } const collectionId = (0, Collections_1.getCollectionIdFromMessage)(message); if (!collectionId) { throw new errors_1.CumulusMessageError('meta.collection required to generate a PDR record'); } const providerId = (0, Providers_1.getMessageProviderId)(message); if (!providerId) { throw new errors_1.CumulusMessageError('meta.provider required to generate a PDR record'); } const status = (0, workflows_1.getMetaStatus)(message); if (!status) { throw new errors_1.CumulusMessageError('meta.status required to generate a PDR record'); } const arn = (0, Executions_1.getMessageExecutionArn)(message); if (!arn) { throw new errors_1.CumulusMessageError('cumulus_meta.state_machine and cumulus_meta.execution_name required to generate a PDR record'); } const execution = (0, Executions_1.getExecutionUrlFromArn)(arn); const stats = (0, exports.getMessagePdrStats)(message); const progress = (0, exports.getPdrPercentCompletion)(stats); const now = Date.now(); const workflowStartTime = (0, workflows_1.getMessageWorkflowStartTime)(message); const record = { pdrName: pdr.name, collectionId, status, provider: providerId, progress, execution, PANSent: (0, exports.getMessagePdrPANSent)(message), PANmessage: (0, exports.getMessagePdrPANMessage)(message), stats, createdAt: (0, workflows_1.getMessageWorkflowStartTime)(message), timestamp: now, updatedAt, duration: (0, workflows_1.getWorkflowDuration)(workflowStartTime, now), }; return record; }; exports.generatePdrApiRecordFromMessage = generatePdrApiRecordFromMessage; //# sourceMappingURL=PDRs.js.map