@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
53 lines • 9.39 kB
JavaScript
import { xml } from '@xmpp/client';
import { Direction } from '../../../../core/message';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
import { MessageReceivedEvent } from './message.plugin';
/**
* XEP-0280 Message Carbons
*/
export class MessageCarbonsPlugin extends AbstractXmppPlugin {
constructor(xmppChatAdapter) {
super();
this.xmppChatAdapter = xmppChatAdapter;
}
async onBeforeOnline() {
return await this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('enable', { xmlns: 'urn:xmpp:carbons:2' })));
}
handleStanza(stanza) {
const receivedOrSentElement = stanza.getChildByAttr('xmlns', 'urn:xmpp:carbons:2');
const forwarded = receivedOrSentElement && receivedOrSentElement.getChild('forwarded', 'urn:xmpp:forward:0');
const messageElement = forwarded && forwarded.getChild('message', 'jabber:client');
const carbonFrom = stanza.attrs.from;
const userJid = this.xmppChatAdapter.chatConnectionService.userJid;
if (stanza.is('message') && receivedOrSentElement && forwarded && messageElement && userJid
&& userJid.bare().toString() === carbonFrom) {
return this.handleCarbonMessageStanza(messageElement, receivedOrSentElement);
}
return false;
}
handleCarbonMessageStanza(messageElement, receivedOrSent) {
const direction = receivedOrSent.is('received') ? Direction.in : Direction.out;
// body can be missing on type=chat messageElements
const body = messageElement.getChildText('body')?.trim();
const message = {
body,
direction,
datetime: new Date(),
delayed: false,
fromArchive: false,
};
const messageReceivedEvent = new MessageReceivedEvent();
this.xmppChatAdapter.plugins.forEach(plugin => plugin.afterReceiveMessage(message, messageElement, messageReceivedEvent));
if (!messageReceivedEvent.discard) {
const { from, to } = messageElement.attrs;
const contactJid = direction === Direction.in ? from : to;
const contact = this.xmppChatAdapter.getOrCreateContactById(contactJid);
contact.addMessage(message);
if (direction === Direction.in) {
this.xmppChatAdapter.message$.next(contact);
}
}
return true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1jYXJib25zLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL21lc3NhZ2UtY2FyYm9ucy5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsa0JBQWtCO0lBRXhELFlBQTZCLGVBQWdDO1FBQ3pELEtBQUssRUFBRSxDQUFDO1FBRGlCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtJQUU3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDaEIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUMxRCxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxFQUNuQixHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FDL0MsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjO1FBQ3ZCLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNuRixNQUFNLFNBQVMsR0FBRyxxQkFBcUIsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDN0csTUFBTSxjQUFjLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDO1FBQ25FLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxxQkFBcUIsSUFBSSxTQUFTLElBQUksY0FBYyxJQUFJLE9BQU87ZUFDcEYsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUM3QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLENBQUMsQ0FBQztTQUNoRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxjQUF1QixFQUFFLGNBQXVCO1FBQzlFLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDL0UsbURBQW1EO1FBQ25ELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFekQsTUFBTSxPQUFPLEdBQUc7WUFDWixJQUFJO1lBQ0osU0FBUztZQUNULFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNwQixPQUFPLEVBQUUsS0FBSztZQUNkLFdBQVcsRUFBRSxLQUFLO1NBQ3JCLENBQUM7UUFFRixNQUFNLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGNBQXVDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ25KLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDL0IsTUFBTSxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFNUIsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9DO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJ2x0eCc7XG5pbXBvcnQgeyBEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21lc3NhZ2UnO1xuaW1wb3J0IHtJcVJlc3BvbnNlU3RhbnphLCBNZXNzYWdlV2l0aEJvZHlTdGFuemEsIFN0YW56YX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zdGFuemEnO1xuaW1wb3J0IHsgWG1wcENoYXRBZGFwdGVyIH0gZnJvbSAnLi4veG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcbmltcG9ydCB7IE1lc3NhZ2VSZWNlaXZlZEV2ZW50IH0gZnJvbSAnLi9tZXNzYWdlLnBsdWdpbic7XG5cbi8qKlxuICogWEVQLTAyODAgTWVzc2FnZSBDYXJib25zXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXNzYWdlQ2FyYm9uc1BsdWdpbiBleHRlbmRzIEFic3RyYWN0WG1wcFBsdWdpbiB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHhtcHBDaGF0QWRhcHRlcjogWG1wcENoYXRBZGFwdGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVPbmxpbmUoKTogUHJvbWlzZTxJcVJlc3BvbnNlU3RhbnphPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnhtcHBDaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKFxuICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXG4gICAgICAgICAgICAgICAgeG1sKCdlbmFibGUnLCB7eG1sbnM6ICd1cm46eG1wcDpjYXJib25zOjInfSksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGhhbmRsZVN0YW56YShzdGFuemE6IFN0YW56YSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZWNlaXZlZE9yU2VudEVsZW1lbnQgPSBzdGFuemEuZ2V0Q2hpbGRCeUF0dHIoJ3htbG5zJywgJ3Vybjp4bXBwOmNhcmJvbnM6MicpO1xuICAgICAgICBjb25zdCBmb3J3YXJkZWQgPSByZWNlaXZlZE9yU2VudEVsZW1lbnQgJiYgcmVjZWl2ZWRPclNlbnRFbGVtZW50LmdldENoaWxkKCdmb3J3YXJkZWQnLCAndXJuOnhtcHA6Zm9yd2FyZDowJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZm9yd2FyZGVkICYmIGZvcndhcmRlZC5nZXRDaGlsZCgnbWVzc2FnZScsICdqYWJiZXI6Y2xpZW50Jyk7XG4gICAgICAgIGNvbnN0IGNhcmJvbkZyb20gPSBzdGFuemEuYXR0cnMuZnJvbTtcbiAgICAgICAgY29uc3QgdXNlckppZCA9IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkO1xuICAgICAgICBpZiAoc3RhbnphLmlzKCdtZXNzYWdlJykgJiYgcmVjZWl2ZWRPclNlbnRFbGVtZW50ICYmIGZvcndhcmRlZCAmJiBtZXNzYWdlRWxlbWVudCAmJiB1c2VySmlkXG4gICAgICAgICAgICAmJiB1c2VySmlkLmJhcmUoKS50b1N0cmluZygpID09PSBjYXJib25Gcm9tKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVDYXJib25NZXNzYWdlU3RhbnphKG1lc3NhZ2VFbGVtZW50LCByZWNlaXZlZE9yU2VudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNhcmJvbk1lc3NhZ2VTdGFuemEobWVzc2FnZUVsZW1lbnQ6IEVsZW1lbnQsIHJlY2VpdmVkT3JTZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHJlY2VpdmVkT3JTZW50LmlzKCdyZWNlaXZlZCcpID8gRGlyZWN0aW9uLmluIDogRGlyZWN0aW9uLm91dDtcbiAgICAgICAgLy8gYm9keSBjYW4gYmUgbWlzc2luZyBvbiB0eXBlPWNoYXQgbWVzc2FnZUVsZW1lbnRzXG4gICAgICAgIGNvbnN0IGJvZHkgPSBtZXNzYWdlRWxlbWVudC5nZXRDaGlsZFRleHQoJ2JvZHknKT8udHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgZGF0ZXRpbWU6IG5ldyBEYXRlKCksIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBlbnRpdHkgdGltZSBwbHVnaW5cbiAgICAgICAgICAgIGRlbGF5ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZnJvbUFyY2hpdmU6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VSZWNlaXZlZEV2ZW50ID0gbmV3IE1lc3NhZ2VSZWNlaXZlZEV2ZW50KCk7XG4gICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLnBsdWdpbnMuZm9yRWFjaChwbHVnaW4gPT4gcGx1Z2luLmFmdGVyUmVjZWl2ZU1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZUVsZW1lbnQgYXMgTWVzc2FnZVdpdGhCb2R5U3RhbnphLCBtZXNzYWdlUmVjZWl2ZWRFdmVudCkpO1xuICAgICAgICBpZiAoIW1lc3NhZ2VSZWNlaXZlZEV2ZW50LmRpc2NhcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtmcm9tLCB0b30gPSBtZXNzYWdlRWxlbWVudC5hdHRycztcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3RKaWQgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5pbiA/IGZyb20gOiB0bztcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLnhtcHBDaGF0QWRhcHRlci5nZXRPckNyZWF0ZUNvbnRhY3RCeUlkKGNvbnRhY3RKaWQpO1xuICAgICAgICAgICAgY29udGFjdC5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uaW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnhtcHBDaGF0QWRhcHRlci5tZXNzYWdlJC5uZXh0KGNvbnRhY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iXX0=