* feat(assist): splitted socket methods in ee/websockets * feat(assist): splitted socket methods in ee/websockets-cluster * feat(assist): moved socket handlers to separate file * feat(assist): changed the way how to get ws server * feat(assist): use method to get io server instead of global object * feat(assist): removed duplicated code from ee assists * feat(assist): removed copy-paste http handlers * feat(assist): added getServer call for some http handlers * feat(assist): added creds=true to cors settings * feat(backend): added debug log flag to assist stats
122 lines
4.3 KiB
JavaScript
122 lines
4.3 KiB
JavaScript
const express = require('express');
|
|
const {
|
|
extractPeerId,
|
|
hasFilters,
|
|
isValidSession,
|
|
sortPaginate,
|
|
} = require('../utils/helper');
|
|
const {
|
|
extractPayloadFromRequest,
|
|
getAvailableRooms
|
|
} = require('../utils/helper-ee');
|
|
const {
|
|
IDENTITIES,
|
|
socketConnexionTimeout,
|
|
authorizer
|
|
} = require('../utils/assistHelper');
|
|
const {
|
|
createSocketIOServer
|
|
} = require('../utils/wsServer');
|
|
const {
|
|
onConnect
|
|
} = require('../utils/socketHandlers');
|
|
const {
|
|
respond,
|
|
socketsList,
|
|
socketsListByProject,
|
|
socketsLiveByProject,
|
|
autocomplete
|
|
} = require('../utils/httpHandlers');
|
|
|
|
const wsRouter = express.Router();
|
|
|
|
let io;
|
|
const debug_log = process.env.debug === "1";
|
|
|
|
const socketsLive = async function (req, res) {
|
|
debug_log && console.log("[WS]looking for all available LIVE sessions");
|
|
let filters = await extractPayloadFromRequest(req, res);
|
|
let withFilters = hasFilters(filters);
|
|
let liveSessionsPerProject = {};
|
|
let rooms = await getAvailableRooms(io);
|
|
for (let roomId of rooms.keys()) {
|
|
let {projectKey} = extractPeerId(roomId);
|
|
if (projectKey !== undefined) {
|
|
let connected_sockets = await io.in(roomId).fetchSockets();
|
|
for (let item of connected_sockets) {
|
|
if (item.handshake.query.identity === IDENTITIES.session) {
|
|
liveSessionsPerProject[projectKey] = liveSessionsPerProject[projectKey] || new Set();
|
|
if (withFilters) {
|
|
if (item.handshake.query.sessionInfo && isValidSession(item.handshake.query.sessionInfo, filters.filter)) {
|
|
liveSessionsPerProject[projectKey].add(item.handshake.query.sessionInfo);
|
|
}
|
|
} else {
|
|
liveSessionsPerProject[projectKey].add(item.handshake.query.sessionInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let liveSessions = {};
|
|
liveSessionsPerProject.forEach((sessions, projectId) => {
|
|
liveSessions[projectId] = Array.from(sessions);
|
|
});
|
|
respond(res, sortPaginate(liveSessions, filters));
|
|
}
|
|
|
|
wsRouter.get(`/sockets-list`, socketsList);
|
|
wsRouter.post(`/sockets-list`, socketsList);
|
|
wsRouter.get(`/sockets-list/:projectKey/autocomplete`, autocomplete);
|
|
wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject);
|
|
wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject);
|
|
wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject);
|
|
|
|
wsRouter.get(`/sockets-live`, socketsLive);
|
|
wsRouter.post(`/sockets-live`, socketsLive);
|
|
wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete);
|
|
wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject);
|
|
wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject);
|
|
wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject);
|
|
|
|
module.exports = {
|
|
wsRouter,
|
|
start: (server, prefix) => {
|
|
io = createSocketIOServer(server, prefix);
|
|
io.use(async (socket, next) => await authorizer.check(socket, next));
|
|
io.on('connection', (socket) => onConnect(socket));
|
|
|
|
console.log("WS server started");
|
|
setInterval(async (io) => {
|
|
try {
|
|
let count = 0;
|
|
const rooms = await getAvailableRooms(io);
|
|
console.log(` ====== Rooms: ${rooms.size} ====== `);
|
|
const arr = Array.from(rooms);
|
|
const filtered = arr.filter(room => !room[1].has(room[0]));
|
|
for (let i of filtered) {
|
|
let {projectKey, sessionId} = extractPeerId(i[0]);
|
|
if (projectKey !== null && sessionId !== null) {
|
|
count++;
|
|
}
|
|
}
|
|
console.log(` ====== Valid Rooms: ${count} ====== `);
|
|
if (debug_log) {
|
|
for (let item of filtered) {
|
|
console.log(`Room: ${item[0]} connected: ${item[1].size}`);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
}, 30000, io);
|
|
|
|
socketConnexionTimeout(io);
|
|
},
|
|
handlers: {
|
|
socketsList,
|
|
socketsListByProject,
|
|
socketsLive,
|
|
socketsLiveByProject,
|
|
autocomplete
|
|
}
|
|
};
|