-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdashboard.js
More file actions
93 lines (81 loc) · 2.46 KB
/
Copy pathdashboard.js
File metadata and controls
93 lines (81 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import express from 'express'
import path from 'node:path'
const target = ['..', 'btt-dashboard', 'dist']
function apiV1({ bfx, queue }) {
const router = express.Router()
router.get('/health-check', (req, res) => {
return res.json({ status: 'ok' })
})
router.get('/queue/stats', (req, res) => {
res.json({
isPaused: queue.isPaused,
isSaturated: queue.isSaturated,
pending: queue.pending,
waiting: queue.size,
concurrency: queue.concurrency,
})
})
router.get('/queue/events', (req, res) => {
// Set up Server-Sent Events headers
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
res.setHeader('Connection', 'keep-alive')
res.setHeader('Access-Control-Allow-Origin', '*')
// Send initial connection confirmation
res.write('data: {"type":"connected"}\n\n')
// Create event handlers
const handlers = {
active: () => {
res.write(
`data: ${JSON.stringify({ type: 'active', message: `Size: ${queue.size} Pending: ${queue.pending}` })}\n\n`
)
},
add: (event) => {
res.write(`data: ${JSON.stringify({ type: 'add', ...event })}\n\n`)
},
next: () => {
res.write(`data: ${JSON.stringify({ type: 'next' })}\n\n`)
},
completed: () => {
res.write(`data: ${JSON.stringify({ type: 'completed' })}\n\n`)
},
error: (error) => {
res.write(
`data: ${JSON.stringify({ type: 'error', message: error?.message || String(error) })}\n\n`
)
},
idle: () => {
res.write(`data: ${JSON.stringify({ type: 'idle' })}\n\n`)
},
}
// Register event listeners
Object.entries(handlers).forEach(([event, handler]) => {
queue.on(event, handler)
})
// Clean up on client disconnect
req.on('close', () => {
Object.entries(handlers).forEach(([event, handler]) => {
queue.off(event, handler)
})
res.end()
})
})
router.post('/ws/reconnect', (req, res) => {
queue
.add(() => bfx.setup())
.then(() => res.json({ status: 'ok' }))
.catch((err) => res.status(500).json({ status: err.toString() }))
})
return router
}
export function setupDashboard({
host = 'localhost',
port = 8000,
bfx,
queue,
}) {
const app = express()
app.use('/api/v1', apiV1({ bfx, queue }))
app.use(express.static(path.join(import.meta.dirname, ...target)))
return app.listen(port, host)
}