UNPKG

@xtcry/bull-arena

Version:

An interactive UI dashboard for Bee/Bull Queue

85 lines (84 loc) 3.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _ = require("lodash"); const JobHelpers = require("../../helpers/jobHelpers"); async function handler(req, res) { const { queueName, queueHost, id } = req.params; const { json } = req.query; const basePath = req.baseUrl; const { Queues, Flows } = req.app.locals; const queue = await Queues.get(queueName, queueHost); if (!queue) return res.status(404).render('dashboard/queueNotFound', { basePath, queueName, queueHost, }); const job = await queue.getJob(id); if (!job) return res.status(404).render('dashboard/jobNotFound', { basePath, id, queueName, queueHost, hasFlows: Flows.hasFlows(), }); if (json === 'true') { // Omit these private and non-stringifyable properties to avoid circular // references parsing errors. return res.json(_.omit(job, 'domain', 'queue', '_events', '_eventsCount')); } const jobState = queue.IS_BEE ? job.status : await job.getState(); job.showRetryButton = !queue.IS_BEE || jobState === 'failed'; job.retryButtonText = jobState === 'failed' ? 'Retry' : 'Trigger'; job.showPromoteButton = !queue.IS_BEE && jobState === 'delayed'; const stacktraces = queue.IS_BEE ? job.options.stacktraces : job.stacktrace; if (!queue.IS_BEE) { const logs = await queue.getJobLogs(job.id); job.logs = logs.logs || 'No Logs'; } if (queue.IS_BULLMQ) { job.parent = JobHelpers.getKeyProperties(job.parentKey); const processedCursor = parseInt(req.query.processedCursor, 10) || 0; const processedCount = parseInt(req.query.processedCount, 10) || 25; const unprocessedCursor = parseInt(req.query.unprocessedCursor, 10) || 0; const unprocessedCount = parseInt(req.query.unprocessedCount, 10) || 25; job.processedCount = processedCount; job.unprocessedCount = unprocessedCount; const { processed, unprocessed, nextProcessedCursor, nextUnprocessedCursor, } = await job.getDependencies({ processed: { cursor: processedCursor, count: processedCount, }, unprocessed: { cursor: unprocessedCursor, count: unprocessedCount, }, }); const count = await job.getDependenciesCount(); job.countDependencies = count; job.processedCursor = nextProcessedCursor; job.unprocessedCursor = nextUnprocessedCursor; if (unprocessed && unprocessed.length) { job.unprocessedChildren = unprocessed.map((child) => { return JobHelpers.getKeyProperties(child); }); } if (processed) { const childrenKeys = Object.keys(processed); job.processedChildren = childrenKeys.map((child) => { return JobHelpers.getKeyProperties(child); }); } } return res.render('dashboard/jobDetails', { basePath, queueName, queueHost, jobState, job, stacktraces, hasFlows: Flows.hasFlows(), }); } exports.default = handler;