68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
const express = require("express");
|
|
var crypto = require('crypto');
|
|
const { finished } = require("stream");
|
|
|
|
const app = express();
|
|
|
|
const PORT = 6968;
|
|
|
|
let jobs = {
|
|
queued: {},
|
|
waiting: {},
|
|
finished: {}
|
|
}
|
|
|
|
app.use(express.json());
|
|
|
|
app.get('/', (req, res) => {
|
|
res.send('Job handling server')
|
|
})
|
|
|
|
app.get('/jobs', (req, res) => {
|
|
let queued = Object.values(jobs['queued']);
|
|
let waiting = Object.values(jobs['waiting']);
|
|
let finished = Object.values(jobs['finished']);
|
|
|
|
res.json(
|
|
{
|
|
'jobs': {
|
|
'queued': { 'count': queued.length, 'items': queued },
|
|
'waiting': { 'count': waiting.length, 'items': waiting },
|
|
'finished': { 'count': finished.length, 'items': finished },
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
|
|
app.post("/jobs", (req, res) => {
|
|
const data = req.body;
|
|
let jobId = crypto.createHash('md5').update(JSON.stringify(req.body)).digest('hex');
|
|
|
|
if (jobs['queued'][jobId] || jobs['waiting'][jobId]) {
|
|
res.status(409).json({ 'message': 'Request already queued or processing!', 'jobId': jobId });
|
|
return;
|
|
}
|
|
|
|
jobs['queued'][jobId] = req.body;
|
|
jobs['queued'][jobId]['jobId'] = jobId;
|
|
console.log(`Queued Job ${jobId}`);
|
|
res.json({ 'jobId': jobId });
|
|
});
|
|
|
|
app.get("/batch", async (req, res) => {
|
|
let queued = Object.values(jobs['queued']);
|
|
const batchSize = req.query.size || Math.min(queued.length, 10);
|
|
let assignedJobs = []
|
|
for (let index = 0; index < batchSize; index++) {
|
|
let job = queued[index]
|
|
assignedJobs.push(job);
|
|
jobs['waiting'][job['jobId']] = job;
|
|
delete jobs['queued'][job['jobId']];
|
|
console.log(`Handed out Job ${job['jobId']}`);
|
|
}
|
|
res.json({ 'count': assignedJobs.length, 'jobs': assignedJobs });
|
|
});
|
|
app.listen(PORT, () => {
|
|
console.log("Job Server running")
|
|
}) |