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

168 lines 28 kB
import { ReplaySubject } from 'rxjs'; import { dummyAvatarRoom } from '../../../../../core/contact-avatar'; import { MessageStore } from '../../../../../core/message-store'; import { jid as parseJid } from '@xmpp/client'; import { isJid } from '../../../../../core/recipient'; export class Room { constructor(roomJid, logService) { this.logService = logService; this.recipientType = 'room'; this.description = ''; this.subject = ''; this.avatar = dummyAvatarRoom; this.metadata = {}; this.roomOccupants = new Map(); this.onOccupantChangeSubject = new ReplaySubject(Infinity, 1000); this.onOccupantChange$ = this.onOccupantChangeSubject.asObservable(); this.occupantsSubject = new ReplaySubject(1); this.occupants$ = this.occupantsSubject.asObservable(); this.roomJid = roomJid.bare(); this.name = undefined; this.messageStore = new MessageStore(logService); } get nick() { return this.occupantJid?.resource; } set nick(nick) { const occupantJid = parseJid(this.roomJid.toString()); occupantJid.resource = nick; this.occupantJid = occupantJid; } get name() { return this._name; } set name(name) { this._name = !!name ? name : this.roomJid.local; } get jidBare() { return this.roomJid; } get messages$() { return this.messageStore.messages$; } get messages() { return this.messageStore.messages; } get dateMessagesGroups() { return this.messageStore.dateMessageGroups; } get oldestMessage() { return this.messageStore.oldestMessage; } get mostRecentMessage() { return this.messageStore.mostRecentMessage; } get mostRecentMessageReceived() { return this.messageStore.mostRecentMessageReceived; } get mostRecentMessageSent() { return this.messageStore.mostRecentMessageSent; } addMessage(message) { this.messageStore.addMessage(message); } equalsBareJid(other) { if (other instanceof Room || isJid(other)) { const otherJid = other instanceof Room ? other.roomJid : other.bare(); return this.roomJid.equals(otherJid); } return false; } hasOccupant(occupantJid) { return this.roomOccupants.has(occupantJid.toString()); } getOccupant(occupantJid) { return this.roomOccupants.get(occupantJid.toString()); } handleOccupantJoined(occupant, isCurrentUser) { this.addOccupant(occupant); this.onOccupantChangeSubject.next({ change: 'joined', occupant, isCurrentUser }); this.logService.debug(`occupant joined room: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); return true; } handleOccupantLeft(occupant, isCurrentUser) { this.removeOccupant(occupant, isCurrentUser); this.logService.debug(`occupant left room: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); this.onOccupantChangeSubject.next({ change: 'left', occupant, isCurrentUser }); return true; } handleOccupantConnectionError(occupant, isCurrentUser) { this.removeOccupant(occupant, isCurrentUser); this.logService.debug(`occupant left room due to connection error: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); this.onOccupantChangeSubject.next({ change: 'leftOnConnectionError', occupant, isCurrentUser }); return true; } handleOccupantKicked(occupant, isCurrentUser, actor, reason) { this.removeOccupant(occupant, isCurrentUser); if (isCurrentUser) { this.logService.info(`you got kicked from room! roomJid=${this.roomJid.toString()}, by=${actor}, reason=${reason}`); } this.logService.debug(`occupant got kicked: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); this.onOccupantChangeSubject.next({ change: 'kicked', occupant, isCurrentUser, actor, reason }); return true; } handleOccupantBanned(occupant, isCurrentUser, actor, reason) { this.removeOccupant(occupant, isCurrentUser); if (isCurrentUser) { this.logService.info(`you got banned from room! roomJid=${this.roomJid.toString()}, by=${actor}, reason=${reason}`); } this.logService.debug(`occupant got banned: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); this.onOccupantChangeSubject.next({ change: 'banned', occupant, isCurrentUser, actor, reason }); return true; } handleOccupantLostMembership(occupant, isCurrentUser) { this.removeOccupant(occupant, isCurrentUser); if (isCurrentUser) { this.logService.info(`your membership got revoked and you got kicked from member-only room: ${this.roomJid.toString()}`); } this.onOccupantChangeSubject.next({ change: 'lostMembership', occupant, isCurrentUser }); return true; } handleOccupantChangedNick(occupant, isCurrentUser, newNick) { if (isCurrentUser) { this.nick = newNick; } let existingOccupant = this.roomOccupants.get(occupant.occupantJid.toString()); if (!existingOccupant) { existingOccupant = { ...occupant }; existingOccupant.occupantJid = parseJid(occupant.occupantJid.toString()); } existingOccupant.occupantJid.resource = newNick; existingOccupant.nick = newNick; this.roomOccupants.delete(occupant.occupantJid.toString()); this.roomOccupants.set(existingOccupant.occupantJid.toString(), existingOccupant); this.logService.debug(`occupant changed nick: from=${occupant.nick}, to=${newNick}, occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`); this.onOccupantChangeSubject.next({ change: 'changedNick', occupant, newNick, isCurrentUser }); return true; } handleOccupantModified(occupant, oldOccupant, isCurrentUser) { this.logService.debug(`occupant changed: from=${JSON.stringify(oldOccupant)}, to=${JSON.stringify(occupant)}`); this.onOccupantChangeSubject.next({ change: 'modified', occupant, oldOccupant, isCurrentUser }); return true; } equals(other) { if (this === other) { return true; } if (other == null || !(other instanceof Room)) { return false; } return this.roomJid.equals(other.roomJid); } addOccupant(occupant) { this.roomOccupants.set(occupant.occupantJid.toString(), occupant); this.occupantsSubject.next([...this.roomOccupants.values()]); } removeOccupant(occupant, isCurrentUser) { if (isCurrentUser) { this.roomOccupants.clear(); this.occupantsSubject.next([]); } else { if (this.roomOccupants.delete(occupant.occupantJid.toString())) { this.occupantsSubject.next([...this.roomOccupants.values()]); } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL211bHRpLXVzZXItY2hhdC9yb29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQVcsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBcUIsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFcEYsT0FBTyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBYSxNQUFNLCtCQUErQixDQUFDO0FBTWpFLE1BQU0sT0FBTyxJQUFJO0lBZ0JiLFlBQVksT0FBWSxFQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBZHhELGtCQUFhLEdBQUcsTUFBTSxDQUFDO1FBR2hDLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixXQUFNLEdBQUcsZUFBZSxDQUFDO1FBQ3pCLGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBRVgsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUNoRCw0QkFBdUIsR0FBRyxJQUFJLGFBQWEsQ0FBaUIsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BGLHNCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4RCxxQkFBZ0IsR0FBRyxJQUFJLGFBQWEsQ0FBaUIsQ0FBQyxDQUFDLENBQUM7UUFDaEUsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUd2RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUs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T0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxRQUFzQjtRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBc0IsRUFBRSxhQUFzQjtRQUNqRSxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2hFO1NBQ0o7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKSUQgfSBmcm9tICdAeG1wcC9qaWQnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZHVtbXlBdmF0YXJSb29tIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9jb250YWN0LWF2YXRhcic7XG5pbXBvcnQgeyBEYXRlTWVzc2FnZXNHcm91cCwgTWVzc2FnZVN0b3JlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tZXNzYWdlLXN0b3JlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBqaWQgYXMgcGFyc2VKaWQgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xuaW1wb3J0IHsgaXNKaWQsIFJlY2lwaWVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvcmVjaXBpZW50JztcbmltcG9ydCB7IFJvb21NZXRhZGF0YSB9IGZyb20gJy4vbXVsdGktdXNlci1jaGF0LnBsdWdpbic7XG5pbXBvcnQgeyBSb29tT2NjdXBhbnQgfSBmcm9tICcuL3Jvb20tb2NjdXBhbnQnO1xuaW1wb3J0IHsgUm9vbU1lc3NhZ2UgfSBmcm9tICcuL3Jvb20tbWVzc2FnZSc7XG5pbXBvcnQgeyBPY2N1cGFudENoYW5nZSB9IGZyb20gJy4vb2NjdXBhbnQtY2hhbmdlJztcblxuZXhwb3J0IGNsYXNzIFJvb20ge1xuXG4gICAgcmVhZG9ubHkgcmVjaXBpZW50VHlwZSA9ICdyb29tJztcbiAgICByZWFkb25seSByb29tSmlkOiBKSUQ7XG4gICAgb2NjdXBhbnRKaWQ6IEpJRCB8IHVuZGVmaW5lZDtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIHN1YmplY3QgPSAnJztcbiAgICBhdmF0YXIgPSBkdW1teUF2YXRhclJvb207XG4gICAgbWV0YWRhdGE6IFJvb21NZXRhZGF0YSA9IHt9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVN0b3JlOiBNZXNzYWdlU3RvcmU8Um9vbU1lc3NhZ2U+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9vbU9jY3VwYW50cyA9IG5ldyBNYXA8c3RyaW5nLCBSb29tT2NjdXBhbnQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvbk9jY3VwYW50Q2hhbmdlU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PE9jY3VwYW50Q2hhbmdlPihJbmZpbml0eSwgMTAwMCk7XG4gICAgcmVhZG9ubHkgb25PY2N1cGFudENoYW5nZSQgPSB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb2NjdXBhbnRzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJvb21PY2N1cGFudFtdPigxKTtcbiAgICByZWFkb25seSBvY2N1cGFudHMkID0gdGhpcy5vY2N1cGFudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgY29uc3RydWN0b3Iocm9vbUppZDogSklELCBwcml2YXRlIHJlYWRvbmx5IGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5yb29tSmlkID0gcm9vbUppZC5iYXJlKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5tZXNzYWdlU3RvcmUgPSBuZXcgTWVzc2FnZVN0b3JlPFJvb21NZXNzYWdlPihsb2dTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBnZXQgbmljaygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5vY2N1cGFudEppZD8ucmVzb3VyY2U7XG4gICAgfVxuXG4gICAgc2V0IG5pY2sobmljazogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG9jY3VwYW50SmlkID0gcGFyc2VKaWQodGhpcy5yb29tSmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBvY2N1cGFudEppZC5yZXNvdXJjZSA9IG5pY2s7XG4gICAgICAgIHRoaXMub2NjdXBhbnRKaWQgPSBvY2N1cGFudEppZDtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIHNldCBuYW1lKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9uYW1lID0gISFuYW1lID8gbmFtZSA6IHRoaXMucm9vbUppZC5sb2NhbDtcbiAgICB9XG5cbiAgICBnZXQgamlkQmFyZSgpOiBKSUQge1xuICAgICAgICByZXR1cm4gdGhpcy5yb29tSmlkO1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlcyQoKTogU3ViamVjdDxSb29tTWVzc2FnZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUubWVzc2FnZXMkO1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlcygpOiBSb29tTWVzc2FnZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVN0b3JlLm1lc3NhZ2VzO1xuICAgIH1cblxuICAgIGdldCBkYXRlTWVzc2FnZXNHcm91cHMoKTogRGF0ZU1lc3NhZ2VzR3JvdXA8Um9vbU1lc3NhZ2U+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUuZGF0ZU1lc3NhZ2VHcm91cHM7XG4gICAgfVxuXG4gICAgZ2V0IG9sZGVzdE1lc3NhZ2UoKTogUm9vbU1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUub2xkZXN0TWVzc2FnZTtcbiAgICB9XG5cbiAgICBnZXQgbW9zdFJlY2VudE1lc3NhZ2UoKTogUm9vbU1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUubW9zdFJlY2VudE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG1vc3RSZWNlbnRNZXNzYWdlUmVjZWl2ZWQoKTogUm9vbU1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUubW9zdFJlY2VudE1lc3NhZ2VSZWNlaXZlZDtcbiAgICB9XG5cbiAgICBnZXQgbW9zdFJlY2VudE1lc3NhZ2VTZW50KCk6IFJvb21NZXNzYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVN0b3JlLm1vc3RSZWNlbnRNZXNzYWdlU2VudDtcbiAgICB9XG5cbiAgICBhZGRNZXNzYWdlKG1lc3NhZ2U6IFJvb21NZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVzc2FnZVN0b3JlLmFkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZXF1YWxzQmFyZUppZChvdGhlcjogUmVjaXBpZW50IHwgSklEKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFJvb20gfHwgaXNKaWQob3RoZXIpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlckppZCA9IG90aGVyIGluc3RhbmNlb2YgUm9vbSA/IG90aGVyLnJvb21KaWQgOiBvdGhlci5iYXJlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb29tSmlkLmVxdWFscyhvdGhlckppZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGhhc09jY3VwYW50KG9jY3VwYW50SmlkOiBKSUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vbU9jY3VwYW50cy5oYXMob2NjdXBhbnRKaWQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgZ2V0T2NjdXBhbnQob2NjdXBhbnRKaWQ6IEpJRCk6IFJvb21PY2N1cGFudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb21PY2N1cGFudHMuZ2V0KG9jY3VwYW50SmlkLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGhhbmRsZU9jY3VwYW50Sm9pbmVkKG9jY3VwYW50OiBSb29tT2NjdXBhbnQsIGlzQ3VycmVudFVzZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hZGRPY2N1cGFudChvY2N1cGFudCk7XG5cbiAgICAgICAgdGhpcy5vbk9jY3VwYW50Q2hhbmdlU3ViamVjdC5uZXh0KHtjaGFuZ2U6ICdqb2luZWQnLCBvY2N1cGFudCwgaXNDdXJyZW50VXNlcn0pO1xuICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoYG9jY3VwYW50IGpvaW5lZCByb29tOiBvY2N1cGFudEppZD0ke29jY3VwYW50Lm9jY3VwYW50SmlkLnRvU3RyaW5nKCl9LCByb29tSmlkPSR7dGhpcy5yb29tSmlkLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhbmRsZU9jY3VwYW50TGVmdChvY2N1cGFudDogUm9vbU9jY3VwYW50LCBpc0N1cnJlbnRVc2VyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlT2NjdXBhbnQob2NjdXBhbnQsIGlzQ3VycmVudFVzZXIpO1xuICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoYG9jY3VwYW50IGxlZnQgcm9vbTogb2NjdXBhbnRKaWQ9JHtvY2N1cGFudC5vY2N1cGFudEppZC50b1N0cmluZygpfSwgcm9vbUppZD0ke3RoaXMucm9vbUppZC50b1N0cmluZygpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2xlZnQnLCBvY2N1cGFudCwgaXNDdXJyZW50VXNlcn0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYW5kbGVPY2N1cGFudENvbm5lY3Rpb25FcnJvcihvY2N1cGFudDogUm9vbU9jY3VwYW50LCBpc0N1cnJlbnRVc2VyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlT2NjdXBhbnQob2NjdXBhbnQsIGlzQ3VycmVudFVzZXIpO1xuICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoYG9jY3VwYW50IGxlZnQgcm9vbSBkdWUgdG8gY29ubmVjdGlvbiBlcnJvcjogb2NjdXBhbnRKaWQ9JHtvY2N1cGFudC5vY2N1cGFudEppZC50b1N0cmluZygpfSwgcm9vbUppZD0ke3RoaXMucm9vbUppZC50b1N0cmluZygpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2xlZnRPbkNvbm5lY3Rpb25FcnJvcicsIG9jY3VwYW50LCBpc0N1cnJlbnRVc2VyfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhbmRsZU9jY3VwYW50S2lja2VkKG9jY3VwYW50OiBSb29tT2NjdXBhbnQsIGlzQ3VycmVudFVzZXI6IGJvb2xlYW4sIGFjdG9yPzogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVPY2N1cGFudChvY2N1cGFudCwgaXNDdXJyZW50VXNlcik7XG4gICAgICAgIGlmIChpc0N1cnJlbnRVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbyhgeW91IGdvdCBraWNrZWQgZnJvbSByb29tISByb29tSmlkPSR7dGhpcy5yb29tSmlkLnRvU3RyaW5nKCl9LCBieT0ke2FjdG9yfSwgcmVhc29uPSR7cmVhc29ufWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1Zyhgb2NjdXBhbnQgZ290IGtpY2tlZDogb2NjdXBhbnRKaWQ9JHtvY2N1cGFudC5vY2N1cGFudEppZC50b1N0cmluZygpfSwgcm9vbUppZD0ke3RoaXMucm9vbUppZC50b1N0cmluZygpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2tpY2tlZCcsIG9jY3VwYW50LCBpc0N1cnJlbnRVc2VyLCBhY3RvciwgcmVhc29ufSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhbmRsZU9jY3VwYW50QmFubmVkKG9jY3VwYW50OiBSb29tT2NjdXBhbnQsIGlzQ3VycmVudFVzZXI6IGJvb2xlYW4sIGFjdG9yPzogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVPY2N1cGFudChvY2N1cGFudCwgaXNDdXJyZW50VXNlcik7XG4gICAgICAgIGlmIChpc0N1cnJlbnRVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbyhgeW91IGdvdCBiYW5uZWQgZnJvbSByb29tISByb29tSmlkPSR7dGhpcy5yb29tSmlkLnRvU3RyaW5nKCl9LCBieT0ke2FjdG9yfSwgcmVhc29uPSR7cmVhc29ufWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1Zyhgb2NjdXBhbnQgZ290IGJhbm5lZDogb2NjdXBhbnRKaWQ9JHtvY2N1cGFudC5vY2N1cGFudEppZC50b1N0cmluZygpfSwgcm9vbUppZD0ke3RoaXMucm9vbUppZC50b1N0cmluZygpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2Jhbm5lZCcsIG9jY3VwYW50LCBpc0N1cnJlbnRVc2VyLCBhY3RvciwgcmVhc29ufSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhbmRsZU9jY3VwYW50TG9zdE1lbWJlcnNoaXAob2NjdXBhbnQ6IFJvb21PY2N1cGFudCwgaXNDdXJyZW50VXNlcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnJlbW92ZU9jY3VwYW50KG9jY3VwYW50LCBpc0N1cnJlbnRVc2VyKTtcbiAgICAgICAgaWYgKGlzQ3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5pbmZvKGB5b3VyIG1lbWJlcnNoaXAgZ290IHJldm9rZWQgYW5kIHlvdSBnb3Qga2lja2VkIGZyb20gbWVtYmVyLW9ubHkgcm9vbTogJHt0aGlzLnJvb21KaWQudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2xvc3RNZW1iZXJzaGlwJywgb2NjdXBhbnQsIGlzQ3VycmVudFVzZXJ9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaGFuZGxlT2NjdXBhbnRDaGFuZ2VkTmljayhvY2N1cGFudDogUm9vbU9jY3VwYW50LCBpc0N1cnJlbnRVc2VyOiBib29sZWFuLCBuZXdOaWNrOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzQ3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMubmljayA9IG5ld05pY2s7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nT2NjdXBhbnQgPSB0aGlzLnJvb21PY2N1cGFudHMuZ2V0KG9jY3VwYW50Lm9jY3VwYW50SmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nT2NjdXBhbnQpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nT2NjdXBhbnQgPSB7Li4ub2NjdXBhbnR9O1xuICAgICAgICAgICAgZXhpc3RpbmdPY2N1cGFudC5vY2N1cGFudEppZCA9IHBhcnNlSmlkKG9jY3VwYW50Lm9jY3VwYW50SmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGV4aXN0aW5nT2NjdXBhbnQub2NjdXBhbnRKaWQucmVzb3VyY2UgPSBuZXdOaWNrO1xuICAgICAgICBleGlzdGluZ09jY3VwYW50Lm5pY2sgPSBuZXdOaWNrO1xuICAgICAgICB0aGlzLnJvb21PY2N1cGFudHMuZGVsZXRlKG9jY3VwYW50Lm9jY3VwYW50SmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLnJvb21PY2N1cGFudHMuc2V0KGV4aXN0aW5nT2NjdXBhbnQub2NjdXBhbnRKaWQudG9TdHJpbmcoKSwgZXhpc3RpbmdPY2N1cGFudCk7XG5cbiAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKGBvY2N1cGFudCBjaGFuZ2VkIG5pY2s6IGZyb209JHtvY2N1cGFudC5uaWNrfSwgdG89JHtuZXdOaWNrfSwgb2NjdXBhbnRKaWQ9JHtvY2N1cGFudC5vY2N1cGFudEppZC50b1N0cmluZygpfSwgcm9vbUppZD0ke3RoaXMucm9vbUppZC50b1N0cmluZygpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ2NoYW5nZWROaWNrJywgb2NjdXBhbnQsIG5ld05pY2ssIGlzQ3VycmVudFVzZXJ9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaGFuZGxlT2NjdXBhbnRNb2RpZmllZChvY2N1cGFudDogUm9vbU9jY3VwYW50LCBvbGRPY2N1cGFudDogUm9vbU9jY3VwYW50LCBpc0N1cnJlbnRVc2VyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1Zyhgb2NjdXBhbnQgY2hhbmdlZDogZnJvbT0ke0pTT04uc3RyaW5naWZ5KG9sZE9jY3VwYW50KX0sIHRvPSR7SlNPTi5zdHJpbmdpZnkob2NjdXBhbnQpfWApO1xuICAgICAgICB0aGlzLm9uT2NjdXBhbnRDaGFuZ2VTdWJqZWN0Lm5leHQoe2NoYW5nZTogJ21vZGlmaWVkJywgb2NjdXBhbnQsIG9sZE9jY3VwYW50LCBpc0N1cnJlbnRVc2VyfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGVxdWFscyhvdGhlcjogUm9vbSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMgPT09IG90aGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8ICEob3RoZXIgaW5zdGFuY2VvZiBSb29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vbUppZC5lcXVhbHMob3RoZXIucm9vbUppZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRPY2N1cGFudChvY2N1cGFudDogUm9vbU9jY3VwYW50KSB7XG4gICAgICAgIHRoaXMucm9vbU9jY3VwYW50cy5zZXQob2NjdXBhbnQub2NjdXBhbnRKaWQudG9TdHJpbmcoKSwgb2NjdXBhbnQpO1xuICAgICAgICB0aGlzLm9jY3VwYW50c1N1YmplY3QubmV4dChbLi4udGhpcy5yb29tT2NjdXBhbnRzLnZhbHVlcygpXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVPY2N1cGFudChvY2N1cGFudDogUm9vbU9jY3VwYW50LCBpc0N1cnJlbnRVc2VyOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpc0N1cnJlbnRVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLnJvb21PY2N1cGFudHMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMub2NjdXBhbnRzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb21PY2N1cGFudHMuZGVsZXRlKG9jY3VwYW50Lm9jY3VwYW50SmlkLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vY2N1cGFudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMucm9vbU9jY3VwYW50cy52YWx1ZXMoKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19