From d2b0a78d46bdb1a228a24e9e7dd0d108e8e32c59 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Jan 2026 13:34:38 -0600 Subject: [PATCH 01/12] logs --- .../importer-slack/server/SlackImporter.ts | 20 +++++++++---------- .../app/livechat/server/sendMessageBySMS.ts | 4 ++-- apps/meteor/app/push/server/push.ts | 16 +++++++-------- .../server/business-hour/Multiple.ts | 2 +- .../server/hooks/afterRemoveDepartment.ts | 2 +- .../notifications/notifications.module.ts | 4 ++-- .../modules/streamer/streamer.module.ts | 4 ++-- .../media-calls/src/server/CallDirector.ts | 2 +- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/apps/meteor/app/importer-slack/server/SlackImporter.ts b/apps/meteor/app/importer-slack/server/SlackImporter.ts index 87098c8b35ec2..30c710df09b7a 100644 --- a/apps/meteor/app/importer-slack/server/SlackImporter.ts +++ b/apps/meteor/app/importer-slack/server/SlackImporter.ts @@ -290,8 +290,8 @@ export class SlackImporter extends Importer { ImporterWebsocket.progressUpdated({ rate }); oldRate = rate; } - } catch (e) { - this.logger.error(e); + } catch (err) { + this.logger.error({ msg: 'Error updating progress', err }); } }; @@ -332,8 +332,8 @@ export class SlackImporter extends Importer { increaseProgress(); continue; } - } catch (e) { - this.logger.error(e); + } catch (err) { + this.logger.error({ msg: 'Error adding missed type', err }); } } @@ -388,19 +388,19 @@ export class SlackImporter extends Importer { this.logger.warn({ msg: 'Entry is not a valid JSON file; unable to import', entryName: entry.entryName, err: error }); } } - } catch (e) { - this.logger.error(e); + } catch (err) { + this.logger.error({ msg: 'Error processing message entry', err }); } increaseProgress(); } if (Object.keys(missedTypes).length > 0) { - this.logger.info('Missed import types:', missedTypes); + this.logger.info({ msg: 'Missed import types', missedTypes }); } - } catch (e) { - this.logger.error(e); - throw e; + } catch (err) { + this.logger.error({ msg: 'Error preparing import using local file', err }); + throw err; } ImporterWebsocket.progressUpdated({ rate: 100 }); diff --git a/apps/meteor/app/livechat/server/sendMessageBySMS.ts b/apps/meteor/app/livechat/server/sendMessageBySMS.ts index 2d370410fa337..32c96b529e497 100644 --- a/apps/meteor/app/livechat/server/sendMessageBySMS.ts +++ b/apps/meteor/app/livechat/server/sendMessageBySMS.ts @@ -68,8 +68,8 @@ callbacks.add( phoneNumber: visitor.phone[0].phoneNumber, service, }); - } catch (e) { - callbackLogger.error(e); + } catch (err) { + callbackLogger.error({ msg: 'Error sending SMS message', err }); } return message; diff --git a/apps/meteor/app/push/server/push.ts b/apps/meteor/app/push/server/push.ts index 6d13a34e7669f..07a1a71f491cf 100644 --- a/apps/meteor/app/push/server/push.ts +++ b/apps/meteor/app/push/server/push.ts @@ -163,7 +163,7 @@ class PushClass { this.isConfigured = true; - logger.debug('Configure', this.options); + logger.debug({ msg: 'Configure', options: this.options }); if (this.options.apn) { initAPN({ options: this.options as RequiredField, absoluteUrl: Meteor.absoluteUrl() }); @@ -188,7 +188,7 @@ class PushClass { countApn: string[], countGcm: string[], ): Promise { - logger.debug('send to token', app.token); + logger.debug({ msg: 'send to token', token: app.token }); if ('apn' in app.token && app.token.apn) { countApn.push(app._id); @@ -248,7 +248,7 @@ class PushClass { projectId: credentials.project_id, }; } catch (error) { - logger.error('Error getting FCM token', error); + logger.error({ msg: 'Error getting FCM token', err: error }); throw new Error('Error getting FCM token'); } } @@ -275,7 +275,7 @@ class PushClass { const response = await result.text(); if (result.status === 406) { - logger.info('removing push token', token); + logger.info({ msg: 'removing push token', token }); await AppsTokens.deleteMany({ $or: [ { @@ -290,7 +290,7 @@ class PushClass { } if (result.status === 422) { - logger.info('gateway rejected push notification. not retrying.', response); + logger.info({ msg: 'gateway rejected push notification. not retrying.', response }); return; } @@ -338,7 +338,7 @@ class PushClass { const gatewayNotification = this.getGatewayNotificationData(notification); for (const gateway of this.options.gateways) { - logger.debug('send to token', app.token); + logger.debug({ msg: 'send to token', token: app.token }); if ('apn' in app.token && app.token.apn) { countApn.push(app._id); @@ -353,7 +353,7 @@ class PushClass { } private async sendNotification(notification: PendingPushNotification): Promise<{ apn: string[]; gcm: string[] }> { - logger.debug('Sending notification', notification); + logger.debug({ msg: 'Sending notification', notification }); const countApn: string[] = []; const countGcm: string[] = []; @@ -382,7 +382,7 @@ class PushClass { const appTokens = AppsTokens.find(query); for await (const app of appTokens) { - logger.debug('send to token', app.token); + logger.debug({ msg: 'send to token', token: app.token }); if (this.shouldUseGateway()) { await this.sendNotificationGateway(app, notification, countApn, countGcm); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts index ce5b28b5a2624..aa1d2d47ea779 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts @@ -225,7 +225,7 @@ export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior } async onDepartmentArchived(department: Pick): Promise { - bhLogger.debug('Processing department archived event on multiple business hours', department); + bhLogger.debug({ msg: 'Processing department archived event on multiple business hours', department }); return this.onDepartmentDisabled(department); } diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.ts index 4c692c72edbf3..9e7589ddce7c0 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.ts @@ -9,7 +9,7 @@ const afterRemoveDepartment = async (options: { agentsId: ILivechatAgent['_id'][]; }) => { if (!options?.department) { - cbLogger.warn('No department found in options', options); + cbLogger.warn({ msg: 'No department found in options', options }); return options; } diff --git a/apps/meteor/server/modules/notifications/notifications.module.ts b/apps/meteor/server/modules/notifications/notifications.module.ts index 8132daa827500..d6f22c429a049 100644 --- a/apps/meteor/server/modules/notifications/notifications.module.ts +++ b/apps/meteor/server/modules/notifications/notifications.module.ts @@ -214,8 +214,8 @@ export class NotificationsModule { } return user[key] === username; - } catch (e) { - SystemLogger.error(e); + } catch (err) { + SystemLogger.error({ err }); return false; } } diff --git a/apps/meteor/server/modules/streamer/streamer.module.ts b/apps/meteor/server/modules/streamer/streamer.module.ts index e55592fb2e907..4bab9793bc4fb 100644 --- a/apps/meteor/server/modules/streamer/streamer.module.ts +++ b/apps/meteor/server/modules/streamer/streamer.module.ts @@ -246,8 +246,8 @@ export abstract class Streamer extends EventEmit try { this.registerMethod(method); - } catch (e) { - SystemLogger.error(e); + } catch (err) { + SystemLogger.error({ err }); } } diff --git a/ee/packages/media-calls/src/server/CallDirector.ts b/ee/packages/media-calls/src/server/CallDirector.ts index 1c762d0c480bf..705a5df1a528d 100644 --- a/ee/packages/media-calls/src/server/CallDirector.ts +++ b/ee/packages/media-calls/src/server/CallDirector.ts @@ -240,7 +240,7 @@ class MediaCallDirector { agent: IMediaCallAgent, ): Promise { if (!agent.oppositeAgent) { - logger.error('Unable to transfer calls without a reference to the opposite agent.'); + logger.error({ msg: 'Unable to transfer calls without a reference to the opposite agent.' }); return; } From 79a8e69934bf4447061f53eeb7300b71970fd910 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Jan 2026 14:08:30 -0600 Subject: [PATCH 02/12] logs --- apps/meteor/app/api/server/lib/eraseTeam.ts | 4 +- .../app/file-upload/server/lib/FileUpload.ts | 2 +- .../app/file-upload/server/lib/requests.ts | 4 +- .../server/PendingFileImporter.ts | 12 +-- .../lib/server/functions/saveUserIdentity.ts | 2 +- .../app/lib/server/functions/setUsername.ts | 4 +- apps/meteor/app/livechat/server/lib/rooms.ts | 4 +- .../server/functions/unsubscribe.ts | 8 +- .../server/loginHandler.ts | 14 ++-- .../app/metrics/server/lib/collectMetrics.ts | 2 +- .../app/nextcloud/server/addWebdavServer.ts | 4 +- .../server/NotificationQueue.ts | 6 +- apps/meteor/app/push/server/push.ts | 3 +- .../app/slackbridge/server/RocketAdapter.js | 5 +- .../app/slackbridge/server/SlackAdapter.js | 8 +- apps/meteor/ee/server/configuration/ldap.ts | 8 +- apps/meteor/ee/server/lib/ldap/Manager.ts | 32 ++++---- apps/meteor/server/database/utils.ts | 2 +- .../server/features/EmailInbox/EmailInbox.ts | 4 +- apps/meteor/server/lib/ldap/Connection.ts | 78 +++++++++---------- apps/meteor/server/lib/ldap/Manager.ts | 28 +++---- .../server/lib/sendDirectMessageToUsers.ts | 4 +- .../meteor/server/lib/sendMessagesToAdmins.ts | 4 +- .../server/methods/sendForgotPasswordEmail.ts | 4 +- .../core-apps/cloudAnnouncements.module.ts | 4 +- .../services/messages/lib/oembed/providers.ts | 4 +- .../services/nps/getAndCreateNpsSurvey.ts | 4 +- .../server/services/nps/sendNpsResults.ts | 4 +- .../providers/twilio.ts | 2 +- .../server/services/omnichannel/queue.ts | 2 +- .../src/internal/SignalProcessor.ts | 2 +- packages/omni-core/src/visitor/create.ts | 2 +- 32 files changed, 138 insertions(+), 132 deletions(-) diff --git a/apps/meteor/app/api/server/lib/eraseTeam.ts b/apps/meteor/app/api/server/lib/eraseTeam.ts index 5fd47f782539a..076064ecbf6d3 100644 --- a/apps/meteor/app/api/server/lib/eraseTeam.ts +++ b/apps/meteor/app/api/server/lib/eraseTeam.ts @@ -83,8 +83,8 @@ export async function eraseRoomLooseValidation(rid: string): Promise { try { await deleteRoom(rid); - } catch (e) { - SystemLogger.error(e); + } catch (err) { + SystemLogger.error({ err }); return false; } diff --git a/apps/meteor/app/file-upload/server/lib/FileUpload.ts b/apps/meteor/app/file-upload/server/lib/FileUpload.ts index 8c1aa7b9d0e3e..7402c59f01bde 100644 --- a/apps/meteor/app/file-upload/server/lib/FileUpload.ts +++ b/apps/meteor/app/file-upload/server/lib/FileUpload.ts @@ -269,7 +269,7 @@ export const FileUpload = { try { await writeFile(tempFilePath, data); } catch (err: any) { - SystemLogger.error(err); + SystemLogger.error({ err }); } await this.getCollection().updateOne( diff --git a/apps/meteor/app/file-upload/server/lib/requests.ts b/apps/meteor/app/file-upload/server/lib/requests.ts index f88b2477777c8..b2ae48fbca362 100644 --- a/apps/meteor/app/file-upload/server/lib/requests.ts +++ b/apps/meteor/app/file-upload/server/lib/requests.ts @@ -44,8 +44,8 @@ WebApp.connectHandlers.use(FileUpload.getPath(), async (req, res, next) => { try { url = await store.getStore().getRedirectURL(file, false); expiryTimespan = await store.getStore().getUrlExpiryTimeSpan(); - } catch (e) { - SystemLogger.debug(e); + } catch (err) { + SystemLogger.debug({ err }); } return FileUpload.respondWithRedirectUrlInfo(url, file, req, res, expiryTimespan); } diff --git a/apps/meteor/app/importer-pending-files/server/PendingFileImporter.ts b/apps/meteor/app/importer-pending-files/server/PendingFileImporter.ts index 818031d07916e..56aa0293aedb0 100644 --- a/apps/meteor/app/importer-pending-files/server/PendingFileImporter.ts +++ b/apps/meteor/app/importer-pending-files/server/PendingFileImporter.ts @@ -129,9 +129,9 @@ export class PendingFileImporter extends Importer { // Update progress more often on large files this.reportProgress(); }); - res.on('error', async (error) => { + res.on('error', async (err) => { await completeFile(details); - logError(error); + logError({ err }); }); res.on('end', async () => { @@ -145,14 +145,14 @@ export class PendingFileImporter extends Importer { await Messages.setImportFileRocketChatAttachment(_importFile.id, url, attachment); await completeFile(details); importedRoomIds.add(message.rid); - } catch (error) { + } catch (err) { await completeFile(details); - logError(error); + logError({ err }); } }); }); - } catch (error) { - this.logger.error(error); + } catch (err) { + this.logger.error({ err }); } } diff --git a/apps/meteor/app/lib/server/functions/saveUserIdentity.ts b/apps/meteor/app/lib/server/functions/saveUserIdentity.ts index e943e1b9128ef..95abd94232bac 100644 --- a/apps/meteor/app/lib/server/functions/saveUserIdentity.ts +++ b/apps/meteor/app/lib/server/functions/saveUserIdentity.ts @@ -88,7 +88,7 @@ export async function saveUserIdentity({ try { await updateUsernameReferences(handleUpdateParams); } catch (err) { - SystemLogger.error(err); + SystemLogger.error({ err }); } }); } else { diff --git a/apps/meteor/app/lib/server/functions/setUsername.ts b/apps/meteor/app/lib/server/functions/setUsername.ts index ad0364d5617a0..9eeff3a14a0e3 100644 --- a/apps/meteor/app/lib/server/functions/setUsername.ts +++ b/apps/meteor/app/lib/server/functions/setUsername.ts @@ -123,8 +123,8 @@ export const _setUsername = async function ( setImmediate(() => { Accounts.sendEnrollmentEmail(user._id); }); - } catch (e: any) { - SystemLogger.error(e); + } catch (err: any) { + SystemLogger.error({ err }); } }, session); } diff --git a/apps/meteor/app/livechat/server/lib/rooms.ts b/apps/meteor/app/livechat/server/lib/rooms.ts index a4b6d0dbc22b6..070946089142e 100644 --- a/apps/meteor/app/livechat/server/lib/rooms.ts +++ b/apps/meteor/app/livechat/server/lib/rooms.ts @@ -254,8 +254,8 @@ export async function returnRoomAsInquiry(room: IOmnichannelRoom, departmentId?: try { await saveTransferHistory(room, transferData); await RoutingManager.unassignAgent(inquiry, departmentId); - } catch (e) { - livechatLogger.error(e); + } catch (err) { + livechatLogger.error({ err }); throw new Meteor.Error('error-returning-inquiry'); } diff --git a/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts b/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts index c3d61eef0d8f9..a72c266cd5d71 100644 --- a/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts +++ b/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts @@ -6,7 +6,13 @@ export const unsubscribe = async function (_id: string, createdAt: string): Prom if (_id && createdAt) { const affectedRows = (await Users.rocketMailUnsubscribe(_id, createdAt)) === 1; - SystemLogger.debug('[Mailer:Unsubscribe]', _id, createdAt, new Date(parseInt(createdAt)), affectedRows); + SystemLogger.debug({ + msg: '[Mailer:Unsubscribe]', + _id, + createdAt, + parsedCreatedAt: new Date(parseInt(createdAt)), + affectedRows, + }); return affectedRows; } diff --git a/apps/meteor/app/meteor-accounts-saml/server/loginHandler.ts b/apps/meteor/app/meteor-accounts-saml/server/loginHandler.ts index b95513fef0366..e9b861b4a511a 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/loginHandler.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/loginHandler.ts @@ -33,16 +33,16 @@ Accounts.registerLoginHandler('saml', async (loginRequest) => { SAMLUtils.events.emit('updateCustomFields', loginResult, updatedUser); return updatedUser; - } catch (error: any) { - SystemLogger.error(error); + } catch (err: any) { + SystemLogger.error({ err }); - let message = error.toString(); + let message = err.toString(); let errorCode = ''; - if (error instanceof Meteor.Error) { - errorCode = (error.error || error.message) as string; - } else if (error instanceof Error) { - errorCode = error.message; + if (err instanceof Meteor.Error) { + errorCode = (err.error || err.message) as string; + } else if (err instanceof Error) { + errorCode = err.message; } if (errorCode) { diff --git a/apps/meteor/app/metrics/server/lib/collectMetrics.ts b/apps/meteor/app/metrics/server/lib/collectMetrics.ts index a1ad41c9a95cf..8628a52fe4096 100644 --- a/apps/meteor/app/metrics/server/lib/collectMetrics.ts +++ b/apps/meteor/app/metrics/server/lib/collectMetrics.ts @@ -208,7 +208,7 @@ const updatePrometheusConfig = async (): Promise => { gcStats(client.register)(); } } catch (error) { - SystemLogger.error(error); + SystemLogger.error({ err: error }); } Object.assign(was, is); diff --git a/apps/meteor/app/nextcloud/server/addWebdavServer.ts b/apps/meteor/app/nextcloud/server/addWebdavServer.ts index d439389299ae2..6d3ea80f6d178 100644 --- a/apps/meteor/app/nextcloud/server/addWebdavServer.ts +++ b/apps/meteor/app/nextcloud/server/addWebdavServer.ts @@ -28,8 +28,8 @@ Meteor.startup(() => { }; try { await addWebdavAccountByToken(user._id, data); - } catch (error) { - SystemLogger.error(error); + } catch (err) { + SystemLogger.error({ err }); } }, callbacks.priority.MEDIUM, diff --git a/apps/meteor/app/notification-queue/server/NotificationQueue.ts b/apps/meteor/app/notification-queue/server/NotificationQueue.ts index 6690bea41f521..52035313949a9 100644 --- a/apps/meteor/app/notification-queue/server/NotificationQueue.ts +++ b/apps/meteor/app/notification-queue/server/NotificationQueue.ts @@ -93,9 +93,9 @@ class NotificationClass { } await NotificationQueue.removeById(notification._id); - } catch (e) { - SystemLogger.error(e); - await NotificationQueue.setErrorById(notification._id, e instanceof Error ? e.message : String(e)); + } catch (err) { + SystemLogger.error({ err }); + await NotificationQueue.setErrorById(notification._id, err instanceof Error ? err.message : String(err)); } if (counter >= this.maxBatchSize) { diff --git a/apps/meteor/app/push/server/push.ts b/apps/meteor/app/push/server/push.ts index 07a1a71f491cf..d3e85c30a0981 100644 --- a/apps/meteor/app/push/server/push.ts +++ b/apps/meteor/app/push/server/push.ts @@ -295,7 +295,7 @@ class PushClass { } if (result.status === 401) { - logger.warn('Error sending push to gateway (not authorized)', response); + logger.warn({ msg: 'authorization failed when sending push to gateway. not retrying.', response }); return; } @@ -503,7 +503,6 @@ class PushClass { userId: notification.userId, err: error, }); - logger.debug(error.stack); } } } diff --git a/apps/meteor/app/slackbridge/server/RocketAdapter.js b/apps/meteor/app/slackbridge/server/RocketAdapter.js index 624d4a72de068..ee9f211b405ff 100644 --- a/apps/meteor/app/slackbridge/server/RocketAdapter.js +++ b/apps/meteor/app/slackbridge/server/RocketAdapter.js @@ -410,8 +410,8 @@ export default class RocketAdapter { if (url) { try { await setUserAvatar(user, url, null, 'url'); - } catch (error) { - rocketLogger.debug('Error setting user avatar', error.message); + } catch (err) { + rocketLogger.debug({ msg: 'Error setting user avatar from Slack', err }); } } } @@ -482,6 +482,7 @@ export default class RocketAdapter { rocketMsgObj.tmid = tmessage._id; } } + if (slackMessage.subtype === 'bot_message') { rocketUser = await Users.findOneById('rocket.cat', { projection: { username: 1 } }); } diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index 46a5ab6d35b5e..06042b7491331 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -181,7 +181,6 @@ export default class SlackAdapter { this.slackApp.event('reaction_added', async ({ event }) => { slackLogger.debug('OnSlackEvent-REACTION_ADDED: ', event); try { - slackLogger.error({ event }); await this.onReactionAdded(event); } catch (err) { slackLogger.error({ msg: 'Unhandled error onReactionAdded', err }); @@ -871,7 +870,12 @@ export default class SlackAdapter { if (postResult && postResult.message && postResult.message.bot_id && postResult.message.ts) { this.slackBotId = postResult.message.bot_id; await Messages.setSlackBotIdAndSlackTs(rocketMessage._id, postResult.message.bot_id, postResult.message.ts); - slackLogger.debug(`RocketMsgID=${rocketMessage._id} SlackMsgID=${postResult.message.ts} SlackBotID=${postResult.message.bot_id}`); + slackLogger.debug({ + msg: 'Message posted to Slack', + rocketMessageId: rocketMessage._id, + slackMessageId: postResult.message.ts, + slackBotId: postResult.message.bot_id, + }); } } } diff --git a/apps/meteor/ee/server/configuration/ldap.ts b/apps/meteor/ee/server/configuration/ldap.ts index b68a310a424d9..afa2f05e895fc 100644 --- a/apps/meteor/ee/server/configuration/ldap.ts +++ b/apps/meteor/ee/server/configuration/ldap.ts @@ -82,16 +82,16 @@ Meteor.startup(async () => { settings.watch('LDAP_Groups_To_Rocket_Chat_Teams', (value) => { try { LDAPEEManager.validateLDAPTeamsMappingChanges(value); - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } }); settings.watch('LDAP_ABAC_AttributeMap', (value) => { try { LDAPEEManager.validateLDAPABACAttributeMap(value); - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } }); diff --git a/apps/meteor/ee/server/lib/ldap/Manager.ts b/apps/meteor/ee/server/lib/ldap/Manager.ts index 6c6d42180a284..a8ec3d84d9769 100644 --- a/apps/meteor/ee/server/lib/ldap/Manager.ts +++ b/apps/meteor/ee/server/lib/ldap/Manager.ts @@ -78,8 +78,8 @@ export class LDAPEEManager extends LDAPManager { if (disableMissingUsers) { await this.disableMissingUsers([...touchedUsers]); } - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } ldap.disconnect(); @@ -99,8 +99,8 @@ export class LDAPEEManager extends LDAPManager { } finally { ldap.disconnect(); } - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } @@ -123,8 +123,8 @@ export class LDAPEEManager extends LDAPManager { } finally { ldap.disconnect(); } - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } @@ -145,8 +145,8 @@ export class LDAPEEManager extends LDAPManager { } finally { ldap.disconnect(); } - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } @@ -211,8 +211,8 @@ export class LDAPEEManager extends LDAPManager { } finally { ldap.disconnect(); } - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } @@ -443,9 +443,9 @@ export class LDAPEEManager extends LDAPManager { await addUserToRoom(room._id, user); logger.debug({ msg: 'Synced user channel from LDAP', roomId: room._id, username }); } - } catch (e) { + } catch (err) { logger.debug({ msg: 'Failed to sync user room', username, userChannelName }); - logger.error(e); + logger.error({ err }); } } @@ -692,10 +692,10 @@ export class LDAPEEManager extends LDAPManager { converter.addObjectToMemory(userData, { dn: data.dn, username: this.getLdapUsername(data) }); return userData; }, - endCallback: (error: any): void => { - if (error) { - logger.error(error); - reject(error); + endCallback: (err: any): void => { + if (err) { + logger.error({ err }); + reject(err); return; } diff --git a/apps/meteor/server/database/utils.ts b/apps/meteor/server/database/utils.ts index 68b6d05832a95..e4b95085408cc 100644 --- a/apps/meteor/server/database/utils.ts +++ b/apps/meteor/server/database/utils.ts @@ -36,7 +36,7 @@ export const onceTransactionCommitedSuccessfully = async { try { await EmailMessageHistory.create({ _id: email.messageId, email: emailInboxRecord.email }); void onEmailReceived(email, emailInboxRecord.email, emailInboxRecord.department); - } catch (e: any) { + } catch (err: any) { // In case the email message history has been received by other instance.. - logger.error(e); + logger.error({ err }); } }); diff --git a/apps/meteor/server/lib/ldap/Connection.ts b/apps/meteor/server/lib/ldap/Connection.ts index 4d4ae9eb8e682..a6d273717d668 100644 --- a/apps/meteor/server/lib/ldap/Connection.ts +++ b/apps/meteor/server/lib/ldap/Connection.ts @@ -349,16 +349,16 @@ export class LDAPConnection { let realEntries = 0; return new Promise((resolve, reject) => { - this.client.search(baseDN, searchOptions, (error, res: ldapjs.SearchCallbackResponse) => { - if (error) { - searchLogger.error(error); - reject(error); + this.client.search(baseDN, searchOptions, (err, res: ldapjs.SearchCallbackResponse) => { + if (err) { + searchLogger.error({ err }); + reject(err); return; } - res.on('error', (error) => { - searchLogger.error(error); - reject(error); + res.on('error', (err) => { + searchLogger.error({ err }); + reject(err); }); const entries: T[] = []; @@ -370,8 +370,8 @@ export class LDAPConnection { entries.push(result as T); } realEntries++; - } catch (e) { - searchLogger.error(e); + } catch (err) { + searchLogger.error({ err }); } }); @@ -418,7 +418,7 @@ export class LDAPConnection { } if (!this.options.groupFilterGroupMemberFormat) { - searchLogger.debug(`LDAP Group Filter is enabled but no group member format is set.`); + searchLogger.debug('LDAP Group Filter is enabled but no group member format is set.'); return []; } @@ -527,16 +527,16 @@ export class LDAPConnection { searchLogger.debug({ msg: 'searchOptions', searchOptions, baseDN }); - this.client.search(baseDN, searchOptions, (error: ldapjs.Error | null, res: ldapjs.SearchCallbackResponse): void => { - if (error) { - searchLogger.error(error); - callback(error); + this.client.search(baseDN, searchOptions, (err: ldapjs.Error | null, res: ldapjs.SearchCallbackResponse): void => { + if (err) { + searchLogger.error({ err }); + callback(err); return; } - res.on('error', (error) => { - searchLogger.error(error); - callback(error); + res.on('error', (err) => { + searchLogger.error({ err }); + callback(err); }); const entries: T[] = []; @@ -545,8 +545,8 @@ export class LDAPConnection { try { const result = entryCallback ? entryCallback(entry) : entry; entries.push(result as T); - } catch (e) { - searchLogger.error(e); + } catch (err) { + searchLogger.error({ err }); } }); @@ -591,16 +591,16 @@ export class LDAPConnection { searchLogger.debug({ msg: 'searchOptions', searchOptions, baseDN }); - this.client.search(baseDN, searchOptions, (error: ldapjs.Error | null, res: ldapjs.SearchCallbackResponse): void => { - if (error) { - searchLogger.error(error); - callback(error); + this.client.search(baseDN, searchOptions, (err: ldapjs.Error | null, res: ldapjs.SearchCallbackResponse): void => { + if (err) { + searchLogger.error({ err }); + callback(err); return; } - res.on('error', (error) => { - searchLogger.error(error); - callback(error); + res.on('error', (err) => { + searchLogger.error({ err }); + callback(err); }); let entries: T[] = []; @@ -622,8 +622,8 @@ export class LDAPConnection { ); entries = []; } - } catch (e) { - searchLogger.error(e); + } catch (err) { + searchLogger.error({ err }); } }); @@ -754,24 +754,20 @@ export class LDAPConnection { }; } - private handleConnectionResponse(error: any, response?: any): void { + private handleConnectionResponse(err: any, response?: any): void { if (!this._receivedResponse) { this._receivedResponse = true; - this._connectionCallback(error, response); + this._connectionCallback(err, response); return; } - if (this._connectionTimedOut && !error) { + if (this._connectionTimedOut && !err) { connLogger.info('Received a response after the connection timedout.'); } else { logger.debug('Ignored error/response:'); } - if (error) { - connLogger.debug(error); - } else { - connLogger.debug(response); - } + connLogger.debug({ err, response }); } private initializeConnection(callback: ILDAPCallback): void { @@ -787,7 +783,7 @@ export class LDAPConnection { this.client = ldapjs.createClient(clientOptions); this.client.on('error', (error) => { - connLogger.error(error); + connLogger.error({ err: error }); this.handleConnectionResponse(error, null); }); @@ -809,10 +805,10 @@ export class LDAPConnection { connLogger.info('Starting TLS'); connLogger.debug({ msg: 'tlsOptions', tlsOptions }); - this.client.starttls(tlsOptions, null, (error, response) => { - if (error) { - connLogger.error({ msg: 'TLS connection', error }); - return this.handleConnectionResponse(error, null); + this.client.starttls(tlsOptions, null, (err, response) => { + if (err) { + connLogger.error({ msg: 'TLS connection', err }); + return this.handleConnectionResponse(err, null); } connLogger.info('TLS connected'); diff --git a/apps/meteor/server/lib/ldap/Manager.ts b/apps/meteor/server/lib/ldap/Manager.ts index 9b747c0f78fd9..1dac8ad89ed52 100644 --- a/apps/meteor/server/lib/ldap/Manager.ts +++ b/apps/meteor/server/lib/ldap/Manager.ts @@ -36,8 +36,8 @@ export class LDAPManager { try { await ldap.connect(); ldapUser = await this.findUser(ldap, username, password); - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } if (ldapUser === undefined) { @@ -78,8 +78,8 @@ export class LDAPManager { try { await ldap.connect(); ldapUser = await this.findAuthenticatedUser(ldap, username); - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } if (ldapUser === undefined) { @@ -108,9 +108,9 @@ export class LDAPManager { try { const ldap = new LDAPConnection(); await ldap.testConnection(); - } catch (error) { - connLogger.error(error); - throw error; + } catch (err) { + connLogger.error({ err }); + throw err; } } @@ -126,9 +126,9 @@ export class LDAPManager { logger.debug({ msg: 'Search results', count: users.length, username: escapedUsername }); throw new Error('User not found'); } - } catch (error) { - logger.error(error); - throw error; + } catch (err) { + logger.error({ err }); + throw err; } } @@ -245,8 +245,8 @@ export class LDAPManager { } } return ldapUser; - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } @@ -276,8 +276,8 @@ export class LDAPManager { } return ldapUser; - } catch (error) { - logger.error(error); + } catch (err) { + logger.error({ err }); } } diff --git a/apps/meteor/server/lib/sendDirectMessageToUsers.ts b/apps/meteor/server/lib/sendDirectMessageToUsers.ts index 644e5161ef903..2183331cedfe0 100644 --- a/apps/meteor/server/lib/sendDirectMessageToUsers.ts +++ b/apps/meteor/server/lib/sendDirectMessageToUsers.ts @@ -25,8 +25,8 @@ export async function sendDirectMessageToUsers( await executeSendMessage(fromId, { rid, msg }); success.push(user._id); - } catch (error) { - SystemLogger.error(error); + } catch (err) { + SystemLogger.error({ err }); } } diff --git a/apps/meteor/server/lib/sendMessagesToAdmins.ts b/apps/meteor/server/lib/sendMessagesToAdmins.ts index 386b8fece3f68..96527f765d7de 100644 --- a/apps/meteor/server/lib/sendMessagesToAdmins.ts +++ b/apps/meteor/server/lib/sendMessagesToAdmins.ts @@ -51,8 +51,8 @@ export async function sendMessagesToAdmins({ await Promise.all( (await getData>(msgs, adminUser)).map((msg) => executeSendMessage(fromId, Object.assign({ rid }, msg))), ); - } catch (error) { - SystemLogger.error(error); + } catch (err) { + SystemLogger.error({ err }); } } diff --git a/apps/meteor/server/methods/sendForgotPasswordEmail.ts b/apps/meteor/server/methods/sendForgotPasswordEmail.ts index 6d7706d25c7ba..e534d2febdbab 100644 --- a/apps/meteor/server/methods/sendForgotPasswordEmail.ts +++ b/apps/meteor/server/methods/sendForgotPasswordEmail.ts @@ -32,8 +32,8 @@ export const sendForgotPasswordEmail = async (to: string): Promise URL or Twilio token not configured.`); + SystemLogger.error('(Twilio) -> URL or Twilio token not configured.'); return false; } diff --git a/apps/meteor/server/services/omnichannel/queue.ts b/apps/meteor/server/services/omnichannel/queue.ts index d522c78d7daaa..68acf2401e961 100644 --- a/apps/meteor/server/services/omnichannel/queue.ts +++ b/apps/meteor/server/services/omnichannel/queue.ts @@ -228,7 +228,7 @@ export class OmnichannelQueue implements IOmnichannelQueue { private async processWaitingQueue(department: string | null, inquiry: InquiryWithAgentInfo) { const queue = department || 'Public'; - queueLogger.debug(`Processing inquiry ${inquiry._id} from queue ${queue}`); + queueLogger.debug({ msg: 'Processing inquiry', inquiry: inquiry._id, queue }); const { defaultAgent } = inquiry; const roomFromDb = await LivechatRooms.findOneById(inquiry.rid); diff --git a/ee/packages/media-calls/src/internal/SignalProcessor.ts b/ee/packages/media-calls/src/internal/SignalProcessor.ts index 3ca1e5952b638..9b292f94d2299 100644 --- a/ee/packages/media-calls/src/internal/SignalProcessor.ts +++ b/ee/packages/media-calls/src/internal/SignalProcessor.ts @@ -104,7 +104,7 @@ export class GlobalSignalProcessor { await agent.processSignal(call, signal); } catch (e) { - logger.error(e); + logger.error({ err: e }); throw e; } } diff --git a/packages/omni-core/src/visitor/create.ts b/packages/omni-core/src/visitor/create.ts index f3c8518c70872..8e91b7c49efa3 100644 --- a/packages/omni-core/src/visitor/create.ts +++ b/packages/omni-core/src/visitor/create.ts @@ -107,7 +107,7 @@ export const registerGuest = makeFunction( }); if (!upsertedLivechatVisitor) { - logger.debug(`No visitor found after upsert`); + logger.debug('No visitor found after upsert'); return null; } From d4680aba5c64d75d9706c238bfaba0be3271ef1a Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Jan 2026 14:12:21 -0600 Subject: [PATCH 03/12] files --- .../app/integrations/server/lib/triggerHandler.ts | 6 +++--- .../app/meteor-accounts-saml/server/lib/SAML.ts | 6 +++--- apps/meteor/app/slackbridge/server/slackbridge.js | 6 +++--- .../app/webdav/server/methods/uploadFileToWebdav.ts | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/meteor/app/integrations/server/lib/triggerHandler.ts b/apps/meteor/app/integrations/server/lib/triggerHandler.ts index abf3437f1bed9..4b8351efee71e 100644 --- a/apps/meteor/app/integrations/server/lib/triggerHandler.ts +++ b/apps/meteor/app/integrations/server/lib/triggerHandler.ts @@ -782,12 +782,12 @@ class RocketChatIntegrationHandler { } } }) - .catch(async (error) => { - outgoingLogger.error(error); + .catch(async (err) => { + outgoingLogger.error({ err }); await updateHistory({ historyId, step: 'after-http-call', - httpError: error, + httpError: err, httpResult: null, }); }); diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts index dc9b83eb67f7f..bb0c5474772a9 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts @@ -342,8 +342,8 @@ export class SAML { redirect(url); }); - } catch (e: any) { - SystemLogger.error(e); + } catch (err: any) { + SystemLogger.error({ err }); redirect(); } }); @@ -521,7 +521,7 @@ export class SAML { } } } catch (err: any) { - SystemLogger.error(err); + SystemLogger.error({ err }); } } } diff --git a/apps/meteor/app/slackbridge/server/slackbridge.js b/apps/meteor/app/slackbridge/server/slackbridge.js index 89ff66a13397e..0012ace30e861 100644 --- a/apps/meteor/app/slackbridge/server/slackbridge.js +++ b/apps/meteor/app/slackbridge/server/slackbridge.js @@ -45,7 +45,7 @@ class SlackBridgeClass { this.rocket.addSlack(slack); this.slackAdapters.push(slack); - slack.connect({ apiToken }).catch((err) => connLogger.error('error connecting to slack', err)); + slack.connect({ apiToken }).catch((err) => connLogger.error({ msg: 'error connecting to slack', err })); }); } else { const botTokenList = this.botTokens.split('\n'); // Bot token list @@ -70,7 +70,7 @@ class SlackBridgeClass { this.rocket.addSlack(slack); this.slackAdapters.push(slack); - slack.connect({ appCredential }).catch((err) => connLogger.error('error connecting to slack', err)); + slack.connect({ appCredential }).catch((err) => connLogger.error({ msg: 'error connecting to slack', err })); }); } @@ -109,7 +109,7 @@ class SlackBridgeClass { connLogger.info('Slack Bridge Disconnected'); } } catch (error) { - connLogger.error('An error occurred during disconnection', error); + connLogger.error({ msg: 'An error occurred during disconnection', err: error }); } } diff --git a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts index 97bcf46322161..6d66031aa4173 100644 --- a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts +++ b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts @@ -38,17 +38,17 @@ Meteor.methods({ try { await uploadFileToWebdav(accountId, fileData instanceof ArrayBuffer ? Buffer.from(fileData) : fileData, name); return { success: true }; - } catch (error: any) { - if (typeof error === 'object' && error instanceof Error && error.name === 'error-invalid-account') { - throw new MeteorError(error.name, 'Invalid WebDAV Account', { + } catch (err: any) { + if (typeof err === 'object' && err instanceof Error && err.name === 'error-invalid-account') { + throw new MeteorError(err.name, 'Invalid WebDAV Account', { method: 'uploadFileToWebdav', }); } - logger.error(error); + logger.error({ err }); - if (error.response) { - const { status } = error.response; + if (err.response) { + const { status } = err.response; if (status === 404) { return { success: false, message: 'webdav-server-not-found' }; } From 83e72ee3a4a7071e8130efee24fa49506beb51c8 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Jan 2026 14:27:10 -0600 Subject: [PATCH 04/12] i think? --- .../server/lib/isolated-vm/isolated-vm.ts | 2 +- .../meteor-accounts-saml/server/lib/Utils.ts | 17 +++--- .../app/slackbridge/server/SlackAdapter.js | 52 +++++++++---------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/apps/meteor/app/integrations/server/lib/isolated-vm/isolated-vm.ts b/apps/meteor/app/integrations/server/lib/isolated-vm/isolated-vm.ts index 2c78b6d98a7ce..42044697014cb 100644 --- a/apps/meteor/app/integrations/server/lib/isolated-vm/isolated-vm.ts +++ b/apps/meteor/app/integrations/server/lib/isolated-vm/isolated-vm.ts @@ -56,7 +56,7 @@ export class IsolatedVMScriptEngine extends Integrat const script = integration.scriptCompiled; try { this.logger.info({ msg: 'Will evaluate the integration script', integration: pick(integration, 'name', '_id') }); - this.logger.debug(script); + this.logger.debug({ script }); const isolate = new ivm.Isolate({ memoryLimit: 8 }); diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/Utils.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/Utils.ts index 5d43e122c7a7e..ec8924c69a7f4 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/Utils.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/Utils.ts @@ -51,7 +51,7 @@ export class SAMLUtils { } public static getServiceProviderOptions(providerName: string): IServiceProviderOptions | undefined { - this.log(providerName, providerList); + this.log({ providerName, providerList }); return providerList.find((providerOptions) => providerOptions.provider === providerName); } @@ -133,15 +133,15 @@ export class SAMLUtils { return `saml/${credentialToken}?saml_idp_credentialToken=${credentialToken}`; } - public static log(obj: any, ...args: Array): void { + public static log(obj: object | string): void { if (debug && logger) { - logger.debug(obj, ...args); + logger.debug(obj); } } - public static error(obj: any, ...args: Array): void { + public static error(obj: object | string): void { if (logger) { - logger.error(obj, ...args); + logger.error(obj); } } @@ -219,9 +219,8 @@ export class SAMLUtils { try { map = JSON.parse(userDataFieldMap); - } catch (e) { - SAMLUtils.log(userDataFieldMap); - SAMLUtils.log(e); + } catch (err) { + SAMLUtils.log({ userDataFieldMap, err }); throw new Error('Failed to parse custom user field map'); } @@ -412,7 +411,7 @@ export class SAMLUtils { public static mapProfileToUserObject(profile: Record): ISAMLUser { const userDataMap = this.getUserDataMapping(); - SAMLUtils.log('parsed userDataMap', userDataMap); + SAMLUtils.log({ msg: 'Mapping SAML Profile to User Object', userDataMap }); if (userDataMap.identifier.type === 'custom') { if (!userDataMap.identifier.attribute) { diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index 06042b7491331..3783416c8d4d8 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -25,7 +25,7 @@ import { getUserAvatarURL } from '../../utils/server/getUserAvatarURL'; export default class SlackAdapter { constructor(slackBridge) { - slackLogger.debug('constructor'); + slackLogger.debug({ msg: 'constructor' }); this.slackBridge = slackBridge; this.rtm = {}; // slack-client Real Time Messaging API this.apiToken = {}; // Slack API Token passed in via Connect @@ -45,8 +45,8 @@ export default class SlackAdapter { const connectResult = await (appCredential ? this.connectApp(appCredential) : this.connectLegacy(apiToken)); if (connectResult) { - slackLogger.info('Connected to Slack'); - slackLogger.debug('Slack connection result: ', connectResult); + slackLogger.info({ msg: 'Connected to Slack' }); + slackLogger.debug({ msg: 'Slack connection result', connectResult }); Meteor.startup(async () => { try { await this.populateMembershipChannelMap(); // If run outside of Meteor.startup, HTTP is not defined @@ -153,7 +153,7 @@ export default class SlackAdapter { * } */ this.slackApp.message(async ({ message }) => { - slackLogger.debug('OnSlackEvent-MESSAGE: ', message); + slackLogger.debug({ msg: 'OnSlackEvent-MESSAGE', message }); if (message) { try { await this.onMessage(message); @@ -179,7 +179,7 @@ export default class SlackAdapter { * } */ this.slackApp.event('reaction_added', async ({ event }) => { - slackLogger.debug('OnSlackEvent-REACTION_ADDED: ', event); + slackLogger.debug({ msg: 'OnSlackEvent-REACTION_ADDED', event }); try { await this.onReactionAdded(event); } catch (err) { @@ -203,7 +203,7 @@ export default class SlackAdapter { * } */ this.slackApp.event('reaction_removed', async ({ event }) => { - slackLogger.debug('OnSlackEvent-REACTION_REMOVED: ', event); + slackLogger.debug({ msg: 'OnSlackEvent-REACTION_REMOVED', event }); try { await this.onReactionRemoved(event); } catch (err) { @@ -224,7 +224,7 @@ export default class SlackAdapter { * } */ this.slackApp.event('member_joined_channel', async ({ event, context }) => { - slackLogger.debug('OnSlackEvent-CHANNEL_LEFT: ', event); + slackLogger.debug({ msg: 'OnSlackEvent-CHANNEL_LEFT', event }); try { await this.processMemberJoinChannel(event, context); } catch (err) { @@ -233,7 +233,7 @@ export default class SlackAdapter { }); this.slackApp.event('channel_left', async ({ event }) => { - slackLogger.debug('OnSlackEvent-CHANNEL_LEFT: ', event); + slackLogger.debug({ msg: 'OnSlackEvent-CHANNEL_LEFT', event }); try { this.onChannelLeft(event); } catch (err) { @@ -250,7 +250,7 @@ export default class SlackAdapter { * @deprecated */ registerForEventsLegacy() { - slackLogger.debug('Register for events'); + slackLogger.debug({ msg: 'Register for events' }); this.rtm.on('authenticated', () => { slackLogger.info('Connected to Slack'); }); @@ -278,7 +278,7 @@ export default class SlackAdapter { * } **/ this.rtm.on('message', async (slackMessage) => { - slackLogger.debug('OnSlackEvent-MESSAGE: ', slackMessage); + slackLogger.debug({ msg: 'OnSlackEvent-MESSAGE', slackMessage }); if (slackMessage) { try { await this.onMessage(slackMessage); @@ -289,7 +289,7 @@ export default class SlackAdapter { }); this.rtm.on('reaction_added', async (reactionMsg) => { - slackLogger.debug('OnSlackEvent-REACTION_ADDED: ', reactionMsg); + slackLogger.debug({ msg: 'OnSlackEvent-REACTION_ADDED', reactionMsg }); if (reactionMsg) { try { await this.onReactionAdded(reactionMsg); @@ -300,7 +300,7 @@ export default class SlackAdapter { }); this.rtm.on('reaction_removed', async (reactionMsg) => { - slackLogger.debug('OnSlackEvent-REACTION_REMOVED: ', reactionMsg); + slackLogger.debug({ msg: 'OnSlackEvent-REACTION_REMOVED', reactionMsg }); if (reactionMsg) { try { await this.onReactionRemoved(reactionMsg); @@ -369,7 +369,7 @@ export default class SlackAdapter { * } **/ this.rtm.on('channel_left', (channelLeftMsg) => { - slackLogger.debug('OnSlackEvent-CHANNEL_LEFT: ', channelLeftMsg); + slackLogger.debug({ msg: 'OnSlackEvent-CHANNEL_LEFT', channelLeftMsg }); if (channelLeftMsg) { try { this.onChannelLeft(channelLeftMsg); @@ -628,7 +628,7 @@ export default class SlackAdapter { } async postFindChannel(rocketChannelName) { - slackLogger.debug('Searching for Slack channel or group', rocketChannelName); + slackLogger.debug({ msg: 'Searching for Slack channel or group', rocketChannelName }); const channels = await this.slackAPI.getChannels(); if (channels && channels.length > 0) { for (const channel of channels) { @@ -679,7 +679,7 @@ export default class SlackAdapter { addSlackChannel(rocketChID, slackChID) { const ch = this.getSlackChannel(rocketChID); if (ch == null) { - slackLogger.debug('Added channel', { rocketChID, slackChID }); + slackLogger.debug({ msg: 'Added channel', rocketChID, slackChID }); this.slackChannelRocketBotMembershipMap.set(rocketChID, { id: slackChID, family: slackChID.charAt(0) === 'C' ? 'channels' : 'groups', @@ -854,7 +854,7 @@ export default class SlackAdapter { data.thread_ts = tmessage.slackTs; } } - slackLogger.debug('Post Message To Slack', data); + slackLogger.debug({ msg: 'Post Message To Slack', data }); // If we don't have the bot id yet and we have multiple slack bridges, we need to keep track of the messages that are being sent if (!this.slackBotId && this.rocket.slackAdapters && this.rocket.slackAdapters.length >= 2) { @@ -891,7 +891,7 @@ export default class SlackAdapter { text: rocketMessage.msg, as_user: true, }; - slackLogger.debug('Post UpdateMessage To Slack', data); + slackLogger.debug({ msg: 'Post UpdateMessage To Slack', data }); const postResult = await this.slackAPI.updateMessage(data); if (postResult) { slackLogger.debug('Message updated on Slack'); @@ -900,7 +900,7 @@ export default class SlackAdapter { } async processMemberJoinChannel(event, context) { - slackLogger.debug('Member join channel', event.channel); + slackLogger.debug({ msg: 'Member join channel', channel: event.channel }); const rocketCh = await this.rocket.getChannel({ channel: event.channel }); if (rocketCh != null) { this.addSlackChannel(rocketCh._id, event.channel); @@ -912,7 +912,7 @@ export default class SlackAdapter { } async processChannelJoin(slackMessage) { - slackLogger.debug('Channel join', slackMessage.channel.id); + slackLogger.debug({ msg: 'Channel join', channelId: slackMessage.channel.id }); const rocketCh = await this.rocket.addChannel(slackMessage.channel); if (rocketCh != null) { this.addSlackChannel(rocketCh._id, slackMessage.channel); @@ -1324,7 +1324,7 @@ export default class SlackAdapter { if (Array.isArray(data.messages) && data.messages.length) { let latest = 0; for await (const message of data.messages.reverse()) { - slackLogger.debug('MESSAGE: ', message); + slackLogger.debug({ msg: 'MESSAGE', message }); if (!latest || message.ts > latest) { latest = message.ts; } @@ -1336,7 +1336,7 @@ export default class SlackAdapter { } async copyChannelInfo(rid, channelMap) { - slackLogger.debug('Copying users from Slack channel to Rocket.Chat', channelMap.id, rid); + slackLogger.debug({ msg: 'Copying users from Slack channel to Rocket.Chat', channelId: channelMap.id, rid }); const channel = await this.slackAPI.getRoomInfo(channelMap.id); if (channel) { const members = await this.slackAPI.getMembers(channelMap.id); @@ -1344,7 +1344,7 @@ export default class SlackAdapter { for await (const member of members) { const user = (await this.rocket.findUser(member)) || (await this.rocket.addUser(member)); if (user) { - slackLogger.debug('Adding user to room', user.username, rid); + slackLogger.debug({ msg: 'Adding user to room', username: user.username, rid }); await addUserToRoom(rid, user, null, { skipSystemMessage: true }); } } @@ -1373,7 +1373,7 @@ export default class SlackAdapter { if (topic) { const creator = (await this.rocket.findUser(topic_creator)) || (await this.rocket.addUser(topic_creator)); - slackLogger.debug('Setting room topic', rid, topic, creator.username); + slackLogger.debug({ msg: 'Setting room topic', rid, topic, username: creator.username }); await saveRoomTopic(rid, topic, creator, false); } } @@ -1415,13 +1415,13 @@ export default class SlackAdapter { } async importMessages(rid, callback) { - slackLogger.info('importMessages: ', rid); + slackLogger.info({ msg: 'importMessages', rid }); const rocketchat_room = await Rooms.findOneById(rid); if (rocketchat_room) { if (this.getSlackChannel(rid)) { await this.copyChannelInfo(rid, this.getSlackChannel(rid)); - slackLogger.debug('Importing messages from Slack to Rocket.Chat', this.getSlackChannel(rid), rid); + slackLogger.debug({ msg: 'Importing messages from Slack to Rocket.Chat', slackChannel: this.getSlackChannel(rid), rid }); let results = await this.importFromHistory({ channel: this.getSlackChannel(rid).id, @@ -1435,7 +1435,7 @@ export default class SlackAdapter { }); } - slackLogger.debug('Pinning Slack channel messages to Rocket.Chat', this.getSlackChannel(rid), rid); + slackLogger.debug({ msg: 'Pinning Slack channel messages to Rocket.Chat', slackChannel: this.getSlackChannel(rid), rid }); await this.copyPins(rid, this.getSlackChannel(rid)); return callback(); From f548117986db34d616f26a585908ec5b4919f0bd Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 08:51:06 -0600 Subject: [PATCH 05/12] fasfa --- .../meteor-accounts-saml/server/lib/SAML.ts | 6 +++--- .../app/slackbridge/server/RocketAdapter.js | 2 +- .../app/slackbridge/server/slackbridge.js | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts index bb0c5474772a9..4edd33fd0704a 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts @@ -351,7 +351,7 @@ export class SAML { private static async processLogoutResponse(req: IIncomingMessage, res: ServerResponse, service: IServiceProviderOptions): Promise { if (!req.query.SAMLResponse) { - SAMLUtils.error('Invalid LogoutResponse, missing SAMLResponse', req.query); + SAMLUtils.error({ msg: 'Invalid LogoutResponse received: missing SAMLResponse parameter.', query: req.query }); throw new Error('Invalid LogoutResponse received.'); } @@ -455,8 +455,8 @@ export class SAML { Location: url, }); res.end(); - } catch (error) { - SAMLUtils.error(error); + } catch (err) { + SAMLUtils.error({ err }); res.writeHead(302, { Location: Meteor.absoluteUrl(), }); diff --git a/apps/meteor/app/slackbridge/server/RocketAdapter.js b/apps/meteor/app/slackbridge/server/RocketAdapter.js index ee9f211b405ff..b6a0b1ccbcfec 100644 --- a/apps/meteor/app/slackbridge/server/RocketAdapter.js +++ b/apps/meteor/app/slackbridge/server/RocketAdapter.js @@ -343,7 +343,7 @@ export default class RocketAdapter { } async addUser(slackUserID) { - rocketLogger.debug('Adding Rocket.Chat user from Slack', slackUserID); + rocketLogger.debug({ msg: 'Adding Rocket.Chat user from Slack', slackUserID }); let addedUser; for await (const slack of this.slackAdapters) { if (addedUser) { diff --git a/apps/meteor/app/slackbridge/server/slackbridge.js b/apps/meteor/app/slackbridge/server/slackbridge.js index 0012ace30e861..75409f4314ceb 100644 --- a/apps/meteor/app/slackbridge/server/slackbridge.js +++ b/apps/meteor/app/slackbridge/server/slackbridge.js @@ -120,7 +120,7 @@ class SlackBridgeClass { this.isLegacyRTM = value; this.debouncedReconnectIfEnabled(); } - classLogger.debug('Setting: SlackBridge_UseLegacy', value); + classLogger.debug({ msg: 'Setting: SlackBridge_UseLegacy', value }); }); // Slack installtion Bot token @@ -129,7 +129,7 @@ class SlackBridgeClass { this.botTokens = value; this.debouncedReconnectIfEnabled(); } - classLogger.debug('Setting: SlackBridge_BotToken', value); + classLogger.debug({ msg: 'Setting: SlackBridge_BotToken', value }); }); // Slack installtion App token settings.watch('SlackBridge_AppToken', (value) => { @@ -137,7 +137,7 @@ class SlackBridgeClass { this.appTokens = value; this.debouncedReconnectIfEnabled(); } - classLogger.debug('Setting: SlackBridge_AppToken', value); + classLogger.debug({ msg: 'Setting: SlackBridge_AppToken', value }); }); // Slack installtion Signing token settings.watch('SlackBridge_SigningSecret', (value) => { @@ -145,7 +145,7 @@ class SlackBridgeClass { this.signingSecrets = value; this.debouncedReconnectIfEnabled(); } - classLogger.debug('Setting: SlackBridge_SigningSecret', value); + classLogger.debug({ msg: 'Setting: SlackBridge_SigningSecret', value }); }); // Slack installation API token @@ -155,25 +155,25 @@ class SlackBridgeClass { this.debouncedReconnectIfEnabled(); } - classLogger.debug('Setting: SlackBridge_APIToken', value); + classLogger.debug({ msg: 'Setting: SlackBridge_APIToken', value }); }); // Import messages from Slack with an alias; %s is replaced by the username of the user. If empty, no alias will be used. settings.watch('SlackBridge_AliasFormat', (value) => { this.aliasFormat = value; - classLogger.debug('Setting: SlackBridge_AliasFormat', value); + classLogger.debug({ msg: 'Setting: SlackBridge_AliasFormat', value }); }); // Do not propagate messages from bots whose name matches the regular expression above. If left empty, all messages from bots will be propagated. settings.watch('SlackBridge_ExcludeBotnames', (value) => { this.excludeBotnames = value; - classLogger.debug('Setting: SlackBridge_ExcludeBotnames', value); + classLogger.debug({ msg: 'Setting: SlackBridge_ExcludeBotnames', value }); }); // Reactions settings.watch('SlackBridge_Reactions_Enabled', (value) => { this.isReactionsEnabled = value; - classLogger.debug('Setting: SlackBridge_Reactions_Enabled', value); + classLogger.debug({ msg: 'Setting: SlackBridge_Reactions_Enabled', value }); }); // Is this entire SlackBridge enabled @@ -186,7 +186,7 @@ class SlackBridgeClass { this.disconnect(); } } - classLogger.debug('Setting: SlackBridge_Enabled', value); + classLogger.debug({ msg: 'Setting: SlackBridge_Enabled', value }); }); } } From bad6ce8a7831c4dec02c88cd8fdbb355416d1d1e Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 08:57:44 -0600 Subject: [PATCH 06/12] Update LogoutRequest.ts --- .../server/lib/parsers/LogoutRequest.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts index bbae84556a9a9..4edb31702bb86 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts @@ -37,14 +37,13 @@ export class LogoutRequestParser { const id = request.getAttribute('ID'); return callback(null, { idpSession, nameID, id }); - } catch (e) { - SAMLUtils.error(e); - SAMLUtils.log(`Caught error: ${e}`); + } catch (err) { + SAMLUtils.error({ err }); const msg = doc.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:protocol', 'StatusMessage'); SAMLUtils.log(`Unexpected msg from IDP. Does your session still exist at IDP? Idp returned: \n ${msg}`); - return callback(e instanceof Error ? e : String(e), null); + return callback(err instanceof Error ? err : String(err), null); } } } From 074c5e8fc933533e3f37299e8c5e56583df9aec1 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 09:06:10 -0600 Subject: [PATCH 07/12] saml --- .../app/meteor-accounts-saml/server/lib/SAML.ts | 7 +++---- .../server/lib/ServiceProvider.ts | 2 +- .../server/lib/generators/LogoutRequest.ts | 2 +- .../server/lib/generators/LogoutResponse.ts | 2 +- .../server/lib/parsers/LogoutRequest.ts | 6 +++--- .../server/lib/parsers/LogoutResponse.ts | 8 ++++---- .../server/lib/parsers/Response.ts | 13 ++++++------- .../app/meteor-accounts-saml/server/lib/settings.ts | 2 +- .../server/methods/samlLogout.ts | 4 ++-- 9 files changed, 22 insertions(+), 24 deletions(-) diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts index 4edd33fd0704a..fdac8b0b77fa8 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts @@ -276,7 +276,7 @@ export class SAML { } private static async _logoutRemoveTokens(userId: string): Promise { - SAMLUtils.log(`Found user ${userId}`); + SAMLUtils.log({ msg: 'Found user', userId }); await Users.unsetLoginTokens(userId); await Users.removeSamlServiceSession(userId); @@ -366,7 +366,7 @@ export class SAML { } const logOutUser = async (inResponseTo: string): Promise => { - SAMLUtils.log(`Logging Out user via inResponseTo ${inResponseTo}`); + SAMLUtils.log({ msg: 'Processing logout for inResponseTo', inResponseTo }); const loggedOutUsers = await Users.findBySAMLInResponseTo(inResponseTo).toArray(); if (loggedOutUsers.length > 1) { @@ -410,8 +410,7 @@ export class SAML { try { url = await serviceProvider.getAuthorizeUrl(samlObject.credentialToken); } catch (err: any) { - SAMLUtils.error('Unable to generate authorize url'); - SAMLUtils.error(err); + SAMLUtils.error({ err, msg: 'Unable to generate authorize url' }); url = Meteor.absoluteUrl(); } diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts index bdce2978850d8..d7b0970ece5e0 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts @@ -176,7 +176,7 @@ export class SAMLServiceProvider { public async getAuthorizeUrl(credentialToken: string): Promise { const request = this.generateAuthorizeRequest(credentialToken); SAMLUtils.log('-----REQUEST------'); - SAMLUtils.log(request); + SAMLUtils.log({ request }); return this.requestToUrl(request, 'authorize'); } diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts index ebca0b4b45f8e..0ced2806dbfbc 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts @@ -13,7 +13,7 @@ export class LogoutRequest { const request = SAMLUtils.fillTemplateData(serviceProviderOptions.logoutRequestTemplate || defaultLogoutRequestTemplate, data); SAMLUtils.log('------- SAML Logout request -----------'); - SAMLUtils.log(request); + SAMLUtils.log({ request }); return { request, diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts index a2563cede90f7..3f1996f66eb20 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts @@ -18,7 +18,7 @@ export class LogoutResponse { const response = SAMLUtils.fillTemplateData(serviceProviderOptions.logoutResponseTemplate || defaultLogoutResponseTemplate, data); SAMLUtils.log('------- SAML Logout response -----------'); - SAMLUtils.log(response); + SAMLUtils.log({ response }); return { response, diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts index 4edb31702bb86..c609328ea21bf 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutRequest.ts @@ -12,7 +12,7 @@ export class LogoutRequestParser { } public async validate(xmlString: string, callback: ILogoutRequestValidateCallback): Promise { - SAMLUtils.log(`LogoutRequest: ${xmlString}`); + SAMLUtils.log({ msg: 'Validating SAML Logout Request', xmlString }); const doc = new xmldom.DOMParser().parseFromString(xmlString, 'text/xml'); if (!doc) { @@ -40,8 +40,8 @@ export class LogoutRequestParser { } catch (err) { SAMLUtils.error({ err }); - const msg = doc.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:protocol', 'StatusMessage'); - SAMLUtils.log(`Unexpected msg from IDP. Does your session still exist at IDP? Idp returned: \n ${msg}`); + const statusMessage = doc.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:protocol', 'StatusMessage'); + SAMLUtils.log({ msg: `Unexpected msg from IDP. Does your session still exist at IDP?`, statusMessage }); return callback(err instanceof Error ? err : String(err), null); } diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutResponse.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutResponse.ts index 54db1a675c9ac..af9c176233cdf 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutResponse.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/LogoutResponse.ts @@ -12,7 +12,7 @@ export class LogoutResponseParser { } public async validate(xmlString: string, callback: ILogoutResponseValidateCallback): Promise { - SAMLUtils.log(`LogoutResponse: ${xmlString}`); + SAMLUtils.log({ msg: 'Validating SAML Logout Response', xmlString }); const doc = new xmldom.DOMParser().parseFromString(xmlString, 'text/xml'); if (!doc) { @@ -28,9 +28,9 @@ export class LogoutResponseParser { let inResponseTo; try { inResponseTo = response.getAttribute('InResponseTo'); - SAMLUtils.log(`In Response to: ${inResponseTo}`); - } catch (e) { - SAMLUtils.log(`Caught error: ${e}`); + SAMLUtils.log({ msg: `Found InResponseTo`, inResponseTo }); + } catch (err) { + SAMLUtils.log({ err }); const msg = doc.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:protocol', 'StatusMessage'); SAMLUtils.log(`Unexpected msg from IDP. Does your session still exist at IDP? Idp returned: \n ${msg}`); } diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/Response.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/Response.ts index af052f43b7fe0..87aeb4ad9f6c8 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/Response.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/parsers/Response.ts @@ -19,7 +19,7 @@ export class ResponseParser { public validate(xml: string, callback: IResponseValidateCallback): void { // We currently use RelayState to save SAML provider - SAMLUtils.log(`Validating response with relay state: ${xml}`); + SAMLUtils.log({ msg: 'Validating SAML Response', xml }); let error: Error | null = null; @@ -145,7 +145,7 @@ export class ResponseParser { if (authnStatement) { if (authnStatement.hasAttribute('SessionIndex')) { profile.sessionIndex = authnStatement.getAttribute('SessionIndex'); - SAMLUtils.log(`Session Index: ${profile.sessionIndex}`); + SAMLUtils.log({ msg: 'Session Index Found', sessionIndex: profile.sessionIndex }); } else { SAMLUtils.log('No Session Index Found'); } @@ -353,7 +353,7 @@ export class ResponseParser { const options = { key: this.serviceProviderOptions.privateKey }; xmlenc.decrypt(encSubject.getElementsByTagNameNS('*', 'EncryptedData')[0], options, (err, result) => { if (err) { - SAMLUtils.error(err); + SAMLUtils.error({ err }); } subject = new xmldom.DOMParser().parseFromString(result, 'text/xml'); }); @@ -418,9 +418,9 @@ export class ResponseParser { } private mapAttributes(attributeStatement: Element, profile: Record): void { - SAMLUtils.log(`Attribute Statement found in SAML response: ${attributeStatement}`); + SAMLUtils.log({ msg: 'Attribute Statement found, mapping attributes to profile.', attributeStatement }); const attributes = attributeStatement.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:assertion', 'Attribute'); - SAMLUtils.log(`Attributes will be processed: ${attributes.length}`); + SAMLUtils.log({ msg: 'Attributes will be processed', count: attributes.length }); if (attributes) { for (let i = 0; i < attributes.length; i++) { @@ -437,8 +437,7 @@ export class ResponseParser { const key = attributes[i].getAttribute('Name'); if (key) { - SAMLUtils.log(`Attribute: ${attributes[i]} has ${values.length} value(s).`); - SAMLUtils.log(`Adding attribute from SAML response to profile: ${key} = ${value}`); + SAMLUtils.log({ msg: 'Mapping attribute to profile', attribute: key, value }); profile[key] = value; } } diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts index 3b93fe22c88b4..dacdd014806e4 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts @@ -124,7 +124,7 @@ export const loadSamlServiceProviders = async function (): Promise { services.map(async ([key, value]) => { if (value === true) { const samlConfigs = getSamlConfigs(key); - SAMLUtils.log(key); + SAMLUtils.log({ key }); await LoginServiceConfiguration.createOrUpdateService(serviceName, samlConfigs); void notifyOnLoginServiceConfigurationChangedByService(serviceName); return configureSamlService(samlConfigs); diff --git a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts index a7f9e87a93de9..ae67248cd212d 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts @@ -64,7 +64,7 @@ Meteor.methods({ }); SAMLUtils.log('----Logout Request----'); - SAMLUtils.log(request); + SAMLUtils.log({ request }); // request.request: actual XML SAML Request // request.id: comminucation id which will be mentioned in the ResponseTo field of SAMLResponse @@ -72,7 +72,7 @@ Meteor.methods({ await Users.setSamlInResponseTo(userId, request.id); const result = await _saml.requestToUrl(request.request, 'logout'); - SAMLUtils.log(`SAML Logout Request ${result}`); + SAMLUtils.log({ msg: 'SAML Logout Request URL generated', result }); return result; }, From 552ea0c51db46c8a18ebd2def36eae95e8203fe3 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 09:17:00 -0600 Subject: [PATCH 08/12] Update scheduler.ts --- .../app/apps/server/bridges/scheduler.ts | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/meteor/app/apps/server/bridges/scheduler.ts b/apps/meteor/app/apps/server/bridges/scheduler.ts index 6fdd3d69f9531..b08d49182c9bc 100644 --- a/apps/meteor/app/apps/server/bridges/scheduler.ts +++ b/apps/meteor/app/apps/server/bridges/scheduler.ts @@ -84,9 +84,7 @@ export class AppSchedulerBridge extends SchedulerBridge { ); break; default: - this.orch - .getRocketChatLogger() - .error(`Invalid startup setting type (${String((startupSetting as any).type)}) for the processor ${id}`); + this.orch.getRocketChatLogger().error({ msg: 'Unknown startup setting type', type: (startupSetting as any).type }); break; } }); @@ -105,8 +103,8 @@ export class AppSchedulerBridge extends SchedulerBridge { await this.startScheduler(); const job = await this.scheduler.schedule(when, id, this.decorateJobData(data, appId)); return job.attrs._id.toString(); - } catch (e) { - this.orch.getRocketChatLogger().error(e); + } catch (err) { + this.orch.getRocketChatLogger().error({ err }); } } @@ -140,8 +138,8 @@ export class AppSchedulerBridge extends SchedulerBridge { skipImmediate, }); return job.attrs._id.toString(); - } catch (e) { - this.orch.getRocketChatLogger().error(e); + } catch (err) { + this.orch.getRocketChatLogger().error({ err }); } } @@ -167,8 +165,8 @@ export class AppSchedulerBridge extends SchedulerBridge { try { await this.scheduler.cancel(cancelQuery); - } catch (e) { - this.orch.getRocketChatLogger().error(e); + } catch (err) { + this.orch.getRocketChatLogger().error({ err }); } } @@ -185,8 +183,8 @@ export class AppSchedulerBridge extends SchedulerBridge { const matcher = new RegExp(`_${appId}$`); try { await this.scheduler.cancel({ name: { $regex: matcher } }); - } catch (e) { - this.orch.getRocketChatLogger().error(e); + } catch (err) { + this.orch.getRocketChatLogger().error({ err }); } } From 60237c3ab5c51fb3f2a24c7e92077cff6a923272 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 09:36:51 -0600 Subject: [PATCH 09/12] final --- .../integrations/server/lib/ScriptEngine.ts | 4 +- .../livechat/server/lib/stream/agentStatus.ts | 3 +- apps/meteor/app/push/server/push.ts | 2 +- .../ee/server/apps/communication/rest.ts | 92 +++++++++------- .../apps/marketplace/fetchMarketplaceApps.ts | 2 +- .../marketplace/fetchMarketplaceCategories.ts | 2 +- .../src/OmnichannelTranscript.ts | 103 ++++++++++++++---- .../ui-client/src/lib/callbacks/Callbacks.ts | 2 +- 8 files changed, 142 insertions(+), 68 deletions(-) diff --git a/apps/meteor/app/integrations/server/lib/ScriptEngine.ts b/apps/meteor/app/integrations/server/lib/ScriptEngine.ts index 906dbcd4024f3..7778d42f20179 100644 --- a/apps/meteor/app/integrations/server/lib/ScriptEngine.ts +++ b/apps/meteor/app/integrations/server/lib/ScriptEngine.ts @@ -296,7 +296,9 @@ export abstract class IntegrationScriptEngine { }); this.logger.debug({ - msg: `Script method "${method}" result of the Integration "${integration.name}" is:`, + msg: 'Script method result of the Integration', + method, + integration: integration.name, result, }); diff --git a/apps/meteor/app/livechat/server/lib/stream/agentStatus.ts b/apps/meteor/app/livechat/server/lib/stream/agentStatus.ts index d2862c93847fa..07e4f8c5ce7d8 100644 --- a/apps/meteor/app/livechat/server/lib/stream/agentStatus.ts +++ b/apps/meteor/app/livechat/server/lib/stream/agentStatus.ts @@ -77,7 +77,8 @@ export const onlineAgents = { } } catch (e) { logger.error({ - msg: `Cannot perform action ${action}`, + msg: 'Cannot perform action', + action, err: e, }); } diff --git a/apps/meteor/app/push/server/push.ts b/apps/meteor/app/push/server/push.ts index d3e85c30a0981..15c057389da4b 100644 --- a/apps/meteor/app/push/server/push.ts +++ b/apps/meteor/app/push/server/push.ts @@ -309,7 +309,7 @@ class PushClass { // [1, 2, 4, 8, 16] minutes (total 31) const ms = 60000 * Math.pow(2, tries); - logger.log('Trying sending push to gateway again in', ms, 'milliseconds'); + logger.log({ msg: 'Retrying push to gateway', tries: tries + 1, in: ms }); setTimeout(() => this.sendGatewayPush(gateway, service, token, notification, tries + 1), ms); } diff --git a/apps/meteor/ee/server/apps/communication/rest.ts b/apps/meteor/ee/server/apps/communication/rest.ts index a886844692f5f..5f579a0838876 100644 --- a/apps/meteor/ee/server/apps/communication/rest.ts +++ b/apps/meteor/ee/server/apps/communication/rest.ts @@ -85,21 +85,21 @@ export class AppsRestApi { const orchestrator = this._orch; const manager = this._manager; - const handleError = (message: string, e: any) => { + const handleError = (message: string, err: any) => { // when there is no `response` field in the error, it means the request // couldn't even make it to the server - if (!e.hasOwnProperty('response')) { - orchestrator.getRocketChatLogger().warn(message, e.message); + if (!err.hasOwnProperty('response')) { + orchestrator.getRocketChatLogger().warn({ msg: message, err }); return API.v1.internalError('Could not reach the Marketplace'); } - orchestrator.getRocketChatLogger().error(message, e.response.data); + orchestrator.getRocketChatLogger().error({ msg: message, err }); - if (e.response.statusCode >= 500 && e.response.statusCode <= 599) { + if (err.response.statusCode >= 500 && err.response.statusCode <= 599) { return API.v1.internalError(); } - if (e.response.statusCode === 404) { + if (err.response.statusCode === 404) { return API.v1.notFound(); } @@ -148,7 +148,7 @@ export class AppsRestApi { } if (err instanceof z.ZodError) { - orchestrator.getRocketChatLogger().error('Error parsing the Marketplace Apps:', err.issues); + orchestrator.getRocketChatLogger().error({ msg: 'Error validating the response from Marketplace:', err }); return API.v1.failure({ error: i18n.t('Marketplace_Failed_To_Fetch_Apps') }); } @@ -167,7 +167,7 @@ export class AppsRestApi { const categories = await fetchMarketplaceCategories(); return API.v1.success(categories); } catch (err) { - orchestrator.getRocketChatLogger().error('Error getting the categories from the Marketplace:', err); + orchestrator.getRocketChatLogger().error({ msg: 'Error fetching categories from Marketplace:', err }); if (err instanceof MarketplaceConnectionError) { return handleError('Unable to access Marketplace. Does the server has access to the internet?', err); } @@ -177,7 +177,7 @@ export class AppsRestApi { } if (err instanceof z.ZodError) { - orchestrator.getRocketChatLogger().error('Error validating the response from the Marketplace:', err.issues); + orchestrator.getRocketChatLogger().error({ msg: 'Error validating the response from Marketplace:', err }); return API.v1.failure({ error: i18n.t('Marketplace_Failed_To_Fetch_Categories') }); } @@ -268,8 +268,8 @@ export class AppsRestApi { } buff = await response.buffer(); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error getting the app from url:', e.response.data); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error fetching App from URL:', err }); return API.v1.internalError(); } } else if ('appId' in this.bodyParams && this.bodyParams.appId && this.bodyParams.marketplace && this.bodyParams.version) { @@ -308,7 +308,7 @@ export class AppsRestApi { // Note: marketplace responds with an array of the marketplace info on the app, but it is expected // to always have one element since we are fetching a specific app version. if (!Array.isArray(marketplaceInfo) || marketplaceInfo?.length !== 1) { - orchestrator.getRocketChatLogger().error('Error getting the App information from the Marketplace:', marketplaceInfo); + orchestrator.getRocketChatLogger().error({ msg: 'Error getting app information from marketplace', marketplaceInfo }); throw new Error('Invalid response from the Marketplace'); } @@ -317,7 +317,7 @@ export class AppsRestApi { let message; if (err instanceof Error) { - orchestrator.getRocketChatLogger().error('Error installing app from marketplace: ', err.message, err.cause); + orchestrator.getRocketChatLogger().error({ msg: 'Error installing app from marketplace:', err }); message = err.message; } else { message = err; @@ -453,8 +453,8 @@ export class AppsRestApi { nickname: a.nickname, }; }); - } catch (e) { - orchestrator.getRocketChatLogger().error('Error getting the admins to request an app be installed:', e); + } catch (err) { + orchestrator.getRocketChatLogger().error({ msg: 'Error fetching admins for app request', err }); } const queryParams = new URLSearchParams(); @@ -548,8 +548,8 @@ export class AppsRestApi { return API.v1.failure(); } result = await request.json(); - } catch (e: any) { - orchestrator.getRocketChatLogger().error("Error getting the Bundle's Apps from the Marketplace:", e.response.data); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: "Error getting the Bundle's Apps from the Marketplace:", err }); return API.v1.internalError(); } @@ -573,7 +573,9 @@ export class AppsRestApi { try { const request = await orchestrator.getMarketplaceClient().fetch(`v1/featured-apps`, { headers }); if (request.status !== 200) { - orchestrator.getRocketChatLogger().error('Error getting the Featured Apps from the Marketplace:', await request.json()); + orchestrator + .getRocketChatLogger() + .error({ msg: 'Error getting the Featured Apps from the Marketplace:', response: await request.json() }); return API.v1.failure(); } result = await request.json(); @@ -611,10 +613,10 @@ export class AppsRestApi { throw new Error(result.error); } return API.v1.success(result); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error getting all non sent app requests from the Marketplace:', e.message); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error getting the app requests from marketplace', err }); - return API.v1.failure(e.message); + return API.v1.failure(err.message); } }, }, @@ -639,10 +641,10 @@ export class AppsRestApi { throw new Error(result.error); } return API.v1.success(result); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error getting the app requests stats from marketplace', e.message); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error getting app request stats from marketplace', err }); - return API.v1.failure(e.message); + return API.v1.failure(err.message); } }, }, @@ -675,10 +677,10 @@ export class AppsRestApi { } return API.v1.success(result); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error marking app requests as seen', e.message); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error marking app requests as seen in marketplace', err }); - return API.v1.failure(e.message); + return API.v1.failure(err.message); } }, }, @@ -713,8 +715,8 @@ export class AppsRestApi { await sendMessagesToAdmins({ msgs }); return API.v1.success(); - } catch (e) { - orchestrator.getRocketChatLogger().error('Error when notifying admins that an user requested an app:', e); + } catch (err) { + orchestrator.getRocketChatLogger().error({ msg: 'Error notifying admins about app request', err }); return API.v1.failure(); } }, @@ -739,7 +741,9 @@ export class AppsRestApi { .getMarketplaceClient() .fetch(`v1/apps/${this.urlParams.id}?appVersion=${this.queryParams.version}`, { headers }); if (request.status !== 200) { - orchestrator.getRocketChatLogger().error('Error getting the App information from the Marketplace:', await request.json()); + orchestrator + .getRocketChatLogger() + .error({ msg: 'Error getting the App from the Marketplace:', response: await request.json() }); return API.v1.failure(); } result = await request.json(); @@ -765,7 +769,9 @@ export class AppsRestApi { headers, }); if (request.status !== 200) { - orchestrator.getRocketChatLogger().error('Error getting the App update info from the Marketplace:', await request.json()); + orchestrator + .getRocketChatLogger() + .error({ msg: 'Error getting the App update from the Marketplace:', response: await request.json() }); return API.v1.failure(); } result = await request.json(); @@ -811,7 +817,9 @@ export class AppsRestApi { }); if (response.status !== 200) { - orchestrator.getRocketChatLogger().error('Error getting the App from the Marketplace:', await response.text()); + orchestrator + .getRocketChatLogger() + .error({ msg: 'Error getting the App from the Marketplace:', response: await response.json() }); return API.v1.failure(); } @@ -822,8 +830,8 @@ export class AppsRestApi { } buff = Buffer.from(await response.arrayBuffer()); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error getting the App from the Marketplace:', e.response.data); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error getting the App from the Marketplace:', err }); return API.v1.internalError(); } @@ -956,7 +964,7 @@ export class AppsRestApi { } if (!result || statusCode !== 200) { - orchestrator.getRocketChatLogger().error('Error getting the App versions from the Marketplace:', result); + orchestrator.getRocketChatLogger().error({ msg: 'Error getting the App versions from the Marketplace:', result }); return API.v1.failure(); } @@ -994,13 +1002,13 @@ export class AppsRestApi { if (!request.ok) { throw new Error(result.error); } - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error syncing the App from the Marketplace:', e); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error syncing the App from the Marketplace:', err }); return API.v1.internalError(); } if (statusCode !== 200) { - orchestrator.getRocketChatLogger().error('Error syncing the App from the Marketplace:', result); + orchestrator.getRocketChatLogger().error({ msg: 'Error getting the App from the Marketplace during sync:', result }); return API.v1.failure(); } @@ -1057,9 +1065,9 @@ export class AppsRestApi { return API.v1.success({ screenshots: data, }); - } catch (e: any) { - orchestrator.getRocketChatLogger().error('Error getting the screenshots from the Marketplace:', e.message); - return API.v1.failure(e.message); + } catch (err: any) { + orchestrator.getRocketChatLogger().error({ msg: 'Error getting the App screenshots from the Marketplace:', err }); + return API.v1.failure(err.message); } }, }, @@ -1208,7 +1216,7 @@ export class AppsRestApi { response.clusterStatus = clusterStatus[app.getID()]; } } catch (e) { - orchestrator.getRocketChatLogger().warn('App status endpoint: could not fetch status across cluster', e); + orchestrator.getRocketChatLogger().warn({ msg: 'Could not fetch cluster status for app', appId: app.getID(), err: e }); } return API.v1.success(response); diff --git a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts index d3993ad6091d0..6a97ca3d494e2 100644 --- a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts +++ b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts @@ -165,7 +165,7 @@ export async function fetchMarketplaceApps({ endUserID }: FetchMarketplaceAppsPa const response = await request.json(); - Apps.getRocketChatLogger().error('Failed to fetch marketplace apps', response); + Apps.getRocketChatLogger().error({ msg: 'Error fetching marketplace apps', status: request.status, response }); // TODO: Refactor cloud to return a proper error code on unsupported version if (request.status === 426 && 'errorMsg' in response && response.errorMsg === 'unsupported version') { diff --git a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts index 847767d6baf12..cbbd7b9441fa9 100644 --- a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts +++ b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts @@ -47,7 +47,7 @@ export async function fetchMarketplaceCategories(): Promise { const response = await request.json(); - Apps.getRocketChatLogger().error('Failed to fetch marketplace categories', response); + Apps.getRocketChatLogger().error({ msg: 'Error fetching marketplace categories', status: request.status, response }); // TODO: Refactor cloud to return a proper error code on unsupported version if (request.status === 426 && 'errorMsg' in response && response.errorMsg === 'unsupported version') { diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts index bd8ba3ace1f47..f24ad369c42e2 100644 --- a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts @@ -162,33 +162,54 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } if (!isFileAttachment(attachment)) { - this.log.error( - `Invalid attachment type ${(attachment as { type?: string }).type} for file ${attachment.title} in room ${message.rid}!`, - ); + this.log.error({ + msg: 'Invalid attachment type for file in room', + attachmentType: (attachment as { type?: string }).type, + title: attachment.title, + rid: message.rid, + }); // ignore other types of attachments continue; } if (!isFileImageAttachment(attachment)) { - this.log.error(`Invalid attachment type ${attachment.type} for file ${attachment.title} in room ${message.rid}!`); + this.log.error({ + msg: 'Invalid attachment type for file in room', + attachmentType: attachment.type, + title: attachment.title, + rid: message.rid, + }); // ignore other types of attachments files.push({ name: attachment.title }); continue; } if (!this.worker.isMimeTypeValid(attachment.image_type)) { - this.log.error(`Invalid mime type ${attachment.image_type} for file ${attachment.title} in room ${message.rid}!`); + this.log.error({ + msg: 'Invalid mime type for file in room', + mimeType: attachment.image_type, + title: attachment.title, + rid: message.rid, + }); // ignore invalid mime types files.push({ name: attachment.title }); continue; } let file = message.files?.map((v) => ({ _id: v._id, name: v.name })).find((file) => file.name === attachment.title); if (!file) { - this.log.warn(`File ${attachment.title} not found in room ${message.rid}!`); + this.log.warn({ + msg: 'File not found in room', + title: attachment.title, + rid: message.rid, + }); // For some reason, when an image is uploaded from clipboard, it doesn't have a file :( // So, we'll try to get the FILE_ID from the `title_link` prop which has the format `/file-upload/FILE_ID/FILE_NAME` using a regex const fileId = attachment.title_link?.match(/\/file-upload\/(.*)\/.*/)?.[1]; if (!fileId) { - this.log.error(`File ${attachment.title} not found in room ${message.rid}!`); + this.log.error({ + msg: 'File not found in room', + title: attachment.title, + rid: message.rid, + }); // ignore attachments without file files.push({ name: attachment.title }); continue; @@ -197,7 +218,11 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } if (!file) { - this.log.warn(`File ${attachment.title} not found in room ${message.rid}!`); + this.log.warn({ + msg: 'File not found in room', + title: attachment.title, + rid: message.rid, + }); // ignore attachments without file files.push({ name: attachment.title }); continue; @@ -205,7 +230,11 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT const uploadedFile = await Uploads.findOneById(file._id); if (!uploadedFile) { - this.log.error(`Uploaded file ${file._id} not found in room ${message.rid}!`); + this.log.error({ + msg: 'Uploaded file not found in room', + fileId: file._id, + rid: message.rid, + }); // ignore attachments without file files.push({ name: file.name }); continue; @@ -214,13 +243,13 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT try { const fileBuffer = await uploadService.getFileBuffer({ file: uploadedFile }); files.push({ name: file.name, buffer: fileBuffer, extension: uploadedFile.extension }); - } catch (e: unknown) { - this.log.error(`Failed to get file ${file._id}`, e); + } catch (err: unknown) { + this.log.error({ msg: 'Failed to fetch file buffer', err }); // Push empty buffer so parser processes this as "unsupported file" files.push({ name: file.name }); // TODO: this is a NATS error message, even when we shouldn't tie it, since it's the only way we have right now we'll live with it for a while - if ((e as Error).message === 'MAX_PAYLOAD_EXCEEDED') { + if ((err as Error).message === 'MAX_PAYLOAD_EXCEEDED') { this.log.error( `File is too big to be processed by NATS. See NATS config for allowing bigger messages to be sent between services`, ); @@ -246,9 +275,17 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } async workOnPdf({ details }: { details: WorkDetailsWithSource }): Promise { - this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - Received from queue`); + this.log.info({ + msg: 'Processing transcript received from queue', + rid: details.rid, + userId: details.userId, + }); if (this.maxNumberOfConcurrentJobs <= this.currentJobNumber) { - this.log.error(`Processing transcript for room ${details.rid} by user ${details.userId} - Too many concurrent jobs, queuing again`); + this.log.error({ + msg: 'Processing transcript exceeded concurrent jobs limit', + rid: details.rid, + userId: details.userId, + }); throw new Error('retry'); } this.currentJobNumber++; @@ -277,7 +314,11 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT throw new Error('room-not-found'); } if (room.pdfTranscriptFileId) { - this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - PDF already exists`); + this.log.info({ + msg: 'Processing transcript skipped because PDF already exists', + rid: details.rid, + userId: details.userId, + }); return; } const messages = await this.getMessagesFromRoom({ rid: room._id }); @@ -340,14 +381,23 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } private async pdfFailed({ details, e, i18n }: { details: WorkDetailsWithSource; e: Error; i18n: i18n }): Promise { - this.log.error(`Transcript for room ${details.rid} by user ${details.userId} - Failed: ${e.message}`); + this.log.error({ + msg: 'Transcript generation failed', + rid: details.rid, + userId: details.userId, + err: e, + }); const room = await LivechatRooms.findOneById>(details.rid, { projection: { _id: 1 } }); if (!room) { return; } const { rid } = await roomService.createDirectMessage({ to: details.userId, from: 'rocket.cat' }); - this.log.info(`Transcript for room ${details.rid} by user ${details.userId} - Sending error message to user`); + this.log.info({ + msg: 'Transcript error message being sent to user', + rid: details.rid, + userId: details.userId, + }); await messageService.sendMessage({ fromId: 'rocket.cat', rid, @@ -400,13 +450,21 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT rocketCatFile: IUpload; i18n: i18n; }): Promise { - this.log.info(`Transcript for room ${details.rid} by user ${details.userId} - Complete`); + this.log.info({ + msg: 'Transcript completed successfully', + rid: details.rid, + userId: details.userId, + }); // Send the file to the livechat room where this was requested, to keep it in context try { await LivechatRooms.setPdfTranscriptFileIdById(details.rid, transcriptFile._id); - this.log.info(`Transcript for room ${details.rid} by user ${details.userId} - Sending success message to user`); + this.log.info({ + msg: 'Transcript success message being sent to user', + rid: details.rid, + userId: details.userId, + }); const result = await Promise.allSettled([ uploadService.sendFileMessage({ roomId: details.rid, @@ -433,7 +491,12 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT throw e.reason; } } catch (err) { - this.log.error({ msg: `Transcript for room ${details.rid} by user ${details.userId} - Failed to send message`, err }); + this.log.error({ + msg: 'Transcript failed to send message', + rid: details.rid, + userId: details.userId, + err, + }); } } } diff --git a/packages/ui-client/src/lib/callbacks/Callbacks.ts b/packages/ui-client/src/lib/callbacks/Callbacks.ts index 8f62fe3e5f791..3ad2e842fdf17 100644 --- a/packages/ui-client/src/lib/callbacks/Callbacks.ts +++ b/packages/ui-client/src/lib/callbacks/Callbacks.ts @@ -67,7 +67,7 @@ export class Callbacks< const wrapCallback = (callback: Callback) => async (item: unknown, constant?: unknown): Promise => { - this.logger?.debug(`Executing callback with id ${callback.id} for hook ${callback.hook}`); + this.logger?.debug({ msg: 'Executing callback for hook', callbackId: callback.id, hook: callback.hook }); return (await this.runOne(callback, item, constant)) ?? item; }; From 408c945299b92f2ccab4a23f0c6c80388a6c8f6b Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 10:59:47 -0600 Subject: [PATCH 10/12] Update apps/meteor/app/mail-messages/server/functions/unsubscribe.ts Co-authored-by: Diego Sampaio --- apps/meteor/app/mail-messages/server/functions/unsubscribe.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts b/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts index a72c266cd5d71..3d14f801fdb2f 100644 --- a/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts +++ b/apps/meteor/app/mail-messages/server/functions/unsubscribe.ts @@ -10,7 +10,6 @@ export const unsubscribe = async function (_id: string, createdAt: string): Prom msg: '[Mailer:Unsubscribe]', _id, createdAt, - parsedCreatedAt: new Date(parseInt(createdAt)), affectedRows, }); From 62eb10dcd151f2a32482a4c79e6348193659e402 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 11:03:37 -0600 Subject: [PATCH 11/12] cr --- .../server/lib/generators/LogoutRequest.ts | 3 +-- .../server/lib/generators/LogoutResponse.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts index 0ced2806dbfbc..733ffd46a89ca 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutRequest.ts @@ -12,8 +12,7 @@ export class LogoutRequest { const data = this.getDataForNewRequest(serviceProviderOptions, nameID, sessionIndex); const request = SAMLUtils.fillTemplateData(serviceProviderOptions.logoutRequestTemplate || defaultLogoutRequestTemplate, data); - SAMLUtils.log('------- SAML Logout request -----------'); - SAMLUtils.log({ request }); + SAMLUtils.log({ request, msg: '------- SAML Logout request -----------' }); return { request, diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts index 3f1996f66eb20..604d395a1bf04 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/generators/LogoutResponse.ts @@ -17,8 +17,7 @@ export class LogoutResponse { const data = this.getDataForNewResponse(serviceProviderOptions, nameID, sessionIndex, inResponseToId); const response = SAMLUtils.fillTemplateData(serviceProviderOptions.logoutResponseTemplate || defaultLogoutResponseTemplate, data); - SAMLUtils.log('------- SAML Logout response -----------'); - SAMLUtils.log({ response }); + SAMLUtils.log({ response, msg: '------- SAML Logout response -----------' }); return { response, From d3546684d1201a4ae4297ebc448c252b3df097bd Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 22 Jan 2026 11:52:16 -0600 Subject: [PATCH 12/12] cmon --- .../app/meteor-accounts-saml/server/lib/ServiceProvider.ts | 3 +-- .../app/meteor-accounts-saml/server/methods/samlLogout.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts index d7b0970ece5e0..f60b65952d67e 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/ServiceProvider.ts @@ -175,8 +175,7 @@ export class SAMLServiceProvider { public async getAuthorizeUrl(credentialToken: string): Promise { const request = this.generateAuthorizeRequest(credentialToken); - SAMLUtils.log('-----REQUEST------'); - SAMLUtils.log({ request }); + SAMLUtils.log({ request, msg: 'getAuthorizeUrl' }); return this.requestToUrl(request, 'authorize'); } diff --git a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts index ae67248cd212d..0570a7e1914ca 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts @@ -63,8 +63,7 @@ Meteor.methods({ sessionIndex: idpSession, }); - SAMLUtils.log('----Logout Request----'); - SAMLUtils.log({ request }); + SAMLUtils.log({ request, msg: '----Logout Request---' }); // request.request: actual XML SAML Request // request.id: comminucation id which will be mentioned in the ResponseTo field of SAMLResponse