UNPKG

@grouparoo/core

Version:
375 lines (374 loc) 13.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResqueRunDelayed = exports.ResqueDelDelayed = exports.ResqueDelayedJobs = exports.ResqueDelLock = exports.ResqueLocks = exports.ResqueRetryAndRemoveAllFailed = exports.ResqueRetryAndRemoveFailed = exports.ResqueRemoveAllFailed = exports.ResqueRemoveFailed = exports.ResqueResqueFailed = exports.ResqueDelQueue = exports.ResqueQueued = exports.ResqueFailedCount = exports.ResqueForceCleanWorker = exports.ResqueLoadWorkerQueues = exports.ResqueResqueDetails = exports.ResqueRedisInfo = void 0; const os_1 = __importDefault(require("os")); const authenticatedAction_1 = require("../classes/actions/authenticatedAction"); const actionhero_1 = require("actionhero"); const cls_1 = require("../modules/cls"); const statusReporters_1 = require("../modules/statusReporters"); const status_1 = require("../modules/status"); const apiData_1 = require("../modules/apiData"); // Helper Classes for Permissions class ResqueActionWrite extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.permission = { topic: "resque", mode: "write" }; this.logLevel = "debug"; this.toDocument = false; } isWriteTransaction() { // because it doesn't use the database return false; } async calculateResqueMetrics() { const resqueStatusReporters = [ async () => await statusReporters_1.StatusReporters.Cluster.Workers.countWorkers(), async () => await statusReporters_1.StatusReporters.Cluster.Workers.countErrors(), async () => await statusReporters_1.StatusReporters.Cluster.Workers.details(), ]; for (const method of resqueStatusReporters) { const response = await method(); const metrics = await status_1.Status.set(response); await actionhero_1.chatRoom.broadcast({}, "system:status", { metrics, }); } } } class ResqueActionRead extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.permission = { topic: "resque", mode: "read" }; this.logLevel = "debug"; this.toDocument = false; } } class ResqueRedisInfo extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:redisInfo"; this.description = "I return the results of redis info"; } async runWithinTransaction() { const redisInfo = await actionhero_1.api.resque.queue.connection.redis.info(); if (redisInfo) { return { redisInfo: redisInfo.split(os_1.default.EOL) }; } } } exports.ResqueRedisInfo = ResqueRedisInfo; class ResqueResqueDetails extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:resqueDetails"; this.description = "I return the results of api.tasks.details"; } async runWithinTransaction() { const resqueDetails = await actionhero_1.task.details(); const failedCount = await actionhero_1.task.failedCount(); return { resqueDetails, failedCount }; } } exports.ResqueResqueDetails = ResqueResqueDetails; class ResqueLoadWorkerQueues extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:loadWorkerQueues"; this.description = "I return the results of api.tasks.workers"; } async runWithinTransaction() { return { workerQueues: await actionhero_1.task.workers() }; } } exports.ResqueLoadWorkerQueues = ResqueLoadWorkerQueues; class ResqueForceCleanWorker extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:forceCleanWorker"; this.description = "I remove a worker from resque"; this.inputs = { workerName: { required: true }, }; } async runWithinTransaction({ params, }) { const generatedErrorPayload = await actionhero_1.api.resque.queue.forceCleanWorker(params.workerName); await this.calculateResqueMetrics(); return { generatedErrorPayload }; } } exports.ResqueForceCleanWorker = ResqueForceCleanWorker; class ResqueFailedCount extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:resqueFailedCount"; this.description = "I return a count of failed jobs"; } async runWithinTransaction() { return { failedCount: await actionhero_1.task.failedCount() }; } } exports.ResqueFailedCount = ResqueFailedCount; class ResqueQueued extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:queued"; this.description = "I list enqueued jobs"; this.inputs = { queue: { required: true, }, offset: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 0, }, limit: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 100, }, }; } async runWithinTransaction({ params }) { const queueLength = await actionhero_1.api.resque.queue.length(params.queue); const jobs = await actionhero_1.task.queued(params.queue, params.offset, params.offset + params.limit - 1); return { queueLength, jobs }; } } exports.ResqueQueued = ResqueQueued; class ResqueDelQueue extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:delQueue"; this.description = "I delete a queue"; this.inputs = { queue: { required: true }, }; } async runWithinTransaction({ params, }) { return { deleted: await actionhero_1.task.delQueue(params.queue) }; } } exports.ResqueDelQueue = ResqueDelQueue; class ResqueResqueFailed extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:resqueFailed"; this.description = "I return failed jobs"; this.inputs = { offset: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 0, }, limit: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 100, }, }; } async runWithinTransaction({ params, }) { const failed = await actionhero_1.task.failed(params.offset, params.offset + params.limit - 1); const total = await actionhero_1.task.failedCount(); return { total, failed }; } } exports.ResqueResqueFailed = ResqueResqueFailed; class ResqueRemoveFailed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:removeFailed"; this.description = "I remove a failed job"; this.inputs = { id: { required: true, formatter: apiData_1.APIData.ensureNumber, }, }; } async runWithinTransaction({ params, }) { const failed = await actionhero_1.task.failed(params.id, params.id); if (!failed) throw Error("failed job not found"); await actionhero_1.task.removeFailed(failed[0]); await this.calculateResqueMetrics(); } } exports.ResqueRemoveFailed = ResqueRemoveFailed; class ResqueRemoveAllFailed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:removeAllFailed"; this.description = "I remove all failed jobs"; } async runWithinTransaction() { const failed = await actionhero_1.task.failed(0, 0); if (failed && failed.length > 0) { const failedJob = failed[0]; await actionhero_1.task.removeFailed(failedJob); return this.runWithinTransaction(); } await this.calculateResqueMetrics(); } } exports.ResqueRemoveAllFailed = ResqueRemoveAllFailed; class ResqueRetryAndRemoveFailed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:retryAndRemoveFailed"; this.description = "I retry a failed job"; this.inputs = { id: { required: true, formatter: apiData_1.APIData.ensureNumber, }, }; } async runWithinTransaction({ params, }) { const failed = await actionhero_1.task.failed(params.id, params.id); if (!failed) throw new Error("failed job not found"); await actionhero_1.task.retryAndRemoveFailed(failed[0]); await this.calculateResqueMetrics(); } } exports.ResqueRetryAndRemoveFailed = ResqueRetryAndRemoveFailed; class ResqueRetryAndRemoveAllFailed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:retryAndRemoveAllFailed"; this.description = "I retry all failed jobs"; } async runWithinTransaction() { const failed = await actionhero_1.task.failed(0, 0); if (failed && failed.length > 0) { const failedJob = failed[0]; await actionhero_1.task.retryAndRemoveFailed(failedJob); return this.runWithinTransaction(); } await this.calculateResqueMetrics(); } } exports.ResqueRetryAndRemoveAllFailed = ResqueRetryAndRemoveAllFailed; class ResqueLocks extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:locks"; this.description = "I return all locks"; } async runWithinTransaction() { return { locks: await actionhero_1.task.locks() }; } } exports.ResqueLocks = ResqueLocks; class ResqueDelLock extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:delLock"; this.description = "I delete a lock"; this.inputs = { lock: { required: true }, }; } async runWithinTransaction({ params, }) { return { count: await actionhero_1.task.delLock(params.lock) }; } } exports.ResqueDelLock = ResqueDelLock; class ResqueDelayedJobs extends ResqueActionRead { constructor() { super(...arguments); this.name = "resque:delayedjobs"; this.description = "I return paginated lists of delayedjobs"; this.inputs = { offset: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 0, }, limit: { required: true, formatter: apiData_1.APIData.ensureNumber, default: 100, }, }; } async runWithinTransaction({ params, }) { const timestamps = []; const delayedjobs = {}; const allTimestamps = await actionhero_1.task.timestamps(); if (allTimestamps.length === 0) { return; } for (let i = 0; i < allTimestamps.length; i++) { if (i >= params.offset && i <= params.offset + params.limit - 1) { timestamps.push(allTimestamps[i]); } } for (const timestamp of timestamps) { delayedjobs[timestamp] = await actionhero_1.task.delayedAt(timestamp); } return { delayedjobs, timestampsCount: 0, total: allTimestamps.length }; } } exports.ResqueDelayedJobs = ResqueDelayedJobs; class ResqueDelDelayed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:delDelayed"; this.description = "I delete a delayed job"; this.inputs = { timestamp: { required: true, formatter: apiData_1.APIData.ensureNumber, }, count: { required: true, formatter: apiData_1.APIData.ensureNumber, }, }; } async runWithinTransaction({ params, }) { const delayed = await actionhero_1.task.delayedAt(params.timestamp); if (delayed.tasks.length === 0 || !delayed.tasks[params.count]) { throw new Error("delayed job not found"); } const job = delayed.tasks[params.count]; return { timestamps: await actionhero_1.task.delDelayed(job.queue, job.class, job.args[0]), }; } } exports.ResqueDelDelayed = ResqueDelDelayed; class ResqueRunDelayed extends ResqueActionWrite { constructor() { super(...arguments); this.name = "resque:runDelayed"; this.description = "I run a delayed job now"; this.inputs = { timestamp: { required: true, formatter: apiData_1.APIData.ensureNumber, }, count: { required: true, formatter: apiData_1.APIData.ensureNumber, }, }; } async runWithinTransaction({ params, }) { const delayed = await actionhero_1.task.delayedAt(params.timestamp); if (delayed.tasks.length === 0 || !delayed.tasks[params.count]) { throw new Error("delayed job not found"); } const job = delayed.tasks[params.count]; await actionhero_1.task.delDelayed(job.queue, job.class, job.args[0]); await cls_1.CLS.enqueueTask(job.class, job.args[0], job.queue); return { success: true }; } } exports.ResqueRunDelayed = ResqueRunDelayed;