The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/packages/rocketchat-lib/server/lib/debug.js

96 lines
2.8 KiB

/* global InstanceStatus */
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import _ from 'underscore';
const logger = new Logger('Meteor', {
methods: {
method: {
type: 'debug',
},
publish: {
type: 'debug',
},
},
});
let Log_Trace_Methods;
let Log_Trace_Subscriptions;
RocketChat.settings.get('Log_Trace_Methods', (key, value) => Log_Trace_Methods = value);
RocketChat.settings.get('Log_Trace_Subscriptions', (key, value) => Log_Trace_Subscriptions = value);
let Log_Trace_Methods_Filter;
let Log_Trace_Subscriptions_Filter;
RocketChat.settings.get('Log_Trace_Methods_Filter', (key, value) => Log_Trace_Methods_Filter = value ? new RegExp(value) : undefined);
RocketChat.settings.get('Log_Trace_Subscriptions_Filter', (key, value) => Log_Trace_Subscriptions_Filter = value ? new RegExp(value) : undefined);
const traceConnection = (enable, filter, prefix, name, connection, userId) => {
if (!enable) {
return;
}
if (filter && !filter.test(name)) {
return;
}
if (connection) {
console.log(name, {
id: connection.id,
clientAddress: connection.clientAddress,
httpHeaders: connection.httpHeaders,
userId,
});
} else {
console.log(name, 'no-connection');
}
};
const wrapMethods = function(name, originalHandler, methodsMap) {
methodsMap[name] = function(...originalArgs) {
traceConnection(Log_Trace_Methods, Log_Trace_Methods_Filter, 'method', name, this.connection, this.userId);
const end = RocketChat.metrics.meteorMethods.startTimer({
method: name,
has_connection: this.connection != null,
has_user: this.userId != null,
});
const args = name === 'ufsWrite' ? Array.prototype.slice.call(originalArgs, 1) : originalArgs;
logger.method(name, '-> userId:', Meteor.userId(), ', arguments: ', args);
this.unblock();
const result = originalHandler.apply(this, originalArgs);
end();
return result;
};
};
const originalMeteorMethods = Meteor.methods;
Meteor.methods = function(methodMap) {
_.each(methodMap, function(handler, name) {
wrapMethods(name, handler, methodMap);
});
originalMeteorMethods(methodMap);
};
const originalMeteorPublish = Meteor.publish;
Meteor.publish = function(name, func) {
return originalMeteorPublish(name, function(...args) {
traceConnection(Log_Trace_Subscriptions, Log_Trace_Subscriptions_Filter, 'subscription', name, this.connection, this.userId);
logger.publish(name, '-> userId:', this.userId, ', arguments: ', args);
const end = RocketChat.metrics.meteorSubscriptions.startTimer({ subscription: name });
const originalReady = this.ready;
this.ready = function() {
end();
return originalReady.apply(this, args);
};
return func.apply(this, args);
});
};
WebApp.rawConnectHandlers.use(function(req, res, next) {
res.setHeader('X-Instance-ID', InstanceStatus.id());
return next();
});