UNPKG

@hsaadawy/ngx-chat

Version:
83 lines 15.2 kB
import { __awaiter } from "tslib"; import { client, xml } from '@xmpp/client'; import { Subject } from 'rxjs'; import { first, takeUntil } from 'rxjs/operators'; import { getDomain } from '../../../../core/get-domain'; import { timeout } from '../../../../core/utils-timeout'; import { AbstractXmppPlugin } from './abstract-xmpp-plugin'; /** * XEP-0077: In-Band Registration * see: https://xmpp.org/extensions/xep-0077.html * Handles registration over the XMPP chat instead of relaying on a admin user account management */ export class RegistrationPlugin extends AbstractXmppPlugin { constructor(logService, ngZone) { super(); this.logService = logService; this.ngZone = ngZone; this.registered$ = new Subject(); this.cleanUp = new Subject(); this.loggedIn$ = new Subject(); this.registrationTimeout = 5000; } /** * Promise resolves if user account is registered successfully, * rejects if an error happens while registering, e.g. the username is already taken. */ register(username, password, service, domain) { return __awaiter(this, void 0, void 0, function* () { yield this.ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () { try { yield timeout((() => __awaiter(this, void 0, void 0, function* () { domain = domain || getDomain(service); this.logService.debug('registration plugin', 'connecting...'); yield this.connect(username, password, service, domain); this.logService.debug('registration plugin', 'connection established, starting registration'); yield this.client.iqCaller.request(xml('iq', { type: 'get', to: domain }, xml('query', { xmlns: 'jabber:iq:register' }))); this.logService.debug('registration plugin', 'server acknowledged registration request, sending credentials'); yield this.client.iqCaller.request(xml('iq', { type: 'set' }, xml('query', { xmlns: 'jabber:iq:register' }, xml('username', {}, username), xml('password', {}, password)))); this.registered$.next(); yield this.loggedIn$.pipe(takeUntil(this.cleanUp), first()).toPromise(); this.logService.debug('registration plugin', 'registration successful'); }))(), this.registrationTimeout); } catch (e) { this.logService.warn('error registering', e); throw e; } finally { this.cleanUp.next(); this.logService.debug('registration plugin', 'cleaning up'); yield this.client.stop(); } })); }); } connect(username, password, service, domain) { return new Promise(resolveConnectionEstablished => { this.client = client({ domain: domain || getDomain(service), service, credentials: (authenticationCallback) => __awaiter(this, void 0, void 0, function* () { resolveConnectionEstablished(); yield this.registered$.pipe(takeUntil(this.cleanUp), first()).toPromise(); yield authenticationCallback({ username, password }); }) }); this.client.reconnect.stop(); this.client.timeout = this.registrationTimeout; this.client.on('online', () => { this.logService.debug('registration plugin', 'online event'); this.loggedIn$.next(); }); this.client.on('error', (err) => { this.logService.error('registration plugin', err); }); this.client.on('offline', () => { this.logService.debug('registration plugin', 'offline event'); }); return this.client.start(); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL3JlZ2lzdHJhdGlvbi5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBVSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsa0JBQWtCO0lBUXRELFlBQW9CLFVBQXNCLEVBQ3RCLE1BQWM7UUFDOUIsS0FBSyxFQUFFLENBQUM7UUFGUSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFQakIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hDLHdCQUFtQixHQUFHLElBQUksQ0FBQztJQU01QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ1UsUUFBUSxDQUFDLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixNQUFjOztZQUNoQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBUyxFQUFFO2dCQUMzQyxJQUFJO29CQUNBLE1BQU0sT0FBTyxDQUFDLENBQUMsR0FBUyxFQUFFO3dCQUN0QixNQUFNLEdBQUcsTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFFdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7d0JBQzlELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFFeEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsK0NBQStDLENBQUMsQ0FBQzt3QkFDOUYsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQzlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUMsRUFDL0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBQyxDQUFDLENBQzlDLENBQ0osQ0FBQzt3QkFFRixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSwrREFBK0QsQ0FBQyxDQUFDO3dCQUM5RyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDOUIsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsRUFDbkIsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBQyxFQUN0QyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFDN0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQ2hDLENBQ0osQ0FDSixDQUFDO3dCQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO29CQUM1RSxDQUFDLENBQUEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7aUJBQ25DO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxNQUFNLENBQUMsQ0FBQztpQkFDWDt3QkFBUztvQkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDNUQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1QjtZQUNMLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFTyxPQUFPLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLE9BQWUsRUFBRSxNQUFlO1FBQ2hGLE9BQU8sSUFBSSxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDakIsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxPQUFPO2dCQUNQLFdBQVcsRUFBRSxDQUFPLHNCQUFzQixFQUFFLEVBQUU7b0JBQzFDLDRCQUE0QixFQUFFLENBQUM7b0JBQy9CLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxRSxNQUFNLHNCQUFzQixDQUFDLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQTthQUNKLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUUvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENsaWVudCwgY2xpZW50LCB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpcnN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGdldERvbWFpbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvZ2V0LWRvbWFpbic7XHJcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzLXRpbWVvdXQnO1xyXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcclxuXHJcbi8qKlxyXG4gKiBYRVAtMDA3NzogSW4tQmFuZCBSZWdpc3RyYXRpb25cclxuICogc2VlOiBodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAwNzcuaHRtbFxyXG4gKiBIYW5kbGVzIHJlZ2lzdHJhdGlvbiBvdmVyIHRoZSBYTVBQIGNoYXQgaW5zdGVhZCBvZiByZWxheWluZyBvbiBhIGFkbWluIHVzZXIgYWNjb3VudCBtYW5hZ2VtZW50XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVyZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW5VcCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlZEluJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblRpbWVvdXQgPSA1MDAwO1xyXG4gICAgcHJpdmF0ZSBjbGllbnQ6IENsaWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBhY2NvdW50IGlzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogcmVqZWN0cyBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHJlZ2lzdGVyaW5nLCBlLmcuIHRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodXNlcm5hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRpbWVvdXQoKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBkb21haW4gfHwgZ2V0RG9tYWluKHNlcnZpY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnY29ubmVjdGluZy4uLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCh1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZpY2UsIGRvbWFpbik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdjb25uZWN0aW9uIGVzdGFibGlzaGVkLCBzdGFydGluZyByZWdpc3RyYXRpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5pcUNhbGxlci5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdnZXQnLCB0bzogZG9tYWlufSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgncXVlcnknLCB7eG1sbnM6ICdqYWJiZXI6aXE6cmVnaXN0ZXInfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdzZXJ2ZXIgYWNrbm93bGVkZ2VkIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LCBzZW5kaW5nIGNyZWRlbnRpYWxzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuaXFDYWxsZXIucmVxdWVzdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAnamFiYmVyOmlxOnJlZ2lzdGVyJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCd1c2VybmFtZScsIHt9LCB1c2VybmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdwYXNzd29yZCcsIHt9LCBwYXNzd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9nZ2VkSW4kLnBpcGUodGFrZVVudGlsKHRoaXMuY2xlYW5VcCksIGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdyZWdpc3RyYXRpb24gc3VjY2Vzc2Z1bCcpO1xyXG4gICAgICAgICAgICAgICAgfSkoKSwgdGhpcy5yZWdpc3RyYXRpb25UaW1lb3V0KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm4oJ2Vycm9yIHJlZ2lzdGVyaW5nJywgZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhblVwLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdjbGVhbmluZyB1cCcpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmVDb25uZWN0aW9uRXN0YWJsaXNoZWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudCh7XHJcbiAgICAgICAgICAgICAgICBkb21haW46IGRvbWFpbiB8fCBnZXREb21haW4oc2VydmljZSksXHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IGFzeW5jIChhdXRoZW50aWNhdGlvbkNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJlZCQucGlwZSh0YWtlVW50aWwodGhpcy5jbGVhblVwKSwgZmlyc3QoKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXV0aGVudGljYXRpb25DYWxsYmFjayh7dXNlcm5hbWUsIHBhc3N3b3JkfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQucmVjb25uZWN0LnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5jbGllbnQudGltZW91dCA9IHRoaXMucmVnaXN0cmF0aW9uVGltZW91dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdvbmxpbmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnb25saW5lIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluJC5uZXh0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdvZmZsaW5lJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKCdyZWdpc3RyYXRpb24gcGx1Z2luJywgJ29mZmxpbmUgZXZlbnQnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc3RhcnQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=