@hsaadawy/ngx-chat
Version:
119 lines • 20.2 kB
JavaScript
import { __awaiter } from "tslib";
import { xml } from '@xmpp/client';
import { BehaviorSubject, Subject } from 'rxjs';
import { filter } from 'rxjs/operators';
import { AbstractStanzaBuilder } from '../abstract-stanza-builder';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
import { IqResponseError } from '../iq-response.error';
export const PUBSUB_EVENT_XMLNS = 'http://jabber.org/protocol/pubsub#event';
class PublishStanzaBuilder extends AbstractStanzaBuilder {
constructor(options) {
super();
this.publishOptions = {
persistItems: false,
};
if (options) {
this.publishOptions = Object.assign(Object.assign({}, this.publishOptions), options);
}
}
toStanza() {
const { node, id, persistItems } = this.publishOptions;
// necessary as a 'event-only' publish is currently broken in ejabberd, see
// https://github.com/processone/ejabberd/issues/2799
const data = this.publishOptions.data || xml('data');
return xml('iq', { type: 'set' }, xml('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub' }, xml('publish', { node }, xml('item', { id }, data)), xml('publish-options', {}, xml('x', { xmlns: 'jabber:x:data', type: 'submit' }, xml('field', { var: 'FORM_TYPE', type: 'hidden' }, xml('value', {}, 'http://jabber.org/protocol/pubsub#publish-options')), xml('field', { var: 'pubsub#persist_items' }, xml('value', {}, persistItems ? 1 : 0)), xml('field', { var: 'pubsub#access_model' }, xml('value', {}, 'whitelist'))))));
}
}
class RetrieveDataStanzaBuilder extends AbstractStanzaBuilder {
constructor(node) {
super();
this.node = node;
}
toStanza() {
return xml('iq', { type: 'get' }, xml('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub' }, xml('items', { node: this.node })));
}
}
/**
* XEP-0060 Publish Subscribe (https://xmpp.org/extensions/xep-0060.html)
* XEP-0223 Persistent Storage of Private Data via PubSub (https://xmpp.org/extensions/xep-0223.html)
*/
export class PublishSubscribePlugin extends AbstractXmppPlugin {
constructor(xmppChatAdapter, serviceDiscoveryPlugin) {
super();
this.xmppChatAdapter = xmppChatAdapter;
this.serviceDiscoveryPlugin = serviceDiscoveryPlugin;
this.publish$ = new Subject();
this.supportsPrivatePublish = new BehaviorSubject('unknown');
}
onBeforeOnline() {
return this.determineSupportForPrivatePublish();
}
onOffline() {
this.supportsPrivatePublish.next('unknown');
}
storePrivatePayloadPersistent(node, id, data) {
return new Promise((resolve, reject) => {
this.supportsPrivatePublish
.pipe(filter(support => support !== 'unknown'))
.subscribe((support) => {
if (!support) {
reject(new Error('does not support private publish subscribe'));
}
else {
resolve(this.xmppChatAdapter.chatConnectionService.sendIq(new PublishStanzaBuilder({ node, id, data, persistItems: true }).toStanza()));
}
});
});
}
privateNotify(node, data, id) {
return new Promise((resolve, reject) => {
this.supportsPrivatePublish
.pipe(filter(support => support !== 'unknown'))
.subscribe((support) => {
if (!support) {
reject(new Error('does not support private publish subscribe'));
}
else {
resolve(this.xmppChatAdapter.chatConnectionService.sendIq(new PublishStanzaBuilder({ node, id, data, persistItems: false }).toStanza()));
}
});
});
}
handleStanza(stanza) {
const eventElement = stanza.getChild('event', PUBSUB_EVENT_XMLNS);
if (stanza.is('message') && eventElement) {
this.publish$.next(eventElement);
return true;
}
return false;
}
retrieveNodeItems(node) {
return __awaiter(this, void 0, void 0, function* () {
try {
const iqResponseStanza = yield this.xmppChatAdapter.chatConnectionService.sendIq(new RetrieveDataStanzaBuilder(node).toStanza());
return iqResponseStanza.getChild('pubsub').getChild('items').getChildren('item');
}
catch (e) {
if (e instanceof IqResponseError &&
(e.errorCondition === 'item-not-found' || e.errorCode === 404)) {
return [];
}
throw e;
}
});
}
determineSupportForPrivatePublish() {
return __awaiter(this, void 0, void 0, function* () {
let isSupported;
try {
const service = yield this.serviceDiscoveryPlugin.findService('pubsub', 'pep');
isSupported = service.features.includes('http://jabber.org/protocol/pubsub#publish-options');
}
catch (e) {
isSupported = false;
}
this.supportsPrivatePublish.next(isSupported);
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC1zdWJzY3JpYmUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvcHVibGlzaC1zdWJzY3JpYmUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRW5DLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcseUNBQXlDLENBQUM7QUFTNUUsTUFBTSxvQkFBcUIsU0FBUSxxQkFBcUI7SUFNcEQsWUFBWSxPQUF1QjtRQUMvQixLQUFLLEVBQUUsQ0FBQztRQUxLLG1CQUFjLEdBQW1CO1lBQzlDLFlBQVksRUFBRSxLQUFLO1NBQ3RCLENBQUM7UUFJRSxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLG1DQUFPLElBQUksQ0FBQyxjQUFjLEdBQUssT0FBTyxDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0sRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFckQsMkVBQTJFO1FBQzNFLHFEQUFxRDtRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFD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ZXNDb250ZW50IjpbImltcG9ydCB7IHhtbCB9IGZyb20gJ0B4bXBwL2NsaWVudCc7XHJcbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICdsdHgnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJcVJlc3BvbnNlU3RhbnphLCBTdGFuemEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0YW56YSc7XHJcbmltcG9ydCB7IEFic3RyYWN0U3RhbnphQnVpbGRlciB9IGZyb20gJy4uL2Fic3RyYWN0LXN0YW56YS1idWlsZGVyJztcclxuaW1wb3J0IHsgWG1wcENoYXRBZGFwdGVyIH0gZnJvbSAnLi4veG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0WG1wcFBsdWdpbiB9IGZyb20gJy4vYWJzdHJhY3QteG1wcC1wbHVnaW4nO1xyXG5pbXBvcnQgeyBTZXJ2aWNlRGlzY292ZXJ5UGx1Z2luIH0gZnJvbSAnLi9zZXJ2aWNlLWRpc2NvdmVyeS5wbHVnaW4nO1xyXG5pbXBvcnQgeyBJcVJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9pcS1yZXNwb25zZS5lcnJvcic7XHJcblxyXG5leHBvcnQgY29uc3QgUFVCU1VCX0VWRU5UX1hNTE5TID0gJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3B1YnN1YiNldmVudCc7XHJcblxyXG5pbnRlcmZhY2UgUHVibGlzaE9wdGlvbnMge1xyXG4gICAgbm9kZT86IHN0cmluZztcclxuICAgIGlkPzogYW55O1xyXG4gICAgZGF0YT86IEVsZW1lbnQ7XHJcbiAgICBwZXJzaXN0SXRlbXM/OiBib29sZWFuO1xyXG59XHJcblxyXG5jbGFzcyBQdWJsaXNoU3RhbnphQnVpbGRlciBleHRlbmRzIEFic3RyYWN0U3RhbnphQnVpbGRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoT3B0aW9uczogUHVibGlzaE9wdGlvbnMgPSB7XHJcbiAgICAgICAgcGVyc2lzdEl0ZW1zOiBmYWxzZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUHVibGlzaE9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVibGlzaE9wdGlvbnMgPSB7Li4udGhpcy5wdWJsaXNoT3B0aW9ucywgLi4ub3B0aW9uc307XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRvU3RhbnphKCkge1xyXG4gICAgICAgIGNvbnN0IHtub2RlLCBpZCwgcGVyc2lzdEl0ZW1zfSA9IHRoaXMucHVibGlzaE9wdGlvbnM7XHJcblxyXG4gICAgICAgIC8vIG5lY2Vzc2FyeSBhcyBhICdldmVudC1vbmx5JyBwdWJsaXNoIGlzIGN1cnJlbnRseSBicm9rZW4gaW4gZWphYmJlcmQsIHNlZVxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzb25lL2VqYWJiZXJkL2lzc3Vlcy8yNzk5XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucHVibGlzaE9wdGlvbnMuZGF0YSB8fCB4bWwoJ2RhdGEnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHhtbCgnaXEnLCB7dHlwZTogJ3NldCd9LFxyXG4gICAgICAgICAgICB4bWwoJ3B1YnN1YicsIHt4bWxuczogJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3B1YnN1Yid9LFxyXG4gICAgICAgICAgICAgICAgeG1sKCdwdWJsaXNoJywge25vZGV9LFxyXG4gICAgICAgICAgICAgICAgICAgIHhtbCgnaXRlbScsIHtpZH0sIGRhdGEpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgeG1sKCdwdWJsaXNoLW9wdGlvbnMnLCB7fSxcclxuICAgICAgICAgICAgICAgICAgICB4bWwoJ3gnLCB7eG1sbnM6ICdqYWJiZXI6eDpkYXRhJywgdHlwZTogJ3N1Ym1pdCd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2ZpZWxkJywge3ZhcjogJ0ZPUk1fVFlQRScsIHR5cGU6ICdoaWRkZW4nfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgndmFsdWUnLCB7fSwgJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3B1YnN1YiNwdWJsaXNoLW9wdGlvbnMnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2ZpZWxkJywge3ZhcjogJ3B1YnN1YiNwZXJzaXN0X2l0ZW1zJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3ZhbHVlJywge30sIHBlcnNpc3RJdGVtcyA/IDEgOiAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2ZpZWxkJywge3ZhcjogJ3B1YnN1YiNhY2Nlc3NfbW9kZWwnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgndmFsdWUnLCB7fSwgJ3doaXRlbGlzdCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuY2xhc3MgUmV0cmlldmVEYXRhU3RhbnphQnVpbGRlciBleHRlbmRzIEFic3RyYWN0U3RhbnphQnVpbGRlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBub2RlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvU3RhbnphKCkge1xyXG4gICAgICAgIHJldHVybiB4bWwoJ2lxJywge3R5cGU6ICdnZXQnfSxcclxuICAgICAgICAgICAgeG1sKCdwdWJzdWInLCB7eG1sbnM6ICdodHRwOi8vamFiYmVyLm9yZy9wcm90b2NvbC9wdWJzdWInfSxcclxuICAgICAgICAgICAgICAgIHhtbCgnaXRlbXMnLCB7bm9kZTogdGhpcy5ub2RlfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogWEVQLTAwNjAgUHVibGlzaCBTdWJzY3JpYmUgKGh0dHBzOi8veG1wcC5vcmcvZXh0ZW5zaW9ucy94ZXAtMDA2MC5odG1sKVxyXG4gKiBYRVAtMDIyMyBQZXJzaXN0ZW50IFN0b3JhZ2Ugb2YgUHJpdmF0ZSBEYXRhIHZpYSBQdWJTdWIgKGh0dHBzOi8veG1wcC5vcmcvZXh0ZW5zaW9ucy94ZXAtMDIyMy5odG1sKVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFB1Ymxpc2hTdWJzY3JpYmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFhtcHBQbHVnaW4ge1xyXG5cclxuICAgIHJlYWRvbmx5IHB1Ymxpc2gkID0gbmV3IFN1YmplY3Q8U3RhbnphPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdXBwb3J0c1ByaXZhdGVQdWJsaXNoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuIHwgJ3Vua25vd24nPigndW5rbm93bicpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgeG1wcENoYXRBZGFwdGVyOiBYbXBwQ2hhdEFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VEaXNjb3ZlcnlQbHVnaW46IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlT25saW5lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRldGVybWluZVN1cHBvcnRGb3JQcml2YXRlUHVibGlzaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT2ZmbGluZSgpIHtcclxuICAgICAgICB0aGlzLnN1cHBvcnRzUHJpdmF0ZVB1Ymxpc2gubmV4dCgndW5rbm93bicpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlUHJpdmF0ZVBheWxvYWRQZXJzaXN0ZW50KG5vZGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGF0YTogRWxlbWVudCk6IFByb21pc2U8SXFSZXNwb25zZVN0YW56YTwncmVzdWx0Jz4+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN1cHBvcnRzUHJpdmF0ZVB1Ymxpc2hcclxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcihzdXBwb3J0ID0+IHN1cHBvcnQgIT09ICd1bmtub3duJykpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzdXBwb3J0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2RvZXMgbm90IHN1cHBvcnQgcHJpdmF0ZSBwdWJsaXNoIHN1YnNjcmliZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHVibGlzaFN0YW56YUJ1aWxkZXIoe25vZGUsIGlkLCBkYXRhLCBwZXJzaXN0SXRlbXM6IHRydWV9KS50b1N0YW56YSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGVOb3RpZnkobm9kZTogc3RyaW5nLCBkYXRhPzogRWxlbWVudCwgaWQ/OiBzdHJpbmcpOiBQcm9taXNlPElxUmVzcG9uc2VTdGFuemE+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN1cHBvcnRzUHJpdmF0ZVB1Ymxpc2hcclxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcihzdXBwb3J0ID0+IHN1cHBvcnQgIT09ICd1bmtub3duJykpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzdXBwb3J0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2RvZXMgbm90IHN1cHBvcnQgcHJpdmF0ZSBwdWJsaXNoIHN1YnNjcmliZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHVibGlzaFN0YW56YUJ1aWxkZXIoe25vZGUsIGlkLCBkYXRhLCBwZXJzaXN0SXRlbXM6IGZhbHNlfSkudG9TdGFuemEoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTdGFuemEoc3RhbnphOiBTdGFuemEpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBldmVudEVsZW1lbnQgPSBzdGFuemEuZ2V0Q2hpbGQoJ2V2ZW50JywgUFVCU1VCX0VWRU5UX1hNTE5TKTtcclxuICAgICAgICBpZiAoc3RhbnphLmlzKCdtZXNzYWdlJykgJiYgZXZlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVibGlzaCQubmV4dChldmVudEVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJldHJpZXZlTm9kZUl0ZW1zKG5vZGU6IHN0cmluZyk6IFByb21pc2U8RWxlbWVudFtdPiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaXFSZXNwb25zZVN0YW56YSA9IGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgICAgICBuZXcgUmV0cmlldmVEYXRhU3RhbnphQnVpbGRlcihub2RlKS50b1N0YW56YSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiBpcVJlc3BvbnNlU3RhbnphLmdldENoaWxkKCdwdWJzdWInKS5nZXRDaGlsZCgnaXRlbXMnKS5nZXRDaGlsZHJlbignaXRlbScpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJcVJlc3BvbnNlRXJyb3IgJiZcclxuICAgICAgICAgICAgICAgIChlLmVycm9yQ29uZGl0aW9uID09PSAnaXRlbS1ub3QtZm91bmQnIHx8IGUuZXJyb3JDb2RlID09PSA0MDQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZGV0ZXJtaW5lU3VwcG9ydEZvclByaXZhdGVQdWJsaXNoKCkge1xyXG4gICAgICAgIGxldCBpc1N1cHBvcnRlZDogYm9vbGVhbjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5zZXJ2aWNlRGlzY292ZXJ5UGx1Z2luLmZpbmRTZXJ2aWNlKCdwdWJzdWInLCAncGVwJyk7XHJcbiAgICAgICAgICAgIGlzU3VwcG9ydGVkID0gc2VydmljZS5mZWF0dXJlcy5pbmNsdWRlcygnaHR0cDovL2phYmJlci5vcmcvcHJvdG9jb2wvcHVic3ViI3B1Ymxpc2gtb3B0aW9ucycpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaXNTdXBwb3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdXBwb3J0c1ByaXZhdGVQdWJsaXNoLm5leHQoaXNTdXBwb3J0ZWQpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=