@grouparoo/core
Version:
The Grouparoo Core
375 lines (374 loc) • 13.8 kB
JavaScript
"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;