diff --git a/packages/api/src/controllers/serverConnections.js b/packages/api/src/controllers/serverConnections.js index bbb058c5f..17c7154ef 100644 --- a/packages/api/src/controllers/serverConnections.js +++ b/packages/api/src/controllers/serverConnections.js @@ -8,6 +8,7 @@ const lock = new AsyncLock(); module.exports = { opened: [], closed: {}, + lastPinged: {}, handle_databases(conid, { databases }) { const existing = this.opened.find(x => x.conid == conid); @@ -88,7 +89,12 @@ module.exports = { ping_meta: 'post', async ping({ connections }) { await Promise.all( - connections.map(async conid => { + _.uniq(connections).map(async conid => { + const last = this.lastPinged[conid]; + if (last && new Date().getTime() - last < 30 * 1000) { + return Promise.resolve(); + } + this.lastPinged[conid] = new Date().getTime(); const opened = await this.ensureOpened(conid); opened.subprocess.send({ msgtype: 'ping' }); }) diff --git a/packages/web/src/appobj/ConnectionAppObject.js b/packages/web/src/appobj/ConnectionAppObject.js index b13313b26..4e5c7c3b0 100644 --- a/packages/web/src/appobj/ConnectionAppObject.js +++ b/packages/web/src/appobj/ConnectionAppObject.js @@ -40,7 +40,7 @@ function Menu({ data }) { setOpenedConnections(list => list.filter(x => x != data._id)); }; const handleConnect = () => { - setOpenedConnections(list => [...list, data._id]); + setOpenedConnections(list => _.uniq([...list, data._id])); }; return ( <> @@ -72,7 +72,7 @@ function ConnectionAppObject({ data, commonProps }) { const extensions = useExtensions(); const isBold = _.get(currentDatabase, 'connection._id') == _id; - const onClick = () => setOpenedConnections(c => [...c, _id]); + const onClick = () => setOpenedConnections(c => _.uniq([...c, _id])); let statusIcon = null; let statusTitle = null; diff --git a/packages/web/src/utility/ConnectionsPinger.js b/packages/web/src/utility/ConnectionsPinger.js index 0af32169a..67784ca45 100644 --- a/packages/web/src/utility/ConnectionsPinger.js +++ b/packages/web/src/utility/ConnectionsPinger.js @@ -7,9 +7,11 @@ export default function ConnectionsPinger({ children }) { const openedConnections = useOpenedConnections(); const currentDatabase = useCurrentDatabase(); - const doPing = () => { + const doServerPing = () => { axios.post('server-connections/ping', { connections: openedConnections }); + }; + const doDatabasePing = () => { const database = _.get(currentDatabase, 'name'); const conid = _.get(currentDatabase, 'connection._id'); if (conid && database) { @@ -18,9 +20,16 @@ export default function ConnectionsPinger({ children }) { }; React.useEffect(() => { - doPing(); - const handle = window.setInterval(doPing, 30 * 1000); + doServerPing(); + const handle = window.setInterval(doServerPing, 30 * 1000); return () => window.clearInterval(handle); - }, [openedConnections, currentDatabase]); + }, [openedConnections]); + + React.useEffect(() => { + doDatabasePing(); + const handle = window.setInterval(doDatabasePing, 30 * 1000); + return () => window.clearInterval(handle); + }, [currentDatabase]); + return children; }