feat(assist): autocomplete
This commit is contained in:
parent
8510949d29
commit
38be085622
6 changed files with 102 additions and 13 deletions
|
|
@ -84,6 +84,7 @@ if (process.env.uws !== "true") {
|
|||
uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey`, uWrapper(socket.handlers.socketsLiveByProject));
|
||||
uapp.post(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey`, uWrapper(socket.handlers.socketsLiveByProject));
|
||||
uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey/:sessionId`, uWrapper(socket.handlers.socketsLiveByProject));
|
||||
uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey/autocomplete`, uWrapper(socket.handlers.autocomplete));
|
||||
|
||||
|
||||
socket.start(uapp);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ const {extractPeerId, hasFilters, isValidSession, sortPaginate} = require('../ut
|
|||
const {
|
||||
extractProjectKeyFromRequest,
|
||||
extractSessionIdFromRequest,
|
||||
extractFiltersFromRequest
|
||||
extractPayloadFromRequest
|
||||
} = require('../utils/helper-ee');
|
||||
const {geoip} = require('../utils/geoIP');
|
||||
const {createAdapter} = require("@socket.io/redis-adapter");
|
||||
|
|
@ -81,7 +81,7 @@ const respond = function (res, data) {
|
|||
|
||||
const socketsList = async function (req, res) {
|
||||
debug && console.log("[WS]looking for all available sessions");
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
|
|
@ -111,7 +111,7 @@ const socketsListByProject = async function (req, res) {
|
|||
debug && console.log("[WS]looking for available sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let _sessionId = extractSessionIdFromRequest(req);
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -139,7 +139,7 @@ wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject);
|
|||
|
||||
const socketsLive = async function (req, res) {
|
||||
debug && console.log("[WS]looking for all available LIVE sessions");
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -170,7 +170,7 @@ const socketsLiveByProject = async function (req, res) {
|
|||
debug && console.log("[WS]looking for available LIVE sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let _sessionId = extractSessionIdFromRequest(req);
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -198,6 +198,29 @@ wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject);
|
|||
wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject);
|
||||
wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject);
|
||||
|
||||
const autocomplete = async function (req, res) {
|
||||
debug && console.log("[WS]looking for available LIVE sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let filters = extractPayloadFromRequest(req);
|
||||
let results = [];
|
||||
if (filters.query && Object.keys(filters.query).length > 0) {
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
let {projectKey} = extractPeerId(peerId);
|
||||
if (projectKey === _projectKey) {
|
||||
let connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
if (item.handshake.query.identity === IDENTITIES.session && item.handshake.query.sessionInfo) {
|
||||
results = [...results, ...getValidAttributes(item.handshake.query.sessionInfo, filters.query)];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
respond(res, results);
|
||||
}
|
||||
wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete);
|
||||
|
||||
const findSessionSocketId = async (io, peerId) => {
|
||||
const connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ const {extractPeerId, hasFilters, isValidSession, sortPaginate} = require('../ut
|
|||
const {
|
||||
extractProjectKeyFromRequest,
|
||||
extractSessionIdFromRequest,
|
||||
extractFiltersFromRequest
|
||||
extractPayloadFromRequest
|
||||
} = require('../utils/helper-ee');
|
||||
const {geoip} = require('../utils/geoIP');
|
||||
const wsRouter = express.Router();
|
||||
|
|
@ -64,7 +64,7 @@ const respond = function (res, data) {
|
|||
|
||||
const socketsList = async function (req, res) {
|
||||
debug && console.log("[WS]looking for all available sessions");
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -93,7 +93,7 @@ const socketsListByProject = async function (req, res) {
|
|||
debug && console.log("[WS]looking for available sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let _sessionId = extractSessionIdFromRequest(req);
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -121,7 +121,7 @@ wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject);
|
|||
|
||||
const socketsLive = async function (req, res) {
|
||||
debug && console.log("[WS]looking for all available LIVE sessions");
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -151,7 +151,7 @@ const socketsLiveByProject = async function (req, res) {
|
|||
debug && console.log("[WS]looking for available LIVE sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let _sessionId = extractSessionIdFromRequest(req);
|
||||
let filters = await extractFiltersFromRequest(req, res);
|
||||
let filters = await extractPayloadFromRequest(req, res);
|
||||
let liveSessions = {};
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
|
|
@ -178,6 +178,29 @@ wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject);
|
|||
wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject);
|
||||
wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject);
|
||||
|
||||
const autocomplete = async function (req, res) {
|
||||
debug && console.log("[WS]looking for available LIVE sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let filters = extractPayloadFromRequest(req);
|
||||
let results = [];
|
||||
if (filters.query && Object.keys(filters.query).length > 0) {
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
let {projectKey} = extractPeerId(peerId);
|
||||
if (projectKey === _projectKey) {
|
||||
let connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
if (item.handshake.query.identity === IDENTITIES.session && item.handshake.query.sessionInfo) {
|
||||
results = [...results, ...getValidAttributes(item.handshake.query.sessionInfo, filters.query)];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
respond(res, results);
|
||||
}
|
||||
wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete);
|
||||
|
||||
const findSessionSocketId = async (io, peerId) => {
|
||||
const connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
|
|
@ -361,6 +384,7 @@ module.exports = {
|
|||
socketsList,
|
||||
socketsListByProject,
|
||||
socketsLive,
|
||||
socketsLiveByProject
|
||||
socketsLiveByProject,
|
||||
autocomplete
|
||||
}
|
||||
};
|
||||
|
|
@ -50,7 +50,7 @@ const extractSessionIdFromRequest = function (req) {
|
|||
}
|
||||
return undefined;
|
||||
}
|
||||
const extractFiltersFromRequest = async function (req, res) {
|
||||
const extractPayloadFromRequest = async function (req, res) {
|
||||
let filters = {};
|
||||
if (process.env.uws === "true") {
|
||||
if (req.getQuery("userId")) {
|
||||
|
|
@ -69,5 +69,5 @@ const extractFiltersFromRequest = async function (req, res) {
|
|||
module.exports = {
|
||||
extractProjectKeyFromRequest,
|
||||
extractSessionIdFromRequest,
|
||||
extractFiltersFromRequest
|
||||
extractPayloadFromRequest
|
||||
};
|
||||
|
|
@ -161,6 +161,29 @@ const socketsLiveByProject = async function (req, res) {
|
|||
wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject);
|
||||
wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject);
|
||||
|
||||
const autocomplete = async function (req, res) {
|
||||
debug && console.log("[WS]looking for available LIVE sessions");
|
||||
let _projectKey = extractProjectKeyFromRequest(req);
|
||||
let filters = extractPayloadFromRequest(req);
|
||||
let results = [];
|
||||
if (filters.query && Object.keys(filters.query).length > 0) {
|
||||
let rooms = await getAvailableRooms();
|
||||
for (let peerId of rooms) {
|
||||
let {projectKey} = extractPeerId(peerId);
|
||||
if (projectKey === _projectKey) {
|
||||
let connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
if (item.handshake.query.identity === IDENTITIES.session && item.handshake.query.sessionInfo) {
|
||||
results = [...results, ...getValidAttributes(item.handshake.query.sessionInfo, filters.query)];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
respond(res, results);
|
||||
}
|
||||
wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete);
|
||||
|
||||
const findSessionSocketId = async (io, peerId) => {
|
||||
const connected_sockets = await io.in(peerId).fetchSockets();
|
||||
for (let item of connected_sockets) {
|
||||
|
|
|
|||
|
|
@ -69,6 +69,23 @@ const isValidSession = function (sessionInfo, filters) {
|
|||
}
|
||||
return foundAll;
|
||||
}
|
||||
const getValidAttributes = function (sessionInfo, query) {
|
||||
let matches = [];
|
||||
let deduplicate = [];
|
||||
for (const [skey, svalue] of Object.entries(sessionInfo)) {
|
||||
if (svalue !== undefined && svalue !== null) {
|
||||
if (svalue.constructor === Object) {
|
||||
matches = [...matches, ...getValidAttributes(svalue, query)]
|
||||
} else if ((query.key === undefined || skey.toLowerCase() === query.key.toLowerCase())
|
||||
&& svalue.toLowerCase().indexOf(query.value.toLowerCase()) >= 0
|
||||
&& deduplicate.indexOf(skey + '_' + svalue) < 0) {
|
||||
matches.push({"type": skey, "value": svalue});
|
||||
deduplicate.push(skey + '_' + svalue);
|
||||
}
|
||||
}
|
||||
}
|
||||
return matches;
|
||||
}
|
||||
const hasFilters = function (filters) {
|
||||
return filters && filters.filter && Object.keys(filters.filter).length > 0;
|
||||
}
|
||||
|
|
@ -129,6 +146,7 @@ const sortPaginate = function (list, filters) {
|
|||
module.exports = {
|
||||
extractPeerId,
|
||||
request_logger,
|
||||
getValidAttributes,
|
||||
extractProjectKeyFromRequest,
|
||||
extractSessionIdFromRequest,
|
||||
isValidSession,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue