@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
93 lines • 13.4 kB
JavaScript
import { jid as parseJid } from '@xmpp/client';
import { BehaviorSubject } from 'rxjs';
import { dummyAvatarContact } from './contact-avatar';
import { MessageStore } from './message-store';
import { Presence } from './presence';
import { isJid } from './recipient';
import { ContactSubscription } from './subscription';
export class Contact {
/**
* Do not call directly, use {@link ContactFactoryService#createContact} instead.
*/
constructor(jidPlain, name, logService, avatar) {
this.name = name;
this.recipientType = 'contact';
this.avatar = dummyAvatarContact;
this.metadata = {};
this.presence$ = new BehaviorSubject(Presence.unavailable);
this.subscription$ = new BehaviorSubject(ContactSubscription.none);
this.pendingOut$ = new BehaviorSubject(false);
this.pendingIn$ = new BehaviorSubject(false);
this.resources$ = new BehaviorSubject(new Map());
this.pendingRoomInvite$ = new BehaviorSubject(null);
if (avatar) {
this.avatar = avatar;
}
const jid = parseJid(jidPlain);
this.jidFull = jid;
this.jidBare = jid.bare();
this.messageStore = new MessageStore(logService);
}
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 Contact || isJid(other)) {
const otherJid = other instanceof Contact ? other.jidBare : other.bare();
return this.jidBare.equals(otherJid);
}
return false;
}
isSubscribed() {
const subscription = this.subscription$.getValue();
return subscription === ContactSubscription.both || subscription === ContactSubscription.to;
}
isUnaffiliated() {
return !this.isSubscribed() && !this.pendingIn$.getValue() && !this.pendingOut$.getValue();
}
updateResourcePresence(jid, presence) {
const resources = this.resources$.getValue();
resources.set(jid, presence);
this.presence$.next(this.determineOverallPresence(resources));
this.resources$.next(resources);
}
getMessageById(id) {
return this.messageStore.messageIdToMessage.get(id);
}
determineOverallPresence(jidToPresence) {
let result = Presence.unavailable;
[...jidToPresence.values()].some((presence) => {
if (presence === Presence.present) {
result = presence;
return true;
}
else if (presence === Presence.away) {
result = Presence.away;
}
return false;
});
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29yZS9jb250YWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQVcsTUFBTSxNQUFNLENBQUM7QUFFaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFxQixZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQWEsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFlckQsTUFBTSxPQUFPLE9BQU87SUE4Q2hCOztPQUVHO0lBQ0gsWUFBWSxRQUFnQixFQUNULElBQVksRUFDbkIsVUFBdUIsRUFDdkIsTUFBZTtRQUZSLFNBQUksR0FBSixJQUFJLENBQVE7UUFoRHRCLGtCQUFhLEdBQUcsU0FBUyxDQUFDO1FBQ25DLFdBQU0sR0FBRyxrQkFBa0IsQ0FBQztRQUM1QixhQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUt0QixjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hFLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQXNCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNELHVCQUFr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QUM7SUFDeEQsQ0FBQztJQUVPLHdCQUF3QixDQUFDLGFBQTRCO1FBQ3pELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFFbEMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzFDLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQy9CLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7aUJBQU0sSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDbkMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDMUI7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGppZCBhcyBwYXJzZUppZCB9IGZyb20gJ0B4bXBwL2NsaWVudCc7XG5pbXBvcnQgeyBKSUQgfSBmcm9tICdAeG1wcC9qaWQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgZHVtbXlBdmF0YXJDb250YWN0IH0gZnJvbSAnLi9jb250YWN0LWF2YXRhcic7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IERhdGVNZXNzYWdlc0dyb3VwLCBNZXNzYWdlU3RvcmUgfSBmcm9tICcuL21lc3NhZ2Utc3RvcmUnO1xuaW1wb3J0IHsgUHJlc2VuY2UgfSBmcm9tICcuL3ByZXNlbmNlJztcbmltcG9ydCB7IGlzSmlkLCBSZWNpcGllbnQgfSBmcm9tICcuL3JlY2lwaWVudCc7XG5pbXBvcnQgeyBDb250YWN0U3Vic2NyaXB0aW9uIH0gZnJvbSAnLi9zdWJzY3JpcHRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEludml0YXRpb24ge1xuICAgIGZyb206IEpJRDtcbiAgICByb29tSmlkOiBKSUQ7XG4gICAgcmVhc29uPzogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhY3RNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBKaWRUb1ByZXNlbmNlID0gTWFwPHN0cmluZywgUHJlc2VuY2U+O1xuXG5leHBvcnQgY2xhc3MgQ29udGFjdCB7XG5cbiAgICByZWFkb25seSByZWNpcGllbnRUeXBlID0gJ2NvbnRhY3QnO1xuICAgIGF2YXRhciA9IGR1bW15QXZhdGFyQ29udGFjdDtcbiAgICBtZXRhZGF0YTogQ29udGFjdE1ldGFkYXRhID0ge307XG5cbiAgICAvKiogdXNlIHtAbGluayBqaWRCYXJlfSwgamlkIHJlc291cmNlIGlzIG9ubHkgc2V0IGZvciBjaGF0IHJvb20gY29udGFjdHMgKi9cbiAgICByZWFkb25seSBqaWRGdWxsOiBKSUQ7XG4gICAgcmVhZG9ubHkgamlkQmFyZTogSklEO1xuICAgIHJlYWRvbmx5IHByZXNlbmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJlc2VuY2U+KFByZXNlbmNlLnVuYXZhaWxhYmxlKTtcbiAgICByZWFkb25seSBzdWJzY3JpcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb250YWN0U3Vic2NyaXB0aW9uPihDb250YWN0U3Vic2NyaXB0aW9uLm5vbmUpO1xuICAgIHJlYWRvbmx5IHBlbmRpbmdPdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgcmVhZG9ubHkgcGVuZGluZ0luJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHJlYWRvbmx5IHJlc291cmNlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEppZFRvUHJlc2VuY2U+KG5ldyBNYXAoKSk7XG4gICAgcmVhZG9ubHkgcGVuZGluZ1Jvb21JbnZpdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsIHwgSW52aXRhdGlvbj4obnVsbCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTdG9yZTogTWVzc2FnZVN0b3JlPE1lc3NhZ2U+O1xuXG4gICAgZ2V0IG1lc3NhZ2VzJCgpOiBTdWJqZWN0PE1lc3NhZ2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVN0b3JlLm1lc3NhZ2VzJDtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZXMoKTogTWVzc2FnZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVN0b3JlLm1lc3NhZ2VzO1xuICAgIH1cblxuICAgIGdldCBkYXRlTWVzc2FnZXNHcm91cHMoKTogRGF0ZU1lc3NhZ2VzR3JvdXA8TWVzc2FnZT5bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTdG9yZS5kYXRlTWVzc2FnZUdyb3VwcztcbiAgICB9XG5cbiAgICBnZXQgb2xkZXN0TWVzc2FnZSgpOiBNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVN0b3JlLm9sZGVzdE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG1vc3RSZWNlbnRNZXNzYWdlKCk6IE1lc3NhZ2UgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUubW9zdFJlY2VudE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG1vc3RSZWNlbnRNZXNzYWdlUmVjZWl2ZWQoKTogTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTdG9yZS5tb3N0UmVjZW50TWVzc2FnZVJlY2VpdmVkO1xuICAgIH1cblxuICAgIGdldCBtb3N0UmVjZW50TWVzc2FnZVNlbnQoKTogTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTdG9yZS5tb3N0UmVjZW50TWVzc2FnZVNlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG8gbm90IGNhbGwgZGlyZWN0bHksIHVzZSB7QGxpbmsgQ29udGFjdEZhY3RvcnlTZXJ2aWNlI2NyZWF0ZUNvbnRhY3R9IGluc3RlYWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoamlkUGxhaW46IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGxvZ1NlcnZpY2U/OiBMb2dTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGF2YXRhcj86IHN0cmluZykge1xuICAgICAgICBpZiAoYXZhdGFyKSB7XG4gICAgICAgICAgICB0aGlzLmF2YXRhciA9IGF2YXRhcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqaWQgPSBwYXJzZUppZChqaWRQbGFpbik7XG4gICAgICAgIHRoaXMuamlkRnVsbCA9IGppZDtcbiAgICAgICAgdGhpcy5qaWRCYXJlID0gamlkLmJhcmUoKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU3RvcmUgPSBuZXcgTWVzc2FnZVN0b3JlKGxvZ1NlcnZpY2UpO1xuICAgIH1cblxuICAgIGFkZE1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTdG9yZS5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGVxdWFsc0JhcmVKaWQob3RoZXI6IFJlY2lwaWVudCB8IEpJRCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBDb250YWN0IHx8IGlzSmlkKG90aGVyKSkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJKaWQgPSBvdGhlciBpbnN0YW5jZW9mIENvbnRhY3QgPyBvdGhlci5qaWRCYXJlIDogb3RoZXIuYmFyZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuamlkQmFyZS5lcXVhbHMob3RoZXJKaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1N1YnNjcmliZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9uJC5nZXRWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uID09PSBDb250YWN0U3Vic2NyaXB0aW9uLmJvdGggfHwgc3Vic2NyaXB0aW9uID09PSBDb250YWN0U3Vic2NyaXB0aW9uLnRvO1xuICAgIH1cblxuICAgIGlzVW5hZmZpbGlhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNTdWJzY3JpYmVkKCkgJiYgIXRoaXMucGVuZGluZ0luJC5nZXRWYWx1ZSgpICYmICF0aGlzLnBlbmRpbmdPdXQkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVzb3VyY2VQcmVzZW5jZShqaWQ6IHN0cmluZywgcHJlc2VuY2U6IFByZXNlbmNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzJC5nZXRWYWx1ZSgpO1xuICAgICAgICByZXNvdXJjZXMuc2V0KGppZCwgcHJlc2VuY2UpO1xuICAgICAgICB0aGlzLnByZXNlbmNlJC5uZXh0KHRoaXMuZGV0ZXJtaW5lT3ZlcmFsbFByZXNlbmNlKHJlc291cmNlcykpO1xuICAgICAgICB0aGlzLnJlc291cmNlcyQubmV4dChyZXNvdXJjZXMpO1xuICAgIH1cblxuICAgIGdldE1lc3NhZ2VCeUlkKGlkOiBzdHJpbmcpOiBNZXNzYWdlIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTdG9yZS5tZXNzYWdlSWRUb01lc3NhZ2UuZ2V0KGlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGVybWluZU92ZXJhbGxQcmVzZW5jZShqaWRUb1ByZXNlbmNlOiBKaWRUb1ByZXNlbmNlKTogUHJlc2VuY2Uge1xuICAgICAgICBsZXQgcmVzdWx0ID0gUHJlc2VuY2UudW5hdmFpbGFibGU7XG5cbiAgICAgICAgWy4uLmppZFRvUHJlc2VuY2UudmFsdWVzKCldLnNvbWUoKHByZXNlbmNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlc2VuY2UgPT09IFByZXNlbmNlLnByZXNlbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmVzZW5jZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlc2VuY2UgPT09IFByZXNlbmNlLmF3YXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBQcmVzZW5jZS5hd2F5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxufVxuIl19