@grouparoo/core
Version:
The Grouparoo Core
105 lines (104 loc) • 4.92 kB
JavaScript
;
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 = {}));