* feat(assist): removed legacy endpoints * feat(assist): added in-memory cache * feat(assist): fixed 'string, not object' issue * feat(assist): reafactored socketsLiveBySession method * feat(assist): rewrote autocomplete * feat(assist): fixed issue with empty session * feat(assist): removed copy/paste code * feat(assist): added ee solo mode
160 lines
No EOL
4.6 KiB
JavaScript
160 lines
No EOL
4.6 KiB
JavaScript
const {
|
|
hasFilters,
|
|
hasQuery,
|
|
isValidSession,
|
|
sortPaginate,
|
|
getValidAttributes,
|
|
uniqueAutocomplete
|
|
} = require("./helper");
|
|
const {
|
|
extractProjectKeyFromRequest,
|
|
extractSessionIdFromRequest,
|
|
extractPayloadFromRequest,
|
|
} = require("./extractors");
|
|
const {
|
|
RecordRequestDuration,
|
|
IncreaseTotalRequests
|
|
} = require('../utils/metrics');
|
|
const {
|
|
GetRoomInfo,
|
|
GetRooms,
|
|
GetSessions,
|
|
} = require('../utils/rooms');
|
|
|
|
const debug_log = process.env.debug === "1";
|
|
|
|
const respond = function (req, res, data) {
|
|
console.log("responding with data: ", data)
|
|
let result = {data}
|
|
if (process.env.uws !== "true") {
|
|
res.statusCode = 200;
|
|
res.setHeader('Content-Type', 'application/json');
|
|
res.end(JSON.stringify(result));
|
|
} else {
|
|
res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(JSON.stringify(result));
|
|
}
|
|
const duration = performance.now() - req.startTs;
|
|
IncreaseTotalRequests();
|
|
RecordRequestDuration(req.method.toLowerCase(), res.handlerName, 200, duration/1000.0);
|
|
}
|
|
|
|
const getParticularSession = function (sessionId, filters) {
|
|
const sessInfo = GetRoomInfo(sessionId);
|
|
if (!sessInfo) {
|
|
return null;
|
|
}
|
|
if (!hasFilters(filters)) {
|
|
return sessInfo;
|
|
}
|
|
if (isValidSession(sessInfo, filters.filter)) {
|
|
return sessInfo;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
const getAllSessions = function (projectKey, filters, onlineOnly= false) {
|
|
const sessions = [];
|
|
const allRooms = onlineOnly ? GetSessions(projectKey) : GetRooms(projectKey);
|
|
|
|
for (let sessionId of allRooms) {
|
|
let sessInfo = GetRoomInfo(sessionId);
|
|
if (!sessInfo) {
|
|
continue;
|
|
}
|
|
if (!hasFilters(filters)) {
|
|
sessions.push(sessInfo);
|
|
continue;
|
|
}
|
|
if (isValidSession(sessInfo, filters.filter)) {
|
|
sessions.push(sessInfo);
|
|
}
|
|
}
|
|
return sessions
|
|
}
|
|
|
|
// Sort by projectKey
|
|
const socketsListByProject = async function (req, res) {
|
|
debug_log && console.log("[WS]looking for available sessions");
|
|
res.handlerName = 'socketsListByProject';
|
|
|
|
const _projectKey = extractProjectKeyFromRequest(req);
|
|
const _sessionId = extractSessionIdFromRequest(req);
|
|
const filters = await extractPayloadFromRequest(req, res);
|
|
|
|
// find a particular session
|
|
if (_sessionId) {
|
|
return respond(req, res, getParticularSession(_sessionId, filters));
|
|
}
|
|
|
|
// find all sessions for a project
|
|
const sessions = getAllSessions(_projectKey, filters);
|
|
|
|
// send response
|
|
respond(req, res, sortPaginate(sessions, filters));
|
|
}
|
|
|
|
// Sort by projectKey
|
|
const socketsLiveByProject = async function (req, res) {
|
|
debug_log && console.log("[WS]looking for available LIVE sessions");
|
|
res.handlerName = 'socketsLiveByProject';
|
|
|
|
const _projectKey = extractProjectKeyFromRequest(req);
|
|
const _sessionId = extractSessionIdFromRequest(req);
|
|
const filters = await extractPayloadFromRequest(req, res);
|
|
|
|
// find a particular session
|
|
if (_sessionId) {
|
|
return respond(req, res, getParticularSession(_sessionId, filters));
|
|
}
|
|
|
|
// find all sessions for a project
|
|
const sessions = getAllSessions(_projectKey, filters, true);
|
|
|
|
// send response
|
|
respond(req, res, sortPaginate(sessions, filters));
|
|
}
|
|
|
|
// Sort by roomID (projectKey+sessionId)
|
|
const socketsLiveBySession = async function (req, res) {
|
|
debug_log && console.log("[WS]looking for LIVE session");
|
|
res.handlerName = 'socketsLiveBySession';
|
|
|
|
const _sessionId = extractSessionIdFromRequest(req);
|
|
const filters = await extractPayloadFromRequest(req, res);
|
|
|
|
// find a particular session
|
|
if (_sessionId) {
|
|
return respond(req, res, getParticularSession(_sessionId, filters));
|
|
}
|
|
return respond(req, res, null);
|
|
}
|
|
|
|
// Sort by projectKey
|
|
const autocomplete = async function (req, res) {
|
|
debug_log && console.log("[WS]autocomplete");
|
|
res.handlerName = 'autocomplete';
|
|
|
|
const _projectKey = extractProjectKeyFromRequest(req);
|
|
const filters = await extractPayloadFromRequest(req);
|
|
let results = [];
|
|
if (!hasQuery(filters)) {
|
|
return respond(req, res, results);
|
|
}
|
|
let allSessions = GetSessions(_projectKey);
|
|
for (let sessionId of allSessions) {
|
|
let sessInfo = GetRoomInfo(sessionId);
|
|
if (!sessInfo) {
|
|
continue;
|
|
}
|
|
results = [...results, ...getValidAttributes(sessInfo, filters.query)];
|
|
}
|
|
respond(req, res, uniqueAutocomplete(results));
|
|
}
|
|
|
|
module.exports = {
|
|
respond,
|
|
socketsListByProject,
|
|
socketsLiveByProject,
|
|
socketsLiveBySession,
|
|
autocomplete
|
|
} |