You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cvm/src/routes/tasks.js

115 lines
3.2 KiB
JavaScript

'use strict';
const sseChannel = require("@joepie91/sse-channel");
const errors = require("../errors");
// const tagWebsocket = require("lib/tag-websocket");
const tagMessage = require("../tag-message");
// const websocketTracker = require("lib/websockets/tracker");
// const websocketDeduplicator = require("lib/deduplicator");
const fakeTask = require("lib/tasks/fake-task");
const authMiddleware = require("../auth/middleware");
module.exports = function({taskTracker}) {
let router = require("express-promise-router")();
// /* We manually create a deduplicator, so that we can share it across all the user-level websocket trackers. This does mean that we have to manually remove disconnected clients from our shared deduplicator. */
// let deduplicator = websocketDeduplicator();
// let allClients = websocketTracker({deduplicator: deduplicator});
// let userClients = websocketTracker({deduplicator: deduplicator, namespaced: true});
// let roleClients = websocketTracker({deduplicator: deduplicator, namespaced: true});
// /* The adminClient tracker is a special case, and can use its own internal deduplicator if needed */
// let adminClients = websocketTracker();
// function emitTask(task, message) {
// task.userIds.forEach((userId) => {
// userClients.emit(userId, message);
// });
// task.roleIds.forEach((roleId) => {
// roleClients.emit(roleId, message);
// });
// adminClients.emit(message);
// }
taskTracker.on("newTask", (task) => {
emitTask(task, tagMessage({
// FIXME: Task state? pending/started/paused/cancelled/etc.
taskId: task.id,
type: "newTask",
name: task.name,
progress: task.progress,
started: task.started,
lastUpdated: task.lastUpdated,
lastOperation: task.lastOperation
}));
});
taskTracker.on("progress", (task, progress, lastOperation) => {
emitTask(task, tagMessage({
taskId: task.id,
type: "progress",
progress: progress,
lastOperation: lastOperation
}));
});
taskTracker.on("completed", (task) => {
emitTask(tagMessage({
taskId: task.id,
type: "completed"
}));
});
// FIXME: Initial task list
router.get("/feed", authMiddleware.isAuthenticated, (req, res) => {
// FIXME: Auth user?
if (req.session.user == null) {
throw new errors.UnauthorizedError("You must be authenticated to obtain a task feed");
} else {
// tagWebsocket(ws);
// // We ignore client messages for now
// allClients.add(client);
// userClients.add(req.session.user.id, client);
// req.session.user.roles.forEach((role) => {
// roleClients.add(role.id, client);
// });
// ws.on("close", () => {
// allClients.remove(client);
// userClients.remove(client);
// roleClients.remove(client);
// deduplicator.forgetClient(client);
// });
}
});
router.get("/feed/all", authMiddleware.isAdministrator, (req, res) => {
// FIXME: Require admin access
tagWebsocket(ws);
// We ignore client messages for now
adminClients.add(client);
ws.on("close", () => {
adminClients.remove(client);
});
});
router.get("/fake-task", (req, res) => {
let task = fakeTask(5000);
addTask("Fake Task", task, [req.session.user.id], [], {});
res.send("Fake task added!");
});
return router;
}