@hsaadawy/ngx-chat
Version:
162 lines • 23.2 kB
JavaScript
import { __awaiter } from "tslib";
import { Injectable, NgZone } from '@angular/core';
import { xml } from '@xmpp/client';
import { BehaviorSubject, Subject } from 'rxjs';
import { LogService } from '../../log.service';
import { XmppClientFactoryService } from './xmpp-client-factory.service';
import { IqResponseError } from './iq-response.error';
/**
* Implementation of the XMPP specification according to RFC 6121.
* @see https://xmpp.org/rfcs/rfc6121.html
* @see https://xmpp.org/rfcs/rfc3920.html
* @see https://xmpp.org/rfcs/rfc3921.html
*/
export class XmppChatConnectionService {
constructor(logService, ngZone, xmppClientFactoryService) {
this.logService = logService;
this.ngZone = ngZone;
this.xmppClientFactoryService = xmppClientFactoryService;
this.state$ = new BehaviorSubject('disconnected');
this.stanzaUnknown$ = new Subject();
this.iqId = new Date().getTime();
this.iqStanzaResponseHandlers = new Map();
}
onOnline(jid) {
this.logService.info('online =', 'online as', jid.toString());
this.userJid = jid;
this.state$.next('online');
}
sendPresence() {
return __awaiter(this, void 0, void 0, function* () {
yield this.send(xml('presence'));
});
}
send(content) {
return __awaiter(this, void 0, void 0, function* () {
this.logService.debug('>>>', content);
yield this.client.send(content);
});
}
sendIq(request) {
return new Promise((resolve, reject) => {
request.attrs = Object.assign({ id: this.getNextIqId(), from: this.userJid.toString() }, request.attrs);
const { id } = request.attrs;
if (!request.attrs.type) {
const message = 'iq stanza without type: ' + request.toString();
this.logService.error(message);
throw new Error(message);
}
this.iqStanzaResponseHandlers.set(id, (response) => {
if (response.attrs.type === 'result') {
resolve(response);
}
else {
const errorResponse = response;
reject(new IqResponseError(errorResponse));
}
});
this.send(request).catch((e) => {
this.logService.error('error sending iq', e);
this.iqStanzaResponseHandlers.delete(id);
reject(e);
});
});
}
sendIqAckResult(id) {
return __awaiter(this, void 0, void 0, function* () {
yield this.send(xml('iq', { from: this.userJid.toString(), id, type: 'result' }));
});
}
onStanzaReceived(stanza) {
let handled = false;
if (this.isIqStanzaResponse(stanza)) {
const handleIqStanzaResponse = this.iqStanzaResponseHandlers.get(stanza.attrs.id);
if (handleIqStanzaResponse) {
this.logService.debug('<<<', stanza.toString(), 'handled by callback', handleIqStanzaResponse);
this.iqStanzaResponseHandlers.delete(stanza.attrs.id);
handleIqStanzaResponse(stanza);
handled = true;
}
}
if (!handled) {
this.stanzaUnknown$.next(stanza);
}
}
isIqStanzaResponse(stanza) {
const stanzaType = stanza.attrs.type;
return stanza.name === 'iq' && (stanzaType === 'result' || stanzaType === 'error');
}
logIn(logInRequest) {
return __awaiter(this, void 0, void 0, function* () {
yield this.ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () {
if (logInRequest.username.indexOf('@') >= 0) {
this.logService.warn('username should not contain domain, only local part, this can lead to errors!');
}
this.client = this.xmppClientFactoryService.client(logInRequest);
this.client.on('error', (err) => {
this.ngZone.run(() => {
this.logService.error('chat service error =>', err.toString(), err);
});
});
this.client.on('status', (status, value) => {
this.ngZone.run(() => {
this.logService.info('status update =', status, value ? JSON.stringify(value) : '');
if (status === 'offline') {
this.state$.next('disconnected');
}
});
});
this.client.on('online', (jid) => {
return this.ngZone.run(() => {
return this.onOnline(jid);
});
});
this.client.on('stanza', (stanza) => {
this.ngZone.run(() => {
this.onStanzaReceived(stanza);
});
});
this.client.on('disconnect', () => {
this.ngZone.run(() => {
this.state$.next('reconnecting');
});
});
yield this.client.start();
}));
});
}
logOut() {
return __awaiter(this, void 0, void 0, function* () {
// TODO: move this to a presence plugin in a handler
this.logService.debug('logging out');
if (this.client) {
this.client.reconnect.stop();
try {
yield this.send(xml('presence', { type: 'unavailable' }));
}
catch (e) {
this.logService.error('error sending presence unavailable');
}
finally {
this.client.stop();
}
}
});
}
getNextIqId() {
return String(this.iqId++);
}
reconnectSilently() {
this.logService.warn('hard reconnect...');
this.state$.next('disconnected');
}
}
XmppChatConnectionService.decorators = [
{ type: Injectable }
];
XmppChatConnectionService.ctorParameters = () => [
{ type: LogService },
{ type: NgZone },
{ type: XmppClientFactoryService }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1wcC1jaGF0LWNvbm5lY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC94bXBwLWNoYXQtY29ubmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQVUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJdEQ7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBYWxDLFlBQ3FCLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCx3QkFBa0Q7UUFGbEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQWR2RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQWlCLGNBQWMsQ0FBQyxDQUFDO1FBQzdELG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQU0vQyxTQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQiw2QkFBd0IsR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQztJQU8vRixDQUFDO0lBRUcsUUFBUSxDQUFDLEdBQVE7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMs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LENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7OztZQXJLSixVQUFVOzs7WUFaRixVQUFVO1lBUEUsTUFBTTtZQVFsQix3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2xpZW50LCB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBKSUQgfSBmcm9tICdAeG1wcC9qaWQnO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSAnbHR4JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvZ0luUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbG9nLWluLXJlcXVlc3QnO1xyXG5pbXBvcnQgeyBJcVJlc3BvbnNlU3RhbnphLCBTdGFuemEgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3N0YW56YSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9sb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFhtcHBDbGllbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4veG1wcC1jbGllbnQtZmFjdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSXFSZXNwb25zZUVycm9yIH0gZnJvbSAnLi9pcS1yZXNwb25zZS5lcnJvcic7XHJcblxyXG5leHBvcnQgdHlwZSBYbXBwQ2hhdFN0YXRlcyA9ICdkaXNjb25uZWN0ZWQnIHwgJ29ubGluZScgfCAncmVjb25uZWN0aW5nJztcclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1QUCBzcGVjaWZpY2F0aW9uIGFjY29yZGluZyB0byBSRkMgNjEyMS5cclxuICogQHNlZSBodHRwczovL3htcHAub3JnL3JmY3MvcmZjNjEyMS5odG1sXHJcbiAqIEBzZWUgaHR0cHM6Ly94bXBwLm9yZy9yZmNzL3JmYzM5MjAuaHRtbFxyXG4gKiBAc2VlIGh0dHBzOi8veG1wcC5vcmcvcmZjcy9yZmMzOTIxLmh0bWxcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFhtcHBDaGF0Q29ubmVjdGlvblNlcnZpY2Uge1xyXG5cclxuICAgIHB1YmxpYyByZWFkb25seSBzdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFhtcHBDaGF0U3RhdGVzPignZGlzY29ubmVjdGVkJyk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhbnphVW5rbm93biQgPSBuZXcgU3ViamVjdDxTdGFuemE+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VyIEpJRCB3aXRoIHJlc291cmNlLCBub3QgYmFyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZXJKaWQ/OiBKSUQ7XHJcbiAgICBwcml2YXRlIGlxSWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXFTdGFuemFSZXNwb25zZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIChzdGFuemE6IElxUmVzcG9uc2VTdGFuemEpID0+IHZvaWQ+KCk7XHJcbiAgICBwdWJsaWMgY2xpZW50PzogQ2xpZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nU2VydmljZTogTG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgeG1wcENsaWVudEZhY3RvcnlTZXJ2aWNlOiBYbXBwQ2xpZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICApIHt9XHJcblxyXG4gICAgcHVibGljIG9uT25saW5lKGppZDogSklEKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmluZm8oJ29ubGluZSA9JywgJ29ubGluZSBhcycsIGppZC50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLnVzZXJKaWQgPSBqaWQ7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSQubmV4dCgnb25saW5lJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlbmRQcmVzZW5jZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXHJcbiAgICAgICAgICAgIHhtbCgncHJlc2VuY2UnKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZW5kKGNvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygnPj4+JywgY29udGVudCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VuZElxKHJlcXVlc3Q6IEVsZW1lbnQpOiBQcm9taXNlPElxUmVzcG9uc2VTdGFuemE8J3Jlc3VsdCc+PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QuYXR0cnMgPSB7XHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5nZXROZXh0SXFJZCgpLFxyXG4gICAgICAgICAgICAgICAgZnJvbTogdGhpcy51c2VySmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmF0dHJzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7aWR9ID0gcmVxdWVzdC5hdHRycztcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVxdWVzdC5hdHRycy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ2lxIHN0YW56YSB3aXRob3V0IHR5cGU6ICcgKyByZXF1ZXN0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXFTdGFuemFSZXNwb25zZUhhbmRsZXJzLnNldChpZCwgKHJlc3BvbnNlOiBJcVJlc3BvbnNlU3RhbnphKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYXR0cnMudHlwZSA9PT0gJ3Jlc3VsdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlIGFzIElxUmVzcG9uc2VTdGFuemE8J3Jlc3VsdCc+KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IHJlc3BvbnNlIGFzIElxUmVzcG9uc2VTdGFuemE8J2Vycm9yJz47XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBJcVJlc3BvbnNlRXJyb3IoZXJyb3JSZXNwb25zZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZChyZXF1ZXN0KS5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdlcnJvciBzZW5kaW5nIGlxJywgZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlxU3RhbnphUmVzcG9uc2VIYW5kbGVycy5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VuZElxQWNrUmVzdWx0KGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXHJcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7ZnJvbTogdGhpcy51c2VySmlkLnRvU3RyaW5nKCksIGlkLCB0eXBlOiAncmVzdWx0J30pLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhbnphUmVjZWl2ZWQoc3RhbnphOiBTdGFuemEpOiB2b2lkIHtcclxuICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXFTdGFuemFSZXNwb25zZShzdGFuemEpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUlxU3RhbnphUmVzcG9uc2UgPSB0aGlzLmlxU3RhbnphUmVzcG9uc2VIYW5kbGVycy5nZXQoc3RhbnphLmF0dHJzLmlkKTtcclxuICAgICAgICAgICAgaWYgKGhhbmRsZUlxU3RhbnphUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygnPDw8Jywgc3RhbnphLnRvU3RyaW5nKCksICdoYW5kbGVkIGJ5IGNhbGxiYWNrJywgaGFuZGxlSXFTdGFuemFSZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlxU3RhbnphUmVzcG9uc2VIYW5kbGVycy5kZWxldGUoc3RhbnphLmF0dHJzLmlkKTtcclxuICAgICAgICAgICAgICAgIGhhbmRsZUlxU3RhbnphUmVzcG9uc2Uoc3RhbnphKTtcclxuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWhhbmRsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFuemFVbmtub3duJC5uZXh0KHN0YW56YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNJcVN0YW56YVJlc3BvbnNlKHN0YW56YTogU3RhbnphKTogc3RhbnphIGlzIElxUmVzcG9uc2VTdGFuemEge1xyXG4gICAgICAgIGNvbnN0IHN0YW56YVR5cGUgPSBzdGFuemEuYXR0cnMudHlwZTtcclxuICAgICAgICByZXR1cm4gc3RhbnphLm5hbWUgPT09ICdpcScgJiYgKHN0YW56YVR5cGUgPT09ICdyZXN1bHQnIHx8IHN0YW56YVR5cGUgPT09ICdlcnJvcicpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvZ0luKGxvZ0luUmVxdWVzdDogTG9nSW5SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobG9nSW5SZXF1ZXN0LnVzZXJuYW1lLmluZGV4T2YoJ0AnKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2Uud2FybigndXNlcm5hbWUgc2hvdWxkIG5vdCBjb250YWluIGRvbWFpbiwgb25seSBsb2NhbCBwYXJ0LCB0aGlzIGNhbiBsZWFkIHRvIGVycm9ycyEnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQgPSB0aGlzLnhtcHBDbGllbnRGYWN0b3J5U2VydmljZS5jbGllbnQobG9nSW5SZXF1ZXN0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdlcnJvcicsIChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJ2NoYXQgc2VydmljZSBlcnJvciA9PicsIGVyci50b1N0cmluZygpLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQub24oJ3N0YXR1cycsIChzdGF0dXM6IGFueSwgdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbygnc3RhdHVzIHVwZGF0ZSA9Jywgc3RhdHVzLCB2YWx1ZSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnb2ZmbGluZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSQubmV4dCgnZGlzY29ubmVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQub24oJ29ubGluZScsIChqaWQ6IEpJRCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub25PbmxpbmUoamlkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdzdGFuemEnLCAoc3RhbnphOiBTdGFuemEpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN0YW56YVJlY2VpdmVkKHN0YW56YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSQubmV4dCgncmVjb25uZWN0aW5nJyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zdGFydCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvZ091dCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBwcmVzZW5jZSBwbHVnaW4gaW4gYSBoYW5kbGVyXHJcbiAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKCdsb2dnaW5nIG91dCcpO1xyXG4gICAgICAgIGlmICh0aGlzLmNsaWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5yZWNvbm5lY3Quc3RvcCgpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kKHhtbCgncHJlc2VuY2UnLCB7dHlwZTogJ3VuYXZhaWxhYmxlJ30pKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdlcnJvciBzZW5kaW5nIHByZXNlbmNlIHVuYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5zdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dElxSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMuaXFJZCsrKTtcclxuICAgIH1cclxuXHJcbiAgICByZWNvbm5lY3RTaWxlbnRseSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvZ1NlcnZpY2Uud2FybignaGFyZCByZWNvbm5lY3QuLi4nKTtcclxuICAgICAgICB0aGlzLnN0YXRlJC5uZXh0KCdkaXNjb25uZWN0ZWQnKTtcclxuICAgIH1cclxufVxyXG4iXX0=