worker-que 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DASHBOARD-QUICKSTART.md +278 -0
- package/DASHBOARD.md +556 -0
- package/LICENSE +21 -0
- package/README.md +414 -0
- package/SSL-QUICK-REFERENCE.md +225 -0
- package/SSL.md +516 -0
- package/dist/client.d.ts +11 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +64 -0
- package/dist/client.js.map +1 -0
- package/dist/dashboard/index.d.ts +34 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +164 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/service.d.ts +66 -0
- package/dist/dashboard/service.d.ts.map +1 -0
- package/dist/dashboard/service.js +201 -0
- package/dist/dashboard/service.js.map +1 -0
- package/dist/dashboard/views.d.ts +3 -0
- package/dist/dashboard/views.d.ts.map +1 -0
- package/dist/dashboard/views.js +786 -0
- package/dist/dashboard/views.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/job.d.ts +19 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +36 -0
- package/dist/job.js.map +1 -0
- package/dist/sql.d.ts +8 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +57 -0
- package/dist/sql.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +6 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +31 -0
- package/dist/utils.js.map +1 -0
- package/dist/worker.d.ts +19 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +99 -0
- package/dist/worker.js.map +1 -0
- package/migrations/schema.sql +26 -0
- package/package.json +105 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DashboardService = void 0;
|
|
4
|
+
exports.createDashboard = createDashboard;
|
|
5
|
+
const express_1 = require("express");
|
|
6
|
+
const service_1 = require("./service");
|
|
7
|
+
Object.defineProperty(exports, "DashboardService", { enumerable: true, get: function () { return service_1.DashboardService; } });
|
|
8
|
+
const views_1 = require("./views");
|
|
9
|
+
/**
|
|
10
|
+
* Creates an Express router with the Que dashboard
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import express from 'express';
|
|
15
|
+
* import { Pool } from 'pg';
|
|
16
|
+
* import { createDashboard } from 'que-ts/dashboard';
|
|
17
|
+
*
|
|
18
|
+
* const app = express();
|
|
19
|
+
* const pool = new Pool({ ... });
|
|
20
|
+
*
|
|
21
|
+
* app.use('/admin/queue', createDashboard(pool, {
|
|
22
|
+
* title: 'My App Queue',
|
|
23
|
+
* auth: (req, res, next) => {
|
|
24
|
+
* // Add your authentication logic
|
|
25
|
+
* return req.isAuthenticated();
|
|
26
|
+
* }
|
|
27
|
+
* }));
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
function createDashboard(pool, options = {}) {
|
|
31
|
+
const router = (0, express_1.Router)();
|
|
32
|
+
const service = new service_1.DashboardService(pool, options);
|
|
33
|
+
const authMiddleware = options.auth;
|
|
34
|
+
// Authentication middleware wrapper
|
|
35
|
+
const requireAuth = async (req, res, next) => {
|
|
36
|
+
if (authMiddleware) {
|
|
37
|
+
try {
|
|
38
|
+
const allowed = await authMiddleware(req, res, next);
|
|
39
|
+
if (!allowed) {
|
|
40
|
+
res.status(403).json({ error: 'Access denied' });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
res.status(500).json({ error: 'Authentication error' });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
next();
|
|
50
|
+
};
|
|
51
|
+
// Apply auth to all routes
|
|
52
|
+
router.use(requireAuth);
|
|
53
|
+
// Main dashboard page
|
|
54
|
+
router.get('/', async (req, res) => {
|
|
55
|
+
try {
|
|
56
|
+
const html = (0, views_1.getDashboardHTML)(service.getOptions());
|
|
57
|
+
res.type('html').send(html);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
res.status(500).json({ error: 'Failed to load dashboard' });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// API: Get queue statistics
|
|
64
|
+
router.get('/api/stats', async (req, res) => {
|
|
65
|
+
try {
|
|
66
|
+
const stats = await service.getStats();
|
|
67
|
+
res.json(stats);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('Error fetching stats:', error);
|
|
71
|
+
res.status(500).json({ error: 'Failed to fetch statistics' });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// API: Get jobs list
|
|
75
|
+
router.get('/api/jobs', async (req, res) => {
|
|
76
|
+
try {
|
|
77
|
+
const { queue, jobClass, status, limit, offset, } = req.query;
|
|
78
|
+
const result = await service.getJobs({
|
|
79
|
+
queue: queue,
|
|
80
|
+
jobClass: jobClass,
|
|
81
|
+
status: status,
|
|
82
|
+
limit: limit ? parseInt(limit) : undefined,
|
|
83
|
+
offset: offset ? parseInt(offset) : undefined,
|
|
84
|
+
});
|
|
85
|
+
res.json(result);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('Error fetching jobs:', error);
|
|
89
|
+
res.status(500).json({ error: 'Failed to fetch jobs' });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// API: Get single job details
|
|
93
|
+
router.get('/api/jobs/:id', async (req, res) => {
|
|
94
|
+
try {
|
|
95
|
+
const jobId = parseInt(req.params.id);
|
|
96
|
+
const job = await service.getJob(jobId);
|
|
97
|
+
if (!job) {
|
|
98
|
+
res.status(404).json({ error: 'Job not found' });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
res.json(job);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Error fetching job:', error);
|
|
105
|
+
res.status(500).json({ error: 'Failed to fetch job' });
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// API: Delete a job
|
|
109
|
+
router.delete('/api/jobs/:id', async (req, res) => {
|
|
110
|
+
try {
|
|
111
|
+
const jobId = parseInt(req.params.id);
|
|
112
|
+
const deleted = await service.deleteJob(jobId);
|
|
113
|
+
if (!deleted) {
|
|
114
|
+
res.status(404).json({ error: 'Job not found' });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
res.json({ success: true, message: 'Job deleted' });
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Error deleting job:', error);
|
|
121
|
+
res.status(500).json({ error: 'Failed to delete job' });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
// API: Retry a failed job
|
|
125
|
+
router.post('/api/jobs/:id/retry', async (req, res) => {
|
|
126
|
+
try {
|
|
127
|
+
const jobId = parseInt(req.params.id);
|
|
128
|
+
const retried = await service.retryJob(jobId);
|
|
129
|
+
if (!retried) {
|
|
130
|
+
res.status(404).json({ error: 'Job not found' });
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
res.json({ success: true, message: 'Job queued for retry' });
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('Error retrying job:', error);
|
|
137
|
+
res.status(500).json({ error: 'Failed to retry job' });
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// API: Get available queues
|
|
141
|
+
router.get('/api/queues', async (req, res) => {
|
|
142
|
+
try {
|
|
143
|
+
const queues = await service.getQueues();
|
|
144
|
+
res.json(queues);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('Error fetching queues:', error);
|
|
148
|
+
res.status(500).json({ error: 'Failed to fetch queues' });
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// API: Get available job classes
|
|
152
|
+
router.get('/api/job-classes', async (req, res) => {
|
|
153
|
+
try {
|
|
154
|
+
const jobClasses = await service.getJobClasses();
|
|
155
|
+
res.json(jobClasses);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
console.error('Error fetching job classes:', error);
|
|
159
|
+
res.status(500).json({ error: 'Failed to fetch job classes' });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return router;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":";;;AAkCA,0CAwJC;AA1LD,qCAAkE;AAElE,uCAA+D;AA0LtD,iGA1LA,0BAAgB,OA0LA;AAzLzB,mCAA2C;AAU3C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,eAAe,CAC7B,IAAU,EACV,UAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,0BAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAEpC,oCAAoC;IACpC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;QAC3F,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACrD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;oBACjD,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAExB,sBAAsB;IACtB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,GACP,GAAG,GAAG,CAAC,KAAK,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACnC,KAAK,EAAE,KAA2B;gBAClC,QAAQ,EAAE,QAA8B;gBACxC,MAAM,EAAE,MAA8D;gBACtE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAClF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QACtF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Pool } from 'pg';
|
|
2
|
+
export interface QueueStats {
|
|
3
|
+
total: number;
|
|
4
|
+
scheduled: number;
|
|
5
|
+
ready: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
errorRate: number;
|
|
8
|
+
avgErrorCount: number;
|
|
9
|
+
oldestJob: Date | null;
|
|
10
|
+
newestJob: Date | null;
|
|
11
|
+
totalByQueue: Array<{
|
|
12
|
+
queue: string;
|
|
13
|
+
count: number;
|
|
14
|
+
}>;
|
|
15
|
+
totalByClass: Array<{
|
|
16
|
+
jobClass: string;
|
|
17
|
+
count: number;
|
|
18
|
+
}>;
|
|
19
|
+
recentFailures: Array<{
|
|
20
|
+
id: number;
|
|
21
|
+
jobClass: string;
|
|
22
|
+
queue: string;
|
|
23
|
+
errorCount: number;
|
|
24
|
+
lastError: string;
|
|
25
|
+
runAt: Date;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
export interface Job {
|
|
29
|
+
id: number;
|
|
30
|
+
queue: string;
|
|
31
|
+
priority: number;
|
|
32
|
+
runAt: Date;
|
|
33
|
+
jobClass: string;
|
|
34
|
+
args: unknown[];
|
|
35
|
+
errorCount: number;
|
|
36
|
+
lastError?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface DashboardOptions {
|
|
39
|
+
title?: string;
|
|
40
|
+
basePath?: string;
|
|
41
|
+
refreshInterval?: number;
|
|
42
|
+
maxRecentFailures?: number;
|
|
43
|
+
}
|
|
44
|
+
export declare class DashboardService {
|
|
45
|
+
private pool;
|
|
46
|
+
private options;
|
|
47
|
+
constructor(pool: Pool, options?: DashboardOptions);
|
|
48
|
+
getStats(): Promise<QueueStats>;
|
|
49
|
+
getJobs(options?: {
|
|
50
|
+
queue?: string;
|
|
51
|
+
jobClass?: string;
|
|
52
|
+
status?: 'ready' | 'scheduled' | 'failed' | 'all';
|
|
53
|
+
limit?: number;
|
|
54
|
+
offset?: number;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
jobs: Job[];
|
|
57
|
+
total: number;
|
|
58
|
+
}>;
|
|
59
|
+
getJob(jobId: number): Promise<Job | null>;
|
|
60
|
+
deleteJob(jobId: number): Promise<boolean>;
|
|
61
|
+
retryJob(jobId: number): Promise<boolean>;
|
|
62
|
+
getQueues(): Promise<string[]>;
|
|
63
|
+
getJobClasses(): Promise<string[]>;
|
|
64
|
+
getOptions(): Required<DashboardOptions>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/dashboard/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,cAAc,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,IAAI,CAAC;KACb,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,gBAAqB;IAUhD,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IA2G/B,OAAO,CAAC,OAAO,GAAE;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAC;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoE1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IA2B1C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAczC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9B,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASxC,UAAU,IAAI,QAAQ,CAAC,gBAAgB,CAAC;CAGzC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DashboardService = void 0;
|
|
4
|
+
class DashboardService {
|
|
5
|
+
constructor(pool, options = {}) {
|
|
6
|
+
this.pool = pool;
|
|
7
|
+
this.options = {
|
|
8
|
+
title: options.title || 'Que Dashboard',
|
|
9
|
+
basePath: options.basePath || '/que',
|
|
10
|
+
refreshInterval: options.refreshInterval || 5000,
|
|
11
|
+
maxRecentFailures: options.maxRecentFailures || 50,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async getStats() {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
// Get total count
|
|
17
|
+
const totalResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs');
|
|
18
|
+
const total = parseInt(totalResult.rows[0].count);
|
|
19
|
+
// Get scheduled jobs (future run_at)
|
|
20
|
+
const scheduledResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE run_at > $1', [now]);
|
|
21
|
+
const scheduled = parseInt(scheduledResult.rows[0].count);
|
|
22
|
+
// Get ready jobs (past run_at)
|
|
23
|
+
const readyResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE run_at <= $1', [now]);
|
|
24
|
+
const ready = parseInt(readyResult.rows[0].count);
|
|
25
|
+
// Get failed jobs (error_count > 0)
|
|
26
|
+
const failedResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE error_count > 0');
|
|
27
|
+
const failed = parseInt(failedResult.rows[0].count);
|
|
28
|
+
// Calculate error rate
|
|
29
|
+
const errorRate = total > 0 ? (failed / total) * 100 : 0;
|
|
30
|
+
// Get average error count
|
|
31
|
+
const avgErrorResult = await this.pool.query('SELECT AVG(error_count) as avg FROM que_jobs WHERE error_count > 0');
|
|
32
|
+
const avgErrorCount = parseFloat(avgErrorResult.rows[0].avg) || 0;
|
|
33
|
+
// Get oldest and newest jobs
|
|
34
|
+
const oldestResult = await this.pool.query('SELECT run_at FROM que_jobs ORDER BY run_at ASC LIMIT 1');
|
|
35
|
+
const oldestJob = oldestResult.rows[0]?.run_at || null;
|
|
36
|
+
const newestResult = await this.pool.query('SELECT run_at FROM que_jobs ORDER BY run_at DESC LIMIT 1');
|
|
37
|
+
const newestJob = newestResult.rows[0]?.run_at || null;
|
|
38
|
+
// Get jobs by queue
|
|
39
|
+
const byQueueResult = await this.pool.query(`
|
|
40
|
+
SELECT queue, COUNT(*) as count
|
|
41
|
+
FROM que_jobs
|
|
42
|
+
GROUP BY queue
|
|
43
|
+
ORDER BY count DESC
|
|
44
|
+
`);
|
|
45
|
+
const totalByQueue = byQueueResult.rows.map(row => ({
|
|
46
|
+
queue: row.queue || '(default)',
|
|
47
|
+
count: parseInt(row.count),
|
|
48
|
+
}));
|
|
49
|
+
// Get jobs by class
|
|
50
|
+
const byClassResult = await this.pool.query(`
|
|
51
|
+
SELECT job_class, COUNT(*) as count
|
|
52
|
+
FROM que_jobs
|
|
53
|
+
GROUP BY job_class
|
|
54
|
+
ORDER BY count DESC
|
|
55
|
+
LIMIT 20
|
|
56
|
+
`);
|
|
57
|
+
const totalByClass = byClassResult.rows.map(row => ({
|
|
58
|
+
jobClass: row.job_class,
|
|
59
|
+
count: parseInt(row.count),
|
|
60
|
+
}));
|
|
61
|
+
// Get recent failures
|
|
62
|
+
const recentFailuresResult = await this.pool.query(`
|
|
63
|
+
SELECT job_id, job_class, queue, error_count, last_error, run_at
|
|
64
|
+
FROM que_jobs
|
|
65
|
+
WHERE error_count > 0
|
|
66
|
+
ORDER BY run_at DESC
|
|
67
|
+
LIMIT $1
|
|
68
|
+
`, [this.options.maxRecentFailures]);
|
|
69
|
+
const recentFailures = recentFailuresResult.rows.map(row => ({
|
|
70
|
+
id: parseInt(row.job_id),
|
|
71
|
+
jobClass: row.job_class,
|
|
72
|
+
queue: row.queue || '(default)',
|
|
73
|
+
errorCount: row.error_count,
|
|
74
|
+
lastError: row.last_error || '',
|
|
75
|
+
runAt: row.run_at,
|
|
76
|
+
}));
|
|
77
|
+
return {
|
|
78
|
+
total,
|
|
79
|
+
scheduled,
|
|
80
|
+
ready,
|
|
81
|
+
failed,
|
|
82
|
+
errorRate,
|
|
83
|
+
avgErrorCount,
|
|
84
|
+
oldestJob,
|
|
85
|
+
newestJob,
|
|
86
|
+
totalByQueue,
|
|
87
|
+
totalByClass,
|
|
88
|
+
recentFailures,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async getJobs(options = {}) {
|
|
92
|
+
const { queue, jobClass, status = 'all', limit = 50, offset = 0, } = options;
|
|
93
|
+
const whereConditions = [];
|
|
94
|
+
const params = [];
|
|
95
|
+
let paramIndex = 1;
|
|
96
|
+
if (queue !== undefined) {
|
|
97
|
+
whereConditions.push(`queue = $${paramIndex++}`);
|
|
98
|
+
params.push(queue);
|
|
99
|
+
}
|
|
100
|
+
if (jobClass) {
|
|
101
|
+
whereConditions.push(`job_class = $${paramIndex++}`);
|
|
102
|
+
params.push(jobClass);
|
|
103
|
+
}
|
|
104
|
+
const now = new Date();
|
|
105
|
+
if (status === 'ready') {
|
|
106
|
+
whereConditions.push(`run_at <= $${paramIndex++}`);
|
|
107
|
+
params.push(now);
|
|
108
|
+
}
|
|
109
|
+
else if (status === 'scheduled') {
|
|
110
|
+
whereConditions.push(`run_at > $${paramIndex++}`);
|
|
111
|
+
params.push(now);
|
|
112
|
+
}
|
|
113
|
+
else if (status === 'failed') {
|
|
114
|
+
whereConditions.push('error_count > 0');
|
|
115
|
+
}
|
|
116
|
+
const whereClause = whereConditions.length > 0
|
|
117
|
+
? `WHERE ${whereConditions.join(' AND ')}`
|
|
118
|
+
: '';
|
|
119
|
+
// Get total count
|
|
120
|
+
const countQuery = `SELECT COUNT(*) as count FROM que_jobs ${whereClause}`;
|
|
121
|
+
const countResult = await this.pool.query(countQuery, params);
|
|
122
|
+
const total = parseInt(countResult.rows[0].count);
|
|
123
|
+
// Get jobs
|
|
124
|
+
params.push(limit, offset);
|
|
125
|
+
const jobsQuery = `
|
|
126
|
+
SELECT job_id, queue, priority, run_at, job_class, args, error_count, last_error
|
|
127
|
+
FROM que_jobs
|
|
128
|
+
${whereClause}
|
|
129
|
+
ORDER BY priority ASC, run_at ASC, job_id ASC
|
|
130
|
+
LIMIT $${paramIndex++} OFFSET $${paramIndex++}
|
|
131
|
+
`;
|
|
132
|
+
const jobsResult = await this.pool.query(jobsQuery, params);
|
|
133
|
+
const jobs = jobsResult.rows.map(row => ({
|
|
134
|
+
id: parseInt(row.job_id),
|
|
135
|
+
queue: row.queue,
|
|
136
|
+
priority: row.priority,
|
|
137
|
+
runAt: row.run_at,
|
|
138
|
+
jobClass: row.job_class,
|
|
139
|
+
args: row.args,
|
|
140
|
+
errorCount: row.error_count,
|
|
141
|
+
lastError: row.last_error || undefined,
|
|
142
|
+
}));
|
|
143
|
+
return { jobs, total };
|
|
144
|
+
}
|
|
145
|
+
async getJob(jobId) {
|
|
146
|
+
const result = await this.pool.query(`
|
|
147
|
+
SELECT job_id, queue, priority, run_at, job_class, args, error_count, last_error
|
|
148
|
+
FROM que_jobs
|
|
149
|
+
WHERE job_id = $1
|
|
150
|
+
`, [jobId]);
|
|
151
|
+
if (result.rows.length === 0) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const row = result.rows[0];
|
|
155
|
+
return {
|
|
156
|
+
id: parseInt(row.job_id),
|
|
157
|
+
queue: row.queue,
|
|
158
|
+
priority: row.priority,
|
|
159
|
+
runAt: row.run_at,
|
|
160
|
+
jobClass: row.job_class,
|
|
161
|
+
args: row.args,
|
|
162
|
+
errorCount: row.error_count,
|
|
163
|
+
lastError: row.last_error || undefined,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async deleteJob(jobId) {
|
|
167
|
+
const result = await this.pool.query('DELETE FROM que_jobs WHERE job_id = $1', [jobId]);
|
|
168
|
+
return (result.rowCount ?? 0) > 0;
|
|
169
|
+
}
|
|
170
|
+
async retryJob(jobId) {
|
|
171
|
+
const result = await this.pool.query(`
|
|
172
|
+
UPDATE que_jobs
|
|
173
|
+
SET error_count = 0,
|
|
174
|
+
last_error = NULL,
|
|
175
|
+
run_at = NOW()
|
|
176
|
+
WHERE job_id = $1
|
|
177
|
+
`, [jobId]);
|
|
178
|
+
return (result.rowCount ?? 0) > 0;
|
|
179
|
+
}
|
|
180
|
+
async getQueues() {
|
|
181
|
+
const result = await this.pool.query(`
|
|
182
|
+
SELECT DISTINCT queue
|
|
183
|
+
FROM que_jobs
|
|
184
|
+
ORDER BY queue
|
|
185
|
+
`);
|
|
186
|
+
return result.rows.map(row => row.queue || '(default)');
|
|
187
|
+
}
|
|
188
|
+
async getJobClasses() {
|
|
189
|
+
const result = await this.pool.query(`
|
|
190
|
+
SELECT DISTINCT job_class
|
|
191
|
+
FROM que_jobs
|
|
192
|
+
ORDER BY job_class
|
|
193
|
+
`);
|
|
194
|
+
return result.rows.map(row => row.job_class);
|
|
195
|
+
}
|
|
196
|
+
getOptions() {
|
|
197
|
+
return this.options;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.DashboardService = DashboardService;
|
|
201
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/dashboard/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/dashboard/views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CA6wB5E"}
|