From 1f3d63bd3714f410c91b112e6e3941f8352f8cba Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 17:55:39 -0400 Subject: [PATCH 1/9] Memoizes DNS responses to improve federation performance --- app/federation/server/lib/dns.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/federation/server/lib/dns.js b/app/federation/server/lib/dns.js index b6a58ba21ff67..e460a282a7d0a 100644 --- a/app/federation/server/lib/dns.js +++ b/app/federation/server/lib/dns.js @@ -1,4 +1,5 @@ import dnsResolver from 'dns'; +import mem from 'mem'; import { Meteor } from 'meteor/meteor'; @@ -10,6 +11,10 @@ import { federationRequest } from './http'; const dnsResolveSRV = Meteor.wrapAsync(dnsResolver.resolveSrv); const dnsResolveTXT = Meteor.wrapAsync(dnsResolver.resolveTxt); +const cacheMaxAge = 3600000; // one hour +const memoizedDnsResolveSRV = mem(dnsResolveSRV, {maxAge: cacheMaxAge}); +const memoizedDnsResolveTXT = mem(dnsResolveTXT, {maxAge: cacheMaxAge}); + const hubUrl = process.env.NODE_ENV === 'development' ? 'http://localhost:8080' : 'https://hub.rocket.chat'; export function registerWithHub(peerDomain, url, publicKey) { @@ -62,7 +67,7 @@ export function search(peerDomain) { // Search by HTTPS first try { - srvEntries = dnsResolveSRV(`_rocketchat._https.${ peerDomain }`); + srvEntries = memoizedDnsResolveSRV(`_rocketchat._https.${ peerDomain }`); protocol = 'https'; } catch (err) { // Ignore errors when looking for DNS entries @@ -71,7 +76,7 @@ export function search(peerDomain) { // If there is not entry, try with http if (!srvEntries.length) { try { - srvEntries = dnsResolveSRV(`_rocketchat._http.${ peerDomain }`); + srvEntries = memoizedDnsResolveSRV(`_rocketchat._http.${ peerDomain }`); protocol = 'http'; } catch (err) { // Ignore errors when looking for DNS entries @@ -86,7 +91,7 @@ export function search(peerDomain) { } // Get the public key from the TXT record - const publicKeyTxtRecords = dnsResolveTXT(`rocketchat-public-key.${ peerDomain }`); + const publicKeyTxtRecords = memoizedDnsResolveTXT(`rocketchat-public-key.${ peerDomain }`); // Join the TXT record, that might be split const publicKey = publicKeyTxtRecords[0].join(''); From 757b0b4cfd409287008388cea80b9ea3121c746e Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 18:04:40 -0400 Subject: [PATCH 2/9] Fixes behaviour when thread messages are created or deleted --- app/federation/server/endpoints/dispatch.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index 43fd8641aa7b8..b21a0263605bf 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -21,6 +21,8 @@ import { isFederationEnabled } from '../lib/isFederationEnabled'; import { getUpload, requestEventsFromLatest } from '../handler'; import { notifyUsersOnMessage } from '../../../lib/server/lib/notifyUsersOnMessage'; import { sendAllNotifications } from '../../../lib/server/lib/sendNotificationsOnMessage'; +import { processThreads } from '../../../threads/server/hooks/aftersavemessage'; +import { processDeleteInThread } from '../../../threads/server/hooks/afterdeletemessage'; const eventHandlers = { // @@ -233,11 +235,17 @@ const eventHandlers = { } // Create the message - Messages.insert(denormalizedMessage); + try { + await Messages.insert(denormalizedMessage); + + processThreads(denormalizedMessage, room); - // Notify users - notifyUsersOnMessage(denormalizedMessage, room); - sendAllNotifications(denormalizedMessage, room); + // Notify users + notifyUsersOnMessage(denormalizedMessage, room); + sendAllNotifications(denormalizedMessage, room); + } catch(err) { + logger.server.debug("Error on creating message: " + message._id); + } } } @@ -279,6 +287,11 @@ const eventHandlers = { if (eventResult.success) { const { data: { roomId, messageId } } = event; + const message = Messages.findOne({ _id: messageId }); + if (message) { + processDeleteInThread(message) + } + // Remove the message Messages.removeById(messageId); From 562d505df9e906f6ffabb3afc604444d4f89bd57 Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 18:21:39 -0400 Subject: [PATCH 3/9] Don't send events to federated domain multiple times --- app/federation/server/handler/index.js | 9 ++++++++- app/federation/server/hooks/afterAddedToRoom.js | 11 +++++++++-- app/federation/server/hooks/afterLeaveRoom.js | 6 ++++-- app/federation/server/hooks/afterRemoveFromRoom.js | 6 ++++-- app/federation/server/normalizers/room.js | 4 ++++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/app/federation/server/handler/index.js b/app/federation/server/handler/index.js index e6bf2be85cb33..32c4b74aa48aa 100644 --- a/app/federation/server/handler/index.js +++ b/app/federation/server/handler/index.js @@ -1,3 +1,4 @@ +import _ from 'underscore'; import qs from 'querystring'; import { disabled } from '../functions/errors'; @@ -55,6 +56,8 @@ export function dispatchEvents(domains, events) { throw disabled('client.dispatchEvents'); } + domains = _.uniq(domains); + logger.client.debug(() => `dispatchEvents => domains=${ domains.join(', ') } events=${ events.map((e) => JSON.stringify(e, null, 2)) }`); const uri = '/api/v1/federation.events.dispatch'; @@ -65,7 +68,11 @@ export function dispatchEvents(domains, events) { } export function dispatchEvent(domains, event) { - dispatchEvents(domains, [event]); + + //Ensure the domain list is distinct to avoid excessive events + const distinctDomains = _.uniq(domains).filter(domain => event.origin); + + dispatchEvents(distinctDomains, [event]); } export function getUpload(domain, fileId) { diff --git a/app/federation/server/hooks/afterAddedToRoom.js b/app/federation/server/hooks/afterAddedToRoom.js index 900ce0cc499ff..63f6f72a1d153 100644 --- a/app/federation/server/hooks/afterAddedToRoom.js +++ b/app/federation/server/hooks/afterAddedToRoom.js @@ -1,3 +1,5 @@ +import _ from 'underscore'; + import { logger } from '../lib/logger'; import { getFederatedRoomData, hasExternalDomain, isLocalUser, checkRoomType, checkRoomDomainsLength } from '../functions/helpers'; import { FederationRoomEvents, Subscriptions } from '../../../models/server'; @@ -45,10 +47,15 @@ async function afterAddedToRoom(involvedUsers, room) { // // Get the users domains - const domainsAfterAdd = users.map((u) => u.federation.origin); + let domainsAfterAdd = []; + users.forEach(user => { + if(user.hasOwnProperty("federation") && !domainsAfterAdd.includes(user.federation.origin)) { + domainsAfterAdd.push(user.federation.origin); + } + }); // Check if the number of domains is allowed - if (!checkRoomDomainsLength(room.federation.domains)) { + if (!checkRoomDomainsLength(domainsAfterAdd)) { throw new Error('Cannot federate rooms with more than 10 domains'); } diff --git a/app/federation/server/hooks/afterLeaveRoom.js b/app/federation/server/hooks/afterLeaveRoom.js index 5690a561a8a9d..4794361f6590c 100644 --- a/app/federation/server/hooks/afterLeaveRoom.js +++ b/app/federation/server/hooks/afterLeaveRoom.js @@ -1,3 +1,5 @@ +import _ from 'underscore'; + import { FederationRoomEvents } from '../../../models/server'; import { getFederatedRoomData, hasExternalDomain, isLocalUser } from '../functions/helpers'; import { logger } from '../lib/logger'; @@ -19,7 +21,7 @@ async function afterLeaveRoom(user, room) { try { // Get the domains after leave - const domainsAfterLeave = users.map((u) => u.federation.origin); + const domainsAfterLeave = _.uniq(users.map((u) => u.federation.origin)); // // Normalize the room's federation status @@ -28,7 +30,7 @@ async function afterLeaveRoom(user, room) { usersBeforeLeave.push(user); // Get the users domains - const domainsBeforeLeft = usersBeforeLeave.map((u) => u.federation.origin); + const domainsBeforeLeft = _.uniq(usersBeforeLeave.map((u) => u.federation.origin)); // // Create the user left event diff --git a/app/federation/server/hooks/afterRemoveFromRoom.js b/app/federation/server/hooks/afterRemoveFromRoom.js index bcc5fb2baaadd..680118b670f6b 100644 --- a/app/federation/server/hooks/afterRemoveFromRoom.js +++ b/app/federation/server/hooks/afterRemoveFromRoom.js @@ -1,3 +1,5 @@ +import _ from 'underscore'; + import { FederationRoomEvents } from '../../../models/server'; import { getFederatedRoomData, hasExternalDomain, isLocalUser } from '../functions/helpers'; import { logger } from '../lib/logger'; @@ -21,7 +23,7 @@ async function afterRemoveFromRoom(involvedUsers, room) { try { // Get the domains after removal - const domainsAfterRemoval = users.map((u) => u.federation.origin); + const domainsAfterRemoval = _.uniq(users.map((u) => u.federation.origin)); // // Normalize the room's federation status @@ -30,7 +32,7 @@ async function afterRemoveFromRoom(involvedUsers, room) { usersBeforeRemoval.push(removedUser); // Get the users domains - const domainsBeforeRemoval = usersBeforeRemoval.map((u) => u.federation.origin); + const domainsBeforeRemoval = _.uniq(usersBeforeRemoval.map((u) => u.federation.origin)); // // Create the user remove event diff --git a/app/federation/server/normalizers/room.js b/app/federation/server/normalizers/room.js index 4aceb9dbdb9e4..562bd7740f70b 100644 --- a/app/federation/server/normalizers/room.js +++ b/app/federation/server/normalizers/room.js @@ -1,3 +1,5 @@ +import _ from 'underscore'; + import { getNameAndDomain, isFullyQualified } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; @@ -78,6 +80,8 @@ const normalizeRoom = (originalResource, users) => { } } + domains = _.uniq(domains); + // Federation resource.federation = resource.federation || { origin: getFederationDomain(), // The origin of this resource, where it was created From 54fb6c81dfdee2ea65d4730ae2c7045ae785cd5e Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 18:23:09 -0400 Subject: [PATCH 4/9] Bug fix: adds missing import of dispatchEvent --- app/federation/server/hooks/afterUnsetReaction.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/federation/server/hooks/afterUnsetReaction.js b/app/federation/server/hooks/afterUnsetReaction.js index 1ee72ff1f3514..72c9259822c07 100644 --- a/app/federation/server/hooks/afterUnsetReaction.js +++ b/app/federation/server/hooks/afterUnsetReaction.js @@ -4,6 +4,7 @@ import { FederationRoomEvents, Rooms } from '../../../models/server'; import { logger } from '../lib/logger'; import { hasExternalDomain } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; +import { dispatchEvent } from '../handler'; async function afterUnsetReaction(message, { user, reaction }) { const room = Rooms.findOneById(message.rid, { fields: { federation: 1 } }); From 3c0a63d430d4b76eafea6a7ac71b1024c1afba44 Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 18:27:18 -0400 Subject: [PATCH 5/9] Makes max domains configurable through env var --- app/federation/server/functions/helpers.js | 2 +- app/federation/server/hooks/afterAddedToRoom.js | 2 +- app/federation/server/hooks/afterCreateRoom.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/federation/server/functions/helpers.js b/app/federation/server/functions/helpers.js index a38582c6aa404..4113b6014edd2 100644 --- a/app/federation/server/functions/helpers.js +++ b/app/federation/server/functions/helpers.js @@ -18,7 +18,7 @@ export function updateEnabled(enabled) { } export const checkRoomType = (room) => room.t === 'p' || room.t === 'd'; -export const checkRoomDomainsLength = (domains) => domains.length <= 10; +export const checkRoomDomainsLength = (domains) => domains.length <= (process.env.FEDERATED_DOMAINS_LENGTH || 10); export const hasExternalDomain = ({ federation }) => { // same test as isFederated(room) diff --git a/app/federation/server/hooks/afterAddedToRoom.js b/app/federation/server/hooks/afterAddedToRoom.js index 63f6f72a1d153..0d6f5f4158dce 100644 --- a/app/federation/server/hooks/afterAddedToRoom.js +++ b/app/federation/server/hooks/afterAddedToRoom.js @@ -56,7 +56,7 @@ async function afterAddedToRoom(involvedUsers, room) { // Check if the number of domains is allowed if (!checkRoomDomainsLength(domainsAfterAdd)) { - throw new Error('Cannot federate rooms with more than 10 domains'); + throw new Error(`Cannot federate rooms with more than ${process.env.FEDERATED_DOMAINS_LENGTH || 10} domains`); } // diff --git a/app/federation/server/hooks/afterCreateRoom.js b/app/federation/server/hooks/afterCreateRoom.js index 7b55a0cc5060a..d2f0b4663815a 100644 --- a/app/federation/server/hooks/afterCreateRoom.js +++ b/app/federation/server/hooks/afterCreateRoom.js @@ -40,7 +40,7 @@ export async function doAfterCreateRoom(room, users, subscriptions) { // Check if the number of domains is allowed if (!checkRoomDomainsLength(normalizedRoom.federation.domains)) { - throw new Error('Cannot federate rooms with more than 10 domains'); + throw new Error(`Cannot federate rooms with more than ${process.env.FEDERATED_DOMAINS_LENGTH || 10} domains`); } // Ensure a genesis event for this room From 3771d954072808321d5d50f9a13aa740eaaa1438 Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Thu, 30 Apr 2020 18:31:15 -0400 Subject: [PATCH 6/9] Performance fix: only refresh federated servers if necessary --- app/federation/server/endpoints/dispatch.js | 47 +++++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index b21a0263605bf..9dc691713bb91 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -92,6 +92,9 @@ const eventHandlers = { async [eventTypes.ROOM_ADD_USER](event) { const eventResult = await FederationRoomEvents.addEvent(event.context, event); + // We only want to refresh the server list and update the room federation array if something changed + let federationAltered = false; + // If the event was successfully added, handle the event locally if (eventResult.success) { const { data: { roomId, user, subscription, domainsAfterAdd } } = event; @@ -100,35 +103,49 @@ const eventHandlers = { const persistedUser = Users.findOne({ _id: user._id }); if (persistedUser) { - // Update the federation - Users.update({ _id: persistedUser._id }, { $set: { federation: user.federation } }); + // Update the federation, if its not already set (if it's set, this is likely an event being reprocessed) + if(!persistedUser.federation) { + Users.update({ _id: persistedUser._id }, { $set: { federation: user.federation } }); + federationAltered = true; + } } else { // Denormalize user const denormalizedUser = normalizers.denormalizeUser(user); // Create the user Users.insert(denormalizedUser); + federationAltered = true; } // Check if subscription exists const persistedSubscription = Subscriptions.findOne({ _id: subscription._id }); - if (persistedSubscription) { - // Update the federation - Subscriptions.update({ _id: persistedSubscription._id }, { $set: { federation: subscription.federation } }); - } else { - // Denormalize subscription - const denormalizedSubscription = normalizers.denormalizeSubscription(subscription); + try { + if (persistedSubscription) { + // Update the federation, if its not already set (if it's set, this is likely an event being reprocessed + if(!persistedSubscription.federation) { + Subscriptions.update({ _id: persistedSubscription._id }, { $set: { federation: subscription.federation } }); + federationAltered = true; + } + } else { + // Denormalize subscription + const denormalizedSubscription = normalizers.denormalizeSubscription(subscription); - // Create the subscription - Subscriptions.insert(denormalizedSubscription); + // Create the subscription + Subscriptions.insert(denormalizedSubscription); + federationAltered = true; + } + } catch(ex) { + logger.server.debug("unable to create subscription for user (" + user._id + ") in room (" + roomId + ") for federation ("+subscription.federation.origin+")"); } // Refresh the servers list - FederationServers.refreshServers(); + if(federationAltered) { + FederationServers.refreshServers(); - // Update the room's federation property - Rooms.update({ _id: roomId }, { $set: { 'federation.domains': domainsAfterAdd } }); + // Update the room's federation property + Rooms.update({ _id: roomId }, { $set: { 'federation.domains': domainsAfterAdd } }); + } } return eventResult; @@ -195,7 +212,9 @@ const eventHandlers = { if (persistedMessage) { // Update the federation - Messages.update({ _id: persistedMessage._id }, { $set: { federation: message.federation } }); + if(!persistedMessage.federation) { + Messages.update({ _id: persistedMessage._id }, { $set: { federation: message.federation } }); + } } else { // Load the room const room = Rooms.findOneById(message.rid); From 0b405eccb72d76d656d2dba9e194825d957e5394 Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Fri, 1 May 2020 11:02:40 -0400 Subject: [PATCH 7/9] Apply suggestions from code review Co-authored-by: Diego Sampaio --- app/federation/server/handler/index.js | 5 ++--- app/federation/server/hooks/afterAddedToRoom.js | 2 -- app/federation/server/hooks/afterLeaveRoom.js | 6 ++---- app/federation/server/hooks/afterRemoveFromRoom.js | 6 ++---- app/federation/server/normalizers/room.js | 4 +--- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/app/federation/server/handler/index.js b/app/federation/server/handler/index.js index 32c4b74aa48aa..e09cc455f5d55 100644 --- a/app/federation/server/handler/index.js +++ b/app/federation/server/handler/index.js @@ -1,4 +1,3 @@ -import _ from 'underscore'; import qs from 'querystring'; import { disabled } from '../functions/errors'; @@ -56,7 +55,7 @@ export function dispatchEvents(domains, events) { throw disabled('client.dispatchEvents'); } - domains = _.uniq(domains); + domains = [...new Set(domains)]; logger.client.debug(() => `dispatchEvents => domains=${ domains.join(', ') } events=${ events.map((e) => JSON.stringify(e, null, 2)) }`); @@ -70,7 +69,7 @@ export function dispatchEvents(domains, events) { export function dispatchEvent(domains, event) { //Ensure the domain list is distinct to avoid excessive events - const distinctDomains = _.uniq(domains).filter(domain => event.origin); + const distinctDomains = [...new Set(domains).filter(domain => event.origin)]; dispatchEvents(distinctDomains, [event]); } diff --git a/app/federation/server/hooks/afterAddedToRoom.js b/app/federation/server/hooks/afterAddedToRoom.js index 0d6f5f4158dce..147c396b57c1d 100644 --- a/app/federation/server/hooks/afterAddedToRoom.js +++ b/app/federation/server/hooks/afterAddedToRoom.js @@ -1,5 +1,3 @@ -import _ from 'underscore'; - import { logger } from '../lib/logger'; import { getFederatedRoomData, hasExternalDomain, isLocalUser, checkRoomType, checkRoomDomainsLength } from '../functions/helpers'; import { FederationRoomEvents, Subscriptions } from '../../../models/server'; diff --git a/app/federation/server/hooks/afterLeaveRoom.js b/app/federation/server/hooks/afterLeaveRoom.js index 4794361f6590c..5f1227df0a69e 100644 --- a/app/federation/server/hooks/afterLeaveRoom.js +++ b/app/federation/server/hooks/afterLeaveRoom.js @@ -1,5 +1,3 @@ -import _ from 'underscore'; - import { FederationRoomEvents } from '../../../models/server'; import { getFederatedRoomData, hasExternalDomain, isLocalUser } from '../functions/helpers'; import { logger } from '../lib/logger'; @@ -21,7 +19,7 @@ async function afterLeaveRoom(user, room) { try { // Get the domains after leave - const domainsAfterLeave = _.uniq(users.map((u) => u.federation.origin)); + const domainsAfterLeave = [...new Set(users.map((u) => u.federation.origin))]; // // Normalize the room's federation status @@ -30,7 +28,7 @@ async function afterLeaveRoom(user, room) { usersBeforeLeave.push(user); // Get the users domains - const domainsBeforeLeft = _.uniq(usersBeforeLeave.map((u) => u.federation.origin)); + const domainsBeforeLeft = [...new Set(usersBeforeLeave.map((u) => u.federation.origin))]; // // Create the user left event diff --git a/app/federation/server/hooks/afterRemoveFromRoom.js b/app/federation/server/hooks/afterRemoveFromRoom.js index 680118b670f6b..c816f251982b1 100644 --- a/app/federation/server/hooks/afterRemoveFromRoom.js +++ b/app/federation/server/hooks/afterRemoveFromRoom.js @@ -1,5 +1,3 @@ -import _ from 'underscore'; - import { FederationRoomEvents } from '../../../models/server'; import { getFederatedRoomData, hasExternalDomain, isLocalUser } from '../functions/helpers'; import { logger } from '../lib/logger'; @@ -23,7 +21,7 @@ async function afterRemoveFromRoom(involvedUsers, room) { try { // Get the domains after removal - const domainsAfterRemoval = _.uniq(users.map((u) => u.federation.origin)); + const domainsAfterRemoval = [...new Set(users.map((u) => u.federation.origin))]; // // Normalize the room's federation status @@ -32,7 +30,7 @@ async function afterRemoveFromRoom(involvedUsers, room) { usersBeforeRemoval.push(removedUser); // Get the users domains - const domainsBeforeRemoval = _.uniq(usersBeforeRemoval.map((u) => u.federation.origin)); + const domainsBeforeRemoval = [...new Set(usersBeforeRemoval.map((u) => u.federation.origin))]; // // Create the user remove event diff --git a/app/federation/server/normalizers/room.js b/app/federation/server/normalizers/room.js index 562bd7740f70b..43822cedb71df 100644 --- a/app/federation/server/normalizers/room.js +++ b/app/federation/server/normalizers/room.js @@ -1,5 +1,3 @@ -import _ from 'underscore'; - import { getNameAndDomain, isFullyQualified } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; @@ -80,7 +78,7 @@ const normalizeRoom = (originalResource, users) => { } } - domains = _.uniq(domains); + domains = [...new Set(domains)]; // Federation resource.federation = resource.federation || { From 7e225daf7cc17c44232800228ac5f987b770f687 Mon Sep 17 00:00:00 2001 From: Andrew Louis Date: Fri, 1 May 2020 12:22:03 -0400 Subject: [PATCH 8/9] Fixes linting issues --- app/federation/server/endpoints/dispatch.js | 18 +++++++++--------- app/federation/server/handler/index.js | 5 ++--- .../server/hooks/afterAddedToRoom.js | 8 ++++---- app/federation/server/hooks/afterCreateRoom.js | 2 +- app/federation/server/lib/dns.js | 6 +++--- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index 9dc691713bb91..15beb97f1458c 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -104,7 +104,7 @@ const eventHandlers = { if (persistedUser) { // Update the federation, if its not already set (if it's set, this is likely an event being reprocessed) - if(!persistedUser.federation) { + if (!persistedUser.federation) { Users.update({ _id: persistedUser._id }, { $set: { federation: user.federation } }); federationAltered = true; } @@ -123,7 +123,7 @@ const eventHandlers = { try { if (persistedSubscription) { // Update the federation, if its not already set (if it's set, this is likely an event being reprocessed - if(!persistedSubscription.federation) { + if (!persistedSubscription.federation) { Subscriptions.update({ _id: persistedSubscription._id }, { $set: { federation: subscription.federation } }); federationAltered = true; } @@ -135,12 +135,12 @@ const eventHandlers = { Subscriptions.insert(denormalizedSubscription); federationAltered = true; } - } catch(ex) { - logger.server.debug("unable to create subscription for user (" + user._id + ") in room (" + roomId + ") for federation ("+subscription.federation.origin+")"); + } catch (ex) { + logger.server.debug(`unable to create subscription for user ( ${ user._id } ) in room (${ roomId })`); } // Refresh the servers list - if(federationAltered) { + if (federationAltered) { FederationServers.refreshServers(); // Update the room's federation property @@ -212,7 +212,7 @@ const eventHandlers = { if (persistedMessage) { // Update the federation - if(!persistedMessage.federation) { + if (!persistedMessage.federation) { Messages.update({ _id: persistedMessage._id }, { $set: { federation: message.federation } }); } } else { @@ -262,8 +262,8 @@ const eventHandlers = { // Notify users notifyUsersOnMessage(denormalizedMessage, room); sendAllNotifications(denormalizedMessage, room); - } catch(err) { - logger.server.debug("Error on creating message: " + message._id); + } catch (err) { + logger.server.debug(`Error on creating message: ${ message._id }`); } } } @@ -308,7 +308,7 @@ const eventHandlers = { const message = Messages.findOne({ _id: messageId }); if (message) { - processDeleteInThread(message) + processDeleteInThread(message); } // Remove the message diff --git a/app/federation/server/handler/index.js b/app/federation/server/handler/index.js index e09cc455f5d55..a2948293a1ac8 100644 --- a/app/federation/server/handler/index.js +++ b/app/federation/server/handler/index.js @@ -67,9 +67,8 @@ export function dispatchEvents(domains, events) { } export function dispatchEvent(domains, event) { - - //Ensure the domain list is distinct to avoid excessive events - const distinctDomains = [...new Set(domains).filter(domain => event.origin)]; + // Ensure the domain list is distinct to avoid excessive events + const distinctDomains = [...new Set(domains)].filter((domain) => domain === event.origin); dispatchEvents(distinctDomains, [event]); } diff --git a/app/federation/server/hooks/afterAddedToRoom.js b/app/federation/server/hooks/afterAddedToRoom.js index 147c396b57c1d..1fd359504c5e3 100644 --- a/app/federation/server/hooks/afterAddedToRoom.js +++ b/app/federation/server/hooks/afterAddedToRoom.js @@ -45,16 +45,16 @@ async function afterAddedToRoom(involvedUsers, room) { // // Get the users domains - let domainsAfterAdd = []; - users.forEach(user => { - if(user.hasOwnProperty("federation") && !domainsAfterAdd.includes(user.federation.origin)) { + const domainsAfterAdd = []; + users.forEach((user) => { + if (user.hasOwnProperty('federation') && !domainsAfterAdd.includes(user.federation.origin)) { domainsAfterAdd.push(user.federation.origin); } }); // Check if the number of domains is allowed if (!checkRoomDomainsLength(domainsAfterAdd)) { - throw new Error(`Cannot federate rooms with more than ${process.env.FEDERATED_DOMAINS_LENGTH || 10} domains`); + throw new Error(`Cannot federate rooms with more than ${ process.env.FEDERATED_DOMAINS_LENGTH || 10 } domains`); } // diff --git a/app/federation/server/hooks/afterCreateRoom.js b/app/federation/server/hooks/afterCreateRoom.js index d2f0b4663815a..a58d40446c179 100644 --- a/app/federation/server/hooks/afterCreateRoom.js +++ b/app/federation/server/hooks/afterCreateRoom.js @@ -40,7 +40,7 @@ export async function doAfterCreateRoom(room, users, subscriptions) { // Check if the number of domains is allowed if (!checkRoomDomainsLength(normalizedRoom.federation.domains)) { - throw new Error(`Cannot federate rooms with more than ${process.env.FEDERATED_DOMAINS_LENGTH || 10} domains`); + throw new Error(`Cannot federate rooms with more than ${ process.env.FEDERATED_DOMAINS_LENGTH || 10 } domains`); } // Ensure a genesis event for this room diff --git a/app/federation/server/lib/dns.js b/app/federation/server/lib/dns.js index e460a282a7d0a..ab00f525f5db5 100644 --- a/app/federation/server/lib/dns.js +++ b/app/federation/server/lib/dns.js @@ -1,7 +1,7 @@ import dnsResolver from 'dns'; -import mem from 'mem'; import { Meteor } from 'meteor/meteor'; +import mem from 'mem'; import * as federationErrors from '../functions/errors'; import { logger } from './logger'; @@ -12,8 +12,8 @@ const dnsResolveSRV = Meteor.wrapAsync(dnsResolver.resolveSrv); const dnsResolveTXT = Meteor.wrapAsync(dnsResolver.resolveTxt); const cacheMaxAge = 3600000; // one hour -const memoizedDnsResolveSRV = mem(dnsResolveSRV, {maxAge: cacheMaxAge}); -const memoizedDnsResolveTXT = mem(dnsResolveTXT, {maxAge: cacheMaxAge}); +const memoizedDnsResolveSRV = mem(dnsResolveSRV, { maxAge: cacheMaxAge }); +const memoizedDnsResolveTXT = mem(dnsResolveTXT, { maxAge: cacheMaxAge }); const hubUrl = process.env.NODE_ENV === 'development' ? 'http://localhost:8080' : 'https://hub.rocket.chat'; From 7fc44fc8297fa9eedae7161dd412de783f435cad Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 May 2020 17:47:45 -0300 Subject: [PATCH 9/9] Remove await --- app/federation/server/endpoints/dispatch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index 15beb97f1458c..0af8348ba559f 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -255,7 +255,7 @@ const eventHandlers = { // Create the message try { - await Messages.insert(denormalizedMessage); + Messages.insert(denormalizedMessage); processThreads(denormalizedMessage, room);