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/client/lib/meteorCallWrapper.ts

65 lines
1.6 KiB

import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import { DDPCommon } from 'meteor/ddp-common';
import { APIClient } from '../../app/utils/client';
const bypassMethods: string[] = [
'setUserStatus',
];
function shouldBypass({ method, params }: Meteor.IDDPMessage): boolean {
if (method === 'login' && params[0]?.resume) {
return true;
}
if (method.startsWith('UserPresence:') || bypassMethods.includes(method)) {
return true;
}
if (method.startsWith('stream-')) {
return true;
}
return false;
}
function wrapMeteorDDPCalls(): void {
const { _send } = Meteor.connection;
Meteor.connection._send = function _DDPSendOverREST(message): void {
if (message.msg !== 'method' || shouldBypass(message)) {
return _send.call(Meteor.connection, message);
}
const endpoint = Tracker.nonreactive(() => (!Meteor.userId() ? 'method.callAnon' : 'method.call'));
const restParams = {
message: DDPCommon.stringifyDDP(message),
};
const processResult = (_message: any): void => {
Meteor.connection._livedata_data({
msg: 'updated',
methods: [message.id],
});
Meteor.connection.onMessage(_message);
};
APIClient.v1.post(`${ endpoint }/${ encodeURIComponent(message.method.replace(/\//g, ':')) }`, restParams)
.then(({ message: _message }) => {
processResult(_message);
if (message.method === 'login') {
const parsedMessage = DDPCommon.parseDDP(_message);
if (parsedMessage.result?.token) {
Meteor.loginWithToken(parsedMessage.result.token);
}
}
})
.catch((error) => {
console.error(error);
});
};
}
window.USE_REST_FOR_DDP_CALLS && wrapMeteorDDPCalls();