diff --git a/ee/utilities/server.js b/ee/utilities/server.js index 327a664a0..480a2b27e 100644 --- a/ee/utilities/server.js +++ b/ee/utilities/server.js @@ -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); diff --git a/ee/utilities/servers/websocket-cluster.js b/ee/utilities/servers/websocket-cluster.js index 57ba2ab6c..6dd69a4bc 100644 --- a/ee/utilities/servers/websocket-cluster.js +++ b/ee/utilities/servers/websocket-cluster.js @@ -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) { diff --git a/ee/utilities/servers/websocket.js b/ee/utilities/servers/websocket.js index 8c34bd91a..dac389fa8 100644 --- a/ee/utilities/servers/websocket.js +++ b/ee/utilities/servers/websocket.js @@ -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 } }; \ No newline at end of file diff --git a/ee/utilities/utils/helper-ee.js b/ee/utilities/utils/helper-ee.js index 2ea57a421..b29fbffef 100644 --- a/ee/utilities/utils/helper-ee.js +++ b/ee/utilities/utils/helper-ee.js @@ -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 }; \ No newline at end of file diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 27e8fba4a..3587d9ad8 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -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) { diff --git a/utilities/utils/helper.js b/utilities/utils/helper.js index 10c03c830..ff7d560f7 100644 --- a/utilities/utils/helper.js +++ b/utilities/utils/helper.js @@ -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,