UNPKG

@grouparoo/core

Version:
105 lines (104 loc) 4.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExportProcessorOps = void 0; const moment_1 = __importDefault(require("moment")); const Export_1 = require("../../models/Export"); const cls_1 = require("../cls"); const sequelize_1 = require("sequelize"); const ExportProcessor_1 = require("../../models/ExportProcessor"); const actionhero_1 = require("actionhero"); const plugin_1 = require("../plugin"); var ExportProcessorOps; (function (ExportProcessorOps) { const defaultExportProcessingDelay = 1000 * 60 * 5; async function getExportsToProcess(exportProcessor) { return Export_1.Export.findAll({ where: { exportProcessorId: exportProcessor.id, state: "processing" }, }); } ExportProcessorOps.getExportsToProcess = getExportsToProcess; async function enqueuePendingProcessorsForDestination(destination, delayMs = defaultExportProcessingDelay) { if (!delayMs || delayMs < defaultExportProcessingDelay) { delayMs = defaultExportProcessingDelay; } let exportProcessors; exportProcessors = await ExportProcessor_1.ExportProcessor.findAll({ where: { state: "pending", destinationId: destination.id, processAt: { [sequelize_1.Op.lte]: new Date() }, startedAt: { [sequelize_1.Op.or]: [null, { [sequelize_1.Op.lt]: new Date().getTime() - delayMs }], }, }, order: [["processAt", "asc"]], }); if (exportProcessors.length > 0) { await ExportProcessor_1.ExportProcessor.update({ startedAt: new Date() }, { where: { id: { [sequelize_1.Op.in]: exportProcessors.map((ep) => ep.id) } }, }); const app = await destination.$get("app", { scope: null }); for (const processor of exportProcessors) { await cls_1.CLS.enqueueTask("export:process", { exportProcessorId: processor.id }, `exports:${app.type}`); } } return exportProcessors.length; } ExportProcessorOps.enqueuePendingProcessorsForDestination = enqueuePendingProcessorsForDestination; async function setError(instance, error, retryDelay = actionhero_1.config.tasks.timeout) { const maxAttempts = parseInt((await plugin_1.plugin.readSetting("core", "export-processors-max-retries-count")) .value); instance.errorMessage = error.message || error.toString(); if (error["errorLevel"]) instance.errorLevel = error["errorLevel"]; instance.retryCount++; if (instance.retryCount >= maxAttempts) { instance.state = "failed"; instance.processAt = null; await Export_1.Export.update({ state: "failed", errorMessage: `An error occurred while processing the export: ${instance.errorMessage}`, errorLevel: "error", }, { where: { state: "processing", exportProcessorId: instance.id } }); } else if (instance.errorLevel === "info") { instance.state = "failed"; await Export_1.Export.update({ state: "failed", errorMessage: instance.errorMessage, errorLevel: "info", }, { where: { state: "processing", exportProcessorId: instance.id } }); } else { instance.processAt = (0, moment_1.default)().add(retryDelay, "ms").toDate(); instance.startedAt = null; } return instance.save(); } ExportProcessorOps.setError = setError; async function retry(instance, retryDelay = actionhero_1.config.tasks.timeout, skipCount = false) { const maxAttempts = parseInt((await plugin_1.plugin.readSetting("core", "export-processors-max-retries-count")) .value); if (!skipCount) instance.retryCount++; if (instance.retryCount >= maxAttempts) { instance.state = "failed"; instance.processAt = null; // fail the related exports too await Export_1.Export.update({ state: "failed", errorMessage: "The maximum amount of retries was reached when trying to process this export.", errorLevel: "info", }, { where: { state: "processing", exportProcessorId: instance.id } }); } else { instance.processAt = (0, moment_1.default)().add(retryDelay, "ms").toDate(); instance.startedAt = null; } return instance.save(); } ExportProcessorOps.retry = retry; })(ExportProcessorOps = exports.ExportProcessorOps || (exports.ExportProcessorOps = {}));