UNPKG

@pazznetwork/ngx-chat

Version:

[![Build status](https://api.travis-ci.com/pazznetwork/ngx-chat.svg?branch=master)](https://travis-ci.com/pazznetwork/ngx-chat) [![Coverage](https://coveralls.io/repos/github/pazznetwork/ngx-chat/badge.svg?branch=master)](https://coveralls.io/github/pazzn

122 lines 24.5 kB
import { xml } from '@xmpp/client'; import { Subject } from 'rxjs'; import { debounceTime, filter } from 'rxjs/operators'; import { AbstractXmppPlugin } from './abstract-xmpp-plugin'; import { PUBSUB_EVENT_XMLNS } from './publish-subscribe.plugin'; import { MUC_SUB_EVENT_TYPE } from './muc-sub.plugin'; import { serializeToSubmitForm } from '../../../../core/form'; /** * https://xmpp.org/extensions/xep-0313.html * Message Archive Management */ export class MessageArchivePlugin extends AbstractXmppPlugin { constructor(chatService, serviceDiscoveryPlugin, multiUserChatPlugin, logService, messagePlugin) { super(); this.chatService = chatService; this.serviceDiscoveryPlugin = serviceDiscoveryPlugin; this.multiUserChatPlugin = multiUserChatPlugin; this.logService = logService; this.messagePlugin = messagePlugin; this.mamMessageReceived$ = new Subject(); this.chatService.state$ .pipe(filter(state => state === 'online')) .subscribe(async () => { if (await this.supportsMessageArchiveManagement()) { await this.requestNewestMessages(); } }); // emit contacts to refresh contact list after receiving mam messages this.mamMessageReceived$ .pipe(debounceTime(10)) .subscribe(() => this.chatService.contacts$.next(this.chatService.contacts$.getValue())); } async requestNewestMessages() { await this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: MessageArchivePlugin.MAM_NS }, xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, '250'), xml('before'))))); } async loadMostRecentUnloadedMessages(recipient) { // for user-to-user chats no to-attribute is necessary, in case of multi-user-chats it has to be set to the bare room jid const to = recipient.recipientType === 'room' ? recipient.roomJid.toString() : undefined; const form = { type: 'submit', instructions: [], fields: [ { type: 'hidden', variable: 'FORM_TYPE', value: MessageArchivePlugin.MAM_NS }, ...(recipient.recipientType === 'contact' ? [{ type: 'jid-single', variable: 'with', value: recipient.jidBare }] : []), ...(recipient.oldestMessage ? [{ type: 'text-single', variable: 'end', value: recipient.oldestMessage.datetime.toISOString() }] : []), ], }; const request = xml('iq', { type: 'set', to }, xml('query', { xmlns: MessageArchivePlugin.MAM_NS }, serializeToSubmitForm(form), xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, '100'), xml('before')))); await this.chatService.chatConnectionService.sendIq(request); } async loadAllMessages() { if (!(await this.supportsMessageArchiveManagement())) { throw new Error('message archive management not suppported'); } let lastMamResponse = await this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: MessageArchivePlugin.MAM_NS }))); while (lastMamResponse.getChild('fin').attrs.complete !== 'true') { const lastReceivedMessageId = lastMamResponse.getChild('fin').getChild('set').getChildText('last'); lastMamResponse = await this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: MessageArchivePlugin.MAM_NS }, xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, '250'), xml('after', {}, lastReceivedMessageId))))); } } async supportsMessageArchiveManagement() { const supportsMessageArchiveManagement = await this.serviceDiscoveryPlugin.supportsFeature(this.chatService.chatConnectionService.userJid.bare().toString(), MessageArchivePlugin.MAM_NS); if (!supportsMessageArchiveManagement) { this.logService.info('server doesn\'t support MAM'); } return supportsMessageArchiveManagement; } handleStanza(stanza) { if (this.isMamMessageStanza(stanza)) { this.handleMamMessageStanza(stanza); return true; } return false; } isMamMessageStanza(stanza) { const result = stanza.getChild('result'); return stanza.name === 'message' && result?.attrs.xmlns === MessageArchivePlugin.MAM_NS; } handleMamMessageStanza(stanza) { const forwardedElement = stanza.getChild('result').getChild('forwarded'); const messageElement = forwardedElement.getChild('message'); const delayElement = forwardedElement.getChild('delay'); const eventElement = messageElement.getChild('event', PUBSUB_EVENT_XMLNS); if (messageElement.getAttr('type') == null && eventElement != null) { this.handlePubSubEvent(eventElement, delayElement); } else { this.handleArchivedMessage(messageElement, delayElement); } } handleArchivedMessage(messageElement, delayEl) { const type = messageElement.getAttr('type'); if (type === 'chat') { const messageHandled = this.messagePlugin.handleStanza(messageElement, delayEl); if (messageHandled) { this.mamMessageReceived$.next(); } } else if (type === 'groupchat' || this.multiUserChatPlugin.isRoomInvitationStanza(messageElement)) { this.multiUserChatPlugin.handleStanza(messageElement, delayEl); } else { throw new Error(`unknown archived message type: ${type}`); } } handlePubSubEvent(eventElement, delayElement) { const itemsElement = eventElement.getChild('items'); const itemsNode = itemsElement?.attrs.node; if (itemsNode !== MUC_SUB_EVENT_TYPE.messages) { this.logService.warn(`Handling of MUC/Sub message types other than ${MUC_SUB_EVENT_TYPE.messages} isn't implemented yet!`); return; } const itemElements = itemsElement.getChildren('item'); itemElements.forEach((itemEl) => this.handleArchivedMessage(itemEl.getChild('message'), delayElement)); } } MessageArchivePlugin.MAM_NS = 'urn:xmpp:mam:2'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1hcmNoaXZlLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL21lc3NhZ2UtYXJjaGl2ZS5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFLcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHMUQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFPLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGtCQUFrQjtJQUt4RCxZQUNxQixXQUE0QixFQUM1QixzQkFBOEMsRUFDOUMsbUJBQXdDLEVBQ3hDLFVBQXNCLEVBQ3RCLGFBQTRCO1FBRTdDLEtBQUssRUFBRSxDQUFDO1FBTlMsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBUGhDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFXdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO2FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxL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QzNDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxrQkFBa0IsQ0FBQyxRQUFRLHlCQUF5QixDQUFDLENBQUM7WUFDM0gsT0FBTztTQUNWO1FBRUQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3JILENBQUM7O0FBaEtlLDJCQUFNLEdBQUcsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3htbH0gZnJvbSAnQHhtcHAvY2xpZW50JztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1JlY2lwaWVudH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWNpcGllbnQnO1xuaW1wb3J0IHtTdGFuemF9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc3RhbnphJztcbmltcG9ydCB7TG9nU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtYbXBwQ2hhdEFkYXB0ZXJ9IGZyb20gJy4uL3htcHAtY2hhdC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtBYnN0cmFjdFhtcHBQbHVnaW59IGZyb20gJy4vYWJzdHJhY3QteG1wcC1wbHVnaW4nO1xuaW1wb3J0IHtNdWx0aVVzZXJDaGF0UGx1Z2lufSBmcm9tICcuL211bHRpLXVzZXItY2hhdC9tdWx0aS11c2VyLWNoYXQucGx1Z2luJztcbmltcG9ydCB7U2VydmljZURpc2NvdmVyeVBsdWdpbn0gZnJvbSAnLi9zZXJ2aWNlLWRpc2NvdmVyeS5wbHVnaW4nO1xuaW1wb3J0IHtQVUJTVUJfRVZFTlRfWE1MTlN9IGZyb20gJy4vcHVibGlzaC1zdWJzY3JpYmUucGx1Z2luJztcbmltcG9ydCB7TWVzc2FnZVBsdWdpbn0gZnJvbSAnLi9tZXNzYWdlLnBsdWdpbic7XG5pbXBvcnQge01VQ19TVUJfRVZFTlRfVFlQRX0gZnJvbSAnLi9tdWMtc3ViLnBsdWdpbic7XG5pbXBvcnQge0Zvcm0sIHNlcmlhbGl6ZVRvU3VibWl0Rm9ybX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9mb3JtJztcblxuLyoqXG4gKiBodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAzMTMuaHRtbFxuICogTWVzc2FnZSBBcmNoaXZlIE1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VBcmNoaXZlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgTUFNX05TID0gJ3Vybjp4bXBwOm1hbToyJztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFtTWVzc2FnZVJlY2VpdmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGF0U2VydmljZTogWG1wcENoYXRBZGFwdGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VEaXNjb3ZlcnlQbHVnaW46IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlVc2VyQ2hhdFBsdWdpbjogTXVsdGlVc2VyQ2hhdFBsdWdpbixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VQbHVnaW46IE1lc3NhZ2VQbHVnaW4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zdGF0ZSRcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihzdGF0ZSA9PiBzdGF0ZSA9PT0gJ29ubGluZScpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuc3VwcG9ydHNNZXNzYWdlQXJjaGl2ZU1hbmFnZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3ROZXdlc3RNZXNzYWdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGVtaXQgY29udGFjdHMgdG8gcmVmcmVzaCBjb250YWN0IGxpc3QgYWZ0ZXIgcmVjZWl2aW5nIG1hbSBtZXNzYWdlc1xuICAgICAgICB0aGlzLm1hbU1lc3NhZ2VSZWNlaXZlZCRcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhdFNlcnZpY2UuY29udGFjdHMkLm5leHQodGhpcy5jaGF0U2VydmljZS5jb250YWN0cyQuZ2V0VmFsdWUoKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdE5ld2VzdE1lc3NhZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXG4gICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdzZXQnfSxcbiAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiBNZXNzYWdlQXJjaGl2ZVBsdWdpbi5NQU1fTlN9LFxuICAgICAgICAgICAgICAgICAgICB4bWwoJ3NldCcsIHt4bWxuczogJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3JzbSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdtYXgnLCB7fSwgJzI1MCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdiZWZvcmUnKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkTW9zdFJlY2VudFVubG9hZGVkTWVzc2FnZXMocmVjaXBpZW50OiBSZWNpcGllbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gZm9yIHVzZXItdG8tdXNlciBjaGF0cyBubyB0by1hdHRyaWJ1dGUgaXMgbmVjZXNzYXJ5LCBpbiBjYXNlIG9mIG11bHRpLXVzZXItY2hhdHMgaXQgaGFzIHRvIGJlIHNldCB0byB0aGUgYmFyZSByb29tIGppZFxuICAgICAgICBjb25zdCB0byA9IHJlY2lwaWVudC5yZWNpcGllbnRUeXBlID09PSAncm9vbScgPyByZWNpcGllbnQucm9vbUppZC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGZvcm06IEZvcm0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogW10sXG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICB7dHlwZTogJ2hpZGRlbicsIHZhcmlhYmxlOiAnRk9STV9UWVBFJywgdmFsdWU6IE1lc3NhZ2VBcmNoaXZlUGx1Z2luLk1BTV9OU30sXG4gICAgICAgICAgICAgICAgLi4uKHJlY2lwaWVudC5yZWNpcGllbnRUeXBlID09PSAnY29udGFjdCdcbiAgICAgICAgICAgICAgICAgICAgPyBbe3R5cGU6ICdqaWQtc2luZ2xlJywgdmFyaWFibGU6ICd3aXRoJywgdmFsdWU6IHJlY2lwaWVudC5qaWRCYXJlfV0gYXMgY29uc3RcbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgLi4uKHJlY2lwaWVudC5vbGRlc3RNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgID8gW3t0eXBlOiAndGV4dC1zaW5nbGUnLCB2YXJpYWJsZTogJ2VuZCcsIHZhbHVlOiByZWNpcGllbnQub2xkZXN0TWVzc2FnZS5kYXRldGltZS50b0lTT1N0cmluZygpfV0gYXMgY29uc3RcbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPVxuICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0JywgdG99LFxuICAgICAgICAgICAgICAgIHhtbCgncXVlcnknLCB7eG1sbnM6IE1lc3NhZ2VBcmNoaXZlUGx1Z2luLk1BTV9OU30sXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVRvU3VibWl0Rm9ybShmb3JtKSxcbiAgICAgICAgICAgICAgICAgICAgeG1sKCdzZXQnLCB7eG1sbnM6ICdodHRwOi8vamFiYmVyLm9yZy9wcm90b2NvbC9yc20nfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgnbWF4Jywge30sICcxMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgnYmVmb3JlJyksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jaGF0U2VydmljZS5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKHJlcXVlc3QpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRBbGxNZXNzYWdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5zdXBwb3J0c01lc3NhZ2VBcmNoaXZlTWFuYWdlbWVudCgpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFyY2hpdmUgbWFuYWdlbWVudCBub3Qgc3VwcHBvcnRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RNYW1SZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhdFNlcnZpY2UuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ3NldCd9LFxuICAgICAgICAgICAgICAgIHhtbCgncXVlcnknLCB7eG1sbnM6IE1lc3NhZ2VBcmNoaXZlUGx1Z2luLk1BTV9OU30pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICB3aGlsZSAobGFzdE1hbVJlc3BvbnNlLmdldENoaWxkKCdmaW4nKS5hdHRycy5jb21wbGV0ZSAhPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjZWl2ZWRNZXNzYWdlSWQgPSBsYXN0TWFtUmVzcG9uc2UuZ2V0Q2hpbGQoJ2ZpbicpLmdldENoaWxkKCdzZXQnKS5nZXRDaGlsZFRleHQoJ2xhc3QnKTtcbiAgICAgICAgICAgIGxhc3RNYW1SZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhdFNlcnZpY2UuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcbiAgICAgICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdzZXQnfSxcbiAgICAgICAgICAgICAgICAgICAgeG1sKCdxdWVyeScsIHt4bWxuczogTWVzc2FnZUFyY2hpdmVQbHVnaW4uTUFNX05TfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgnc2V0Jywge3htbG5zOiAnaHR0cDovL2phYmJlci5vcmcvcHJvdG9jb2wvcnNtJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdtYXgnLCB7fSwgJzI1MCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgnYWZ0ZXInLCB7fSwgbGFzdFJlY2VpdmVkTWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN1cHBvcnRzTWVzc2FnZUFyY2hpdmVNYW5hZ2VtZW50KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzdXBwb3J0c01lc3NhZ2VBcmNoaXZlTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMuc2VydmljZURpc2NvdmVyeVBsdWdpbi5zdXBwb3J0c0ZlYXR1cmUoXG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkLmJhcmUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgTWVzc2FnZUFyY2hpdmVQbHVnaW4uTUFNX05TLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXN1cHBvcnRzTWVzc2FnZUFyY2hpdmVNYW5hZ2VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbygnc2VydmVyIGRvZXNuXFwndCBzdXBwb3J0IE1BTScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBwb3J0c01lc3NhZ2VBcmNoaXZlTWFuYWdlbWVudDtcbiAgICB9XG5cbiAgICBoYW5kbGVTdGFuemEoc3RhbnphOiBTdGFuemEpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNYW1NZXNzYWdlU3RhbnphKHN0YW56YSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTWFtTWVzc2FnZVN0YW56YShzdGFuemEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYW1NZXNzYWdlU3RhbnphKHN0YW56YTogU3RhbnphKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YW56YS5nZXRDaGlsZCgncmVzdWx0Jyk7XG4gICAgICAgIHJldHVybiBzdGFuemEubmFtZSA9PT0gJ21lc3NhZ2UnICYmIHJlc3VsdD8uYXR0cnMueG1sbnMgPT09IE1lc3NhZ2VBcmNoaXZlUGx1Z2luLk1BTV9OUztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU1hbU1lc3NhZ2VTdGFuemEoc3RhbnphOiBTdGFuemEpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVkRWxlbWVudCA9IHN0YW56YS5nZXRDaGlsZCgncmVzdWx0JykuZ2V0Q2hpbGQoJ2ZvcndhcmRlZCcpIGFzIFN0YW56YTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBmb3J3YXJkZWRFbGVtZW50LmdldENoaWxkKCdtZXNzYWdlJykgYXMgU3RhbnphO1xuICAgICAgICBjb25zdCBkZWxheUVsZW1lbnQgPSBmb3J3YXJkZWRFbGVtZW50LmdldENoaWxkKCdkZWxheScpIGFzIFN0YW56YTtcblxuICAgICAgICBjb25zdCBldmVudEVsZW1lbnQgPSBtZXNzYWdlRWxlbWVudC5nZXRDaGlsZCgnZXZlbnQnLCBQVUJTVUJfRVZFTlRfWE1MTlMpIGFzIFN0YW56YTtcbiAgICAgICAgaWYgKG1lc3NhZ2VFbGVtZW50LmdldEF0dHIoJ3R5cGUnKSA9PSBudWxsICYmIGV2ZW50RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVB1YlN1YkV2ZW50KGV2ZW50RWxlbWVudCwgZGVsYXlFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJjaGl2ZWRNZXNzYWdlKG1lc3NhZ2VFbGVtZW50LCBkZWxheUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcmNoaXZlZE1lc3NhZ2UobWVzc2FnZUVsZW1lbnQ6IFN0YW56YSwgZGVsYXlFbDogU3RhbnphKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlRWxlbWVudC5nZXRBdHRyKCd0eXBlJyk7XG4gICAgICAgIGlmICh0eXBlID09PSAnY2hhdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVkID0gdGhpcy5tZXNzYWdlUGx1Z2luLmhhbmRsZVN0YW56YShtZXNzYWdlRWxlbWVudCwgZGVsYXlFbCk7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbU1lc3NhZ2VSZWNlaXZlZCQubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdncm91cGNoYXQnIHx8IHRoaXMubXVsdGlVc2VyQ2hhdFBsdWdpbi5pc1Jvb21JbnZpdGF0aW9uU3RhbnphKG1lc3NhZ2VFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVVzZXJDaGF0UGx1Z2luLmhhbmRsZVN0YW56YShtZXNzYWdlRWxlbWVudCwgZGVsYXlFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gYXJjaGl2ZWQgbWVzc2FnZSB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVB1YlN1YkV2ZW50KGV2ZW50RWxlbWVudDogU3RhbnphLCBkZWxheUVsZW1lbnQ6IFN0YW56YSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtc0VsZW1lbnQgPSBldmVudEVsZW1lbnQuZ2V0Q2hpbGQoJ2l0ZW1zJyk7XG4gICAgICAgIGNvbnN0IGl0ZW1zTm9kZSA9IGl0ZW1zRWxlbWVudD8uYXR0cnMubm9kZTtcblxuICAgICAgICBpZiAoaXRlbXNOb2RlICE9PSBNVUNfU1VCX0VWRU5UX1RZUEUubWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS53YXJuKGBIYW5kbGluZyBvZiBNVUMvU3ViIG1lc3NhZ2UgdHlwZXMgb3RoZXIgdGhhbiAke01VQ19TVUJfRVZFTlRfVFlQRS5tZXNzYWdlc30gaXNuJ3QgaW1wbGVtZW50ZWQgeWV0IWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnRzID0gaXRlbXNFbGVtZW50LmdldENoaWxkcmVuKCdpdGVtJyk7XG4gICAgICAgIGl0ZW1FbGVtZW50cy5mb3JFYWNoKChpdGVtRWwpID0+IHRoaXMuaGFuZGxlQXJjaGl2ZWRNZXNzYWdlKGl0ZW1FbC5nZXRDaGlsZCgnbWVzc2FnZScpIGFzIFN0YW56YSwgZGVsYXlFbGVtZW50KSk7XG4gICAgfVxufVxuIl19