{"version":3,"file":"pazznetwork-ngx-chat.mjs","sources":["../../../src/lib/components/chat-filedrop/file-drop.component.ts","../../../src/lib/components/chat-filedrop/file-drop.component.html","../../../src/lib/services/chat-service.ts","../../../src/lib/components/chat-message-input/chat-message-input.component.ts","../../../src/lib/components/chat-message-input/chat-message-input.component.html","../../../src/lib/core/message.ts","../../../src/lib/services/adapters/xmpp/plugins/abstract-xmpp-plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/block.plugin.ts","../../../src/lib/services/adapters/xmpp/abstract-stanza-builder.ts","../../../src/lib/services/adapters/xmpp/xmpp-response.error.ts","../../../src/lib/core/form.ts","../../../src/lib/services/adapters/xmpp/plugins/publish-subscribe.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/muc-sub.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/message-archive.plugin.ts","../../../src/lib/services/report-user-service.ts","../../../src/lib/core/utils-links.ts","../../../src/lib/core/id-generator.ts","../../../src/lib/services/adapters/xmpp/plugins/message-uuid.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/message-state.plugin.ts","../../../src/lib/core/contact-avatar.ts","../../../src/lib/core/presence.ts","../../../src/lib/core/translations-default.ts","../../../src/lib/services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat-constants.ts","../../../src/lib/services/adapters/xmpp/plugins/message.plugin.ts","../../../src/lib/services/adapters/xmpp/stanza-builder.ts","../../../src/lib/services/adapters/xmpp/plugins/service-discovery.plugin.ts","../../../src/lib/core/utils-array.ts","../../../src/lib/core/utils-date.ts","../../../src/lib/core/message-store.ts","../../../src/lib/core/recipient.ts","../../../src/lib/services/adapters/xmpp/plugins/multi-user-chat/room.ts","../../../src/lib/services/adapters/xmpp/plugins/multi-user-chat/affiliation.ts","../../../src/lib/services/adapters/xmpp/plugins/multi-user-chat/role.ts","../../../src/lib/services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin.ts","../../../src/lib/core/subscription.ts","../../../src/lib/services/adapters/xmpp/plugins/roster.plugin.ts","../../../src/lib/services/log.service.ts","../../../src/lib/services/adapters/xmpp/xmpp-client-factory.service.ts","../../../src/lib/services/adapters/xmpp/xmpp-chat-connection.service.ts","../../../src/lib/core/contact.ts","../../../src/lib/services/contact-factory.service.ts","../../../src/lib/services/adapters/xmpp/xmpp-chat-adapter.service.ts","../../../src/lib/hooks/chat-contact-click-handler.ts","../../../src/lib/components/chat-avatar/chat-avatar.component.ts","../../../src/lib/components/chat-avatar/chat-avatar.component.html","../../../src/lib/components/chat-message-simple/chat-message-simple.component.ts","../../../src/lib/components/chat-message-simple/chat-message-simple.component.html","../../../src/lib/components/chat-message-link/chat-message-link.component.ts","../../../src/lib/components/chat-message-link/chat-message-link.component.html","../../../src/lib/components/chat-message-text/chat-message-text.component.ts","../../../src/lib/directives/links.directive.ts","../../../src/lib/components/chat-message/chat-message.component.ts","../../../src/lib/components/chat-message/chat-message.component.html","../../../src/lib/services/chat-list-state.service.ts","../../../src/lib/services/chat-message-list-registry.service.ts","../../../src/lib/directives/intersection-observer.directive.ts","../../../src/lib/components/chat-message-list/chat-message-list.component.ts","../../../src/lib/components/chat-message-list/chat-message-list.component.html","../../../src/lib/hooks/file-upload-handler.ts","../../../src/lib/services/chat-style.ts","../../../src/lib/components/chat-window-frame/chat-window-frame.component.ts","../../../src/lib/components/chat-window-frame/chat-window-frame.component.html","../../../src/lib/components/chat-window/chat-window.component.ts","../../../src/lib/components/chat-window/chat-window.component.html","../../../src/lib/components/chat-video-window/chat-video-window.component.ts","../../../src/lib/components/chat-video-window/chat-video-window.component.html","../../../src/lib/components/chat-window-list/chat-window-list.component.ts","../../../src/lib/components/chat-window-list/chat-window-list.component.html","../../../src/lib/services/adapters/xmpp/plugins/unread-message-count.plugin.ts","../../../src/lib/components/roster-recipient/roster-recipient.component.ts","../../../src/lib/components/roster-recipient/roster-recipient.component.html","../../../src/lib/components/roster-list/roster-list.component.ts","../../../src/lib/components/roster-list/roster-list.component.html","../../../src/lib/components/chat.component.ts","../../../src/lib/components/chat.component.html","../../../src/lib/core/get-domain.ts","../../../src/lib/services/adapters/xmpp/plugins/bookmark.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/entity-time.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/http-file-upload.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/message-carbons.plugin.ts","../../../src/lib/core/utils-timeout.ts","../../../src/lib/services/adapters/xmpp/plugins/ping.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/push.plugin.ts","../../../src/lib/services/adapters/xmpp/plugins/registration.plugin.ts","../../../src/lib/services/chat-background-notification.service.ts","../../../src/lib/ngx-chat.module.ts","../../../src/lib/core/utils-file.ts","../../../src/public-api.ts","../../../src/pazznetwork-ngx-chat.ts"],"sourcesContent":["import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\n@Component({\n    selector: 'ngx-chat-filedrop',\n    templateUrl: './file-drop.component.html',\n    styleUrls: ['./file-drop.component.less'],\n})\nexport class FileDropComponent {\n\n    @Output()\n    readonly fileUpload = new EventEmitter<File>();\n\n    @Input()\n    dropMessage: string;\n\n    @Input()\n    enabled = true;\n\n    isDropTarget = false;\n\n    @HostListener('dragover', ['$event'])\n    @HostListener('dragenter', ['$event'])\n    onDragOver(event: any) {\n        if (this.enabled) {\n            event.preventDefault();\n            event.stopPropagation();\n            this.isDropTarget = true;\n        }\n    }\n\n    @HostListener('dragleave', ['$event'])\n    @HostListener('dragexit', ['$event'])\n    onDragLeave(event: any) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.isDropTarget = false;\n    }\n\n    @HostListener('drop', ['$event'])\n    async onDrop(event: any) {\n        if (this.enabled) {\n            event.preventDefault();\n            event.stopPropagation();\n\n            this.isDropTarget = false;\n\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < event.dataTransfer.items.length; i++) {\n                const dataTransferItem = event.dataTransfer.items[i];\n                if (dataTransferItem.kind === 'file') {\n                    this.fileUpload.emit(dataTransferItem.getAsFile());\n                }\n            }\n        }\n    }\n\n}\n","<div>\n    <div class=\"drop-message\"\n         [class.drop-message--visible]=\"isDropTarget\">\n        {{dropMessage}}\n    </div>\n    <div>\n        <ng-content></ng-content>\n    </div>\n</div>\n","import {InjectionToken} from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {Contact} from '../core/contact';\nimport {LogInRequest} from '../core/log-in-request';\nimport {ChatPlugin} from '../core/plugin';\nimport {Recipient} from '../core/recipient';\nimport {Translations} from '../core/translations';\nimport {ChatAction} from './adapters/xmpp/xmpp-chat-adapter.service';\n\n/**\n * The chat service token gives you access to the main chat api and is implemented by default with an XMPP adapter,\n * you can always reuse the api and ui with a new service implementing the ChatService interface and providing the\n * said implementation with the token\n */\nexport const CHAT_SERVICE_TOKEN = new InjectionToken<ChatService>('ngxChatService');\n\n\nexport type ConnectionStates = 'disconnected' | 'connecting' | 'online';\n\n/**\n * ChatService is your main API for using ngx-chat. Can be injected in your services like in the following example:\n *\n * ```\n * constructor(@Inject(CHAT_SERVICE_TOKEN) chatService: ChatService)\n * ```\n */\nexport interface ChatService {\n\n    /**\n     * Will emit the corresponding contact when a new message arrive.\n     */\n    message$: Observable<Contact>;\n\n    /**\n     * Lifecycle state machine. Starts in the state \"disconnected\". When logging in, the state will change to \"connecting\".\n     * Plugins may now initialize, for example load the contact list or request archived messages. When all plugins have completed the\n     * initialization, the new state will be 'online'.\n     */\n    state$: BehaviorSubject<ConnectionStates>;\n\n    /**\n     * A BehaviorSubject of all known contacts. Contains for example Contacts that sent you a message or blocked contacts.\n     * This does not represent your roster list.\n     */\n    contacts$: BehaviorSubject<Contact[]>;\n\n    /**\n     * A list of contacts which the current user has blocked.\n     */\n    blockedContacts$: Observable<Contact[]>;\n\n    /**\n     * contacts$ without the blockedContacts$.\n     */\n    notBlockedContacts$: Observable<Contact[]>;\n\n    /**\n     * A list of contacts to which the current user has accepted subscriptions to.\n     */\n    contactsSubscribed$: Observable<Contact[]>;\n\n    /**\n     * A list of contacts to which a subscription from the user is outstanding.\n     */\n    contactRequestsSent$: Observable<Contact[]>;\n\n    /**\n     * A list of contacts which have sent the user a subscription request.\n     */\n    contactRequestsReceived$: Observable<Contact[]>;\n\n    /**\n     * A list of contacts where the user is not subscribed to and neither a pending request is incoming or outgoing.\n     */\n    contactsUnaffiliated$: Observable<Contact[]>;\n\n    /**\n     * If set to true, debug information will be visible in the roster list.\n     */\n    enableDebugging: boolean;\n\n    /**\n     * The avatar of the user. Is used as src attribute of an img-element. Purely cosmetical. Should be set via the\n     * [userAvatar$]{@link ChatComponent#userAvatar$} @Input-attribute of {@link ChatComponent}.\n     */\n    userAvatar$: BehaviorSubject<string>;\n\n    /**\n     * The current translation. Do NOT write to this attribute, use the [translations]{@link ChatComponent#translations} @Input-attribute\n     * of {@link ChatComponent} instead.\n     */\n    translations: Translations;\n\n    /**\n     * The actions visible to users near to chat inputs, e.g. the send message button. Customize it for branding or to add\n     * new actions, e.g. for file uploads.\n     */\n    chatActions: ChatAction<{sendMessage: () => void}>[];\n\n    /**\n     * Forces asynchronous reloading of your roster list from the server, {@link contacts$} will reflect this.\n     */\n    reloadContacts(): void;\n\n    /**\n     * Returns the contact with the given ID or undefined if no contact with the given ID is found. In case of XMPP it does not have to be\n     * bare, the search will convert it to a bare JID.\n     * @param id The ID of the contact.\n     * @returns Either the Contact or undefined.\n     */\n    getContactById(id: string): Contact | undefined;\n\n    /**\n     * Always returns a contact with the given ID. If no contact exists, a new one is created and announced via contacts$. In case of XMPP\n     * it does not have to be bare, the search will convert it to a bare JID.\n     * @param id The ID of the contact.\n     * @returns The new contact instance.\n     */\n    getOrCreateContactById(id: string): Contact;\n\n    /**\n     * Adds the given contact to the user roster. Will send a subscription request to the contact.\n     * @param identifier The ID of the contact.\n     */\n    addContact(identifier: string): void;\n\n    /**\n     * Removes the given contact from the user roster. Will cancel a presence subscription from the user to the contact and will retract\n     * accepted subscriptions from the contact to the user.\n     * @param identifier The ID of the contact.\n     */\n    removeContact(identifier: string): void;\n\n    /**\n     * Logs the user in. Will modify state$ accordingly. If login fails, state will stay in 'disconnected'.\n     */\n    logIn(logInRequest: LogInRequest): void;\n\n    /**\n     * Disconnects from the server, clears contacts$, sets state$ to 'disconnected'.\n     */\n    logOut(): void;\n\n    /**\n     * Sends a given message to a given contact.\n     * @param recipient The recipient to which the message shall be sent.\n     * @param body The message content.\n     */\n    sendMessage(recipient: Recipient, body: string): void;\n\n    /**\n     * Requests all archived messages for all contacts from the server.\n     */\n    loadCompleteHistory(): Promise<void>;\n\n    /**\n     * Returns the plugin instance for the given constructor\n     * @param constructor The plugin constructor, e.g. {@link RosterPlugin}\n     */\n    getPlugin<T extends ChatPlugin>(constructor: new(...args: any[]) => T): T;\n\n    /**\n     * Tries to transparently (= without the user noticing) reconnect to the chat server.\n     */\n    reconnectSilently(): void;\n\n    /**\n     * Tries to reconnect with the same credentials the user logged in last.\n     */\n    reconnect(): void;\n\n}\n","import { Component, ElementRef, EventEmitter, Inject, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { Recipient } from '../../core/recipient';\nimport { CHAT_SERVICE_TOKEN, ChatService } from '../../services/chat-service';\n\n@Component({\n    selector: 'ngx-chat-message-input',\n    templateUrl: './chat-message-input.component.html',\n    styleUrls: ['./chat-message-input.component.less'],\n})\nexport class ChatMessageInputComponent implements OnInit {\n\n    @Input()\n    public recipient: Recipient;\n\n    @Output()\n    public messageSent = new EventEmitter<void>();\n\n    public message = '';\n\n    @ViewChild('chatInput')\n    chatInput: ElementRef;\n\n    constructor(@Inject(CHAT_SERVICE_TOKEN) public chatService: ChatService) {\n    }\n\n    ngOnInit() {\n    }\n\n    onSendMessage($event?: KeyboardEvent) {\n        if ($event) {\n            $event.preventDefault();\n        }\n        this.chatService.sendMessage(this.recipient, this.message);\n        this.message = '';\n        this.messageSent.emit();\n    }\n\n    focus() {\n        this.chatInput.nativeElement.focus();\n    }\n\n}\n","<textarea class=\"chat-input\"\n          #chatInput\n          [(ngModel)]=\"message\"\n          (keydown.enter)=\"onSendMessage($event)\"\n          cdkTextareaAutosize\n          cdkAutosizeMinRows=\"1\"\n          cdkAutosizeMaxRows=\"5\"\n          placeholder=\"{{chatService.translations.placeholder}}\"></textarea>\n","export enum MessageState {\n    /**\n     * Not yet sent\n     */\n    SENDING = 'sending',\n    /**\n     * Sent, but neither received nor seen by the recipient\n     */\n    SENT = 'sent',\n    /**\n     * The recipient client has received the message but the recipient has not seen it yet\n     */\n    RECIPIENT_RECEIVED = 'recipientReceived',\n    /**\n     * The message has been seen by the recipient\n     */\n    RECIPIENT_SEEN = 'recipientSeen',\n}\n\nexport interface Message {\n    direction: Direction;\n    body: string;\n    datetime: Date;\n    id?: string;\n    delayed: boolean;\n    fromArchive: boolean;\n    /**\n     * if no explicit state is set for the message, use implicit contact message states instead.\n     */\n    state?: MessageState;\n}\n\nexport enum Direction {\n    in = 'in',\n    out = 'out',\n}\n","import { Element } from 'ltx';\nimport { Message } from '../../../../core/message';\nimport { ChatPlugin } from '../../../../core/plugin';\nimport { MessageWithBodyStanza, Stanza } from '../../../../core/stanza';\nimport { MessageReceivedEvent } from './message.plugin';\n\nexport abstract class AbstractXmppPlugin implements ChatPlugin {\n\n    onBeforeOnline(): PromiseLike<any> {\n        return Promise.resolve();\n    }\n\n    onOffline() {\n    }\n\n    afterSendMessage(message: Message, messageStanza: Element): void {\n        return;\n    }\n\n    beforeSendMessage(messageStanza: Element, message: Message): void {\n        return;\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        return false;\n    }\n\n    afterReceiveMessage(message: Message, messageStanza: MessageWithBodyStanza, messageReceivedEvent: MessageReceivedEvent): void {\n        return;\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { BehaviorSubject } from 'rxjs';\nimport { Stanza } from '../../../../core/stanza';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { ServiceDiscoveryPlugin } from './service-discovery.plugin';\n\n/**\n * XEP-0191: Blocking Command\n * https://xmpp.org/extensions/xep-0191.html\n */\nexport class BlockPlugin extends AbstractXmppPlugin {\n\n    public supportsBlock$ = new BehaviorSubject<boolean | 'unknown'>('unknown');\n\n    constructor(\n        private xmppChatAdapter: XmppChatAdapter,\n        private serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n    ) {\n        super();\n    }\n\n    async onBeforeOnline() {\n        const supportsBlock = await this.determineSupportForBlock();\n        this.supportsBlock$.next(supportsBlock);\n        if (supportsBlock) {\n            await this.requestBlockedJids();\n        }\n    }\n\n    private async determineSupportForBlock() {\n        try {\n            return await this.serviceDiscoveryPlugin.supportsFeature(\n                this.xmppChatAdapter.chatConnectionService.userJid.domain,\n                'urn:xmpp:blocking');\n        } catch (e) {\n            return false;\n        }\n    }\n\n    onOffline() {\n        this.supportsBlock$.next('unknown');\n        this.xmppChatAdapter.blockedContactIds$.next(new Set<string>());\n    }\n\n    blockJid(jid: string) {\n        return this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('block', {xmlns: 'urn:xmpp:blocking'},\n                    xml('item', {jid}))));\n    }\n\n    unblockJid(jid: string) {\n        return this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('unblock', {xmlns: 'urn:xmpp:blocking'},\n                    xml('item', {jid}))));\n    }\n\n    private async requestBlockedJids() {\n        const blockListResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get'},\n                xml('blocklist', {xmlns: 'urn:xmpp:blocking'})\n            )\n        );\n\n        const blockedJids = blockListResponse\n            .getChild('blocklist')\n            .getChildren('item')\n            .map(e => e.attrs.jid);\n\n        this.xmppChatAdapter.blockedContactIds$.next(new Set<string>(blockedJids));\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        const {from} = stanza.attrs;\n        if (from && from === this.xmppChatAdapter.chatConnectionService.userJid?.bare().toString()) {\n            const blockPush = stanza.getChild('block', 'urn:xmpp:blocking');\n            const unblockPush = stanza.getChild('unblock', 'urn:xmpp:blocking');\n            const blockList = this.xmppChatAdapter.blockedContactIds$.getValue();\n            if (blockPush) {\n                blockPush.getChildren('item')\n                    .map(e => e.attrs.jid as string)\n                    .forEach(jid => blockList.add(jid));\n                this.xmppChatAdapter.blockedContactIds$.next(blockList);\n                return true;\n            } else if (unblockPush) {\n                const jidsToUnblock = unblockPush.getChildren('item').map(e => e.attrs.jid as string);\n                if (jidsToUnblock.length === 0) {\n                    // unblock everyone\n                    blockList.clear();\n                } else {\n                    // unblock individually\n                    jidsToUnblock.forEach(jid => blockList.delete(jid));\n                }\n                this.xmppChatAdapter.blockedContactIds$.next(blockList);\n                return true;\n            }\n        }\n        return false;\n    }\n\n}\n","import { Element } from 'ltx';\n\nexport abstract class AbstractStanzaBuilder {\n\n    abstract toStanza(): Element;\n\n}\n","import {Stanza} from '../../../core/stanza';\n\nexport class XmppResponseError extends Error {\n    static readonly ERROR_ELEMENT_NS = 'urn:ietf:params:xml:ns:xmpp-stanzas';\n    readonly errorCode?: number;\n    readonly errorType?: string;\n    readonly errorCondition?: string;\n\n    constructor(readonly errorStanza: Stanza) {\n        super(\n            XmppResponseError.extractErrorTextFromErrorResponse(\n                errorStanza,\n                XmppResponseError.extractErrorDataFromErrorResponse(errorStanza),\n            ),\n        );\n\n        const {code, type, condition} = XmppResponseError.extractErrorDataFromErrorResponse(errorStanza);\n        this.errorCode = code;\n        this.errorType = type;\n        this.errorCondition = condition;\n    }\n\n    private static extractErrorDataFromErrorResponse(stanza: Stanza): {\n        code?: number,\n        type?: string,\n        condition?: string\n    } {\n        const errorElement = stanza.getChild('error') as Stanza;\n        const errorCode = Number(errorElement?.attrs.code) || undefined;\n        const errorType = errorElement?.attrs.type as string | undefined;\n        const errorCondition =\n            errorElement\n                ?.children\n                .filter(childElement =>\n                    childElement.getName() !== 'text' &&\n                    childElement.attrs.xmlns === XmppResponseError.ERROR_ELEMENT_NS,\n                )[0]\n                ?.getName();\n\n        return {\n            code: errorCode,\n            type: errorType,\n            condition: errorCondition,\n        };\n    }\n\n    private static extractErrorTextFromErrorResponse(\n        stanza: Stanza,\n        {code, type, condition}: {\n            code?: number,\n            type?: string,\n            condition?: string\n        }): string {\n        const additionalData = [\n            `errorCode: ${code ?? '[unknown]'}`,\n            `errorType: ${type ?? '[unknown]'}`,\n            `errorCondition: ${condition ?? '[unknown]'}`,\n        ].join(', ');\n        const errorText =\n            stanza.getChild('error')?.getChildText('text', XmppResponseError.ERROR_ELEMENT_NS) || 'Unknown error';\n\n        return `XmppResponseError: ${errorText}${additionalData ? ` (${additionalData})` : ''}`;\n    }\n}\n","import { Element } from 'ltx';\nimport { jid as parseJid, JID } from '@xmpp/jid';\nimport { xml } from '@xmpp/client';\n\n// implements https://xmpp.org/extensions/xep-0004.html\n\nexport const FORM_NS = 'jabber:x:data';\n\nexport type FormType = 'form' | 'submit' | 'cancel' | 'result';\n\nexport interface Form {\n    type: FormType;\n    title?: string;\n    instructions: string[];\n    fields: FormField[];\n}\n\nexport type FieldType =\n    | 'fixed'\n    | 'boolean'\n    | 'hidden'\n    | 'jid-single'\n    | 'jid-multi'\n    | 'list-single'\n    | 'list-multi'\n    | 'text-single'\n    | 'text-private'\n    | 'text-multi';\n\nexport interface FieldValueType {\n    fixed: string;\n    boolean: boolean;\n    hidden: string;\n    'jid-single': JID;\n    'jid-multi': JID[];\n    'list-single': string;\n    'list-multi': string[];\n    'text-single': string;\n    'text-private': string;\n    'text-multi': string[];\n}\n\nexport type FormField =\n    | FixedFormField\n    | BooleanFormField\n    | TextualFormField\n    | JidSingleFormField\n    | JidMultiFormField\n    | ListSingleFormField\n    | ListMultiFormField\n    | TextMultiFormField;\n\nexport interface FixedFormField {\n    type: 'fixed';\n    variable?: string;\n    value: string;\n}\n\ninterface FormFieldBase<TFieldType extends FieldType> {\n    type: TFieldType;\n    variable: string;\n    label?: string;\n    required?: boolean;\n    description?: string;\n    value?: FieldValueType[TFieldType];\n}\n\nexport type BooleanFormField = FormFieldBase<'boolean'>;\nexport type TextualFormField = FormFieldBase<'hidden' | 'text-single' | 'text-private'>;\nexport type JidSingleFormField = FormFieldBase<'jid-single'>;\nexport type JidMultiFormField = FormFieldBase<'jid-multi'>;\nexport type TextMultiFormField = FormFieldBase<'text-multi'>;\n\ninterface ListFormField<TFieldType extends 'list-single' | 'list-multi'> extends FormFieldBase<TFieldType> {\n    options?: FieldOption[];\n}\n\nexport type ListSingleFormField = ListFormField<'list-single'>;\nexport type ListMultiFormField = ListFormField<'list-multi'>;\n\nexport interface FieldOption {\n    label?: string;\n    value: string;\n}\n\nfunction parseStringValue([valueEl]: Element[]): string {\n    return valueEl?.getText();\n}\n\nfunction parseMultipleStringValues(valueEls: Element[]): string[] {\n    return valueEls.map(el => parseStringValue([el]));\n}\n\nfunction parseJidValue([valueEl]: Element[]): JID {\n    return valueEl && parseJid(valueEl.getText());\n}\n\nconst valueParsers = {\n    fixed: parseStringValue,\n    boolean: ([valueEl]: Element[]): boolean => {\n        if (!valueEl) {\n            return false;\n        }\n        const value = valueEl.getText();\n        return value === '1' || value === 'true';\n    },\n    hidden: parseStringValue,\n    'jid-single': parseJidValue,\n    'jid-multi': (valueEls: Element[]): JID[] =>\n        [\n            ...new Set(\n                valueEls.map(el => parseStringValue([el])),\n            ),\n        ]\n            .map(jidStr => parseJid(jidStr)),\n    'list-single': parseStringValue,\n    'list-multi': parseMultipleStringValues,\n    'text-single': parseStringValue,\n    'text-private': parseStringValue,\n    'text-multi': parseMultipleStringValues,\n};\n\nexport function parseForm(formEl: Element): Form {\n    if (formEl.name !== 'x' || formEl.getNS() !== FORM_NS) {\n        throw new Error(`Provided element is not a form element: elementName=${formEl.name}, xmlns=${formEl.getNS()}, form=${formEl.toString()}`);\n    }\n\n    return {\n        type: formEl.attrs.type,\n        title: formEl.getChildText('title') ?? undefined,\n        instructions: formEl.getChildren('instructions').map(descEl => descEl.getText()),\n        fields: formEl.getChildren('field')\n            .map(fieldEl => {\n                const rawType = fieldEl.attrs.type as string;\n                const type = rawType in valueParsers ? rawType as keyof typeof valueParsers : 'text-single';\n                const {var: variable, label}: { var?: string, label?: string } = fieldEl.attrs;\n                let options: FieldOption[] | undefined;\n                if (type === 'list-single' || type === 'list-multi') {\n                    options = fieldEl.getChildren('option').map(optionEl => ({\n                        value: optionEl.getChildText('value'),\n                        label: optionEl.attrs.label,\n                    }));\n                }\n                return {\n                    type,\n                    variable,\n                    label,\n                    description: fieldEl.getChildText('desc') ?? undefined,\n                    required: fieldEl.getChild('required') != null,\n                    value: valueParsers[type](fieldEl.getChildren('value')),\n                    options,\n                } as FormField;\n            }),\n    };\n}\n\nexport function getField(form: Form, variable: string): FormField | undefined {\n    return form.fields.find(field => field.variable === variable) ?? undefined;\n}\n\nexport function setFieldValue<TFieldType extends FieldType, TValue extends FieldValueType[TFieldType]>(\n    form: Form,\n    type: TFieldType,\n    variable: string,\n    value: TValue,\n    createField = false,\n) {\n    let field = form.fields\n        .find((f) => f.variable === variable);\n\n    if (field) {\n        if (field.type !== type) {\n            throw new Error(`type mismatch setting field value: variable=${field.variable}, field.type=${field.type}, requested type=${type}`);\n        }\n        field.value = value;\n        return;\n    }\n\n    if (createField) {\n        field = {\n            type,\n            variable,\n            value,\n        } as FormField;\n        form.fields.push(field);\n    } else {\n        throw new Error(`field for variable not found! variable=${variable}, type=${type}, value=${value}`);\n    }\n}\n\nfunction serializeTextualField(field: TextualFormField | ListSingleFormField): string[] {\n    return field.value != null ? [field.value] : [];\n}\n\nfunction serializeTextualMultiField(field: ListMultiFormField | TextMultiFormField): string[] {\n    return field.value;\n}\n\nconst valueSerializers: Record<FieldType, (field: FormField) => string[]> = {\n    fixed: serializeTextualField,\n    boolean: (field: BooleanFormField) => field.value != null ? [String(field.value)] : [],\n    hidden: serializeTextualField,\n    'jid-single': (field: JidSingleFormField) => field.value ? [field.value.toString()] : [],\n    'jid-multi': (field: JidMultiFormField) => field.value.map(jid => jid.toString()),\n    'list-single': serializeTextualField,\n    'list-multi': serializeTextualMultiField,\n    'text-single': serializeTextualField,\n    'text-private': serializeTextualField,\n    'text-multi': serializeTextualMultiField,\n};\n\nexport function serializeToSubmitForm(form: Form): Element {\n    const serializedFields = form.fields\n        .reduce<[string, string[]][]>((collectedFields, field) => {\n            const serializer = valueSerializers[field.type];\n            if (!serializer) {\n                throw new Error(`unknown field type: ${field.type}`);\n            }\n\n            const values = serializer(field);\n\n            if (field.variable != null && values.length > 0) {\n                collectedFields.push([field.variable, values]);\n            }\n\n            return collectedFields;\n        }, []);\n\n    return xml('x', {xmlns: FORM_NS, type: 'submit'},\n        ...serializedFields.map(\n            ([variable, values]) =>\n                xml(\n                    'field',\n                    {var: variable},\n                    ...values.map(value => xml('value', {}, value)),\n                ),\n        ),\n    );\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { IqResponseStanza, Stanza } from '../../../../core/stanza';\nimport { AbstractStanzaBuilder } from '../abstract-stanza-builder';\nimport { XmppResponseError } from '../xmpp-response.error';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { ServiceDiscoveryPlugin } from './service-discovery.plugin';\nimport { serializeToSubmitForm } from '../../../../core/form';\n\nexport const PUBSUB_EVENT_XMLNS = 'http://jabber.org/protocol/pubsub#event';\n\ninterface PublishOptions {\n    node?: string;\n    id?: any;\n    data?: Element;\n    persistItems?: boolean;\n}\n\nclass PublishStanzaBuilder extends AbstractStanzaBuilder {\n\n    private readonly publishOptions: PublishOptions = {\n        persistItems: false,\n    };\n\n    constructor(options: PublishOptions) {\n        super();\n        if (options) {\n            this.publishOptions = {...this.publishOptions, ...options};\n        }\n    }\n\n    toStanza() {\n        const {node, id, persistItems} = this.publishOptions;\n\n        // necessary as a 'event-only' publish is currently broken in ejabberd, see\n        // https://github.com/processone/ejabberd/issues/2799\n        const data = this.publishOptions.data || xml('data');\n\n        return xml('iq', {type: 'set'},\n            xml('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'},\n                xml('publish', {node},\n                    xml('item', {id}, data),\n                ),\n                xml('publish-options', {},\n                    serializeToSubmitForm({\n                        type: 'submit',\n                        instructions: [],\n                        fields: [\n                            {type: 'hidden', variable: 'FORM_TYPE', value: 'http://jabber.org/protocol/pubsub#publish-options'},\n                            {type: 'boolean', variable: 'pubsub#persist_items', value: persistItems === true},\n                            {type: 'list-single', variable: 'pubsub#access_model', value: 'whitelist'},\n                        ],\n                    }),\n                ),\n            ),\n        );\n    }\n\n}\n\nclass RetrieveDataStanzaBuilder extends AbstractStanzaBuilder {\n\n    constructor(private readonly node: string) {\n        super();\n    }\n\n    toStanza() {\n        return xml('iq', {type: 'get'},\n            xml('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'},\n                xml('items', {node: this.node}),\n            ),\n        );\n    }\n\n}\n\n/**\n * XEP-0060 Publish Subscribe (https://xmpp.org/extensions/xep-0060.html)\n * XEP-0223 Persistent Storage of Private Data via PubSub (https://xmpp.org/extensions/xep-0223.html)\n */\nexport class PublishSubscribePlugin extends AbstractXmppPlugin {\n\n    readonly publish$ = new Subject<Stanza>();\n    private readonly supportsPrivatePublish = new BehaviorSubject<boolean | 'unknown'>('unknown');\n\n    constructor(\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n    ) {\n        super();\n    }\n\n    onBeforeOnline() {\n        return this.determineSupportForPrivatePublish();\n    }\n\n    onOffline() {\n        this.supportsPrivatePublish.next('unknown');\n    }\n\n    storePrivatePayloadPersistent(node: string, id: string, data: Element): Promise<IqResponseStanza<'result'>> {\n        return new Promise((resolve, reject) => {\n            this.supportsPrivatePublish\n                .pipe(filter(support => support !== 'unknown'))\n                .subscribe((support: boolean) => {\n                    if (!support) {\n                        reject(new Error('does not support private publish subscribe'));\n                    } else {\n                        resolve(this.xmppChatAdapter.chatConnectionService.sendIq(\n                            new PublishStanzaBuilder({node, id, data, persistItems: true}).toStanza(),\n                        ));\n                    }\n                });\n        });\n    }\n\n    privateNotify(node: string, data?: Element, id?: string): Promise<IqResponseStanza> {\n        return new Promise((resolve, reject) => {\n            this.supportsPrivatePublish\n                .pipe(filter(support => support !== 'unknown'))\n                .subscribe((support: boolean) => {\n                    if (!support) {\n                        reject(new Error('does not support private publish subscribe'));\n                    } else {\n                        resolve(this.xmppChatAdapter.chatConnectionService.sendIq(\n                            new PublishStanzaBuilder({node, id, data, persistItems: false}).toStanza(),\n                        ));\n                    }\n                });\n        });\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        const eventElement = stanza.getChild('event', PUBSUB_EVENT_XMLNS) as Stanza;\n        if (stanza.is('message') && eventElement) {\n            this.publish$.next(eventElement);\n            return true;\n        }\n        return false;\n    }\n\n    async retrieveNodeItems(node: string): Promise<Element[]> {\n        try {\n            const iqResponseStanza = await this.xmppChatAdapter.chatConnectionService.sendIq(\n                new RetrieveDataStanzaBuilder(node).toStanza(),\n            );\n            return iqResponseStanza.getChild('pubsub').getChild('items').getChildren('item');\n        } catch (e) {\n            if (e instanceof XmppResponseError &&\n                (e.errorCondition === 'item-not-found' || e.errorCode === 404)) {\n                return [];\n            }\n\n            throw e;\n        }\n    }\n\n    private async determineSupportForPrivatePublish() {\n        let isSupported: boolean;\n        try {\n            const service = await this.serviceDiscoveryPlugin.findService('pubsub', 'pep');\n            isSupported = service.features.includes('http://jabber.org/protocol/pubsub#publish-options');\n        } catch (e) {\n            isSupported = false;\n        }\n        this.supportsPrivatePublish.next(isSupported);\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { BehaviorSubject } from 'rxjs';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { ServiceDiscoveryPlugin } from './service-discovery.plugin';\nimport { Stanza } from '../../../../core/stanza';\n\nexport const MUC_SUB_FEATURE_ID = 'urn:xmpp:mucsub:0';\n\nexport enum MUC_SUB_EVENT_TYPE {\n    presence = 'urn:xmpp:mucsub:nodes:presence',\n    messages = 'urn:xmpp:mucsub:nodes:messages',\n    affiliations = 'urn:xmpp:mucsub:nodes:affiliations',\n    subscribers = 'urn:xmpp:mucsub:nodes:subscribers',\n    config = 'urn:xmpp:mucsub:nodes:config',\n    subject = 'urn:xmpp:mucsub:nodes:subject',\n    system = 'urn:xmpp:mucsub:nodes:system',\n}\n\n/**\n * support for https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/\n */\nexport class MucSubPlugin extends AbstractXmppPlugin {\n    private readonly supportsMucSub$ = new BehaviorSubject<boolean | 'unknown'>('unknown');\n\n    constructor(\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n    ) {\n        super();\n    }\n\n    onBeforeOnline(): PromiseLike<void> {\n        return this.determineSupportForMucSub();\n    }\n\n    private async determineSupportForMucSub() {\n        let isSupported: boolean;\n        try {\n            const service = await this.serviceDiscoveryPlugin.findService('conference', 'text');\n            isSupported = service.features.includes(MUC_SUB_FEATURE_ID);\n        } catch (e) {\n            isSupported = false;\n        }\n        this.supportsMucSub$.next(isSupported);\n    }\n\n    onOffline() {\n        this.supportsMucSub$.next('unknown');\n    }\n\n    async subscribeRoom(roomJid: string, nodes: string[] = []): Promise<void> {\n        const nick = this.xmppChatAdapter.chatConnectionService.userJid.local;\n        await this.xmppChatAdapter.chatConnectionService.sendIq(\n            makeSubscribeRoomStanza(roomJid, nick, nodes)\n        );\n    }\n\n    async unsubscribeRoom(roomJid: string): Promise<void> {\n        await this.xmppChatAdapter.chatConnectionService.sendIq(\n            makeUnsubscribeRoomStanza(roomJid)\n        );\n    }\n\n    /**\n     * A room moderator can unsubscribe others providing the their jid as attribute to the information query (iq)\n     * see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#unsubscribing-from-a-muc-room\n     * @param roomJid for the room to be unsubscribed from\n     * @param jid user id to be unsubscribed\n     */\n    unsubscribeJidFromRoom(roomJid: string, jid: string) {\n        this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set', to: roomJid},\n                xml('unsubscribe', {xmlns: 'urn:xmpp:mucsub:0', jid}),\n            ),\n        );\n    }\n\n    /**\n     * A user can query the MUC service to get their list of subscriptions.\n     * see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#g dd ddetting-list-of-subscribed-rooms\n     */\n    async getSubscribedRooms() {\n        const {local, domain} = this.xmppChatAdapter.chatConnectionService.userJid;\n        const from = `${local}@${domain}`;\n        const subscriptions = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', from, to: 'muc.' + domain},\n                xml('subscriptions', {xmlns: 'urn:xmpp:mucsub:0'}),\n            ),\n        );\n        return subscriptions.getChildren('subscription').map(sub => sub.getAttr('jid'));\n    }\n\n    /**\n     * A subscriber or room moderator can get the list of subscribers by sending <subscriptions/> request directly to the room JID.\n     * see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#getting-list-of-subscribers-of-a-room\n     * @param roomJid of the room the get a subscriber list from\n     */\n    getSubscribers(roomJid: string) {\n        this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', to: roomJid},\n                xml('subscriptions', {xmlns: 'urn:xmpp:mucsub:0'}),\n            ),\n        );\n    }\n\n    async retrieveSubscriptions(): Promise<Map<string, string[]>> {\n        const service = await this.serviceDiscoveryPlugin.findService('conference', 'text');\n\n        const result = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            makeRetrieveSubscriptionsStanza(service.jid)\n        );\n\n        const subscriptions = result\n            .getChild('subscriptions', MUC_SUB_FEATURE_ID)\n            ?.getChildren('subscription')\n            ?.map(subscriptionElement => {\n                const subscribedEvents: string[] = subscriptionElement\n                    .getChildren('event')\n                    ?.map(eventElement => eventElement.attrs.node) ?? [];\n                return [subscriptionElement.attrs.jid as string, subscribedEvents] as const;\n            });\n\n        return new Map(subscriptions);\n    }\n}\n\nfunction makeSubscribeRoomStanza(roomJid: string, nick: string, nodes: readonly string[]): Stanza {\n    return xml('iq', {type: 'set', to: roomJid},\n        xml('subscribe', {xmlns: MUC_SUB_FEATURE_ID, nick},\n            ...nodes.map(node => xml('event', {node}))\n        )\n    ) as Stanza;\n}\n\nfunction makeUnsubscribeRoomStanza(roomJid: string): Stanza {\n    return xml('iq', {type: 'set', to: roomJid},\n        xml('unsubscribe', {xmlns: MUC_SUB_FEATURE_ID})\n    ) as Stanza;\n}\n\nfunction makeRetrieveSubscriptionsStanza(conferenceServiceJid: string): Stanza {\n    return xml('iq', {type: 'get', to: conferenceServiceJid},\n        xml('subscriptions', {xmlns: MUC_SUB_FEATURE_ID})\n    ) as Stanza;\n}\n","import {xml} from '@xmpp/client';\nimport {Subject} from 'rxjs';\nimport {debounceTime, filter} from 'rxjs/operators';\nimport {Recipient} from '../../../../core/recipient';\nimport {Stanza} from '../../../../core/stanza';\nimport {LogService} from '../../../log.service';\nimport {XmppChatAdapter} from '../xmpp-chat-adapter.service';\nimport {AbstractXmppPlugin} from './abstract-xmpp-plugin';\nimport {MultiUserChatPlugin} from './multi-user-chat/multi-user-chat.plugin';\nimport {ServiceDiscoveryPlugin} from './service-discovery.plugin';\nimport {PUBSUB_EVENT_XMLNS} from './publish-subscribe.plugin';\nimport {MessagePlugin} from './message.plugin';\nimport {MUC_SUB_EVENT_TYPE} from './muc-sub.plugin';\nimport {Form, serializeToSubmitForm} from '../../../../core/form';\n\n/**\n * https://xmpp.org/extensions/xep-0313.html\n * Message Archive Management\n */\nexport class MessageArchivePlugin extends AbstractXmppPlugin {\n    static readonly MAM_NS = 'urn:xmpp:mam:2';\n\n    private readonly mamMessageReceived$ = new Subject<void>();\n\n    constructor(\n        private readonly chatService: XmppChatAdapter,\n        private readonly serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n        private readonly multiUserChatPlugin: MultiUserChatPlugin,\n        private readonly logService: LogService,\n        private readonly messagePlugin: MessagePlugin,\n    ) {\n        super();\n\n        this.chatService.state$\n            .pipe(filter(state => state === 'online'))\n            .subscribe(async () => {\n                if (await this.supportsMessageArchiveManagement()) {\n                    await this.requestNewestMessages();\n                }\n            });\n\n        // emit contacts to refresh contact list after receiving mam messages\n        this.mamMessageReceived$\n            .pipe(debounceTime(10))\n            .subscribe(() => this.chatService.contacts$.next(this.chatService.contacts$.getValue()));\n    }\n\n    private async requestNewestMessages(): Promise<void> {\n        await this.chatService.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('query', {xmlns: MessageArchivePlugin.MAM_NS},\n                    xml('set', {xmlns: 'http://jabber.org/protocol/rsm'},\n                        xml('max', {}, '250'),\n                        xml('before'),\n                    ),\n                ),\n            ),\n        );\n    }\n\n    async loadMostRecentUnloadedMessages(recipient: Recipient): Promise<void> {\n        // for user-to-user chats no to-attribute is necessary, in case of multi-user-chats it has to be set to the bare room jid\n        const to = recipient.recipientType === 'room' ? recipient.roomJid.toString() : undefined;\n\n        const form: Form = {\n            type: 'submit',\n            instructions: [],\n            fields: [\n                {type: 'hidden', variable: 'FORM_TYPE', value: MessageArchivePlugin.MAM_NS},\n                ...(recipient.recipientType === 'contact'\n                    ? [{type: 'jid-single', variable: 'with', value: recipient.jidBare}] as const\n                    : []),\n                ...(recipient.oldestMessage\n                    ? [{type: 'text-single', variable: 'end', value: recipient.oldestMessage.datetime.toISOString()}] as const\n                    : []),\n            ],\n        };\n\n        const request =\n            xml('iq', {type: 'set', to},\n                xml('query', {xmlns: MessageArchivePlugin.MAM_NS},\n                    serializeToSubmitForm(form),\n                    xml('set', {xmlns: 'http://jabber.org/protocol/rsm'},\n                        xml('max', {}, '100'),\n                        xml('before'),\n                    ),\n                ),\n            );\n\n        await this.chatService.chatConnectionService.sendIq(request);\n    }\n\n    async loadAllMessages(): Promise<void> {\n        if (!(await this.supportsMessageArchiveManagement())) {\n            throw new Error('message archive management not suppported');\n        }\n\n        let lastMamResponse = await this.chatService.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('query', {xmlns: MessageArchivePlugin.MAM_NS}),\n            ),\n        );\n\n        while (lastMamResponse.getChild('fin').attrs.complete !== 'true') {\n            const lastReceivedMessageId = lastMamResponse.getChild('fin').getChild('set').getChildText('last');\n            lastMamResponse = await this.chatService.chatConnectionService.sendIq(\n                xml('iq', {type: 'set'},\n                    xml('query', {xmlns: MessageArchivePlugin.MAM_NS},\n                        xml('set', {xmlns: 'http://jabber.org/protocol/rsm'},\n                            xml('max', {}, '250'),\n                            xml('after', {}, lastReceivedMessageId),\n                        ),\n                    ),\n                ),\n            );\n        }\n    }\n\n    private async supportsMessageArchiveManagement(): Promise<boolean> {\n        const supportsMessageArchiveManagement = await this.serviceDiscoveryPlugin.supportsFeature(\n            this.chatService.chatConnectionService.userJid.bare().toString(),\n            MessageArchivePlugin.MAM_NS,\n        );\n        if (!supportsMessageArchiveManagement) {\n            this.logService.info('server doesn\\'t support MAM');\n        }\n        return supportsMessageArchiveManagement;\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        if (this.isMamMessageStanza(stanza)) {\n            this.handleMamMessageStanza(stanza);\n            return true;\n        }\n        return false;\n    }\n\n    private isMamMessageStanza(stanza: Stanza): boolean {\n        const result = stanza.getChild('result');\n        return stanza.name === 'message' && result?.attrs.xmlns === MessageArchivePlugin.MAM_NS;\n    }\n\n    private handleMamMessageStanza(stanza: Stanza): void {\n        const forwardedElement = stanza.getChild('result').getChild('forwarded') as Stanza;\n        const messageElement = forwardedElement.getChild('message') as Stanza;\n        const delayElement = forwardedElement.getChild('delay') as Stanza;\n\n        const eventElement = messageElement.getChild('event', PUBSUB_EVENT_XMLNS) as Stanza;\n        if (messageElement.getAttr('type') == null && eventElement != null) {\n            this.handlePubSubEvent(eventElement, delayElement);\n        } else {\n            this.handleArchivedMessage(messageElement, delayElement);\n        }\n    }\n\n    private handleArchivedMessage(messageElement: Stanza, delayEl: Stanza): void {\n        const type = messageElement.getAttr('type');\n        if (type === 'chat') {\n            const messageHandled = this.messagePlugin.handleStanza(messageElement, delayEl);\n            if (messageHandled) {\n                this.mamMessageReceived$.next();\n            }\n        } else if (type === 'groupchat' || this.multiUserChatPlugin.isRoomInvitationStanza(messageElement)) {\n            this.multiUserChatPlugin.handleStanza(messageElement, delayEl);\n        } else {\n            throw new Error(`unknown archived message type: ${type}`);\n        }\n    }\n\n    private handlePubSubEvent(eventElement: Stanza, delayElement: Stanza): void {\n        const itemsElement = eventElement.getChild('items');\n        const itemsNode = itemsElement?.attrs.node;\n\n        if (itemsNode !== MUC_SUB_EVENT_TYPE.messages) {\n            this.logService.warn(`Handling of MUC/Sub message types other than ${MUC_SUB_EVENT_TYPE.messages} isn't implemented yet!`);\n            return;\n        }\n\n        const itemElements = itemsElement.getChildren('item');\n        itemElements.forEach((itemEl) => this.handleArchivedMessage(itemEl.getChild('message') as Stanza, delayElement));\n    }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Contact } from '../core/contact';\n\n/**\n * Optional injectable token to handle contact reports in the chat\n */\nexport const REPORT_USER_INJECTION_TOKEN = new InjectionToken<ReportUserService>('ngxChatReportUserService');\n\nexport interface ReportUserService {\n\n    reportUser(user: Contact): void;\n\n}\n","export const urlRegex = /(\\b(https?|ftp):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/gim;\n\nexport function extractUrls(message: string): RegExpMatchArray {\n    return message.match(urlRegex) || [];\n}\n","export function id(): string {\n    let i;\n    while (!i) {\n        i = Math.random()\n            .toString(36)\n            .substr(2, 12);\n    }\n    return i;\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { id } from '../../../../core/id-generator';\nimport { Message } from '../../../../core/message';\nimport { MessageWithBodyStanza } from '../../../../core/stanza';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\n\n/**\n * https://xmpp.org/extensions/xep-0359.html\n */\nexport class MessageUuidPlugin extends AbstractXmppPlugin {\n\n    public static extractIdFromStanza(messageStanza: Element) {\n        const originIdElement = messageStanza.getChild('origin-id');\n        const stanzaIdElement = messageStanza.getChild('stanza-id');\n        return messageStanza.attrs.id || (originIdElement && originIdElement.attrs.id) || (stanzaIdElement && stanzaIdElement.attrs.id);\n    }\n\n    beforeSendMessage(messageStanza: Element, message: Message): void {\n        const generatedId = id();\n        messageStanza.children.push(xml('origin-id', {xmlns: 'urn:xmpp:sid:0', id: generatedId}));\n        if (message) {\n            message.id = generatedId;\n        }\n    }\n\n    afterSendMessage(message: Message, messageStanza: Element): void {\n        message.id = MessageUuidPlugin.extractIdFromStanza(messageStanza);\n    }\n\n    afterReceiveMessage(message: Message, messageStanza: MessageWithBodyStanza) {\n        message.id = MessageUuidPlugin.extractIdFromStanza(messageStanza);\n    }\n\n}\n","import {jid as parseJid, xml} from '@xmpp/client';\nimport {JID} from '@xmpp/jid';\nimport {Element} from 'ltx';\nimport {filter} from 'rxjs/operators';\nimport {Direction, Message, MessageState} from '../../../../core/message';\nimport {MessageWithBodyStanza, Stanza} from '../../../../core/stanza';\nimport {ChatMessageListRegistryService} from '../../../chat-message-list-registry.service';\nimport {LogService} from '../../../log.service';\nimport {XmppChatAdapter} from '../xmpp-chat-adapter.service';\nimport {AbstractXmppPlugin} from './abstract-xmpp-plugin';\nimport {EntityTimePlugin} from './entity-time.plugin';\nimport {MessageUuidPlugin} from './message-uuid.plugin';\nimport {MessageReceivedEvent} from './message.plugin';\nimport {PublishSubscribePlugin} from './publish-subscribe.plugin';\n\nexport interface StateDate {\n    lastRecipientReceived: Date;\n    lastRecipientSeen: Date;\n    lastSent: Date;\n}\n\nexport type JidToMessageStateDate = Map<string, StateDate>;\n\nconst STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES = 'ngxchat:contactmessagestates';\nconst wrapperNodeName = 'entries';\nconst nodeName = 'contact-message-state';\n\n/**\n * Plugin using PubSub to persist message read states.\n * Custom not part of the XMPP Specification\n * Standardized implementation specification would be https://xmpp.org/extensions/xep-0184.html\n */\nexport class MessageStatePlugin extends AbstractXmppPlugin {\n\n    private jidToMessageStateDate: JidToMessageStateDate = new Map();\n\n    constructor(\n        private readonly publishSubscribePlugin: PublishSubscribePlugin,\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly chatMessageListRegistry: ChatMessageListRegistryService,\n        private readonly logService: LogService,\n        private readonly entityTimePlugin: EntityTimePlugin,\n    ) {\n        super();\n\n        this.chatMessageListRegistry.openChats$\n            .pipe(\n                filter(() => xmppChatAdapter.state$.getValue() === 'online'),\n            )\n            .subscribe(contacts => {\n                contacts.forEach(async contact => {\n                    if (contact.mostRecentMessageReceived) {\n                        await this.sendMessageStateNotification(\n                            contact.jidBare,\n                            contact.mostRecentMessageReceived.id,\n                            MessageState.RECIPIENT_SEEN);\n                    }\n                });\n            });\n\n        this.publishSubscribePlugin.publish$\n            .subscribe((event) => this.handlePubSubEvent(event as Stanza));\n    }\n\n    async onBeforeOnline(): Promise<void> {\n        this.parseContactMessageStates().catch(err => this.logService.error('error parsing contact message states', err));\n    }\n\n    private async parseContactMessageStates(): Promise<void> {\n        const itemElements = await this.publishSubscribePlugin.retrieveNodeItems(STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES);\n        this.processPubSub(itemElements);\n    }\n\n    private processPubSub(itemElements: Element[]): void {\n        let results = [] as [string, StateDate][];\n        if (itemElements.length === 1) {\n            results = itemElements[0]\n                .getChild(wrapperNodeName)\n                .getChildren(nodeName)\n                .map((contactMessageStateElement: Stanza) => {\n                    const {lastRecipientReceived, lastRecipientSeen, lastSent, jid} = contactMessageStateElement.attrs;\n                    return [\n                        jid,\n                        {\n                            lastRecipientSeen: new Date(+lastRecipientSeen || 0),\n                            lastRecipientReceived: new Date(+lastRecipientReceived || 0),\n                            lastSent: new Date(+lastSent || 0),\n                        }\n                    ];\n                });\n        }\n        this.jidToMessageStateDate = new Map(results);\n    }\n\n    private async persistContactMessageStates(): Promise<void> {\n        const messageStateElements =\n            [...this.jidToMessageStateDate.entries()]\n                .map(([jid, stateDates]) =>\n                    xml(nodeName, {\n                        jid,\n                        lastRecipientReceived: String(stateDates.lastRecipientReceived.getTime()),\n                        lastRecipientSeen: String(stateDates.lastRecipientSeen.getTime()),\n                        lastSent: String(stateDates.lastSent.getTime()),\n                    })\n                );\n\n        await this.publishSubscribePlugin.storePrivatePayloadPersistent(\n            STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES,\n            'current',\n            xml(wrapperNodeName, {}, ...messageStateElements));\n    }\n\n    onOffline(): void {\n        this.jidToMessageStateDate.clear();\n    }\n\n    beforeSendMessage(messageStanza: Element, message: Message): void {\n        const {type} = messageStanza.attrs;\n        if (type === 'chat' && message) {\n            message.state = MessageState.SENDING;\n        }\n    }\n\n    async afterSendMessage(message: Message, messageStanza: Element): Promise<void> {\n        const {type, to} = messageStanza.attrs;\n        if (type === 'chat') {\n            this.updateContactMessageState(\n                parseJid(to).bare().toString(),\n                MessageState.SENT,\n                new Date(await this.entityTimePlugin.getNow()));\n            delete message.state;\n        }\n    }\n\n    afterReceiveMessage(messageReceived: Message, stanza: MessageWithBodyStanza, messageReceivedEvent: MessageReceivedEvent): void {\n        const messageStateElement = stanza.getChild('message-state', STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES);\n        if (messageStateElement) {\n            // we received a message state or a message via carbon from another resource, discard it\n            messageReceivedEvent.discard = true;\n        } else if (messageReceived.direction === Direction.in && !messageReceived.fromArchive && stanza.attrs.type !== 'groupchat') {\n            this.acknowledgeReceivedMessage(stanza);\n        }\n    }\n\n    private acknowledgeReceivedMessage(stanza: MessageWithBodyStanza): void {\n        const {from} = stanza.attrs;\n        const isChatWithContactOpen = this.chatMessageListRegistry.isChatOpen(this.xmppChatAdapter.getOrCreateContactById(from));\n        const state = isChatWithContactOpen ? MessageState.RECIPIENT_SEEN : MessageState.RECIPIENT_RECEIVED;\n        const messageId = MessageUuidPlugin.extractIdFromStanza(stanza);\n        this.sendMessageStateNotification(parseJid(from), messageId, state).catch(e => this.logService.error('error sending state notification', e));\n    }\n\n    private async sendMessageStateNotification(recipient: JID, messageId: string, state: MessageState): Promise<void> {\n        const messageStateResponse = xml('message', {\n                to: recipient.bare().toString(),\n                from: this.xmppChatAdapter.chatConnectionService.userJid.toString(),\n                type: 'chat'\n            },\n            xml('message-state', {\n                xmlns: STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES,\n                messageId,\n                date: new Date(await this.entityTimePlugin.getNow()).toISOString(),\n                state\n            })\n        );\n        await this.xmppChatAdapter.chatConnectionService.send(messageStateResponse);\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        const {type, from} = stanza.attrs;\n        const stateElement = stanza.getChild('message-state', STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES);\n        if (type === 'chat' && stateElement) {\n            this.handleStateNotificationStanza(stateElement, from);\n            return true;\n        }\n        return false;\n    }\n\n    private handleStateNotificationStanza(stateElement: Element, from: string): void {\n        const {state, date} = stateElement.attrs;\n        const contact = this.xmppChatAdapter.getOrCreateContactById(from);\n        const stateDate = new Date(date);\n        this.updateContactMessageState(contact.jidBare.toString(), state, stateDate);\n    }\n\n    private updateContactMessageState(contactJid: string, state: MessageState, stateDate: Date): void {\n        const current = this.getContactMessageState(contactJid);\n        let changed = false;\n        if (state === MessageState.RECIPIENT_RECEIVED && current.lastRecipientReceived < stateDate) {\n            current.lastRecipientReceived = stateDate;\n            changed = true;\n        } else if (state === MessageState.RECIPIENT_SEEN && current.lastRecipientSeen < stateDate) {\n            current.lastRecipientReceived = stateDate;\n            current.lastRecipientSeen = stateDate;\n            changed = true;\n        } else if (state === MessageState.SENT && current.lastSent < stateDate) {\n            current.lastSent = stateDate;\n            changed = true;\n        }\n        if (changed) {\n            this.persistContactMessageStates().catch(err => this.logService.error('error persisting contact message states', err));\n        }\n    }\n\n    public getContactMessageState(contactJid: string): StateDate | undefined {\n        if (!this.jidToMessageStateDate.has(contactJid)) {\n            this.jidToMessageStateDate.set(\n                contactJid,\n                {\n                    lastRecipientReceived: new Date(0),\n                    lastRecipientSeen: new Date(0),\n                    lastSent: new Date(0),\n                }\n            );\n        }\n        return this.jidToMessageStateDate.get(contactJid);\n    }\n\n    private handlePubSubEvent(event: Element): void {\n        const items: Element | undefined = event.getChild('items');\n        const itemsNode = items?.attrs.node;\n        const itemElements: Element[] | undefined = items?.getChildren('item');\n        if (itemsNode === STORAGE_NGX_CHAT_CONTACT_MESSAGE_STATES && itemElements) {\n            this.processPubSub(itemElements);\n        }\n    }\n}\n","// tslint:disable\nexport const dummyAvatarContact = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjYwMCIgdmlld0JveD0iMCAwIDYwMCA2MDAiPgogIDxkZWZzPgogICAgPGNsaXBQYXRoIGlkPSJjbGlwLV8xIj4KICAgICAgPHJlY3Qgd2lkdGg9IjYwMCIgaGVpZ2h0PSI2MDAiLz4KICAgIDwvY2xpcFBhdGg+CiAgPC9kZWZzPgogIDxnIGlkPSJfMSIgZGF0YS1uYW1lPSIxIiBjbGlwLXBhdGg9InVybCgjY2xpcC1fMSkiPgogICAgPHJlY3Qgd2lkdGg9IjYwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiNmZmYiLz4KICAgIDxnIGlkPSJHcnVwcGVfNzcxNyIgZGF0YS1uYW1lPSJHcnVwcGUgNzcxNyI+CiAgICAgIDxyZWN0IGlkPSJSZWNodGVja18xMzk3IiBkYXRhLW5hbWU9IlJlY2h0ZWNrIDEzOTciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjZTVlNmU4Ii8+CiAgICAgIDxlbGxpcHNlIGlkPSJFbGxpcHNlXzI4MyIgZGF0YS1uYW1lPSJFbGxpcHNlIDI4MyIgY3g9IjExNi4yMzEiIGN5PSIxMjUuNjcxIiByeD0iMTE2LjIzMSIgcnk9IjEyNS42NzEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4NS4yMzEgMTExLjQ4NSkiIGZpbGw9IiNhZmI0YjgiLz4KICAgICAgPHBhdGggaWQ9IlBmYWRfMjQ5NjIiIGRhdGEtbmFtZT0iUGZhZCAyNDk2MiIgZD0iTTU0Ni4zNTksNTk1LjI3NnMwLTIxNy41NjMtMjQ0LjkwOS0yMTcuNTYzaC0xLjQ1N2MtMjQ0LjkwOSwwLTI0NC45MDksMjE3LjU2My0yNDQuOTA5LDIxNy41NjMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgNC43MjQpIiBmaWxsPSIjYWZiNGI4Ii8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K';\nexport const dummyAvatarRoom = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjYwMCIgdmlld0JveD0iMCAwIDYwMCA2MDAiPgogIDxkZWZzPgogICAgPGNsaXBQYXRoIGlkPSJjbGlwLV8zIj4KICAgICAgPHJlY3Qgd2lkdGg9IjYwMCIgaGVpZ2h0PSI2MDAiLz4KICAgIDwvY2xpcFBhdGg+CiAgPC9kZWZzPgogIDxnIGlkPSJfMyIgZGF0YS1uYW1lPSIzIiBjbGlwLXBhdGg9InVybCgjY2xpcC1fMykiPgogICAgPHJlY3Qgd2lkdGg9IjYwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiNmZmYiLz4KICAgIDxnIGlkPSJHcnVwcGVfNzcxOCIgZGF0YS1uYW1lPSJHcnVwcGUgNzcxOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc4MC42OTcgODgxLjUpIj4KICAgICAgPHJlY3QgaWQ9IlJlY2h0ZWNrXzEzOTgiIGRhdGEtbmFtZT0iUmVjaHRlY2sgMTM5OCIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI1OTkuOTk1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3ODAuNjk3IC04ODEuNSkiIGZpbGw9IiNlNWU2ZTgiLz4KICAgICAgPGVsbGlwc2UgaWQ9IkVsbGlwc2VfMjg0IiBkYXRhLW5hbWU9IkVsbGlwc2UgMjg0IiBjeD0iMTE2LjIzMSIgY3k9IjEyNS42NzEiIHJ4PSIxMTYuMjMxIiByeT0iMTI1LjY3MSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTY1LjkyNiAtNzY5LjA5MykiIGZpbGw9IiNhZmI0YjgiLz4KICAgICAgPGVsbGlwc2UgaWQ9IkVsbGlwc2VfMjg1IiBkYXRhLW5hbWU9IkVsbGlwc2UgMjg1IiBjeD0iNjcuOTk4IiBjeT0iNzMuNTIxIiByeD0iNjcuOTk4IiByeT0iNzMuNTIxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MTYuMjEgLTY2NS40OTYpIiBmaWxsPSIjYWZiNGI4Ii8+CiAgICAgIDxlbGxpcHNlIGlkPSJFbGxpcHNlXzI4OSIgZGF0YS1uYW1lPSJFbGxpcHNlIDI4OSIgY3g9IjY3Ljk5OCIgY3k9IjczLjUyMSIgcng9IjY3Ljk5OCIgcnk9IjczLjUyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIxMi4xMDcgLTY2NS40OTYpIiBmaWxsPSIjYWZiNGI4Ii8+CiAgICAgIDxwYXRoIGlkPSJQZmFkXzI0OTYzIiBkYXRhLW5hbWU9IlBmYWQgMjQ5NjMiIGQ9Ik0xMzI3LjA1Mi0yODYuMjI1czAtMjE3LjU2My0yNDQuOTA3LTIxNy41NjNoLTEuNDU3Yy0yNDQuOTA3LDAtMjQ0LjkwNywyMTcuNTYzLTI0NC45MDcsMjE3LjU2M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgNC43MjUpIiBmaWxsPSIjYWZiNGI4Ii8+CiAgICAgIDxwYXRoIGlkPSJQZmFkXzI0OTY0IiBkYXRhLW5hbWU9IlBmYWQgMjQ5NjQiIGQ9Ik05MzMuOTc3LTQ4My44Yy0xLjA1LjYtMi4xLDEuMjItMy4xNCwxLjg0LTMyLjM0LDE5LjM0LTU4LjI5LDQ2LjI3LTc3LjEyLDgwLjA1LTMxLjcsNTYuODgtMzQuMzU1LDExOC43MjgtMzQuMzU1LDEyMS4yNDhoLTQwLjkxTDc4MC43LTQ3MS4zMmMyMy4yOC0xOC44Miw1Ny4wNS0zMi40NywxMDYuMDQtMzIuNDdoLjk0YTIxNy43NTMsMjE3Ljc1MywwLDAsMSw0My44Myw0LjE4QTguNTQ5LDguNTQ5LDAsMCwxLDkzMy45NzctNDgzLjhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAgLTAuNzI1KSIgZmlsbD0iI2FmYjRiOCIvPgogICAgICA8cGF0aCBpZD0iUGZhZF8yNDk2OCIgZGF0YS1uYW1lPSJQZmFkIDI0OTY4IiBkPSJNNzgyLjc5LTQ4My44YzEuMDUuNiwyLjEsMS4yMiwzLjE0LDEuODQsMzIuMzQsMTkuMzQsNTguMjksNDYuMjcsNzcuMTIsODAuMDUsMzEuNyw1Ni44OCwzNC4zNTUsMTE4LjcyOCwzNC4zNTUsMTIxLjI0OGg0MC45MUw5MzYuMDctNDcxLjMyYy0yMy4yOC0xOC44Mi01Ny4wNS0zMi40Ny0xMDYuMDQtMzIuNDdoLS45NGEyMTcuNzUzLDIxNy43NTMsMCwwLDAtNDMuODMsNC4xOEE4LjU0OSw4LjU0OSwwLDAsMCw3ODIuNzktNDgzLjhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTcuNTQ3IC0wLjcyNikiIGZpbGw9IiNhZmI0YjgiLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=';\n","export enum Presence {\n\n    present = 'present',\n    unavailable = 'unavailable',\n    away = 'away',\n\n}\n","import { Presence } from './presence';\nimport { Translations } from './translations';\n\nexport function defaultTranslations(): Translations {\n    return {\n        acceptSubscriptionRequest: 'Accept',\n        block: 'Block',\n        blockAndReport: 'Block & report',\n        chat: 'Chat',\n        contactRequestIn: 'Incoming contact requests',\n        contactRequestOut: 'Outgoing contact requests',\n        contacts: 'Contacts',\n        contactsUnaffiliated: 'Unknown',\n        dateFormat: 'EEEE, MM/dd/yyyy',\n        denySubscriptionRequest: 'Deny',\n        dismiss: 'Dismiss',\n        dropMessage: 'Drop your file to send it',\n        locale: undefined,\n        noContacts: 'No contacts yet.',\n        noMessages: 'No messages yet.',\n        placeholder: 'Enter your message!',\n        presence: {\n            [Presence.away]: 'Away',\n            [Presence.present]: 'Online',\n            [Presence.unavailable]: 'Offline',\n        },\n        rooms: 'Rooms',\n        subscriptionRequestMessage: 'I want to add you as a contact.',\n        timeFormat: 'shortTime',\n    };\n}\n","export const mucNs = 'http://jabber.org/protocol/muc';\nexport const mucUserNs = `${mucNs}#user`;\nexport const mucAdminNs = `${mucNs}#admin`;\nexport const mucOwnerNs = `${mucNs}#owner`;\nexport const mucRoomConfigFormNs = `${mucNs}#roomconfig`;\nexport const mucRequestFormNs = `${mucNs}#request`;\n","import { jid as parseJid, xml } from '@xmpp/client';\nimport { Contact, Invitation } from '../../../../core/contact';\nimport { Direction, Message } from '../../../../core/message';\nimport { MessageWithBodyStanza, Stanza } from '../../../../core/stanza';\nimport { LogService } from '../../../log.service';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { mucUserNs } from './multi-user-chat/multi-user-chat-constants';\n\nexport class MessageReceivedEvent {\n    discard = false;\n}\n\n/**\n * Part of the XMPP Core Specification\n * see: https://datatracker.ietf.org/doc/rfc6120/\n */\nexport class MessagePlugin extends AbstractXmppPlugin {\n    private static readonly MUC_DIRECT_INVITATION_NS = 'jabber:x:conference';\n\n    constructor(\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly logService: LogService,\n    ) {\n        super();\n    }\n\n    handleStanza(stanza: Stanza, archiveDelayElement?: Stanza) {\n        if (this.isMessageStanza(stanza)) {\n            this.handleMessageStanza(stanza, archiveDelayElement);\n            return true;\n        }\n        return false;\n    }\n\n    sendMessage(contact: Contact, body: string) {\n        const messageStanza = xml('message', {\n                to: contact.jidBare.toString(),\n                from: this.xmppChatAdapter.chatConnectionService.userJid.toString(),\n                type: 'chat',\n            },\n            xml('body', {}, body),\n        );\n\n        const message: Message = {\n            direction: Direction.out,\n            body,\n            datetime: new Date(), // TODO: replace with entity time plugin\n            delayed: false,\n            fromArchive: false,\n        };\n        this.xmppChatAdapter.plugins.forEach(plugin => plugin.beforeSendMessage(messageStanza, message));\n        contact.addMessage(message);\n        // TODO: on rejection mark message that it was not sent successfully\n        this.xmppChatAdapter.chatConnectionService.send(messageStanza).then(() => {\n            this.xmppChatAdapter.plugins.forEach(plugin => plugin.afterSendMessage(message, messageStanza));\n        }, (rej) => {\n            this.logService.error('rejected message ' + message.id, rej);\n        });\n    }\n\n    private isMessageStanza(stanza: Stanza): stanza is MessageWithBodyStanza {\n        return stanza.name === 'message'\n            && stanza.attrs.type !== 'groupchat'\n            && stanza.attrs.type !== 'error'\n            && !!stanza.getChildText('body')?.trim();\n    }\n\n    private handleMessageStanza(messageStanza: MessageWithBodyStanza, archiveDelayElement?: Stanza) {\n        const isAddressedToMe = this.xmppChatAdapter.chatConnectionService.userJid.bare()\n            .equals(parseJid(messageStanza.attrs.to).bare());\n        const messageDirection = isAddressedToMe ? Direction.in : Direction.out;\n\n        const messageFromArchive = archiveDelayElement != null;\n\n        const delayElement = archiveDelayElement ?? messageStanza.getChild('delay');\n        const datetime = delayElement?.attrs.stamp\n            ? new Date(delayElement.attrs.stamp)\n            : new Date() /* TODO: replace with entity time plugin */;\n\n        if (messageDirection === Direction.in && !messageFromArchive) {\n            this.logService.debug('message received <=', messageStanza.getChildText('body'));\n        }\n\n        const message = {\n            body: messageStanza.getChildText('body').trim(),\n            direction: messageDirection,\n            datetime,\n            delayed: !!delayElement,\n            fromArchive: messageFromArchive,\n        };\n\n        const messageReceivedEvent = new MessageReceivedEvent();\n        this.xmppChatAdapter.plugins.forEach(plugin => plugin.afterReceiveMessage(message, messageStanza, messageReceivedEvent));\n\n        if (messageReceivedEvent.discard) {\n            return;\n        }\n\n        const contactJid = isAddressedToMe ? messageStanza.attrs.from : messageStanza.attrs.to;\n        const contact = this.xmppChatAdapter.getOrCreateContactById(contactJid);\n        contact.addMessage(message);\n\n        const isRoomInviteMessage =\n            messageStanza.getChild('x', mucUserNs)\n            || messageStanza.getChild('x', MessagePlugin.MUC_DIRECT_INVITATION_NS);\n\n        if (isRoomInviteMessage) {\n            contact.pendingRoomInvite$.next(this.extractInvitationFromMessage(messageStanza));\n        }\n\n        if (messageDirection === Direction.in && !messageFromArchive) {\n            this.xmppChatAdapter.message$.next(contact);\n        }\n    }\n\n    private extractInvitationFromMessage(messageStanza: MessageWithBodyStanza): Invitation {\n        const mediatedInvitation = messageStanza.getChild('x', mucUserNs);\n        if (mediatedInvitation) {\n            const inviteEl = mediatedInvitation.getChild('invite');\n            return {\n                from: parseJid(inviteEl.attrs.from),\n                roomJid: parseJid(messageStanza.attrs.from),\n                reason: inviteEl.getChildText('reason'),\n                password: mediatedInvitation.getChildText('password'),\n            };\n        }\n\n        const directInvitation = messageStanza.getChild('x', MessagePlugin.MUC_DIRECT_INVITATION_NS);\n        if (directInvitation) {\n            return {\n                from: parseJid(messageStanza.attrs.from),\n                roomJid: parseJid(directInvitation.attrs.jid),\n                reason: directInvitation.attrs.reason,\n                password: directInvitation.attrs.password,\n            };\n        }\n\n        throw new Error(`unknown invitation format: ${messageStanza.toString()}`);\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\n\nexport class StanzaBuilder {\n\n    static buildRoomMessage(from: string, roomJid: string, content: Element[] = []): Element {\n        return xml('message', {from, to: roomJid, type: 'groupchat'},\n            ...content,\n        );\n    }\n\n    static buildRoomMessageWithBody(from: string, roomJid: string, body: string, content: Element[] = []): Element {\n        return StanzaBuilder.buildRoomMessage(from, roomJid, [\n            xml('body', {}, body),\n            ...content,\n        ]);\n    }\n\n    static buildRoomMessageWithThread(from: string, roomJid: string, body: string, thread: string): Element {\n        return StanzaBuilder.buildRoomMessageWithBody(from, roomJid, body, [\n            xml('thread', {}, thread),\n        ]);\n    }\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { BehaviorSubject } from 'rxjs';\nimport { first } from 'rxjs/operators';\nimport { AbstractStanzaBuilder } from '../abstract-stanza-builder';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\n\nclass QueryStanzaBuilder extends AbstractStanzaBuilder {\n\n    constructor(private xmlns: string, private to?: string) {\n        super();\n    }\n\n    toStanza() {\n        return xml('iq',\n            {\n                type: 'get',\n                ...(this.to ? {to: this.to} : {}),\n            },\n            xml('query', {xmlns: this.xmlns}),\n        );\n    }\n\n}\n\nexport interface IdentityAttrs {\n    category: string;\n    type: string;\n    name?: string;\n}\n\nexport interface Service {\n    jid: string;\n    identitiesAttrs: IdentityAttrs[];\n    features: string[];\n}\n\n/**\n * see XEP-0030 Service Discovery\n */\nexport class ServiceDiscoveryPlugin extends AbstractXmppPlugin {\n\n    public static readonly DISCO_INFO = 'http://jabber.org/protocol/disco#info';\n    public static readonly DISCO_ITEMS = 'http://jabber.org/protocol/disco#items';\n\n    private readonly servicesInitialized$ = new BehaviorSubject(false);\n    private hostedServices: Service[] = [];\n    private readonly resourceCache = new Map<string, Service>();\n\n    constructor(private readonly chatAdapter: XmppChatAdapter) {\n        super();\n    }\n\n    async onBeforeOnline(): Promise<void> {\n        await this.discoverServices(this.chatAdapter.chatConnectionService.userJid.domain);\n        this.servicesInitialized$.next(true);\n    }\n\n    onOffline(): void {\n        this.servicesInitialized$.next(false);\n        this.hostedServices = [];\n        this.resourceCache.clear();\n    }\n\n    supportsFeature(jid: string, searchedFeature: string): Promise<boolean> {\n\n        return new Promise((resolve, reject) => {\n\n            this.servicesInitialized$.pipe(first(value => !!value)).subscribe(async () => {\n                try {\n                    const service = this.resourceCache.get(jid) || await this.discoverServiceInformation(jid);\n                    if (!service) {\n                        reject(new Error('no service found for jid ' + jid));\n                    }\n                    resolve(service.features.includes(searchedFeature));\n                } catch (e) {\n                    reject(e);\n                }\n            });\n\n        });\n\n    }\n\n    findService(category: string, type: string): Promise<Service> {\n\n        return new Promise((resolve, reject) => {\n\n            this.servicesInitialized$.pipe(first(value => !!value)).subscribe(() => {\n                const results = this.hostedServices.filter(service =>\n                    service.identitiesAttrs.filter(identityAttrs => identityAttrs.category === category\n                        && identityAttrs.type === type).length > 0,\n                );\n\n                if (results.length === 0) {\n                    reject(new Error(`no service matching category ${category} and type ${type} found!`));\n                } else if (results.length > 1) {\n                    reject(new Error(`multiple services matching category ${category} and type ${type} found! ${JSON.stringify(results)}`));\n                } else {\n                    return resolve(results[0]);\n                }\n            });\n\n        });\n\n    }\n\n    private async discoverServices(mainDomain: string): Promise<void> {\n        const serviceListResponse = await this.chatAdapter.chatConnectionService.sendIq(\n            new QueryStanzaBuilder(\n                ServiceDiscoveryPlugin.DISCO_ITEMS, this.chatAdapter.chatConnectionService.userJid.domain).toStanza(),\n        );\n\n        const serviceDomains = new Set(\n            serviceListResponse\n                .getChild('query')\n                .getChildren('item')\n                .map((itemNode: Element) => itemNode.attrs.jid as string),\n        );\n        serviceDomains.add(mainDomain);\n\n        const discoveredServices: Service[] = await Promise.all(\n            [...serviceDomains.keys()]\n                .map((serviceDomain) => this.discoverServiceInformation(serviceDomain)),\n        );\n        this.hostedServices.push(...discoveredServices);\n    }\n\n    private async discoverServiceInformation(serviceDomain: string): Promise<Service> {\n        const serviceInformationResponse = await this.chatAdapter.chatConnectionService.sendIq(\n            new QueryStanzaBuilder(ServiceDiscoveryPlugin.DISCO_INFO, serviceDomain).toStanza(),\n        );\n\n        const queryNode = serviceInformationResponse.getChild('query');\n        const features = queryNode.getChildren('feature').map((featureNode: Element) => featureNode.attrs.var);\n        const identitiesAttrs = queryNode\n            .getChildren('identity')\n            .filter((identityNode: Element) => identityNode.attrs)\n            .map((identityNode: Element) => identityNode.attrs);\n\n        const serviceInformation: Service = {\n            identitiesAttrs: this.isIdentitiesAttrs(identitiesAttrs) ? identitiesAttrs : [],\n            features,\n            jid: serviceInformationResponse.attrs.from,\n        };\n        this.resourceCache.set(serviceInformationResponse.attrs.from, serviceInformation);\n        return serviceInformation;\n    }\n\n    private isIdentitiesAttrs(elements: { [attrName: string]: any }[]): elements is IdentityAttrs[] {\n        return elements.every((element) => {\n            const keys = Object.keys(element);\n            const mustHave = keys.includes('category') && keys.includes('type');\n            if (keys.length === 2) {\n                return mustHave;\n            } else if (keys.length === 3) {\n                return mustHave && keys.includes('name');\n            }\n            return false;\n        });\n    }\n}\n","export const identity: <T>(elem: T) => T = elem => elem;\nexport const toString: (elem: any) => string = elem => elem.toString();\n\n/**\n * given a sorted list, insert the given item in place after the last matching item.\n * @param elemToInsert the item to insert\n * @param list the list in which the element should be inserted\n * @param keyExtractor an optional element mapper, defaults to toString\n */\nexport function insertSortedLast<U>(elemToInsert: U, list: U[], keyExtractor: (a: U) => any = toString): void {\n    list.splice(findSortedInsertionIndexLast(keyExtractor(elemToInsert), list, keyExtractor), 0, elemToInsert);\n}\n\n/**\n * Find the highest possible index where the given element should be inserted so that the order of the list is preserved.\n * @param needle the needle to find\n * @param haystack the pre sorted list\n * @param keyExtractor an optional needle mapper, defaults to toString\n */\nexport function findSortedInsertionIndexLast<U, V>(needle: U, haystack: V[], keyExtractor: (a: V) => any = toString): number {\n    let low = 0;\n    let high = haystack.length;\n\n    while (low !== high) {\n\n        const cur = Math.floor(low + (high - low) / 2);\n\n        if (needle < keyExtractor(haystack[cur])) {\n            high = cur;\n        } else {\n            low = cur + 1;\n        }\n\n    }\n\n    return low;\n}\n\n/**\n * Find the index of an element in a sorted list. If list contains no matching element, return -1.\n */\nexport function findSortedIndex<U, V>(needle: U, haystack: V[], keyExtractor: (a: V) => any = toString): number {\n    let low = 0;\n    let high = haystack.length;\n\n    while (low !== high) {\n\n        const cur = Math.floor(low + (high - low) / 2);\n\n        const extractedKey = keyExtractor(haystack[cur]);\n        if (needle < extractedKey) {\n            high = cur;\n        } else if (needle > extractedKey) {\n            low = cur + 1;\n        } else {\n            return cur;\n        }\n\n    }\n\n    return -1;\n}\n\n/**\n * Like {@link Array.prototype.findIndex} but finds the last index instead.\n */\nexport function findLastIndex<T>(arr: T[], predicate: (x: T) => boolean): number {\n    for (let i = arr.length - 1; i >= 0; i--) {\n        if (predicate(arr[i])) {\n            return i;\n        }\n    }\n    return -1;\n}\n\n/**\n * Like {@link Array.prototype.find} but finds the last matching element instead.\n */\nexport function findLast<T>(arr: T[], predicate: (x: T) => boolean): T | undefined {\n    return arr[findLastIndex(arr, predicate)];\n}\n\n/**\n * Return a new array, where all elements from the original array occur exactly once.\n */\nexport function removeDuplicates<T>(arr: T[], eq: (x: T, y: T) => boolean = (x: T, y: T) => x === y): T[] {\n    const results = [];\n    for (const arrElement of arr) {\n        let duplicateFound = false;\n        for (const resultElement of results) {\n            if (eq(arrElement, resultElement)) {\n                duplicateFound = true;\n                break;\n            }\n        }\n        if (!duplicateFound) {\n            results.push(arrElement);\n        }\n    }\n    return results;\n}\n","/**\n * converts date objects to date strings like '2011-10-05'\n */\nexport function extractDateStringFromDate(date: Date): string {\n    const isoString = date.toISOString();\n    return isoString.slice(0, isoString.indexOf('T'));\n}\n","import { Subject } from 'rxjs';\nimport { LogService } from '../services/log.service';\nimport { Direction, Message } from './message';\nimport { findLast, findSortedIndex, findSortedInsertionIndexLast, insertSortedLast } from './utils-array';\nimport { extractDateStringFromDate } from './utils-date';\n\nexport interface DateMessagesGroup<T extends Message> {\n    /** is equal to the date where one message on that date was received */\n    date: Date;\n    messages: T[];\n}\n\nexport class MessageStore<T extends Message> {\n\n    public readonly messages$: Subject<T>;\n    public readonly messages: T[] = [];\n    public readonly dateMessageGroups: DateMessagesGroup<T>[] = [];\n    public readonly messageIdToMessage = new Map<string, T>();\n\n    constructor(private readonly logService?: LogService) {\n        this.messages$ = new Subject<T>();\n    }\n\n    addMessage(message: T): boolean {\n        if (message.id && this.messageIdToMessage.has(message.id)) {\n            if (this.logService) {\n                this.logService.warn(`message with id ${message.id} already exists`);\n            }\n            return false;\n        }\n        insertSortedLast(message, this.messages, m => m.datetime);\n        this.addToDateMessageGroups(message);\n        this.messageIdToMessage.set(message.id, message);\n        this.messages$.next(message);\n        return true;\n    }\n\n    get oldestMessage(): T | undefined {\n        return this.messages[0];\n    }\n\n    get mostRecentMessage(): T | undefined {\n        return this.messages[this.messages.length - 1];\n    }\n\n    get mostRecentMessageReceived(): T | undefined {\n        return findLast(this.messages, msg => msg.direction === Direction.in);\n    }\n\n    get mostRecentMessageSent(): T | undefined {\n        return findLast(this.messages, msg => msg.direction === Direction.out);\n    }\n\n    private addToDateMessageGroups(message: T): void {\n        const dateString = extractDateStringFromDate(message.datetime);\n        const groupIndex = findSortedIndex(dateString, this.dateMessageGroups, group => extractDateStringFromDate(group.date));\n        if (groupIndex !== -1) {\n            insertSortedLast(message, this.dateMessageGroups[groupIndex].messages, m => m.datetime);\n        } else {\n            const groupToInsert = {\n                date: message.datetime,\n                messages: [message],\n            };\n            const insertIndex = findSortedInsertionIndexLast(dateString, this.dateMessageGroups,\n                group => extractDateStringFromDate(group.date));\n            this.dateMessageGroups.splice(insertIndex, 0, groupToInsert);\n        }\n    }\n\n}\n","import { JID } from '@xmpp/jid';\nimport { Contact } from './contact';\nimport { Room } from '../services/adapters/xmpp/plugins/multi-user-chat/room';\n\nexport type Recipient = Contact | Room;\n\nexport function isJid(o: any): o is JID {\n    // due to unknown reasons, `o instanceof JID` does not work when\n    // JID is instantiated by an application instead of ngx-chat\n    return !!o.bare;\n}\n","import { JID } from '@xmpp/jid';\nimport { ReplaySubject, Subject } from 'rxjs';\nimport { dummyAvatarRoom } from '../../../../../core/contact-avatar';\nimport { DateMessagesGroup, MessageStore } from '../../../../../core/message-store';\nimport { LogService } from '../../../../log.service';\nimport { jid as parseJid } from '@xmpp/client';\nimport { isJid, Recipient } from '../../../../../core/recipient';\nimport { RoomMetadata } from './multi-user-chat.plugin';\nimport { RoomOccupant } from './room-occupant';\nimport { RoomMessage } from './room-message';\nimport { OccupantChange } from './occupant-change';\n\nexport class Room {\n\n    readonly recipientType = 'room';\n    readonly roomJid: JID;\n    occupantJid: JID | undefined;\n    description = '';\n    subject = '';\n    avatar = dummyAvatarRoom;\n    metadata: RoomMetadata = {};\n    private readonly messageStore: MessageStore<RoomMessage>;\n    private readonly roomOccupants = new Map<string, RoomOccupant>();\n    private readonly onOccupantChangeSubject = new ReplaySubject<OccupantChange>(Infinity, 1000);\n    readonly onOccupantChange$ = this.onOccupantChangeSubject.asObservable();\n    private readonly occupantsSubject = new ReplaySubject<RoomOccupant[]>(1);\n    readonly occupants$ = this.occupantsSubject.asObservable();\n\n    constructor(roomJid: JID, private readonly logService: LogService) {\n        this.roomJid = roomJid.bare();\n        this.name = undefined;\n        this.messageStore = new MessageStore<RoomMessage>(logService);\n    }\n\n    get nick(): string {\n        return this.occupantJid?.resource;\n    }\n\n    set nick(nick: string) {\n        const occupantJid = parseJid(this.roomJid.toString());\n        occupantJid.resource = nick;\n        this.occupantJid = occupantJid;\n    }\n\n    // tslint:disable-next-line:variable-name\n    private _name: string;\n\n    get name(): string {\n        return this._name;\n    }\n\n    set name(name: string | undefined) {\n        this._name = !!name ? name : this.roomJid.local;\n    }\n\n    get jidBare(): JID {\n        return this.roomJid;\n    }\n\n    get messages$(): Subject<RoomMessage> {\n        return this.messageStore.messages$;\n    }\n\n    get messages(): RoomMessage[] {\n        return this.messageStore.messages;\n    }\n\n    get dateMessagesGroups(): DateMessagesGroup<RoomMessage>[] {\n        return this.messageStore.dateMessageGroups;\n    }\n\n    get oldestMessage(): RoomMessage {\n        return this.messageStore.oldestMessage;\n    }\n\n    get mostRecentMessage(): RoomMessage {\n        return this.messageStore.mostRecentMessage;\n    }\n\n    get mostRecentMessageReceived(): RoomMessage {\n        return this.messageStore.mostRecentMessageReceived;\n    }\n\n    get mostRecentMessageSent(): RoomMessage {\n        return this.messageStore.mostRecentMessageSent;\n    }\n\n    addMessage(message: RoomMessage): void {\n        this.messageStore.addMessage(message);\n    }\n\n    equalsBareJid(other: Recipient | JID): boolean {\n        if (other instanceof Room || isJid(other)) {\n            const otherJid = other instanceof Room ? other.roomJid : other.bare();\n            return this.roomJid.equals(otherJid);\n        }\n        return false;\n    }\n\n    hasOccupant(occupantJid: JID): boolean {\n        return this.roomOccupants.has(occupantJid.toString());\n    }\n\n    getOccupant(occupantJid: JID): RoomOccupant | undefined {\n        return this.roomOccupants.get(occupantJid.toString());\n    }\n\n    handleOccupantJoined(occupant: RoomOccupant, isCurrentUser: boolean) {\n        this.addOccupant(occupant);\n\n        this.onOccupantChangeSubject.next({change: 'joined', occupant, isCurrentUser});\n        this.logService.debug(`occupant joined room: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        return true;\n    }\n\n    handleOccupantLeft(occupant: RoomOccupant, isCurrentUser: boolean) {\n        this.removeOccupant(occupant, isCurrentUser);\n        this.logService.debug(`occupant left room: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        this.onOccupantChangeSubject.next({change: 'left', occupant, isCurrentUser});\n        return true;\n    }\n\n    handleOccupantConnectionError(occupant: RoomOccupant, isCurrentUser: boolean) {\n        this.removeOccupant(occupant, isCurrentUser);\n        this.logService.debug(`occupant left room due to connection error: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        this.onOccupantChangeSubject.next({change: 'leftOnConnectionError', occupant, isCurrentUser});\n        return true;\n    }\n\n    handleOccupantKicked(occupant: RoomOccupant, isCurrentUser: boolean, actor?: string, reason?: string) {\n        this.removeOccupant(occupant, isCurrentUser);\n        if (isCurrentUser) {\n            this.logService.info(`you got kicked from room! roomJid=${this.roomJid.toString()}, by=${actor}, reason=${reason}`);\n        }\n        this.logService.debug(`occupant got kicked: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        this.onOccupantChangeSubject.next({change: 'kicked', occupant, isCurrentUser, actor, reason});\n        return true;\n    }\n\n    handleOccupantBanned(occupant: RoomOccupant, isCurrentUser: boolean, actor?: string, reason?: string) {\n        this.removeOccupant(occupant, isCurrentUser);\n        if (isCurrentUser) {\n            this.logService.info(`you got banned from room! roomJid=${this.roomJid.toString()}, by=${actor}, reason=${reason}`);\n        }\n        this.logService.debug(`occupant got banned: occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        this.onOccupantChangeSubject.next({change: 'banned', occupant, isCurrentUser, actor, reason});\n        return true;\n    }\n\n    handleOccupantLostMembership(occupant: RoomOccupant, isCurrentUser: boolean) {\n        this.removeOccupant(occupant, isCurrentUser);\n        if (isCurrentUser) {\n            this.logService.info(`your membership got revoked and you got kicked from member-only room: ${this.roomJid.toString()}`);\n        }\n        this.onOccupantChangeSubject.next({change: 'lostMembership', occupant, isCurrentUser});\n        return true;\n    }\n\n    handleOccupantChangedNick(occupant: RoomOccupant, isCurrentUser: boolean, newNick: string) {\n        if (isCurrentUser) {\n            this.nick = newNick;\n        }\n        let existingOccupant = this.roomOccupants.get(occupant.occupantJid.toString());\n        if (!existingOccupant) {\n            existingOccupant = {...occupant};\n            existingOccupant.occupantJid = parseJid(occupant.occupantJid.toString());\n        }\n        existingOccupant.occupantJid.resource = newNick;\n        existingOccupant.nick = newNick;\n        this.roomOccupants.delete(occupant.occupantJid.toString());\n        this.roomOccupants.set(existingOccupant.occupantJid.toString(), existingOccupant);\n\n        this.logService.debug(`occupant changed nick: from=${occupant.nick}, to=${newNick}, occupantJid=${occupant.occupantJid.toString()}, roomJid=${this.roomJid.toString()}`);\n        this.onOccupantChangeSubject.next({change: 'changedNick', occupant, newNick, isCurrentUser});\n        return true;\n    }\n\n    handleOccupantModified(occupant: RoomOccupant, oldOccupant: RoomOccupant, isCurrentUser: boolean) {\n        this.logService.debug(`occupant changed: from=${JSON.stringify(oldOccupant)}, to=${JSON.stringify(occupant)}`);\n        this.onOccupantChangeSubject.next({change: 'modified', occupant, oldOccupant, isCurrentUser});\n        return true;\n    }\n\n    equals(other: Room | null | undefined): boolean {\n        if (this === other) {\n            return true;\n        }\n\n        if (other == null || !(other instanceof Room)) {\n            return false;\n        }\n\n        return this.roomJid.equals(other.roomJid);\n    }\n\n    private addOccupant(occupant: RoomOccupant) {\n        this.roomOccupants.set(occupant.occupantJid.toString(), occupant);\n        this.occupantsSubject.next([...this.roomOccupants.values()]);\n    }\n\n    private removeOccupant(occupant: RoomOccupant, isCurrentUser: boolean) {\n        if (isCurrentUser) {\n            this.roomOccupants.clear();\n            this.occupantsSubject.next([]);\n        } else {\n            if (this.roomOccupants.delete(occupant.occupantJid.toString())) {\n                this.occupantsSubject.next([...this.roomOccupants.values()]);\n            }\n        }\n    }\n}\n","import { JID } from '@xmpp/jid';\n\nexport enum Affiliation {\n    none = 'none',\n    outcast = 'outcast',\n    member = 'member',\n    admin = 'admin',\n    owner = 'owner',\n}\n\nexport interface AffiliationModification {\n    userJid: JID;\n    affiliation: Affiliation;\n    reason?: string;\n}\n","export enum Role {\n    none = 'none',\n    visitor = 'visitor',\n    participant = 'participant',\n    moderator = 'moderator',\n}\n\nexport interface RoleModification {\n    nick: string;\n    role: Role;\n    reason?: string;\n}\n","import { jid as parseJid, xml } from '@xmpp/client';\nimport { JID } from '@xmpp/jid';\nimport { Element } from 'ltx';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Direction } from '../../../../../core/message';\nimport { IqResponseStanza, Stanza } from '../../../../../core/stanza';\nimport { LogService } from '../../../../log.service';\nimport { AbstractStanzaBuilder } from '../../abstract-stanza-builder';\nimport { StanzaBuilder } from '../../stanza-builder';\nimport { XmppChatAdapter } from '../../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from '../abstract-xmpp-plugin';\nimport { MessageReceivedEvent } from '../message.plugin';\nimport { ServiceDiscoveryPlugin } from '../service-discovery.plugin';\nimport { Presence } from '../../../../../core/presence';\nimport { Room } from './room';\nimport { Affiliation, AffiliationModification } from './affiliation';\nimport { Role, RoleModification } from './role';\nimport { RoomUser } from './room-user';\nimport { RoomOccupant } from './room-occupant';\nimport { Invitation } from './invitation';\nimport { RoomMessage } from './room-message';\nimport {\n    Form,\n    FORM_NS,\n    getField,\n    parseForm,\n    serializeToSubmitForm,\n    setFieldValue,\n    TextualFormField,\n} from '../../../../../core/form';\nimport { XmppResponseError } from '../../xmpp-response.error';\nimport { mucNs, mucAdminNs, mucOwnerNs, mucRoomConfigFormNs, mucUserNs } from './multi-user-chat-constants';\n\n/**\n * see:\n * https://xmpp.org/extensions/xep-0045.html#terms-rooms\n */\nexport interface RoomCreationOptions extends RoomConfiguration {\n    /**\n     * The room id to create the room with. This is the `local` part of the room JID.\n     */\n    roomId: string;\n    /**\n     * Optional nickname to use in the room. Current user's nickname will be used if not provided.\n     */\n    nick?: string;\n}\n\nexport interface RoomConfiguration {\n    /**\n     * Optional name for the room. If none is provided, room will be only identified by its JID.\n     */\n    name?: string;\n    /**\n     * A room that can be found by any user through normal means such as searching and service discovery\n     */\n    public?: boolean;\n    /**\n     * for true:\n     * A room that a user cannot enter without being on the member list.\n     * for false:\n     * A room that non-banned entities are allowed to enter without being on the member list.\n     */\n    membersOnly?: boolean;\n    /**\n     * for true:\n     * A room in which an occupant's full JID is exposed to all other occupants,\n     * although the occupant can request any desired room nickname.\n     * for false:\n     * A room in which an occupant's full JID can be discovered by room moderators only.\n     */\n    nonAnonymous?: boolean;\n    /**\n     * for true:\n     * A room that is not destroyed if the last occupant exits.\n     * for false:\n     * A room that is destroyed if the last occupant exits.\n     */\n    persistentRoom?: boolean;\n    /**\n     * allow ejabberd MucSub subscriptions.\n     * Room occupants are allowed to subscribe to message notifications being archived while they were offline\n     */\n    allowSubscription?: boolean;\n\n    /**\n    * Only occupants with \"voice\" can send public messages. The default value is true.\n    */\n    moderated?: boolean;\n}\n\nexport interface RoomMetadata {\n    [key: string]: any;\n}\n\nclass QueryAffiliatedMemberListStanzaBuilder extends AbstractStanzaBuilder {\n\n    constructor(\n        private readonly roomJid: JID,\n        private readonly queryType: 'affiliation' | 'role',\n        private readonly affiliationOrRole: Affiliation | Role,\n    ) {\n        super();\n    }\n\n    static build(roomJid: JID, ...[queryType, affiliationOrRole]:\n        [queryType: 'affiliation', affiliation: Affiliation] | [queryType: 'role', role: Role]): Stanza {\n        return new QueryAffiliatedMemberListStanzaBuilder(roomJid, queryType, affiliationOrRole).toStanza();\n    }\n\n    toStanza(): Stanza {\n        return xml('iq', {type: 'get', to: this.roomJid.toString()},\n            xml('query', {xmlns: mucAdminNs},\n                xml('item', {[this.queryType]: this.affiliationOrRole}),\n            ),\n        ) as Stanza;\n    }\n}\n\nclass QueryOccupantListStanzaBuilder extends AbstractStanzaBuilder {\n\n    constructor(private readonly roomJid: JID) {\n        super();\n    }\n\n    static build(roomJid: JID): Stanza {\n        return new QueryOccupantListStanzaBuilder(roomJid).toStanza();\n    }\n\n    toStanza(): Stanza {\n        return xml('iq', {type: 'get', to: this.roomJid.toString()},\n            xml('query', {xmlns: ServiceDiscoveryPlugin.DISCO_ITEMS}),\n        ) as Stanza;\n    }\n}\n\nexport interface RoomSummary {\n    jid: JID;\n    name: string;\n    roomInfo: Form | null;\n}\n\nclass ModifyAffiliationsOrRolesStanzaBuilder extends AbstractStanzaBuilder {\n\n    constructor(\n        private readonly roomJid: JID,\n        private readonly modifications: readonly (AffiliationModification | RoleModification)[],\n    ) {\n        super();\n    }\n\n    static build(\n        roomJid: JID,\n        modifications: readonly (AffiliationModification | RoleModification)[],\n    ): Stanza {\n        return new ModifyAffiliationsOrRolesStanzaBuilder(roomJid, modifications).toStanza();\n    }\n\n    toStanza(): Stanza {\n        return xml('iq', {to: this.roomJid.toString(), type: 'set'},\n            xml(\n                'query',\n                {xmlns: mucAdminNs},\n                ...this.modifications.map(modification => this.buildItem(modification)),\n            ),\n        ) as Stanza;\n    }\n\n    private buildItem(modification: AffiliationModification | RoleModification): Element {\n        const {reason, ...attrs} = modification;\n        return xml(\n            'item',\n            'userJid' in attrs\n                ? {\n                    jid: attrs.userJid.toString(),\n                    affiliation: attrs.affiliation,\n                }\n                : {\n                    nick: attrs.nick,\n                    role: attrs.role,\n                },\n            reason ? xml('reason', {}, reason) : null,\n        );\n    }\n}\n\n/**\n * The MultiUserChatPlugin tries to provide the necessary functionality for a multi-user text chat,\n * whereby multiple XMPP users can exchange messages in the context of a room or channel, similar to Internet Relay Chat (IRC).\n * For more details see:\n * @see https://xmpp.org/extensions/xep-0045.html\n */\nexport class MultiUserChatPlugin extends AbstractXmppPlugin {\n    readonly rooms$ = new BehaviorSubject<Room[]>([]);\n    readonly message$ = new Subject<Room>();\n\n    private onInvitationSubject = new Subject<Invitation>();\n    readonly onInvitation$ = this.onInvitationSubject.asObservable();\n\n    constructor(\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly logService: LogService,\n        private readonly serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n    ) {\n        super();\n    }\n\n    onOffline(): void {\n        this.rooms$.next([]);\n    }\n\n    handleStanza(stanza: Stanza, archiveDelayElement?: Stanza): boolean {\n        if (this.isRoomPresenceStanza(stanza)) {\n            return this.handleRoomPresenceStanza(stanza);\n        } else if (this.isRoomMessageStanza(stanza)) {\n            return this.handleRoomMessageStanza(stanza, archiveDelayElement);\n        } else if (this.isRoomSubjectStanza(stanza)) {\n            return this.handleRoomSubjectStanza(stanza, archiveDelayElement);\n        } else if (this.isRoomInvitationStanza(stanza)) {\n            return this.handleRoomInvitationStanza(stanza);\n        }\n        return false;\n    }\n\n    /**\n     * Resolves if room could be configured as requested, rejects if room did exist or server did not accept configuration.\n     */\n    async createRoom(options: RoomCreationOptions): Promise<Room> {\n        const {roomId, nick} = options;\n        const service = await this.serviceDiscoveryPlugin.findService('conference', 'text');\n        const occupantJid = parseJid(roomId, service.jid, nick);\n        const {presenceResponse, room} = await this.joinRoomInternal(occupantJid);\n\n        const itemElement = presenceResponse.getChild('x').getChild('item');\n        if (itemElement.attrs.affiliation !== Affiliation.owner) {\n            throw new Error('error creating room, user is not owner: ' + presenceResponse.toString());\n        }\n\n        try {\n            await this.applyRoomConfiguration(room.roomJid, options);\n            room.name = options.name || undefined;\n            this.rooms$.next(this.rooms$.getValue());\n        } catch (e) {\n            this.logService.error('room configuration rejected', e);\n            throw e;\n        }\n\n        return room;\n    }\n\n    async destroyRoom(roomJid: JID): Promise<IqResponseStanza<'result'>> {\n        let roomDestroyedResponse: IqResponseStanza<'result'>;\n        try {\n            roomDestroyedResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n                xml('iq', {type: 'set', to: roomJid.toString()},\n                    xml('query', {xmlns: mucOwnerNs},\n                        xml('destroy'))));\n        } catch (e) {\n            this.logService.error('error destroying room');\n            throw e;\n        }\n\n        // TODO: refactor so that we instead listen to the presence destroy stanza\n        const allRoomsWithoutDestroyedRoom = this.rooms$.getValue().filter(\n            room => !room.roomJid.equals(roomJid),\n        );\n\n        this.rooms$.next(allRoomsWithoutDestroyedRoom);\n\n        return roomDestroyedResponse;\n    }\n\n    async joinRoom(occupantJid: JID): Promise<Room> {\n        const {room} = await this.joinRoomInternal(occupantJid);\n        this.rooms$.next(this.rooms$.getValue());\n        return room;\n    }\n\n    async getRoomInfo(roomJid: JID): Promise<Form | null> {\n        const roomInfoResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', to: roomJid.toString()},\n                xml('query', {xmlns: ServiceDiscoveryPlugin.DISCO_INFO}),\n            ),\n        );\n        const formEl = roomInfoResponse\n            .getChild('query', ServiceDiscoveryPlugin.DISCO_INFO)\n            ?.getChild('x', FORM_NS);\n\n        if (formEl) {\n            return parseForm(formEl);\n        }\n\n        return null;\n    }\n\n    async queryAllRooms(): Promise<RoomSummary[]> {\n        const conferenceServer = await this.serviceDiscoveryPlugin.findService('conference', 'text');\n        const to = conferenceServer.jid.toString();\n\n        const result: RoomSummary[] = [];\n\n        let roomQueryResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', to},\n                xml('query', {xmlns: ServiceDiscoveryPlugin.DISCO_ITEMS}),\n            ),\n        );\n        result.push(...this.extractRoomSummariesFromResponse(roomQueryResponse));\n\n        let resultSet = this.extractResultSetFromResponse(roomQueryResponse);\n        while (resultSet && resultSet.getChild('last')) {\n            const lastReceivedRoom = resultSet.getChildText('last');\n            roomQueryResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n                xml('iq', {type: 'get', to},\n                    xml('query', {xmlns: ServiceDiscoveryPlugin.DISCO_ITEMS},\n                        xml('set', {xmlns: 'http://jabber.org/protocol/rsm'},\n                            xml('max', {}, '250'),\n                            xml('after', {}, lastReceivedRoom),\n                        ),\n                    ),\n                ),\n            );\n            result.push(...this.extractRoomSummariesFromResponse(roomQueryResponse));\n            resultSet = this.extractResultSetFromResponse(roomQueryResponse);\n        }\n\n        await Promise.all(\n            result.map(async (summary) => {\n                summary.roomInfo = await this.getRoomInfo(summary.jid);\n            }),\n        );\n\n        return result;\n    }\n\n    /**\n     * Get all members of a MUC-Room with their affiliation to the room using the rooms fullJid\n     * @param roomJid jid of the room\n     */\n    async queryUserList(roomJid: JID): Promise<RoomUser[]> {\n        const memberQueryResponses = await Promise.all(\n            [\n                ...Object\n                    .values(Affiliation)\n                    .map(affiliation =>\n                        this.xmppChatAdapter.chatConnectionService.sendIq(\n                            QueryAffiliatedMemberListStanzaBuilder.build(roomJid, 'affiliation', affiliation),\n                        ),\n                    ),\n                ...Object\n                    .values(Role)\n                    .map(role =>\n                        this.xmppChatAdapter.chatConnectionService.sendIq(\n                            QueryAffiliatedMemberListStanzaBuilder.build(roomJid, 'role', role),\n                        ),\n                    ),\n            ],\n        );\n        const members = new Map<string, RoomUser>();\n        for (const memberQueryResponse of memberQueryResponses) {\n            memberQueryResponse\n                .getChild('query', mucAdminNs)\n                .getChildren('item')\n                .forEach((memberItem: Element) => {\n                    const userJid = parseJid(memberItem.attrs.jid);\n                    const roomUser = members.get(userJid.bare().toString()) || {\n                        userIdentifiers: [],\n                        affiliation: Affiliation.none,\n                        role: Role.none,\n                    } as RoomUser;\n                    roomUser.userIdentifiers.push({\n                        userJid,\n                        nick: memberItem.attrs.nick && memberItem.attrs.nick,\n                    });\n                    // tslint:disable no-unused-expression\n                    memberItem.attrs.affiliation && (roomUser.affiliation = memberItem.attrs.affiliation);\n                    memberItem.attrs.role && (roomUser.role = memberItem.attrs.role);\n                    // tslint:enable no-unused-expression\n                    members.set(userJid.bare().toString(), roomUser);\n                });\n        }\n\n        return [...members.values()];\n    }\n\n    async modifyAffiliationOrRole(roomJid: JID, modification: AffiliationModification | RoleModification): Promise<IqResponseStanza> {\n        return await this.xmppChatAdapter.chatConnectionService.sendIq(\n            ModifyAffiliationsOrRolesStanzaBuilder.build(roomJid, [modification]),\n        );\n    }\n\n    async sendMessage(room: Room, body: string, thread?: string): Promise<void> {\n        const from = this.xmppChatAdapter.chatConnectionService.userJid.toString();\n        const roomJid = room.roomJid.toString();\n        const roomMessageStanza =\n            thread\n                ? StanzaBuilder.buildRoomMessageWithThread(from, roomJid, body, thread)\n                : StanzaBuilder.buildRoomMessageWithBody(from, roomJid, body);\n\n        for (const plugin of this.xmppChatAdapter.plugins) {\n            plugin.beforeSendMessage(roomMessageStanza);\n        }\n\n        return await this.xmppChatAdapter.chatConnectionService.send(roomMessageStanza);\n    }\n\n    /**\n     * requests a configuration form for a room which returns with the default values\n     * for an example see:\n     * https://xmpp.org/extensions/xep-0045.html#registrar-formtype-owner\n     */\n    async getRoomConfiguration(roomJid: JID): Promise<Form> {\n        const configurationForm = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', to: roomJid.toString()},\n                xml('query', {xmlns: mucOwnerNs}),\n            ),\n        );\n\n        const formElement = configurationForm.getChild('query').getChild('x', FORM_NS);\n        if (!formElement) {\n            throw new Error('room not configurable');\n        }\n\n        return parseForm(formElement);\n    }\n\n    async applyRoomConfiguration(roomJid: JID, roomConfiguration: RoomConfiguration): Promise<void> {\n        const roomConfigForm = await this.getRoomConfiguration(roomJid);\n\n        const formTypeField = getField(roomConfigForm, 'FORM_TYPE') as TextualFormField | undefined;\n        if (formTypeField.value !== mucRoomConfigFormNs) {\n            throw new Error(`unexpected form type for room configuration form: formType=${formTypeField.value}, formTypeField=${JSON.stringify(formTypeField)}`);\n        }\n\n        if (typeof roomConfiguration.name === 'string') {\n            setFieldValue(roomConfigForm, 'text-single', 'muc#roomconfig_roomname', roomConfiguration.name);\n        }\n        if (typeof roomConfiguration.nonAnonymous === 'boolean') {\n            setFieldValue(\n                roomConfigForm,\n                'list-single',\n                'muc#roomconfig_whois',\n                roomConfiguration.nonAnonymous ? 'anyone' : 'moderators',\n            );\n        }\n        if (typeof roomConfiguration.public === 'boolean') {\n            setFieldValue(roomConfigForm, 'boolean', 'muc#roomconfig_publicroom', roomConfiguration.public);\n        }\n        if (typeof roomConfiguration.membersOnly === 'boolean') {\n            setFieldValue(roomConfigForm, 'boolean', 'muc#roomconfig_membersonly', roomConfiguration.membersOnly);\n        }\n        if (typeof roomConfiguration.persistentRoom === 'boolean') {\n            setFieldValue(roomConfigForm, 'boolean', 'muc#roomconfig_persistentroom', roomConfiguration.persistentRoom);\n        }\n        if (typeof roomConfiguration.allowSubscription === 'boolean') {\n            setFieldValue(roomConfigForm, 'boolean', 'allow_subscription', roomConfiguration.allowSubscription);\n        }\n\n        await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set', to: roomJid.toString()},\n                xml('query', {xmlns: mucOwnerNs},\n                    serializeToSubmitForm(roomConfigForm),\n                ),\n            ),\n        );\n    }\n\n    getRoomByJid(jid: JID): Room | undefined {\n        return this.rooms$.getValue().find(room => room.roomJid.equals(jid.bare()));\n    }\n\n    async banUser(occupantJid: JID, roomJid: JID, reason?: string): Promise<IqResponseStanza> {\n        const userJid = await this.getUserJidByOccupantJid(occupantJid, roomJid);\n\n        const response = await this.modifyAffiliationOrRole(roomJid, {\n            userJid: userJid.bare(),\n            affiliation: Affiliation.outcast,\n            reason,\n        });\n        this.logService.debug(`ban response ${response.toString()}`);\n\n        return response;\n    }\n\n    async unbanUser(occupantJid: JID, roomJid: JID): Promise<IqResponseStanza> {\n        const userJid = await this.getUserJidByOccupantJid(occupantJid, roomJid);\n\n        const banList = (await this.getBanList(roomJid)).map(bannedUser => bannedUser.userJid);\n        this.logService.debug(`ban list: ${JSON.stringify(banList)}`);\n\n        if (!banList.find(bannedJid => bannedJid.equals(userJid))) {\n            throw new Error(`error unbanning: ${userJid} isn't on the ban list`);\n        }\n\n        const response = await this.modifyAffiliationOrRole(roomJid, {userJid, affiliation: Affiliation.none});\n        this.logService.debug('unban response: ' + response.toString());\n\n        return response;\n    }\n\n    async getBanList(roomJid: JID): Promise<AffiliationModification[]> {\n        const iq = xml('iq', {to: roomJid.toString(), type: 'get'},\n            xml('query', {xmlns: mucAdminNs},\n                xml('item', {affiliation: Affiliation.outcast}),\n            ),\n        );\n        const response = await this.xmppChatAdapter.chatConnectionService.sendIq(iq);\n\n        return response.getChild('query').getChildren('item').map(item => ({\n            userJid: parseJid(item.attrs.jid),\n            affiliation: item.attrs.affiliation,\n            reason: item.getChild('reason')?.getText(),\n        }));\n    }\n\n    async inviteUser(inviteeJid: JID, roomJid: JID, invitationMessage?: string): Promise<void> {\n        const from = this.xmppChatAdapter.chatConnectionService.userJid.toString();\n        const stanza = xml('message', {to: roomJid.toString(), from},\n            xml('x', {xmlns: mucUserNs},\n                xml('invite', {to: inviteeJid.toString()},\n                    invitationMessage ? xml('reason', {}, invitationMessage) : null,\n                ),\n            ),\n        );\n        await this.xmppChatAdapter.chatConnectionService.send(stanza);\n    }\n\n    async declineRoomInvite(occupantJid: JID, reason?: string) {\n        const to = occupantJid.bare().toString();\n        const from = this.xmppChatAdapter.chatConnectionService.userJid.toString();\n        const stanza = xml('message', {to, from},\n            xml('x', {xmlns: mucUserNs},\n                xml('decline', {to},\n                    reason ? xml('reason', {}, reason) : null\n                ),\n            ),\n        );\n        await this.xmppChatAdapter.chatConnectionService.send(stanza);\n    }\n\n    async kickOccupant(nick: string, roomJid: JID, reason?: string): Promise<IqResponseStanza> {\n        const response = await this.modifyAffiliationOrRole(roomJid, {nick, role: Role.none, reason});\n        this.logService.debug(`kick occupant response: ${response.toString()}`);\n        return response;\n    }\n\n    async changeUserNickname(newNick: string, roomJid: JID): Promise<void> {\n        const newRoomJid = parseJid(roomJid.toString());\n        newRoomJid.resource = newNick;\n        const stanza = xml('presence', {\n            to: newRoomJid.toString(),\n            from: this.xmppChatAdapter.chatConnectionService.userJid.toString(),\n        });\n        await this.xmppChatAdapter.chatConnectionService.send(stanza);\n    }\n\n    async leaveRoom(occupantJid: JID, status?: string): Promise<void> {\n        const stanza = xml('presence', {\n                to: occupantJid.toString(),\n                from: this.xmppChatAdapter.chatConnectionService.userJid.toString(),\n                type: Presence[Presence.unavailable],\n            },\n            status ? xml('status', {}, status) : null,\n        );\n\n        await this.xmppChatAdapter.chatConnectionService.send(stanza);\n        this.logService.debug(`occupant left room: occupantJid=${occupantJid.toString()}`);\n    }\n\n    async changeRoomSubject(roomJid: JID, subject: string): Promise<void> {\n        const from = this.xmppChatAdapter.chatConnectionService.userJid.toString();\n        await this.xmppChatAdapter.chatConnectionService.send(\n            xml('message', {to: roomJid.toString(), from, type: 'groupchat'},\n                xml('subject', {}, subject),\n            ),\n        );\n        this.logService.debug(`room subject changed: roomJid=${roomJid.toString()}, new subject=${subject}`);\n    }\n\n    isRoomInvitationStanza(stanza: Stanza): boolean {\n        let x: Element | undefined;\n        return stanza.name === 'message'\n            && (x = stanza.getChild('x', mucUserNs)) != null\n            && (x.getChild('invite') != null || x.getChild('decline') != null);\n    }\n\n    async grantMembership(userJid: JID, roomJid: JID, reason?: string) {\n        await this.setAffiliation(userJid, roomJid, Affiliation.member, reason);\n    }\n\n    async revokeMembership(userJid: JID, roomJid: JID, reason?: string) {\n        await this.setAffiliation(userJid, roomJid, Affiliation.none, reason);\n    }\n\n    async grantAdmin(userJid: JID, roomJid: JID, reason?: string) {\n        await this.setAffiliation(userJid, roomJid, Affiliation.admin, reason);\n    }\n\n    async revokeAdmin(userJid: JID, roomJid: JID, reason?: string) {\n        await this.setAffiliation(userJid, roomJid, Affiliation.member, reason);\n    }\n\n    async grantModeratorStatus(occupantNick: string, roomJid: JID, reason?: string) {\n        await this.setRole(occupantNick, roomJid, Role.moderator, reason);\n    }\n\n    async revokeModeratorStatus(occupantNick: string, roomJid: JID, reason?: string) {\n        await this.setRole(occupantNick, roomJid, Role.participant, reason);\n    }\n\n    private isRoomPresenceStanza(stanza: Stanza): boolean {\n        return stanza.name === 'presence' && (\n            stanza.getChild('x', mucNs)\n            || stanza.getChild('x', mucUserNs)\n        ) != null;\n    }\n\n    private handleRoomPresenceStanza(stanza: Stanza): boolean {\n        const stanzaType = stanza.attrs.type;\n\n        if (stanzaType === 'error') {\n            this.logService.error(stanza);\n            throw new Error('error handling message, stanza: ' + stanza);\n        }\n\n        const occupantJid = parseJid(stanza.attrs.from);\n        const roomJid = occupantJid.bare();\n\n        const xEl = stanza.getChild('x', mucUserNs);\n\n        const itemEl = xEl.getChild('item');\n        const subjectOccupant: RoomOccupant = {\n            occupantJid,\n            affiliation: itemEl.attrs.affiliation,\n            role: itemEl.attrs.role,\n            nick: occupantJid.resource,\n        };\n\n        const room = this.getOrCreateRoom(occupantJid);\n        const statusCodes: string[] = xEl.getChildren('status').map(status => status.attrs.code);\n        const isCurrenUser = statusCodes.includes('110');\n        if (stanzaType === 'unavailable') {\n            const actor = itemEl.getChild('actor')?.attrs.nick;\n            const reason = itemEl.getChild('reason')?.getText();\n\n            if (statusCodes.includes('333')) {\n                if (isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue().filter(r => !r.jidBare.equals(roomJid)));\n                }\n                return room.handleOccupantConnectionError(subjectOccupant, isCurrenUser);\n            } else if (statusCodes.includes('307')) {\n                if (isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue().filter(r => !r.jidBare.equals(roomJid)));\n                }\n                return room.handleOccupantKicked(subjectOccupant, isCurrenUser, actor, reason);\n            } else if (statusCodes.includes('301')) {\n                if (isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue().filter(r => !r.jidBare.equals(roomJid)));\n                }\n                return room.handleOccupantBanned(subjectOccupant, isCurrenUser, actor, reason);\n            } else if (statusCodes.includes('303')) {\n                const handled = room.handleOccupantChangedNick(subjectOccupant, isCurrenUser, xEl.getChild('item').attrs.nick);\n                if (handled && isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue());\n                }\n                return handled;\n            } else if (statusCodes.includes('321')) {\n                if (isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue().filter(r => !r.jidBare.equals(roomJid)));\n                }\n                return room.handleOccupantLostMembership(subjectOccupant, isCurrenUser);\n            } else {\n                if (isCurrenUser) {\n                    this.rooms$.next(this.rooms$.getValue().filter(r => !r.jidBare.equals(roomJid)));\n                }\n                return room.handleOccupantLeft(subjectOccupant, isCurrenUser);\n            }\n        } else if (!stanzaType) {\n            if (room.hasOccupant(subjectOccupant.occupantJid)) {\n                const oldOccupant = room.getOccupant(subjectOccupant.occupantJid);\n                return room.handleOccupantModified(subjectOccupant, oldOccupant, isCurrenUser);\n            } else {\n                return room.handleOccupantJoined(subjectOccupant, isCurrenUser);\n            }\n        }\n\n        return false;\n    }\n\n    private getOrCreateRoom(roomJid: JID): Room {\n        roomJid = roomJid.bare();\n        let room = this.getRoomByJid(roomJid);\n        if (!room) {\n            room = new Room(roomJid, this.logService);\n            this.rooms$.next([room, ...this.rooms$.getValue()]);\n        }\n        return room;\n    }\n\n    private async joinRoomInternal(roomJid: JID): Promise<{ presenceResponse: Stanza, room: Room }> {\n        if (this.getRoomByJid(roomJid.bare())) {\n            throw new Error('can not join room more than once: ' + roomJid.bare().toString());\n        }\n        const userJid = this.xmppChatAdapter.chatConnectionService.userJid;\n        const occupantJid = parseJid(roomJid.local, roomJid.domain, roomJid.resource || userJid.local);\n\n        let roomInfo: Form | null = null;\n        try {\n            roomInfo = await this.getRoomInfo(occupantJid.bare());\n        } catch (e) {\n            if (!(e instanceof XmppResponseError) || e.errorCondition !== 'item-not-found') {\n                throw e;\n            }\n        }\n\n        try {\n            const presenceResponse = await this.xmppChatAdapter.chatConnectionService.sendAwaitingResponse(\n                xml('presence', {to: occupantJid.toString()},\n                    xml('x', {xmlns: mucNs}),\n                ),\n            );\n            this.handleRoomPresenceStanza(presenceResponse);\n\n            const room = this.getOrCreateRoom(occupantJid.bare());\n            room.nick = occupantJid.resource;\n            if (roomInfo) {\n                room.name = getField(roomInfo, 'muc#roomconfig_roomname')?.value as string | undefined;\n                room.description = getField(roomInfo, 'muc#roominfo_description')?.value as string | undefined || '';\n            }\n\n            return {presenceResponse, room};\n        } catch (e) {\n            this.logService.error('error joining room', e);\n            throw e;\n        }\n    }\n\n    private extractRoomSummariesFromResponse(iq: IqResponseStanza): RoomSummary[] {\n        return iq\n            .getChild('query', ServiceDiscoveryPlugin.DISCO_ITEMS)\n            ?.getChildren('item')\n            ?.reduce<RoomSummary[]>((acc, item) => {\n                const {jid, name} = item.attrs;\n\n                if (typeof jid === 'string' && typeof name === 'string') {\n                    acc.push({\n                        jid: parseJid(jid),\n                        name,\n                        roomInfo: null,\n                    });\n                }\n\n                return acc;\n            }, []) || [];\n    }\n\n    private extractResultSetFromResponse(iq: IqResponseStanza): Stanza {\n        return iq\n            .getChild('query', ServiceDiscoveryPlugin.DISCO_ITEMS)\n            ?.getChild('set', 'http://jabber.org/protocol/rsm') as Stanza;\n    }\n\n    private isRoomMessageStanza(stanza: Stanza): boolean {\n        return stanza.name === 'message' && stanza.attrs.type === 'groupchat' && !!stanza.getChildText('body')?.trim();\n    }\n\n    private handleRoomMessageStanza(messageStanza: Stanza, archiveDelayElement?: Stanza): boolean {\n        const delayElement = archiveDelayElement ?? messageStanza.getChild('delay');\n        const datetime = delayElement?.attrs.stamp\n            ? new Date(delayElement.attrs.stamp)\n            : new Date() /* TODO: replace with entity time plugin */;\n\n        const from = parseJid(messageStanza.attrs.from);\n        const room = this.getRoomByJid(from.bare());\n        if (!room) {\n            // there are several reasons why we can receive a message for an unknown room:\n            // - this is a message delivered via MAM/MUCSub but the room it was stored for\n            //   - is gone (was destroyed)\n            //   - user was banned from room\n            //   - room wasn't joined yet\n            // - this is some kind of error on developer's side\n            this.logService.warn(`received stanza for unknown room: ${from.bare().toString()}`);\n            return false;\n        }\n\n        const message: RoomMessage = {\n            body: messageStanza.getChildText('body').trim(),\n            datetime,\n            id: messageStanza.attrs.id,\n            from,\n            direction: from.equals(room.occupantJid) ? Direction.out : Direction.in,\n            delayed: !!delayElement,\n            fromArchive: archiveDelayElement != null,\n        };\n\n        const messageReceivedEvent = new MessageReceivedEvent();\n        for (const plugin of this.xmppChatAdapter.plugins) {\n            plugin.afterReceiveMessage(message, messageStanza, messageReceivedEvent);\n        }\n        if (!messageReceivedEvent.discard) {\n            room.addMessage(message);\n        }\n\n        if (!message.delayed) {\n            this.message$.next(room);\n        }\n\n        return true;\n    }\n\n    private isRoomSubjectStanza(stanza: Stanza): boolean {\n        return stanza.name === 'message'\n            && stanza.attrs.type === 'groupchat'\n            && stanza.getChild('subject') != null\n            && stanza.getChild('body') == null;\n    }\n\n    private handleRoomSubjectStanza(stanza: Stanza, archiveDelayElement: Stanza): boolean {\n        const roomJid = parseJid(stanza.attrs.from).bare();\n        const room = this.getRoomByJid(roomJid);\n\n        if (!room) {\n            throw new Error(`unknown room trying to change room subject: roomJid=${roomJid.toString()}`);\n        }\n\n        // The archive only stores non-empty subjects. The current value of the subject is sent directly after entering a room by the room,\n        // not the archive.\n        // If a subject was first set, then unset, we would first receive the empty subject on room entry and then overwrite it with the\n        // previous non-empty value from archive. This is why we want to always ignore subjects from archive.\n        // This actually looks like a bug in MAM, it seems that MAM interprets messages with just subject in them as if they were chat\n        // messages and not room metadata. This would explain why empty subjects are not stored.\n        if (archiveDelayElement) {\n            return true;\n        }\n\n        room.subject = stanza.getChild('subject').getText().trim();\n        this.rooms$.next(this.rooms$.getValue());\n\n        return true;\n    }\n\n    private handleRoomInvitationStanza(stanza: Stanza): boolean {\n        const xEl = stanza.getChild('x', mucUserNs);\n        const invitationEl = xEl.getChild('invite') ?? xEl.getChild('decline');\n\n        this.onInvitationSubject.next({\n            type: invitationEl.name as Invitation['type'],\n            roomJid: parseJid(stanza.attrs.from),\n            roomPassword: xEl.getChild('password')?.getText(),\n            from: parseJid(invitationEl.attrs.from),\n            message: invitationEl.getChild('reason')?.getText(),\n        });\n\n        return true;\n    }\n\n    private async setAffiliation(occupantJid: JID, roomJid: JID, affiliation: Affiliation, reason?: string): Promise<IqResponseStanza> {\n        const userJid = await this.getUserJidByOccupantJid(occupantJid, roomJid);\n\n        return await this.modifyAffiliationOrRole(roomJid, {userJid, affiliation, reason});\n    }\n\n    private async setRole(occupantNick: string, roomJid: JID, role: Role, reason?: string): Promise<IqResponseStanza> {\n        return await this.modifyAffiliationOrRole(roomJid, {nick: occupantNick, role, reason});\n    }\n\n    private async getUserJidByOccupantJid(occupantJid: JID, roomJid: JID): Promise<JID> {\n        const users = await this.queryUserList(roomJid);\n        return users.find(roomUser => roomUser.userIdentifiers.find(\n            ids => ids.nick === occupantJid.resource || ids.userJid.bare().equals(occupantJid.bare())),\n        )?.userIdentifiers?.[0].userJid;\n    }\n}\n","export enum ContactSubscription {\n\n    to = 'to',\n    from = 'from',\n    both = 'both',\n    none = 'none'\n\n}\n","import { jid as parseJid, xml } from '@xmpp/client';\nimport { Contact } from '../../../../core/contact';\nimport { Presence } from '../../../../core/presence';\nimport { PresenceStanza, Stanza } from '../../../../core/stanza';\nimport { ContactSubscription } from '../../../../core/subscription';\nimport { LogService } from '../../../log.service';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\n\n/**\n * https://xmpp.org/rfcs/rfc6121.html#roster-add-success\n */\nexport class RosterPlugin extends AbstractXmppPlugin {\n\n    constructor(\n        private chatService: XmppChatAdapter,\n        private logService: LogService,\n    ) {\n        super();\n    }\n\n    handleStanza(stanza: Stanza) {\n        if (this.isCapabilitiesStanza(stanza)) {\n            return false;\n        }\n        if (this.isRosterPushStanza(stanza)) {\n            return this.handleRosterPushStanza(stanza);\n        } else if (this.isPresenceStanza(stanza)) {\n            return this.handlePresenceStanza(stanza);\n        }\n        return false;\n    }\n\n    private isRosterPushStanza(stanza: Stanza) {\n        return stanza.name === 'iq'\n            && stanza.attrs.type === 'set'\n            && stanza.getChild('query', 'jabber:iq:roster');\n    }\n\n    private isPresenceStanza(stanza: Stanza): stanza is PresenceStanza {\n        return stanza.name === 'presence' && !stanza.getChild('x', 'http://jabber.org/protocol/muc#user');\n    }\n\n    private isCapabilitiesStanza(stanza: Stanza) {\n        const child = stanza.getChild('c', 'http://jabber.org/protocol/caps');\n        return !!child;\n    }\n\n    private handleRosterPushStanza(stanza: Stanza) {\n\n        // TODO:\n        // Security Warning: Traditionally, a roster push included no 'from' address, with the result that all roster pushes were sent\n        // implicitly from the bare JID of the account itself. However, this specification allows entities other than the user's server\n        // to maintain roster information, which means that a roster push might include a 'from' address other than the bare JID of the\n        // user's account. Therefore, the client MUST check the 'from' address to verify that the sender of the roster push is authorized\n        // to update the roster. If the client receives a roster push from an unauthorized entity, it MUST NOT process the pushed data; in\n        // addition, the client can either return a stanza error of <service-unavailable/> error or refuse to return a stanza error at all\n        // (the latter behavior overrides a MUST-level requirement from [XMPP‑CORE] for the purpose of preventing a presence leak).\n\n        const itemChild = stanza.getChild('query').getChild('item');\n        const contact = this.chatService.getOrCreateContactById(itemChild.attrs.jid, itemChild.attrs.name || itemChild.attrs.jid);\n        contact.pendingOut$.next(itemChild.attrs.ask === 'subscribe');\n        const subscriptionStatus = itemChild.attrs.subscription || 'none';\n\n        this.chatService.chatConnectionService.sendIqAckResult(stanza.attrs.id);\n\n        let handled = false;\n\n        if (subscriptionStatus === 'remove') {\n            contact.pendingOut$.next(false);\n            contact.subscription$.next(ContactSubscription.none);\n            handled = true;\n        } else if (subscriptionStatus === 'none') {\n            contact.subscription$.next(ContactSubscription.none);\n            handled = true;\n        } else if (subscriptionStatus === 'to') {\n            contact.subscription$.next(ContactSubscription.to);\n            handled = true;\n        } else if (subscriptionStatus === 'from') {\n            contact.subscription$.next(ContactSubscription.from);\n            handled = true;\n        } else if (subscriptionStatus === 'both') {\n            contact.subscription$.next(ContactSubscription.both);\n            handled = true;\n        }\n\n        if (handled) {\n            const existingContacts = this.chatService.contacts$.getValue();\n            this.chatService.contacts$.next(existingContacts);\n        }\n\n        return handled;\n    }\n\n    private handlePresenceStanza(stanza: PresenceStanza) {\n        const fromAsContact = this.chatService.getOrCreateContactById(stanza.attrs.from);\n        const isAddressedToMe = this.chatService.chatConnectionService.userJid.bare().equals(parseJid(stanza.attrs.to).bare());\n        if (isAddressedToMe) {\n            if (!stanza.attrs.type) {\n                // https://xmpp.org/rfcs/rfc3921.html#stanzas-presence-children-show\n                const show = stanza.getChildText('show');\n                const presenceMapping: { [key: string]: Presence } = {\n                    chat: Presence.present,\n                    null: Presence.present,\n                    away: Presence.away,\n                    dnd: Presence.away,\n                    xa: Presence.away,\n                };\n                const presence = presenceMapping[show];\n                if (presence) {\n                    fromAsContact.updateResourcePresence(stanza.attrs.from, presence);\n                } else {\n                    this.logService.error('illegal presence:', stanza.attrs.from, show);\n                }\n                return true;\n            } else if (stanza.attrs.type === 'unavailable') {\n                fromAsContact.updateResourcePresence(stanza.attrs.from, Presence.unavailable);\n                return true;\n            } else if (stanza.attrs.type === 'subscribe') {\n                if (fromAsContact.isSubscribed() || fromAsContact.pendingOut$.getValue()) {\n                    // subscriber is already a contact of us, approve subscription\n                    fromAsContact.pendingIn$.next(false);\n                    this.sendAcceptPresenceSubscriptionRequest(stanza.attrs.from);\n                    fromAsContact.subscription$.next(\n                        this.transitionSubscriptionRequestReceivedAccepted(fromAsContact.subscription$.getValue()));\n                    this.chatService.contacts$.next(this.chatService.contacts$.getValue());\n                    return true;\n                } else if (fromAsContact) {\n                    // subscriber is known but not subscribed or pending\n                    fromAsContact.pendingIn$.next(true);\n                    this.chatService.contacts$.next(this.chatService.contacts$.getValue());\n                    return true;\n                }\n            } else if (stanza.attrs.type === 'subscribed') {\n                fromAsContact.pendingOut$.next(false);\n                fromAsContact.subscription$.next(this.transitionSubscriptionRequestSentAccepted(fromAsContact.subscription$.getValue()));\n                this.chatService.contacts$.next(this.chatService.contacts$.getValue());\n                return true;\n            } else if (stanza.attrs.type === 'unsubscribed') {\n                // TODO: handle unsubscribed\n            } else if (stanza.attrs.type === 'unsubscribe') {\n                // TODO: handle unsubscribe\n            }\n        }\n        return false;\n    }\n\n    private transitionSubscriptionRequestReceivedAccepted(subscription: ContactSubscription) {\n        switch (subscription) {\n            case ContactSubscription.none:\n                return ContactSubscription.from;\n            case ContactSubscription.to:\n                return ContactSubscription.both;\n            default:\n                return subscription;\n        }\n    }\n\n    private transitionSubscriptionRequestSentAccepted(subscription: ContactSubscription) {\n        switch (subscription) {\n            case ContactSubscription.none:\n                return ContactSubscription.to;\n            case ContactSubscription.from:\n                return ContactSubscription.both;\n            default:\n                return subscription;\n        }\n    }\n\n    private sendAcceptPresenceSubscriptionRequest(jid: string) {\n        const contact = this.chatService.getOrCreateContactById(jid);\n        contact.pendingIn$.next(false);\n        this.chatService.chatConnectionService.send(\n            xml('presence', {to: jid, type: 'subscribed', id: this.chatService.chatConnectionService.getNextRequestId()}),\n        );\n    }\n\n    public onBeforeOnline(): PromiseLike<any> {\n        return this.refreshRosterContacts();\n    }\n\n    getRosterContacts(): Promise<Contact[]> {\n        return new Promise((resolve) =>\n            this.chatService.chatConnectionService.sendIq(\n                xml('iq', {type: 'get'},\n                    xml('query', {xmlns: 'jabber:iq:roster'}),\n                ),\n            ).then(\n                (responseStanza: Stanza) => resolve(this.convertToContacts(responseStanza)),\n                (responseStanza: Stanza) => {\n                    this.logService.error('error converting roster contact push', responseStanza.toString());\n                    resolve([]);\n                },\n            ),\n        );\n    }\n\n    private convertToContacts(responseStanza: Stanza): Contact[] {\n        return responseStanza.getChild('query').getChildElements()\n            .map(rosterElement => {\n                const contact = this.chatService.getOrCreateContactById(rosterElement.attrs.jid,\n                    rosterElement.attrs.name || rosterElement.attrs.jid);\n                contact.subscription$.next(this.parseSubscription(rosterElement.attrs.subscription));\n                contact.pendingOut$.next(rosterElement.attrs.ask === 'subscribe');\n                return contact;\n            });\n    }\n\n    private parseSubscription(subscription: string): ContactSubscription {\n        switch (subscription) {\n            case 'to':\n                return ContactSubscription.to;\n            case 'from':\n                return ContactSubscription.from;\n            case 'both':\n                return ContactSubscription.both;\n            case 'none':\n            default:\n                return ContactSubscription.none;\n        }\n    }\n\n    addRosterContact(jid: string): void {\n        this.sendAcceptPresenceSubscriptionRequest(jid);\n        this.sendAddToRoster(jid);\n        this.sendSubscribeToPresence(jid);\n    }\n\n    private sendAddToRoster(jid: string) {\n        return this.chatService.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('query', {xmlns: 'jabber:iq:roster'},\n                    xml('item', {jid}))));\n    }\n\n    private sendSubscribeToPresence(jid: string) {\n        this.chatService.chatConnectionService.send(\n            xml('presence', {id: this.chatService.chatConnectionService.getNextRequestId(), to: jid, type: 'subscribe'}),\n        );\n    }\n\n    removeRosterContact(jid: string): void {\n        const contact = this.chatService.getContactById(jid);\n        if (contact) {\n            contact.subscription$.next(ContactSubscription.none);\n            contact.pendingOut$.next(false);\n            contact.pendingIn$.next(false);\n            this.sendRemoveFromRoster(jid);\n            this.sendWithdrawPresenceSubscription(jid);\n        }\n    }\n\n    private sendRemoveFromRoster(jid: string) {\n        this.chatService.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('query', {xmlns: 'jabber:iq:roster'},\n                    xml('item', {jid, subscription: 'remove'}))));\n    }\n\n    private sendWithdrawPresenceSubscription(jid: string) {\n        this.chatService.chatConnectionService.send(\n            xml('presence', {id: this.chatService.chatConnectionService.getNextRequestId(), to: jid, type: 'unsubscribed'}),\n        );\n    }\n\n    refreshRosterContacts() {\n        return this.getRosterContacts();\n    }\n}\n","import { Injectable } from '@angular/core';\n\nexport enum LogLevel {\n    Disabled = 0,\n    Error,\n    Warn,\n    Info,\n    Debug,\n}\n\n@Injectable()\nexport class LogService {\n\n    public logLevel = LogLevel.Info;\n    public writer = console;\n    public messagePrefix = () => 'ChatService:';\n\n    public error(...messages: any[]) {\n        if (this.logLevel >= LogLevel.Error) {\n            this.writer.error(this.messagePrefix(), ...messages);\n        }\n    }\n\n    public warn(...messages: any[]) {\n        if (this.logLevel >= LogLevel.Warn) {\n            this.writer.warn(this.messagePrefix(), ...messages);\n        }\n    }\n\n    public info(...messages: any[]) {\n        if (this.logLevel >= LogLevel.Info) {\n            this.writer.info(this.messagePrefix(), ...messages);\n        }\n    }\n\n    public debug(...messages: any[]) {\n        if (this.logLevel >= LogLevel.Debug) {\n            this.writer.debug(this.messagePrefix(), ...messages);\n        }\n    }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Client, client } from '@xmpp/client';\nimport { LogInRequest } from '../../../core/log-in-request';\n\n@Injectable()\nexport class XmppClientFactoryService {\n\n    client(logInRequest: LogInRequest): Client {\n        return client(logInRequest);\n    }\n\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Client, xml } from '@xmpp/client';\nimport { JID } from '@xmpp/jid';\nimport { Element } from 'ltx';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { LogInRequest } from '../../../core/log-in-request';\nimport { IqResponseStanza, Stanza } from '../../../core/stanza';\nimport { LogService } from '../../log.service';\nimport { XmppResponseError } from './xmpp-response.error';\nimport { XmppClientFactoryService } from './xmpp-client-factory.service';\n\nexport type XmppChatStates = 'disconnected' | 'online' | 'reconnecting';\n\n/**\n * Implementation of the XMPP specification according to RFC 6121.\n * @see https://xmpp.org/rfcs/rfc6121.html\n * @see https://xmpp.org/rfcs/rfc3920.html\n * @see https://xmpp.org/rfcs/rfc3921.html\n */\n@Injectable()\nexport class XmppChatConnectionService {\n\n    public readonly state$ = new BehaviorSubject<XmppChatStates>('disconnected');\n    public readonly stanzaUnknown$ = new Subject<Stanza>();\n\n    /**\n     * User JID with resource, not bare.\n     */\n    public userJid?: JID;\n    private requestId = new Date().getTime();\n    private readonly stanzaResponseHandlers = new Map<string, [(stanza: Stanza) => void, (e: Error) => void]>();\n    public client?: Client;\n\n    constructor(\n        private readonly logService: LogService,\n        private readonly ngZone: NgZone,\n        private readonly xmppClientFactoryService: XmppClientFactoryService,\n    ) {}\n\n    public onOnline(jid: JID): void {\n        this.logService.info('online =', 'online as', jid.toString());\n        this.userJid = jid;\n        this.state$.next('online');\n    }\n\n    private onOffline(): void {\n        this.stanzaResponseHandlers.forEach(([, reject]) => reject(new Error('offline')));\n        this.stanzaResponseHandlers.clear();\n    }\n\n    public async sendPresence(): Promise<void> {\n        await this.send(\n            xml('presence'),\n        );\n    }\n\n    public async send(content: any): Promise<void> {\n        this.logService.debug('>>>', content);\n        await this.client.send(content);\n    }\n\n    public sendAwaitingResponse(request: Element): Promise<Stanza> {\n        return new Promise((resolve, reject) => {\n            request.attrs = {\n                id: this.getNextRequestId(),\n                from: this.userJid.toString(),\n                ...request.attrs,\n            };\n            const {id} = request.attrs;\n\n            this.stanzaResponseHandlers.set(id, [\n                (response) => {\n                    if (response.attrs.type === 'error') {\n                        reject(new XmppResponseError(response));\n                        return;\n                    }\n\n                    resolve(response);\n                },\n                reject,\n            ]);\n\n            this.send(request).catch((e: unknown) => {\n                this.logService.error('error sending stanza', e);\n                this.stanzaResponseHandlers.delete(id);\n                reject(e);\n            });\n        });\n    }\n\n    public onStanzaReceived(stanza: Stanza): void {\n        let handled = false;\n\n        const [handleResponse] = this.stanzaResponseHandlers.get(stanza.attrs.id) ?? [];\n        if (handleResponse) {\n            this.logService.debug('<<<', stanza.toString(), 'handled by response handler');\n            this.stanzaResponseHandlers.delete(stanza.attrs.id);\n            handleResponse(stanza);\n            handled = true;\n        }\n\n        if (!handled) {\n            this.stanzaUnknown$.next(stanza);\n        }\n    }\n\n    public async sendIq(request: Element): Promise<IqResponseStanza<'result'>> {\n        const requestType: string | undefined = request.attrs.type;\n        // see https://datatracker.ietf.org/doc/html/draft-ietf-xmpp-3920bis#section-8.2.3\n        if (!requestType || (requestType !== 'get' && requestType !== 'set')) {\n            const message = `iq stanza without type: ${request.toString()}`;\n            this.logService.error(message);\n            throw new Error(message);\n        }\n\n        const response = await this.sendAwaitingResponse(request);\n        if (!this.isIqStanzaResponse(response)) {\n            throw new Error(`received unexpected stanza as iq response: type=${response.attrs.type}, stanza=${response.toString()}`);\n        }\n        return response as IqResponseStanza<'result'>;\n    }\n\n    private isIqStanzaResponse(stanza: Stanza): stanza is IqResponseStanza {\n        const stanzaType = stanza.attrs.type;\n        return stanza.name === 'iq' && (stanzaType === 'result' || stanzaType === 'error');\n    }\n\n    public async sendIqAckResult(id: string): Promise<void> {\n        await this.send(\n            xml('iq', {from: this.userJid.toString(), id, type: 'result'}),\n        );\n    }\n\n    async logIn(logInRequest: LogInRequest): Promise<void> {\n        await this.ngZone.runOutsideAngular(async () => {\n            if (logInRequest.username.indexOf('@') >= 0) {\n                this.logService.warn('username should not contain domain, only local part, this can lead to errors!');\n            }\n\n            this.client = this.xmppClientFactoryService.client(logInRequest);\n\n            this.client.on('error', (err: any) => {\n                this.ngZone.run(() => {\n                    this.logService.error('chat service error =>', err.toString(), err);\n                });\n            });\n\n            this.client.on('status', (status: any, value: any) => {\n                this.ngZone.run(() => {\n                    this.logService.info('status update =', status, value ? JSON.stringify(value) : '');\n                    if (status === 'offline') {\n                        this.state$.next('disconnected');\n                    }\n                });\n            });\n\n            this.client.on('online', (jid: JID) => {\n                return this.ngZone.run(() => {\n                    return this.onOnline(jid);\n                });\n            });\n\n            this.client.on('stanza', (stanza: Stanza) => {\n                this.ngZone.run(() => {\n                    if (this.skipXmppClientResponses(stanza)) {\n                        return;\n                    }\n                    this.onStanzaReceived(stanza);\n                });\n            });\n\n            this.client.on('disconnect', () => {\n                this.ngZone.run(() => {\n                    this.state$.next('reconnecting');\n                });\n            });\n\n            this.client.on('offline', () => {\n                this.ngZone.run(() => {\n                    this.onOffline();\n                });\n            });\n\n            await this.client.start();\n        });\n    }\n\n    /**\n     * We should skip our iq handling for the following xmpp/client response:\n     * - resource bind on start by https://xmpp.org/rfcs/rfc6120.html#bind\n     */\n    private skipXmppClientResponses(stanza: Stanza) {\n        const xmppBindNS = 'urn:ietf:params:xml:ns:xmpp-bind';\n        return stanza.getChild('bind')?.getNS() === xmppBindNS;\n    }\n\n    async logOut(): Promise<void> {\n        // TODO: move this to a presence plugin in a handler\n        this.logService.debug('logging out');\n        if (this.client) {\n            this.client.reconnect.stop();\n            try {\n                await this.send(xml('presence', {type: 'unavailable'}));\n            } catch (e) {\n                this.logService.error('error sending presence unavailable');\n            } finally {\n                this.client.stop();\n            }\n        }\n    }\n\n    getNextRequestId(): string {\n        return String(this.requestId++);\n    }\n\n    reconnectSilently(): void {\n        this.logService.warn('hard reconnect...');\n        this.state$.next('disconnected');\n    }\n}\n","import { jid as parseJid } from '@xmpp/client';\nimport { JID } from '@xmpp/jid';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { LogService } from '../services/log.service';\nimport { dummyAvatarContact } from './contact-avatar';\nimport { Message } from './message';\nimport { DateMessagesGroup, MessageStore } from './message-store';\nimport { Presence } from './presence';\nimport { isJid, Recipient } from './recipient';\nimport { ContactSubscription } from './subscription';\n\nexport interface Invitation {\n    from: JID;\n    roomJid: JID;\n    reason?: string;\n    password?: string;\n}\n\nexport interface ContactMetadata {\n    [key: string]: any;\n}\n\nexport type JidToPresence = Map<string, Presence>;\n\nexport class Contact {\n\n    readonly recipientType = 'contact';\n    avatar = dummyAvatarContact;\n    metadata: ContactMetadata = {};\n\n    /** use {@link jidBare}, jid resource is only set for chat room contacts */\n    readonly jidFull: JID;\n    readonly jidBare: JID;\n    readonly presence$ = new BehaviorSubject<Presence>(Presence.unavailable);\n    readonly subscription$ = new BehaviorSubject<ContactSubscription>(ContactSubscription.none);\n    readonly pendingOut$ = new BehaviorSubject(false);\n    readonly pendingIn$ = new BehaviorSubject(false);\n    readonly resources$ = new BehaviorSubject<JidToPresence>(new Map());\n    readonly pendingRoomInvite$ = new BehaviorSubject<null | Invitation>(null);\n\n    private readonly messageStore: MessageStore<Message>;\n\n    get messages$(): Subject<Message> {\n        return this.messageStore.messages$;\n    }\n\n    get messages(): Message[] {\n        return this.messageStore.messages;\n    }\n\n    get dateMessagesGroups(): DateMessagesGroup<Message>[] {\n        return this.messageStore.dateMessageGroups;\n    }\n\n    get oldestMessage(): Message | undefined {\n        return this.messageStore.oldestMessage;\n    }\n\n    get mostRecentMessage(): Message | undefined {\n        return this.messageStore.mostRecentMessage;\n    }\n\n    get mostRecentMessageReceived(): Message | undefined {\n        return this.messageStore.mostRecentMessageReceived;\n    }\n\n    get mostRecentMessageSent(): Message | undefined {\n        return this.messageStore.mostRecentMessageSent;\n    }\n\n    /**\n     * Do not call directly, use {@link ContactFactoryService#createContact} instead.\n     */\n    constructor(jidPlain: string,\n                public name: string,\n                logService?: LogService,\n                avatar?: string) {\n        if (avatar) {\n            this.avatar = avatar;\n        }\n        const jid = parseJid(jidPlain);\n        this.jidFull = jid;\n        this.jidBare = jid.bare();\n        this.messageStore = new MessageStore(logService);\n    }\n\n    addMessage(message: Message): void {\n        this.messageStore.addMessage(message);\n    }\n\n    equalsBareJid(other: Recipient | JID): boolean {\n        if (other instanceof Contact || isJid(other)) {\n            const otherJid = other instanceof Contact ? other.jidBare : other.bare();\n            return this.jidBare.equals(otherJid);\n        }\n        return false;\n    }\n\n    isSubscribed(): boolean {\n        const subscription = this.subscription$.getValue();\n        return subscription === ContactSubscription.both || subscription === ContactSubscription.to;\n    }\n\n    isUnaffiliated(): boolean {\n        return !this.isSubscribed() && !this.pendingIn$.getValue() && !this.pendingOut$.getValue();\n    }\n\n    updateResourcePresence(jid: string, presence: Presence): void {\n        const resources = this.resources$.getValue();\n        resources.set(jid, presence);\n        this.presence$.next(this.determineOverallPresence(resources));\n        this.resources$.next(resources);\n    }\n\n    getMessageById(id: string): Message | null {\n        return this.messageStore.messageIdToMessage.get(id);\n    }\n\n    private determineOverallPresence(jidToPresence: JidToPresence): Presence {\n        let result = Presence.unavailable;\n\n        [...jidToPresence.values()].some((presence) => {\n            if (presence === Presence.present) {\n                result = presence;\n                return true;\n            } else if (presence === Presence.away) {\n                result = Presence.away;\n            }\n            return false;\n        });\n\n        return result;\n    }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Contact } from '../core/contact';\nimport { LogService } from './log.service';\n\n@Injectable()\nexport class ContactFactoryService {\n\n    constructor(private logService: LogService) { }\n\n    createContact(jidPlain: string,\n                  name?: string,\n                  avatar?: string) {\n        if (!name) {\n            name = jidPlain;\n        }\n        return new Contact(jidPlain, name, this.logService, avatar);\n    }\n\n}\n","import { Injectable } from '@angular/core';\nimport { jid as parseJid } from '@xmpp/client';\nimport { BehaviorSubject, combineLatest, merge, Observable, Subject } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { Contact } from '../../../core/contact';\nimport { dummyAvatarContact } from '../../../core/contact-avatar';\nimport { LogInRequest } from '../../../core/log-in-request';\nimport { ChatPlugin } from '../../../core/plugin';\nimport { Recipient } from '../../../core/recipient';\nimport { Stanza } from '../../../core/stanza';\nimport { Translations } from '../../../core/translations';\nimport { defaultTranslations } from '../../../core/translations-default';\nimport { ChatService, ConnectionStates } from '../../chat-service';\nimport { ContactFactoryService } from '../../contact-factory.service';\nimport { LogService } from '../../log.service';\nimport { MessageArchivePlugin } from './plugins/message-archive.plugin';\nimport { MessagePlugin } from './plugins/message.plugin';\nimport { MultiUserChatPlugin } from './plugins/multi-user-chat/multi-user-chat.plugin';\nimport { RosterPlugin } from './plugins/roster.plugin';\nimport { XmppChatConnectionService, XmppChatStates } from './xmpp-chat-connection.service';\n\n\nexport interface ChatAction<TChatWindow> {\n    cssClass: { [className: string]: boolean } | string | string[];\n    /**\n     * to identify actions\n     */\n    id: string;\n    html: string;\n\n    onClick(chatActionContext: ChatActionContext<TChatWindow>): void;\n}\n\nexport interface ChatActionContext<TChatWindow> {\n    contact: string;\n    chatWindow: TChatWindow;\n}\n\n\n@Injectable()\nexport class XmppChatAdapter implements ChatService {\n\n    readonly message$ = new Subject<Contact>();\n    readonly messageSent$: Subject<Contact> = new Subject();\n\n    readonly contacts$ = new BehaviorSubject<Contact[]>([]);\n    readonly contactCreated$ = new Subject<Contact>();\n\n    readonly blockedContactIds$ = new BehaviorSubject<Set<string>>(new Set<string>());\n    readonly blockedContacts$ = combineLatest([this.contacts$, this.blockedContactIds$])\n        .pipe(\n            map(\n                ([contacts, blockedJids]) =>\n                    contacts.filter(contact => blockedJids.has(contact.jidBare.toString())),\n            ),\n        );\n    readonly notBlockedContacts$ = combineLatest([this.contacts$, this.blockedContactIds$])\n        .pipe(\n            map(\n                ([contacts, blockedJids]) =>\n                    contacts.filter(contact => !blockedJids.has(contact.jidBare.toString())),\n            ),\n        );\n    readonly contactsSubscribed$: Observable<Contact[]> = this.notBlockedContacts$.pipe(\n        map(contacts => contacts.filter(contact => contact.isSubscribed())));\n    readonly contactRequestsReceived$: Observable<Contact[]> = this.notBlockedContacts$.pipe(\n        map(contacts => contacts.filter(contact => contact.pendingIn$.getValue())));\n    readonly contactRequestsSent$: Observable<Contact[]> = this.notBlockedContacts$.pipe(\n        map(contacts => contacts.filter(contact => contact.pendingOut$.getValue())));\n    readonly contactsUnaffiliated$: Observable<Contact[]> = this.notBlockedContacts$.pipe(\n        map(contacts => contacts.filter(contact => contact.isUnaffiliated() && contact.messages.length > 0)));\n    readonly state$ = new BehaviorSubject<ConnectionStates>('disconnected');\n    readonly plugins: ChatPlugin[] = [];\n    enableDebugging = false;\n    readonly userAvatar$ = new BehaviorSubject(dummyAvatarContact);\n    translations: Translations = defaultTranslations();\n\n    chatActions = [{\n        id: 'sendMessage',\n        cssClass: 'chat-window-send',\n        html: '&raquo;',\n        onClick: (chatActionContext: ChatActionContext<{ sendMessage: () => void }>) => {\n            chatActionContext.chatWindow.sendMessage();\n        },\n    }];\n\n    private lastLogInRequest: LogInRequest;\n\n    constructor(\n        public chatConnectionService: XmppChatConnectionService,\n        private logService: LogService,\n        private contactFactory: ContactFactoryService,\n    ) {\n        this.state$.subscribe((state) => this.logService.info('state changed to:', state));\n        chatConnectionService.state$\n            .pipe(filter(nextState => nextState !== this.state$.getValue()))\n            .subscribe((nextState) => {\n                this.handleInternalStateChange(nextState);\n            });\n        this.chatConnectionService.stanzaUnknown$.subscribe((stanza) => this.onUnknownStanza(stanza));\n\n        merge(this.messageSent$, this.message$).subscribe(() => {\n            // re-emit contacts when sending or receiving a message to refresh contact groups\n            // if the sending contact was in 'other', he still is in other now, but passes the 'messages.length > 0' predicate, so that\n            // he should be seen now.\n            this.contacts$.next(this.contacts$.getValue());\n        });\n    }\n\n    private handleInternalStateChange(newState: XmppChatStates) {\n        if (newState === 'online') {\n            this.state$.next('connecting');\n            Promise\n                .all(this.plugins.map(plugin => plugin.onBeforeOnline()))\n                .catch((e) => this.logService.error('error while connecting', e))\n                .finally(() => this.announceAvailability());\n        } else {\n            if (this.state$.getValue() === 'online') {\n                // clear data the first time we transition to a not-online state\n                this.onOffline();\n            }\n            this.state$.next('disconnected');\n        }\n    }\n\n    private onOffline() {\n        this.contacts$.next([]);\n        this.plugins.forEach(plugin => {\n            try {\n                plugin.onOffline();\n            } catch (e) {\n                this.logService.error('error while handling offline in ', plugin);\n            }\n        });\n    }\n\n    private announceAvailability() {\n        this.logService.info('announcing availability');\n        this.chatConnectionService.sendPresence();\n        this.state$.next('online');\n    }\n\n    addPlugins(plugins: ChatPlugin[]) {\n        plugins.forEach(plugin => {\n            this.plugins.push(plugin);\n        });\n    }\n\n    reloadContacts(): void {\n        this.getPlugin(RosterPlugin).refreshRosterContacts();\n    }\n\n    getContactById(jidPlain: string) {\n        const bareJidToFind = parseJid(jidPlain).bare();\n        return this.contacts$.getValue().find(contact => contact.jidBare.equals(bareJidToFind));\n    }\n\n    getOrCreateContactById(jidPlain: string, name?: string) {\n        let contact = this.getContactById(jidPlain);\n        if (!contact) {\n            contact = this.contactFactory.createContact(parseJid(jidPlain).bare().toString(), name);\n            this.contacts$.next([contact, ...this.contacts$.getValue()]);\n            this.contactCreated$.next(contact);\n        }\n        return contact;\n    }\n\n    addContact(identifier: string) {\n        this.getPlugin(RosterPlugin).addRosterContact(identifier);\n    }\n\n    removeContact(identifier: string) {\n        this.getPlugin(RosterPlugin).removeRosterContact(identifier);\n    }\n\n    async logIn(logInRequest: LogInRequest) {\n        this.lastLogInRequest = logInRequest;\n        if (this.state$.getValue() === 'disconnected') {\n            await this.chatConnectionService.logIn(logInRequest);\n        }\n    }\n\n    logOut(): Promise<void> {\n        return this.chatConnectionService.logOut();\n    }\n\n    async sendMessage(recipient: Recipient, body: string) {\n        const trimmedBody = body.trim();\n        if (trimmedBody.length === 0) {\n            return;\n        }\n        switch (recipient.recipientType) {\n            case 'room':\n                await this.getPlugin(MultiUserChatPlugin).sendMessage(recipient, trimmedBody);\n                break;\n            case 'contact':\n                this.getPlugin(MessagePlugin).sendMessage(recipient, trimmedBody);\n                this.messageSent$.next(recipient);\n                break;\n            default:\n                throw new Error('invalid recipient type: ' + (recipient as any)?.recipientType);\n        }\n    }\n\n    loadCompleteHistory() {\n        return this.getPlugin(MessageArchivePlugin).loadAllMessages();\n    }\n\n    getPlugin<T extends ChatPlugin>(constructor: new(...args: any[]) => T): T {\n        for (const plugin of this.plugins) {\n            if (plugin.constructor === constructor) {\n                return plugin as T;\n            }\n        }\n        throw new Error('plugin not found: ' + constructor);\n    }\n\n    private onUnknownStanza(stanza: Stanza) {\n\n        let handled = false;\n\n        for (const plugin of this.plugins) {\n            try {\n                if (plugin.handleStanza(stanza)) {\n                    this.logService.debug(plugin.constructor.name, 'handled', stanza.toString());\n                    handled = true;\n                }\n            } catch (e) {\n                this.logService.error('error handling stanza in ', plugin.constructor.name, e);\n            }\n        }\n\n        if (!handled) {\n            this.logService.warn('unknown stanza <=', stanza.toString());\n        }\n\n    }\n\n    reconnectSilently(): void {\n        this.chatConnectionService.reconnectSilently();\n    }\n\n    reconnect() {\n        return this.logIn(this.lastLogInRequest);\n    }\n\n}\n","import { InjectionToken } from '@angular/core';\nimport { Recipient } from '../core/recipient';\n\n/**\n * Optional injectable token to handle contact clicks in the chat\n */\nexport const CONTACT_CLICK_HANDLER_TOKEN = new InjectionToken<ChatContactClickHandler>('ngxChatContactClickHandler');\n\nexport interface ChatContactClickHandler {\n\n    onClick(contact: Recipient): void;\n\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n    selector: 'ngx-chat-avatar',\n    templateUrl: './chat-avatar.component.html',\n    styleUrls: ['./chat-avatar.component.less'],\n})\nexport class ChatAvatarComponent {\n\n    @Input()\n    imageUrl: string;\n\n}\n","<div class=\"chat-avatar\" [ngStyle]=\"{backgroundImage: 'url(' + imageUrl + ')'}\"></div>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Direction, MessageState } from '../../core/message';\n\n@Component({\n    selector: 'ngx-chat-message-simple',\n    templateUrl: './chat-message-simple.component.html',\n    styleUrls: ['./chat-message-simple.component.less'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ChatMessageSimpleComponent {\n\n    @Input()\n    avatar?: string;\n\n    @Output()\n    avatarClickHandler = new EventEmitter<void>();\n\n    @Input()\n    avatarInteractive: boolean;\n\n    @Input()\n    direction: Direction;\n\n    @Input()\n    formattedDate: string;\n\n    @Input()\n    footerHidden = false;\n\n    @Input()\n    mediaLink: string;\n\n    @Input()\n    isImage: boolean;\n\n    @Input()\n    isAudio: boolean;\n\n    @Input()\n    showImagePlaceholder: boolean;\n\n    @Input()\n    messageState: MessageState;\n\n    @Input()\n    nick?: string;\n\n    MessageState = MessageState;\n\n}\n","<div class=\"chat-message\" [class.chat-message--in]=\"direction === 'in'\" [class.chat-message--out]=\"direction === 'out'\">\n    <div class=\"chat-message-text-wrapper\">\n        <div *ngIf=\"avatar\" class=\"chat-message-avatar\">\n            <ngx-chat-avatar [class.has-click-handler]=\"avatarInteractive\" (click)=\"avatarClickHandler.emit()\"\n                             [imageUrl]=\"avatar\"></ngx-chat-avatar>\n        </div>\n        <div class=\"chat-message-text\">\n            <ng-content></ng-content>\n        </div>\n    </div>\n    <div class=\"chat-message-image-wrapper\" *ngIf=\"isImage\"\n         [class.chat-message-image-wrapper--placeholder]=\"showImagePlaceholder\">\n        <img class=\"chat-message-image\" (load)=\"showImagePlaceholder = false\" [src]=\"mediaLink\"/>\n    </div>\n    <audio controls *ngIf=\"isAudio\">\n        <source [src]=\"mediaLink\" type=\"audio/mpeg\">\n    </audio>\n    <div class=\"chat-message-footer\" *ngIf=\"!footerHidden\">\n        <small title=\"{{nick}}\" class=\"chat-message-name\">\n            {{nick}}\n            <ng-container *ngIf=\"direction === 'out'\" [ngSwitch]=\"messageState\">\n                <ng-container *ngSwitchCase=\"MessageState.SENT\">✓</ng-container>\n                <ng-container *ngSwitchCase=\"MessageState.RECIPIENT_RECEIVED\">✓✓</ng-container>\n                <ng-container *ngSwitchCase=\"MessageState.RECIPIENT_SEEN\">\n                    <span class=\"state--seen\">✓✓</span>\n                </ng-container>\n            </ng-container>\n        </small>\n        <small class=\"chat-message-datetime\">{{formattedDate}}</small>\n    </div>\n</div>\n","import { PlatformLocation } from '@angular/common';\nimport { Component, Inject, InjectionToken, Optional } from '@angular/core';\nimport { Router } from '@angular/router';\n\nexport interface LinkOpener {\n    openLink(url: string): void;\n}\n\n/**\n * You can provide your own implementation for {@link LinkOpener} to override link opening e.g. when using Cordova.\n */\nexport const LINK_OPENER_TOKEN = new InjectionToken<LinkOpener>('ngxChatLinkOpener');\n\n@Component({\n    selector: 'ngx-chat-message-link',\n    templateUrl: './chat-message-link.component.html',\n    styleUrls: ['./chat-message-link.component.less']\n})\nexport class ChatMessageLinkComponent {\n\n    link: string;\n    text: string;\n\n    constructor(private router: Router,\n                private platformLocation: PlatformLocation,\n                @Optional() @Inject(LINK_OPENER_TOKEN) private linkOpener: LinkOpener) { }\n\n   async onClick($event: Event) {\n        if (this.linkOpener) {\n            $event.preventDefault();\n            this.linkOpener.openLink(this.link);\n        } else if (this.isInApp()) {\n            $event.preventDefault();\n            const linkParser = document.createElement('a');\n            linkParser.href = this.link;\n            await this.router.navigateByUrl(linkParser.pathname);\n        }\n    }\n\n    private isInApp() {\n        return this.link.startsWith(this.appUrl());\n    }\n\n    private appUrl() {\n        return window.location.protocol + '//' + window.location.host + this.platformLocation.getBaseHrefFromDOM();\n    }\n}\n","<a href=\"{{link}}\" target=\"_blank\" rel=\"noopener\" (click)=\"onClick($event)\">{{text}}</a>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n    selector: 'ngx-chat-message-text',\n    template: `{{text}}`,\n    styles: [\n        `\n            :host {\n                white-space: pre-wrap;\n            }\n        `\n    ]\n})\nexport class ChatMessageTextComponent {\n    @Input() text: string;\n}\n","import { ComponentFactoryResolver, Directive, Input, OnChanges, ViewContainerRef } from '@angular/core';\nimport { ChatMessageLinkComponent } from '../components/chat-message-link/chat-message-link.component';\nimport { ChatMessageTextComponent } from '../components/chat-message-text/chat-message-text.component';\nimport { extractUrls } from '../core/utils-links';\n\n@Directive({\n    selector: '[ngxChatLinks]'\n})\nexport class LinksDirective implements OnChanges {\n\n    @Input() ngxChatLinks: string;\n\n    constructor(private readonly resolver: ComponentFactoryResolver,\n                private readonly viewContainerRef: ViewContainerRef) {\n    }\n\n    ngOnChanges(): void {\n        this.transform();\n    }\n\n    private transform(): void {\n        const message = this.ngxChatLinks;\n\n        if (!message) {\n            return;\n        }\n\n        const links = extractUrls(message);\n\n        const chatMessageTextFactory = this.resolver.resolveComponentFactory(ChatMessageTextComponent);\n        const chatMessageLinkFactory = this.resolver.resolveComponentFactory(ChatMessageLinkComponent);\n\n        let lastIndex = 0;\n        for (const link of links) {\n            const currentIndex = message.indexOf(link, lastIndex);\n\n            const textBeforeLink = message.substring(lastIndex, currentIndex);\n            if (textBeforeLink) {\n                const textBeforeLinkComponent = this.viewContainerRef.createComponent(chatMessageTextFactory);\n                textBeforeLinkComponent.instance.text = textBeforeLink;\n            }\n\n            const linkRef = this.viewContainerRef.createComponent(chatMessageLinkFactory);\n            linkRef.instance.link = link;\n            linkRef.instance.text = this.shorten(link);\n\n            lastIndex = currentIndex + link.length;\n        }\n\n        const textAfterLastLink = message.substring(lastIndex);\n        if (textAfterLastLink) {\n            const textAfterLastLinkComponent = this.viewContainerRef.createComponent(chatMessageTextFactory);\n            textAfterLastLinkComponent.instance.text = textAfterLastLink;\n        }\n    }\n\n    private shorten(url: string): string {\n        const parser = document.createElement('a');\n        parser.href = url;\n\n        let shortenedPathname = parser.pathname;\n        if (shortenedPathname.length > 17) {\n            shortenedPathname = shortenedPathname.substring(0, 5) + '...' + shortenedPathname.substring(shortenedPathname.length - 10);\n        }\n\n        return parser.protocol + '//' + parser.host + shortenedPathname;\n    }\n\n}\n","import {HttpClient} from '@angular/common/http';\nimport {Component, Inject, Input, OnInit, Optional} from '@angular/core';\nimport {Contact} from '../../core/contact';\nimport {Direction, Message, MessageState} from '../../core/message';\nimport {extractUrls} from '../../core/utils-links';\nimport {MessageStatePlugin, StateDate} from '../../services/adapters/xmpp/plugins/message-state.plugin';\nimport {XmppChatAdapter} from '../../services/adapters/xmpp/xmpp-chat-adapter.service';\nimport {ChatContactClickHandler, CONTACT_CLICK_HANDLER_TOKEN} from '../../hooks/chat-contact-click-handler';\nimport {CHAT_SERVICE_TOKEN, ChatService} from '../../services/chat-service';\n\n@Component({\n    selector: 'ngx-chat-message',\n    templateUrl: './chat-message.component.html',\n    styleUrls: ['./chat-message.component.less'],\n})\nexport class ChatMessageComponent implements OnInit {\n\n    @Input()\n    showAvatars: boolean;\n\n    @Input()\n    avatar?: string;\n\n    @Input()\n    message: Message;\n\n    @Input()\n    nick: string;\n\n    @Input()\n    contact: Contact;\n\n    @Input()\n    showMessageReadState = true;\n\n    showImagePlaceholder = true;\n\n    isImage = false;\n\n    isAudio = false;\n\n    mediaLink: string;\n\n    Direction = Direction;\n\n    private readonly messageStatePlugin: MessageStatePlugin;\n\n    constructor(\n        @Inject(CHAT_SERVICE_TOKEN) public chatService: ChatService,\n        private httpClient: HttpClient,\n        @Inject(CONTACT_CLICK_HANDLER_TOKEN) @Optional() public contactClickHandler: ChatContactClickHandler,\n    ) {\n        this.messageStatePlugin = this.chatService.getPlugin(MessageStatePlugin);\n    }\n\n    ngOnInit() {\n        this.tryFindImageLink();\n    }\n\n    private tryFindImageLink() {\n        if (this.chatService instanceof XmppChatAdapter) {\n            const candidateUrls = extractUrls(this.message.body);\n\n            if (candidateUrls.length === 0) {\n                this.showImagePlaceholder = false;\n                return;\n            }\n\n            void this.tryFindEmbedImageUrls(candidateUrls);\n        }\n    }\n\n    private async tryFindEmbedImageUrls(candidateUrls: RegExpMatchArray) {\n        for (const url of candidateUrls) {\n            try {\n                const headRequest = await this.httpClient.head(url, {observe: 'response'}).toPromise();\n                const contentType = headRequest.headers.get('Content-Type');\n                this.isImage = contentType && contentType.startsWith('image');\n                this.isAudio = url.includes('mp3');\n                if (this.isImage || this.isAudio) {\n                    this.mediaLink = url;\n                    break;\n                }\n            } catch (e) {\n            }\n        }\n\n        this.showImagePlaceholder = this.isImage;\n    }\n\n    getMessageState(): MessageState | undefined {\n        if (this.showMessageReadState && this.message.state) {\n            return this.message.state;\n        }\n\n        if (this.showMessageReadState && this.messageStatePlugin && this.contact) {\n            const date = this.message.datetime;\n            const states = this.messageStatePlugin.getContactMessageState(this.contact.jidBare.toString());\n            return this.getStateForDate(date, states);\n        }\n        return undefined;\n    }\n\n    private getStateForDate(date: Date, states: StateDate): MessageState | undefined {\n        if (date <= states.lastRecipientSeen) {\n            return MessageState.RECIPIENT_SEEN;\n        } else if (date <= states.lastRecipientReceived) {\n            return MessageState.RECIPIENT_RECEIVED;\n        } else if (date <= states.lastSent) {\n            return MessageState.SENT;\n        }\n        return undefined;\n    }\n\n    onContactClick() {\n        if (this.contactClickHandler) {\n            this.contactClickHandler.onClick(this.contact);\n        }\n    }\n\n    getAvatar(): string | undefined {\n        if (this.showAvatars) {\n            if (this.message.direction === Direction.in) {\n                return this.avatar;\n            } else {\n                return this.chatService.userAvatar$.getValue();\n            }\n        }\n        return undefined;\n    }\n}\n","<ngx-chat-message-simple [mediaLink]=\"mediaLink\"\n                         [isImage]=\"isImage\"\n                         [isAudio]=\"isAudio\"\n                         [avatar]=\"getAvatar()\"\n                         [avatarInteractive]=\"message.direction === Direction.in\"\n                         (avatarClickHandler)=\"onContactClick()\"\n                         [direction]=\"message.direction\"\n                         [messageState]=\"getMessageState()\"\n                         [formattedDate]=\"message.datetime | date:chatService.translations.timeFormat\"\n                         [nick]=\"nick\">\n    <span [ngxChatLinks]=\"message.body\"></span>\n</ngx-chat-message-simple>\n","import { Inject, Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { Recipient } from '../core/recipient';\nimport { CHAT_SERVICE_TOKEN, ChatService } from './chat-service';\n\nexport class ChatWindowState {\n    constructor(readonly recipient: Recipient,\n                public isCollapsed: boolean) {\n    }\n}\n\nexport interface AttachableTrack {\n    attach(elem: HTMLVideoElement): void;\n}\n\n/**\n * Used to open chat windows programmatically.\n */\n@Injectable()\nexport class ChatListStateService {\n\n    public openChats$ = new BehaviorSubject<ChatWindowState[]>([]);\n    public openTracks$ = new BehaviorSubject<AttachableTrack[]>([]);\n\n    constructor(@Inject(CHAT_SERVICE_TOKEN) private chatService: ChatService) {\n        this.chatService.state$\n            .pipe(filter(newState => newState === 'disconnected'))\n            .subscribe(() => {\n                this.openChats$.next([]);\n            });\n\n        this.chatService.contactRequestsReceived$.subscribe(contacts => {\n            for (const contact of contacts) {\n                this.openChat(contact);\n            }\n        });\n    }\n\n    private openChatCollapsed(recipient: Recipient) {\n        if (!this.isChatWithRecipientOpen(recipient)) {\n            const openChats = this.openChats$.getValue();\n            const chatWindow = new ChatWindowState(recipient, true);\n            const copyWithNewContact = [chatWindow].concat(openChats);\n            this.openChats$.next(copyWithNewContact);\n        }\n    }\n\n    public openChat(recipient: Recipient) {\n        this.openChatCollapsed(recipient);\n        this.findChatWindowStateByRecipient(recipient).isCollapsed = false;\n    }\n\n    public closeChat(recipient: Recipient) {\n        const openChats = this.openChats$.getValue();\n        const index = this.findChatWindowStateIndexByRecipient(recipient);\n        if (index >= 0) {\n            const copyWithoutContact = openChats.slice();\n            copyWithoutContact.splice(index, 1);\n            this.openChats$.next(copyWithoutContact);\n        }\n    }\n\n    public openTrack(track: AttachableTrack) {\n        this.openTracks$.next(this.openTracks$.getValue().concat([track]));\n    }\n\n    public closeTrack(track: AttachableTrack) {\n        this.openTracks$.next(\n            this.openTracks$.getValue().filter(s => s !== track)\n        );\n    }\n\n    isChatWithRecipientOpen(recipient: Recipient): boolean {\n        return this.findChatWindowStateByRecipient(recipient) !== undefined;\n    }\n\n    private findChatWindowStateIndexByRecipient(recipient: Recipient): number {\n        return this.openChats$.getValue()\n            .findIndex((chatWindowState) => chatWindowState.recipient.equalsBareJid(recipient));\n    }\n\n    private findChatWindowStateByRecipient(recipient: Recipient): ChatWindowState | undefined {\n        return this.openChats$.getValue().find(chat => chat.recipient.equalsBareJid(recipient));\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Recipient } from '../core/recipient';\n\n/**\n * Used to determine if a message component for a given recipient is open.\n */\n@Injectable()\nexport class ChatMessageListRegistryService {\n\n    public openChats$ = new BehaviorSubject<Set<Recipient>>(new Set());\n    public chatOpened$ = new Subject<Recipient>();\n    private recipientToOpenMessageListCount = new Map<Recipient, number>();\n\n    constructor() {\n    }\n\n    isChatOpen(recipient: Recipient) {\n        return this.getOrDefault(recipient, 0) > 0;\n    }\n\n    incrementOpenWindowCount(recipient: Recipient) {\n        const wasWindowOpen = this.isChatOpen(recipient);\n        this.recipientToOpenMessageListCount.set(recipient, this.getOrDefault(recipient, 0) + 1);\n        const openWindowSet = this.openChats$.getValue();\n        openWindowSet.add(recipient);\n        this.openChats$.next(openWindowSet);\n        if (!wasWindowOpen) {\n            this.chatOpened$.next(recipient);\n        }\n    }\n\n    decrementOpenWindowCount(recipient: Recipient) {\n        const newValue = this.getOrDefault(recipient, 0) - 1;\n        if (newValue <= 0) {\n            this.recipientToOpenMessageListCount.set(recipient, 0);\n            const openWindowSet = this.openChats$.getValue();\n            openWindowSet.delete(recipient);\n            this.openChats$.next(openWindowSet);\n        } else {\n            this.recipientToOpenMessageListCount.set(recipient, newValue);\n        }\n    }\n\n    private getOrDefault(recipient: Recipient, defaultValue: number) {\n        return this.recipientToOpenMessageListCount.get(recipient) || defaultValue;\n    }\n\n}\n","import { Directive, ElementRef, EventEmitter, OnDestroy, Output } from '@angular/core';\n\n@Directive({\n    selector: '[ngxChatIntersectionObserver]',\n})\nexport class IntersectionObserverDirective implements OnDestroy {\n\n    @Output()\n    ngxChatIntersectionObserver = new EventEmitter();\n\n    private intersectionObserver: IntersectionObserver;\n\n    constructor(private el: ElementRef) {\n        this.intersectionObserver = new IntersectionObserver((entries) => {\n            this.ngxChatIntersectionObserver.emit(entries[0]);\n        }, {\n            // even if user is not pixel-perfect at the bottom of a chat message list we still want to\n            // react to new messages, hence we have a buffer of 150px around the bottom of the chat message list\n            rootMargin: '150px 0px 150px 0px',\n        });\n        this.intersectionObserver.observe(el.nativeElement);\n    }\n\n    ngOnDestroy(): void {\n        this.intersectionObserver.disconnect();\n    }\n\n}\n","import {\n    AfterViewInit,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    Inject,\n    Input,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    Optional,\n    QueryList,\n    SimpleChanges,\n    ViewChild,\n    ViewChildren,\n} from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, filter, takeUntil } from 'rxjs/operators';\nimport { Direction, Message } from '../../core/message';\nimport { Recipient } from '../../core/recipient';\nimport { BlockPlugin } from '../../services/adapters/xmpp/plugins/block.plugin';\nimport { MessageArchivePlugin } from '../../services/adapters/xmpp/plugins/message-archive.plugin';\nimport { ChatListStateService } from '../../services/chat-list-state.service';\nimport { ChatMessageListRegistryService } from '../../services/chat-message-list-registry.service';\nimport { CHAT_SERVICE_TOKEN, ChatService } from '../../services/chat-service';\nimport { ContactFactoryService } from '../../services/contact-factory.service';\nimport { REPORT_USER_INJECTION_TOKEN, ReportUserService } from '../../services/report-user-service';\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\nimport { RoomMessage } from '../../services/adapters/xmpp/plugins/multi-user-chat/room-message';\nimport { MultiUserChatPlugin } from '../../services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin';\nimport { Contact, Invitation } from '../../core/contact';\n\nenum SubscriptionAction {\n    PENDING_REQUEST,\n    SHOW_BLOCK_ACTIONS,\n    NO_PENDING_REQUEST,\n}\n\n@Component({\n    selector: 'ngx-chat-message-list',\n    templateUrl: './chat-message-list.component.html',\n    styleUrls: ['./chat-message-list.component.less'],\n})\nexport class ChatMessageListComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\n\n    @Input()\n    recipient: Recipient;\n\n    @Input()\n    showAvatars: boolean;\n\n    @ViewChild('messageArea')\n    chatMessageAreaElement: ElementRef<HTMLElement>;\n\n    @ViewChildren(ChatMessageComponent)\n    chatMessageViewChildrenList: QueryList<ChatMessageComponent>;\n\n    Direction = Direction;\n    SubscriptionAction = SubscriptionAction;\n    blockPlugin: BlockPlugin;\n    subscriptionAction = SubscriptionAction.NO_PENDING_REQUEST;\n    onTop$ = new Subject<IntersectionObserverEntry>();\n\n    private ngDestroy = new Subject<void>();\n    private isAtBottom = true;\n    private bottomLeftAt = 0;\n    private oldestVisibleMessageBeforeLoading: Message = null;\n    private pendingRoomInvite: Invitation | null = null;\n\n    constructor(\n        public chatListService: ChatListStateService,\n        @Inject(CHAT_SERVICE_TOKEN) public chatService: ChatService,\n        private chatMessageListRegistry: ChatMessageListRegistryService,\n        @Optional() @Inject(REPORT_USER_INJECTION_TOKEN) public reportUserService: ReportUserService,\n        private changeDetectorRef: ChangeDetectorRef,\n        private contactFactory: ContactFactoryService,\n    ) {\n        this.blockPlugin = this.chatService.getPlugin(BlockPlugin);\n    }\n\n    async ngOnInit() {\n\n        this.onTop$\n            .pipe(filter(event => event.isIntersecting), debounceTime(1000))\n            .subscribe(() => this.loadOlderMessagesBeforeViewport());\n\n        if (this.recipient.recipientType === 'contact') {\n            this.recipient.pendingIn$\n                .pipe(\n                    filter(pendingIn => pendingIn === true),\n                    takeUntil(this.ngDestroy),\n                )\n                .subscribe(() => {\n                    this.subscriptionAction = SubscriptionAction.PENDING_REQUEST;\n                    this.scheduleScrollToLastMessage();\n                });\n\n            this.recipient.pendingRoomInvite$\n                .pipe(\n                    filter(invite => invite != null),\n                    takeUntil(this.ngDestroy),\n                )\n                .subscribe((invite) => this.pendingRoomInvite = invite);\n        }\n\n        this.chatMessageListRegistry.incrementOpenWindowCount(this.recipient);\n    }\n\n    async ngAfterViewInit() {\n        this.chatMessageViewChildrenList.changes\n            .subscribe(() => {\n                if (this.oldestVisibleMessageBeforeLoading) {\n                    this.scrollToMessage(this.oldestVisibleMessageBeforeLoading);\n                }\n                this.oldestVisibleMessageBeforeLoading = null;\n            });\n\n        const messages$: Observable<Message> = this.recipient.messages$;\n        messages$\n            .pipe(\n                debounceTime(10),\n                filter(() => this.isNearBottom()),\n                takeUntil(this.ngDestroy),\n            )\n            .subscribe((_) => this.scheduleScrollToLastMessage());\n\n        if (this.recipient.messages.length < 10) {\n            await this.loadMessages(); // in case insufficient old messages are displayed\n        }\n        this.scheduleScrollToLastMessage();\n    }\n\n    ngOnChanges(changes: SimpleChanges): void {\n        const contact = changes.contact;\n\n        if (contact && contact.previousValue && contact.currentValue) {\n            this.chatMessageListRegistry.decrementOpenWindowCount(contact.previousValue);\n            this.chatMessageListRegistry.incrementOpenWindowCount(contact.currentValue);\n        }\n\n        if (contact && contact.currentValue) {\n            this.scheduleScrollToLastMessage();\n        }\n    }\n\n    ngOnDestroy(): void {\n        this.ngDestroy.next();\n        this.chatMessageListRegistry.decrementOpenWindowCount(this.recipient);\n    }\n\n    acceptSubscriptionRequest(event: Event) {\n        event.preventDefault();\n        if (this.subscriptionAction === SubscriptionAction.PENDING_REQUEST) {\n            this.chatService.addContact(this.recipient.jidBare.toString());\n            this.subscriptionAction = SubscriptionAction.NO_PENDING_REQUEST;\n            this.scheduleScrollToLastMessage();\n        }\n    }\n\n    denySubscriptionRequest(event: Event) {\n        event.preventDefault();\n        if (this.subscriptionAction === SubscriptionAction.PENDING_REQUEST) {\n            this.chatService.removeContact(this.recipient.jidBare.toString());\n            this.subscriptionAction = SubscriptionAction.SHOW_BLOCK_ACTIONS;\n            this.scheduleScrollToLastMessage();\n        }\n    }\n\n    scheduleScrollToLastMessage() {\n        setTimeout(() => this.scrollToLastMessage(), 0);\n    }\n\n    blockContact($event: MouseEvent) {\n        $event.preventDefault();\n        this.blockPlugin.blockJid(this.recipient.jidBare.toString());\n        this.chatListService.closeChat(this.recipient);\n        this.subscriptionAction = SubscriptionAction.NO_PENDING_REQUEST;\n    }\n\n    blockContactAndReport($event: MouseEvent) {\n        if (this.recipient.recipientType !== 'contact') {\n            return;\n        }\n        $event.preventDefault();\n        this.reportUserService.reportUser(this.recipient);\n        this.blockContact($event);\n    }\n\n    dismissBlockOptions($event: MouseEvent) {\n        $event.preventDefault();\n        this.subscriptionAction = SubscriptionAction.NO_PENDING_REQUEST;\n    }\n\n    subscriptionActionShown() {\n        if (this.recipient.recipientType !== 'contact') {\n            return false;\n        }\n        return this.subscriptionAction === SubscriptionAction.PENDING_REQUEST\n            || (this.blockPlugin.supportsBlock$.getValue() === true && this.subscriptionAction === SubscriptionAction.SHOW_BLOCK_ACTIONS);\n    }\n\n    async loadOlderMessagesBeforeViewport() {\n        if (this.isLoadingHistory() || this.isNearBottom()) {\n            return;\n        }\n\n        try {\n            this.oldestVisibleMessageBeforeLoading = this.recipient.oldestMessage;\n            await this.loadMessages();\n        } catch (e) {\n            this.oldestVisibleMessageBeforeLoading = null;\n        }\n    }\n\n    onBottom(event: IntersectionObserverEntry) {\n        this.isAtBottom = event.isIntersecting;\n\n        if (event.isIntersecting) {\n            this.isAtBottom = true;\n        } else {\n            this.isAtBottom = false;\n            this.bottomLeftAt = Date.now();\n        }\n    }\n\n    getOrCreateContactWithFullJid(message: Message | RoomMessage): Contact {\n        if (this.recipient.recipientType === 'contact') {\n            // this is not a multi user chat, just use recipient as contact\n            return this.recipient;\n        }\n\n        const roomMessage = message as RoomMessage;\n\n        let matchingContact = this.chatService.contacts$.getValue().find(\n            contact => contact.jidFull.equals(roomMessage.from),\n        );\n\n        if (!matchingContact) {\n            matchingContact = this.contactFactory.createContact(roomMessage.from.toString(), roomMessage.from.resource);\n            this.chatService.contacts$.next([matchingContact].concat(this.chatService.contacts$.getValue()));\n        }\n\n        return matchingContact;\n    }\n\n    showPendingRoomInvite() {\n        if (this.recipient.recipientType !== 'contact') {\n            return false;\n        }\n        return this.pendingRoomInvite;\n    }\n\n    async acceptRoomInvite(event: MouseEvent) {\n        event.preventDefault();\n        await this.chatService.getPlugin(MultiUserChatPlugin).joinRoom(this.pendingRoomInvite.roomJid);\n        (this.recipient as Contact).pendingRoomInvite$.next(null);\n        this.pendingRoomInvite = null;\n    }\n\n    async declineRoomInvite(event: MouseEvent) {\n        event.preventDefault();\n        await this.chatService.getPlugin(MultiUserChatPlugin).declineRoomInvite(this.pendingRoomInvite.roomJid);\n        (this.recipient as Contact).pendingRoomInvite$.next(null);\n        this.pendingRoomInvite = null;\n        this.chatService.removeContact(this.recipient.jidBare.toString());\n    }\n\n    private scrollToLastMessage() {\n        if (this.chatMessageAreaElement) {\n            this.chatMessageAreaElement.nativeElement.scrollTop = this.chatMessageAreaElement.nativeElement.scrollHeight;\n            this.isAtBottom = true; // in some browsers the intersection observer does not emit when scrolling programmatically\n        }\n    }\n\n    private scrollToMessage(message: Message) {\n        if (this.chatMessageAreaElement) {\n            const htmlIdAttribute = 'message-' + message.id;\n            const messageElement = document.getElementById(htmlIdAttribute);\n            messageElement.scrollIntoView(false);\n        }\n    }\n\n    private async loadMessages() {\n        try {\n            // improve performance when loading lots of old messages\n            this.changeDetectorRef.detach();\n            await this.chatService.getPlugin(MessageArchivePlugin).loadMostRecentUnloadedMessages(this.recipient);\n        } finally {\n            this.changeDetectorRef.reattach();\n        }\n    }\n\n    private isNearBottom() {\n        return this.isAtBottom || Date.now() - this.bottomLeftAt < 1000;\n    }\n\n    private isLoadingHistory(): boolean {\n        return !!this.oldestVisibleMessageBeforeLoading;\n    }\n}\n","<div class=\"chat-messages\" #messageArea>\n\n    <div class=\"chat-messages-start\" (ngxChatIntersectionObserver)=\"onTop$.next($event)\"></div>\n\n    <ng-container *ngFor=\"let dateMessagesGroup of recipient.dateMessagesGroups\">\n        <div class=\"chat-messages-date-group\">{{dateMessagesGroup.date | date:chatService.translations.dateFormat:undefined:chatService.translations.locale}}</div>\n        <ngx-chat-message\n                *ngFor=\"let message of dateMessagesGroup.messages\"\n                [id]=\"'message-' + message.id\"\n                [class.chat-message--in]=\"message.direction === Direction.in\"\n                [class.chat-message--out]=\"message.direction === Direction.out\"\n                [contact]=\"getOrCreateContactWithFullJid(message)\"\n                [nick]=\"message.direction === Direction.in ? getOrCreateContactWithFullJid(message).name : ''\"\n                [avatar]=\"getOrCreateContactWithFullJid(message).avatar\"\n                [message]=\"message\"\n                [showAvatars]=\"showAvatars\">\n        </ngx-chat-message>\n    </ng-container>\n\n    <div class=\"chat-messages-empty\" *ngIf=\"recipient.messages.length === 0\">\n        {{chatService.translations.noMessages}}\n    </div>\n\n    <ngx-chat-message-simple\n            [direction]=\"Direction.in\"\n            [avatar]=\"undefined\"\n            [footerHidden]=\"true\"\n            *ngIf=\"showPendingRoomInvite()\"\n    >\n        <ul class=\"chat-presence-subscription-actions\">\n            <li>\n                <a (click)=\"acceptRoomInvite($event)\" href=\"#\">Join</a>\n            </li>\n            <li>\n                <a (click)=\"declineRoomInvite($event)\" href=\"#\">Decline</a>\n            </li>\n        </ul>\n    </ngx-chat-message-simple>\n\n    <ngx-chat-message-simple\n            [direction]=\"Direction.in\"\n            [avatar]=\"showAvatars ? recipient.avatar : undefined\"\n            [footerHidden]=\"true\"\n            *ngIf=\"subscriptionActionShown()\"\n    >\n        <span>\n            {{chatService.translations.subscriptionRequestMessage}}\n        </span>\n        <ul class=\"chat-presence-subscription-actions\">\n            <li>\n                <span class=\"action-disabled\"\n                      *ngIf=\"subscriptionAction === SubscriptionAction.SHOW_BLOCK_ACTIONS\"\n                >{{chatService.translations.acceptSubscriptionRequest}}</span>\n\n                <a *ngIf=\"subscriptionAction === SubscriptionAction.PENDING_REQUEST\"\n                   (click)=\"acceptSubscriptionRequest($event)\"\n                   href=\"#\"\n                >{{chatService.translations.acceptSubscriptionRequest}}</a>\n            </li>\n\n            <li>\n                <span class=\"action-disabled\"\n                      *ngIf=\"subscriptionAction === SubscriptionAction.SHOW_BLOCK_ACTIONS\"\n                >{{chatService.translations.denySubscriptionRequest}}</span>\n\n                <a *ngIf=\"subscriptionAction === SubscriptionAction.PENDING_REQUEST\"\n                   (click)=\"denySubscriptionRequest($event)\"\n                   href=\"#\"\n                >{{chatService.translations.denySubscriptionRequest}}</a>\n            </li>\n        </ul>\n        <ul class=\"deny-actions\"\n            *ngIf=\"(blockPlugin.supportsBlock$ | async) === true && subscriptionAction === SubscriptionAction.SHOW_BLOCK_ACTIONS\">\n            <li>\n                <a (click)=\"blockContact($event)\" href=\"#\">{{chatService.translations.block}}</a>\n            </li>\n            <li *ngIf=\"reportUserService\">\n                <a (click)=\"blockContactAndReport($event)\" href=\"#\">{{chatService.translations.blockAndReport}}</a>\n            </li>\n            <li>\n                <a (click)=\"dismissBlockOptions($event)\" href=\"#\">{{chatService.translations.dismiss}}</a>\n            </li>\n        </ul>\n    </ngx-chat-message-simple>\n\n    <div class=\"chat-messages-end\" (ngxChatIntersectionObserver)=\"onBottom($event)\"></div>\n\n</div>\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Optional injectable token to handle file uploads in the chat.\n */\nexport const FILE_UPLOAD_HANDLER_TOKEN = new InjectionToken<FileUploadHandler>('ngxChatFileUploadHandler');\n\nexport interface FileUploadHandler {\n    /**\n     * @return {string} Returns the public URL of the uploaded file.\n     */\n    upload(file: File): Promise<string>;\n\n    isUploadSupported(): boolean;\n\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const CHAT_STYLE_TOKEN = new InjectionToken<ChatStyle>('ngxChatStyle');\n\nexport interface ChatStyle {\n    windowFrame: {\n        windowWidth: string\n    };\n}\n","import {Component, EventEmitter, Inject, Optional, Output} from '@angular/core';\nimport {ChatStyle, CHAT_STYLE_TOKEN } from '../../services/chat-style';\n\n@Component({\n    selector: 'ngx-chat-window-frame',\n    templateUrl: './chat-window-frame.component.html',\n    styleUrls: ['./chat-window-frame.component.less'],\n})\nexport class ChatWindowFrameComponent {\n\n    @Output()\n    closeClick = new EventEmitter<void>();\n\n    @Output()\n    headerClick = new EventEmitter<void>();\n\n    constructor(@Optional() @Inject(CHAT_STYLE_TOKEN) public chatStyle: ChatStyle) {\n    }\n\n}\n","<div class=\"window\" [style.width]=\"chatStyle?.windowFrame?.windowWidth ?? '17em'\">\n\n    <div (click)=\"headerClick.emit()\" class=\"window-header\">\n\n        <ng-content select=\".window-header-content\"></ng-content>\n\n        <div *ngIf=\"closeClick.observers.length > 0\" class=\"window-close\" (click)=\"closeClick.emit()\">\n            &times;\n        </div>\n\n    </div>\n\n    <ng-content select=\".window-content\"></ng-content>\n\n</div>\n","import {Component, Inject, Input, OnDestroy, OnInit, Optional, ViewChild} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, takeUntil} from 'rxjs/operators';\nimport {Direction, Message} from '../../core/message';\nimport {ChatContactClickHandler, CONTACT_CLICK_HANDLER_TOKEN} from '../../hooks/chat-contact-click-handler';\nimport {ChatListStateService, ChatWindowState} from '../../services/chat-list-state.service';\nimport {CHAT_SERVICE_TOKEN, ChatService} from '../../services/chat-service';\nimport {ChatMessageInputComponent} from '../chat-message-input/chat-message-input.component';\nimport {ChatMessageListComponent} from '../chat-message-list/chat-message-list.component';\nimport {FILE_UPLOAD_HANDLER_TOKEN, FileUploadHandler} from '../../hooks/file-upload-handler';\nimport {RoomMessage} from '../../services/adapters/xmpp/plugins/multi-user-chat/room-message';\nimport {ChatAction} from '../../services/adapters/xmpp/xmpp-chat-adapter.service';\n\n@Component({\n    selector: 'ngx-chat-window',\n    templateUrl: './chat-window.component.html',\n    styleUrls: ['./chat-window.component.less'],\n})\nexport class ChatWindowComponent implements OnInit, OnDestroy {\n\n    @Input()\n    public chatWindowState: ChatWindowState;\n\n    @ViewChild(ChatMessageInputComponent)\n    private readonly messageInput: ChatMessageInputComponent;\n\n    @ViewChild(ChatMessageListComponent)\n    private readonly contactMessageList: ChatMessageListComponent;\n\n    private readonly ngDestroy = new Subject<void>();\n\n    constructor(\n        @Inject(CHAT_SERVICE_TOKEN) readonly chatService: ChatService,\n        private readonly chatListService: ChatListStateService,\n        @Inject(FILE_UPLOAD_HANDLER_TOKEN) readonly fileUploadHandler: FileUploadHandler,\n        @Inject(CONTACT_CLICK_HANDLER_TOKEN) @Optional() readonly contactClickHandler: ChatContactClickHandler,\n    ) {\n    }\n\n    ngOnInit() {\n        const messages$: Observable<RoomMessage | Message> = this.chatWindowState.recipient.messages$;\n        messages$\n            .pipe(\n                filter(message => message.direction === Direction.in),\n                takeUntil(this.ngDestroy),\n            )\n            .subscribe(() => {\n                this.chatWindowState.isCollapsed = false;\n            });\n    }\n\n    ngOnDestroy() {\n        this.ngDestroy.next();\n        this.ngDestroy.complete();\n    }\n\n    public onClickHeader() {\n        this.chatWindowState.isCollapsed = !this.chatWindowState.isCollapsed;\n    }\n\n    public onClickClose() {\n        this.chatListService.closeChat(this.chatWindowState.recipient);\n    }\n\n    sendMessage() {\n        this.messageInput.onSendMessage();\n    }\n\n    afterSendMessage() {\n        this.contactMessageList.scheduleScrollToLastMessage();\n    }\n\n    async uploadFile(file: File) {\n        const url = await this.fileUploadHandler.upload(file);\n        this.chatService.sendMessage(this.chatWindowState.recipient, url);\n    }\n\n    onFocus() {\n        this.messageInput.focus();\n    }\n\n    onActionClick(chatAction: ChatAction<this>) {\n        chatAction.onClick({\n            contact: this.chatWindowState.recipient.jidBare.toString(),\n            chatWindow: this,\n        });\n    }\n\n    onContactClick($event: MouseEvent) {\n        if (this.contactClickHandler && !this.chatWindowState.isCollapsed) {\n            $event.stopPropagation();\n            this.contactClickHandler.onClick(this.chatWindowState.recipient);\n        }\n    }\n}\n","<ngx-chat-window-frame\n        (headerClick)=\"onClickHeader()\"\n        (closeClick)=\"onClickClose()\">\n\n    <ng-container class=\"window-header-content\">\n        <div class=\"chat-contact-avatar-wrapper\"\n             (click)=\"onContactClick($event)\"\n        >\n            <ngx-chat-avatar [imageUrl]=\"chatWindowState.recipient.avatar\"></ngx-chat-avatar>\n        </div>\n\n        <div class=\"header-middle\">\n\n            <div class=\"chat-contact-name-wrapper\"\n                 [title]=\"chatWindowState.recipient.name\"\n            >\n                <span [ngClass]=\"{'has-click-handler': !chatWindowState.isCollapsed && !!this.contactClickHandler}\"\n                      (click)=\"onContactClick($event)\">\n                    {{chatWindowState.recipient.name}}\n                </span>\n            </div>\n\n            <div class=\"chat-contact-status-wrapper\"\n                 *ngIf=\"!chatWindowState.isCollapsed && chatWindowState.recipient.recipientType === 'contact'\"\n            >\n                <span class=\"chat-contact-status\">\n                    {{chatService.translations.presence[chatWindowState.recipient.presence$ | async]}}\n                </span>\n            </div>\n\n        </div>\n    </ng-container>\n\n    <ngx-chat-filedrop\n            *ngIf=\"!chatWindowState.isCollapsed\"\n            class=\"window-content\"\n            [enabled]=\"fileUploadHandler.isUploadSupported()\"\n            (fileUpload)=\"uploadFile($event)\"\n            [dropMessage]=\"chatService.translations.dropMessage\">\n        <div (click)=\"onFocus()\">\n            <ngx-chat-message-list\n                    [recipient]=\"chatWindowState.recipient\"\n                    [showAvatars]=\"false\"></ngx-chat-message-list>\n            <div class=\"chat-input-container\">\n                <ngx-chat-message-input\n                        [recipient]=\"chatWindowState.recipient\"\n                        (messageSent)=\"afterSendMessage()\"\n                ></ngx-chat-message-input>\n                <div *ngFor=\"let action of chatService.chatActions\"\n                     (click)=\"onActionClick(action)\"\n                     class=\"chat-action\"\n                     [ngClass]=\"action.cssClass\"\n                     [innerHTML]=\"action.html\">\n                </div>\n            </div>\n        </div>\n    </ngx-chat-filedrop>\n\n</ngx-chat-window-frame>\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { AttachableTrack } from '../../services/chat-list-state.service';\n\n@Component({\n    selector: 'ngx-chat-video-window',\n    templateUrl: './chat-video-window.component.html',\n    styleUrls: ['./chat-video-window.component.less'],\n})\nexport class ChatVideoWindowComponent implements AfterViewInit {\n\n    @ViewChild('video')\n    public video: ElementRef<HTMLVideoElement>;\n\n    @Input()\n    track: AttachableTrack;\n\n    constructor() { }\n\n    ngAfterViewInit(): void {\n        this.track.attach(this.video.nativeElement);\n    }\n\n}\n","<ngx-chat-window-frame>\n    <video #video autoplay=\"1\"></video>\n</ngx-chat-window-frame>\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { Component, Input } from '@angular/core';\nimport { ChatListStateService } from '../../services/chat-list-state.service';\n\n@Component({\n    selector: 'ngx-chat-window-list',\n    templateUrl: './chat-window-list.component.html',\n    styleUrls: ['./chat-window-list.component.less'],\n    animations: [\n        trigger('rosterVisibility', [\n            state('hidden', style({\n                right: '1em',\n            })),\n            state('shown', style({\n                right: '15em',\n            })),\n            transition('hidden => shown', animate('400ms ease')),\n            transition('shown => hidden', animate('400ms ease'))\n        ])\n    ]\n})\nexport class ChatWindowListComponent {\n\n    @Input()\n    rosterState: string;\n\n    constructor(public chatListService: ChatListStateService) {\n    }\n\n}\n","<div class=\"chat-list\" [@rosterVisibility]=\"rosterState\">\n\n    <ngx-chat-video-window\n            *ngFor=\"let track of (chatListService.openTracks$ | async)\"\n            [track]=\"track\">\n    </ngx-chat-video-window>\n\n    <ngx-chat-window\n            *ngFor=\"let chatWindowState of (chatListService.openChats$ | async)\"\n            [chatWindowState]=\"chatWindowState\"></ngx-chat-window>\n\n</div>\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { BehaviorSubject, combineLatest, merge, Observable, Subject, Subscription } from 'rxjs';\nimport { debounceTime, delay, distinctUntilChanged, map, share } from 'rxjs/operators';\nimport { Direction, Message } from '../../../../core/message';\nimport { Recipient } from '../../../../core/recipient';\nimport { findSortedInsertionIndexLast } from '../../../../core/utils-array';\nimport { ChatMessageListRegistryService } from '../../../chat-message-list-registry.service';\nimport { AbstractStanzaBuilder } from '../abstract-stanza-builder';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { EntityTimePlugin } from './entity-time.plugin';\nimport { MultiUserChatPlugin } from './multi-user-chat/multi-user-chat.plugin';\nimport { PublishSubscribePlugin } from './publish-subscribe.plugin';\n\nconst STORAGE_NGX_CHAT_LAST_READ_DATE = 'ngxchat:unreadmessagedate';\nconst wrapperNodeName = 'entries';\nconst nodeName = 'last-read';\n\nexport type JidToNumber = Map<string, number>;\ntype JidToLastReadTimestamp = Map<string, number>;\n\nclass LastReadEntriesNodeBuilder extends AbstractStanzaBuilder {\n\n    private lastReadNodes = [] as Element[];\n\n    addLastReadNode(jid: string, date: string) {\n        this.lastReadNodes.push(\n            xml(nodeName, {jid, date}),\n        );\n    }\n\n    toStanza(): Element {\n        return xml(wrapperNodeName, {}, ...this.lastReadNodes);\n    }\n\n}\n\n/**\n * Unofficial plugin using XEP-0163 / PubSub to track count of unread messages per recipient\n *\n * It publishes entries to a private PubSub-Node 'ngxchat:unreadmessagedate'\n * The stored elements look like this:\n * <item id=\"current\">\n *     <entries>\n *         <last-read jid=\"user1@host1.tld\" date=\"1546419050584\"/>\n *         <last-read jid=\"user2@host1.tld\" date=\"1546419050000\"/>\n *     </entries>\n * </item>\n */\nexport class UnreadMessageCountPlugin extends AbstractXmppPlugin {\n\n    /**\n     * already debounced to prevent the issues described in {@link UnreadMessageCountPlugin.jidToUnreadCount$}.\n     */\n    public readonly unreadMessageCountSum$: Observable<number>;\n    /**\n     * emits as soon as the unread message count changes, you might want to debounce it with e.g. half a a second, as\n     * new messages might be acknowledged in another session.\n     */\n    public readonly jidToUnreadCount$: BehaviorSubject<JidToNumber> = new BehaviorSubject(new Map<string, number>());\n    private readonly jidToLastReadTimestamp: JidToLastReadTimestamp = new Map<string, number>();\n    private readonly recipientIdToMessageSubscription = new Map<string, Subscription>();\n\n    constructor(\n        private chatService: XmppChatAdapter,\n        private chatMessageListRegistry: ChatMessageListRegistryService,\n        private publishSubscribePlugin: PublishSubscribePlugin,\n        private entityTimePlugin: EntityTimePlugin,\n        private multiUserChatPlugin: MultiUserChatPlugin,\n    ) {\n        super();\n\n        this.chatMessageListRegistry.chatOpened$\n            .pipe(\n                delay(0), // prevent 'Expression has changed after it was checked'\n            )\n            .subscribe(recipient => this.checkForUnreadCountChange(recipient));\n\n        merge(\n            multiUserChatPlugin.rooms$,\n            this.chatService.contactCreated$.pipe(map(contact => [contact])),\n        ).subscribe(recipients => {\n            for (const recipient of recipients) {\n                const jid = recipient.jidBare.toString();\n                if (!this.recipientIdToMessageSubscription.has(jid)) {\n                    const messages$: Subject<Message> = recipient.messages$;\n                    const updateUnreadCountSubscription = messages$\n                        .pipe(debounceTime(20))\n                        .subscribe(() => this.checkForUnreadCountChange(recipient));\n                    this.recipientIdToMessageSubscription.set(jid, updateUnreadCountSubscription);\n                }\n            }\n        });\n\n        this.publishSubscribePlugin.publish$\n            .subscribe((event) => this.handlePubSubEvent(event));\n\n        this.unreadMessageCountSum$ = combineLatest([this.jidToUnreadCount$, this.chatService.blockedContactIds$])\n            .pipe(\n                debounceTime(20),\n                map(([jidToUnreadCount, blockedContactIdSet]) => {\n                    let sum = 0;\n                    for (const [recipientJid, count] of jidToUnreadCount) {\n                        if (!blockedContactIdSet.has(recipientJid)) {\n                            sum += count;\n                        }\n                    }\n                    return sum;\n                }),\n                distinctUntilChanged(),\n                share(),\n            );\n    }\n\n    private async checkForUnreadCountChange(recipient: Recipient) {\n        if (this.chatMessageListRegistry.isChatOpen(recipient)) {\n            this.jidToLastReadTimestamp.set(recipient.jidBare.toString(), await this.entityTimePlugin.getNow());\n            await this.persistLastSeenDates();\n        }\n        this.updateContactUnreadMessageState(recipient);\n    }\n\n    async onBeforeOnline(): Promise<any> {\n        const fetchedDates = await this.fetchLastSeenDates();\n        this.mergeJidToDates(fetchedDates);\n    }\n\n    onOffline() {\n        for (const subscription of this.recipientIdToMessageSubscription.values()) {\n            subscription.unsubscribe();\n        }\n        this.recipientIdToMessageSubscription.clear();\n        this.jidToLastReadTimestamp.clear();\n        this.jidToUnreadCount$.next(new Map<string, number>());\n    }\n\n    private async fetchLastSeenDates(): Promise<JidToLastReadTimestamp> {\n        const entries = await this.publishSubscribePlugin.retrieveNodeItems(STORAGE_NGX_CHAT_LAST_READ_DATE);\n        return this.parseLastSeenDates(entries);\n    }\n\n    private parseLastSeenDates(topLevelElements: Element[]): JidToLastReadTimestamp {\n        const result: JidToLastReadTimestamp = new Map<string, number>();\n\n        if (topLevelElements.length === 1) {\n            const [itemElement] = topLevelElements;\n            for (const lastReadEntry of itemElement.getChild(wrapperNodeName).getChildren(nodeName)) {\n                const {jid, date} = lastReadEntry.attrs;\n                if (!isNaN(date)) {\n                    result.set(jid, date);\n                }\n            }\n        }\n\n        return result;\n    }\n\n    updateContactUnreadMessageState(recipient: Recipient) {\n        const contactJid = recipient.jidBare.toString();\n        const lastReadDate = this.jidToLastReadTimestamp.get(contactJid) || 0;\n        const contactUnreadMessageCount = this.calculateUnreadMessageCount(recipient, lastReadDate);\n        const jidToCount = this.jidToUnreadCount$.getValue();\n        if (jidToCount.get(contactJid) !== contactUnreadMessageCount) {\n            this.jidToUnreadCount$.next(jidToCount.set(contactJid, contactUnreadMessageCount));\n        }\n    }\n\n    private calculateUnreadMessageCount(recipient: Recipient, lastReadTimestamp: number) {\n        const firstUnreadMessageIndex = findSortedInsertionIndexLast(lastReadTimestamp, recipient.messages,\n            message => message.datetime.getTime());\n        return recipient.messages.slice(firstUnreadMessageIndex)\n            .filter(message => message.direction === Direction.in)\n            .length;\n    }\n\n    private async persistLastSeenDates() {\n        const lastReadNodeBuilder = new LastReadEntriesNodeBuilder();\n        for (const [jid, date] of this.jidToLastReadTimestamp) {\n            lastReadNodeBuilder.addLastReadNode(jid, date.toString());\n        }\n\n        await this.publishSubscribePlugin.storePrivatePayloadPersistent(\n            STORAGE_NGX_CHAT_LAST_READ_DATE,\n            'current',\n            lastReadNodeBuilder.toStanza());\n    }\n\n    private handlePubSubEvent(event: Element) {\n        const items = event.getChild('items');\n        const itemsNode = items && items.attrs.node;\n        const item = items && items.getChildren('item');\n        if (itemsNode === STORAGE_NGX_CHAT_LAST_READ_DATE && item) {\n            const publishedLastJidToDate = this.parseLastSeenDates(item);\n            this.mergeJidToDates(publishedLastJidToDate);\n        }\n    }\n\n    private mergeJidToDates(newJidToDate: JidToLastReadTimestamp) {\n        for (const [jid, date] of newJidToDate) {\n            const oldLastReadDate = this.jidToLastReadTimestamp.get(jid);\n            if (!oldLastReadDate || oldLastReadDate < date) {\n                this.jidToLastReadTimestamp.set(jid, date);\n            }\n        }\n    }\n}\n","import { Component, Inject, Input, OnInit } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\nimport { Presence } from '../../core/presence';\nimport { Recipient } from '../../core/recipient';\nimport { UnreadMessageCountPlugin } from '../../services/adapters/xmpp/plugins/unread-message-count.plugin';\nimport { CHAT_SERVICE_TOKEN, ChatService } from '../../services/chat-service';\n\n@Component({\n    selector: 'ngx-chat-roster-recipient',\n    templateUrl: './roster-recipient.component.html',\n    styleUrls: ['./roster-recipient.component.less'],\n})\nexport class RosterRecipientComponent implements OnInit {\n\n    @Input()\n    recipient: Recipient;\n\n    unreadCount$: Observable<number>;\n    presence$: Observable<Presence> | null;\n\n    Presence = Presence;\n\n    constructor(\n        @Inject(CHAT_SERVICE_TOKEN) private chatService: ChatService,\n    ) {}\n\n    ngOnInit() {\n        this.unreadCount$ = this.chatService.getPlugin(UnreadMessageCountPlugin).jidToUnreadCount$\n            .pipe(\n                map(jidToUnreadCount => jidToUnreadCount.get(this.recipient.jidBare.toString()) || 0),\n                distinctUntilChanged(),\n                debounceTime(20),\n            );\n        this.presence$ = this.recipient.recipientType === 'contact' ? this.recipient.presence$ : of(Presence.unavailable);\n    }\n\n}\n","<div class=\"roster-recipient\" [title]=\"recipient.name\">\n\n    <div class=\"roster-recipient-avatar\">\n        <ngx-chat-avatar [imageUrl]=\"recipient.avatar\"></ngx-chat-avatar>\n    </div>\n\n    <div class=\"roster-recipient-name\">\n        {{recipient.name}}\n    </div>\n\n    <div class=\"roster-recipient-status\">\n        <div class=\"unread-message-badge\" *ngIf=\"(unreadCount$ | async) > 0\">{{unreadCount$ | async}}</div>\n        <ng-container *ngIf=\"presence$ | async as presence\">\n            <div *ngIf=\"presence !== Presence.unavailable\"\n                 class=\"roster-presence\"\n                 [ngClass]=\"'roster-presence--' + presence\">●\n            </div>\n        </ng-container>\n    </div>\n\n</div>\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Contact } from '../../core/contact';\nimport { Recipient } from '../../core/recipient';\nimport { MultiUserChatPlugin } from '../../services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin';\nimport { ChatListStateService } from '../../services/chat-list-state.service';\nimport { CHAT_SERVICE_TOKEN, ChatService } from '../../services/chat-service';\n\n@Component({\n    selector: 'ngx-chat-roster-list',\n    templateUrl: './roster-list.component.html',\n    styleUrls: ['./roster-list.component.less'],\n    animations: [\n        trigger('rosterVisibility', [\n            state('hidden', style({\n                right: '-14em',\n            })),\n            state('shown', style({\n                right: '0em',\n            })),\n            transition('hidden => shown', animate('400ms ease')),\n            transition('shown => hidden', animate('400ms ease')),\n        ]),\n        trigger('drawerVisibility', [\n            state('hidden', style({\n                right: '0em',\n            })),\n            state('shown', style({\n                right: '14em',\n            })),\n            transition('hidden => shown', animate('400ms ease')),\n            transition('shown => hidden', animate('400ms ease')),\n        ]),\n    ],\n})\nexport class RosterListComponent implements OnInit {\n\n    @Input()\n    rosterState: 'hidden' | 'shown';\n\n    @Input()\n    contacts: Observable<Contact[]>;\n\n    @Input()\n    contactRequestsReceived$: Observable<Contact[]>;\n\n    @Input()\n    contactRequestsSent$: Observable<Contact[]>;\n\n    @Input()\n    contactsUnaffiliated$: Observable<Contact[]>;\n\n    hasNoContacts$: Observable<boolean>;\n\n    @Output()\n    rosterStateChanged = new EventEmitter<'hidden' | 'shown'>();\n\n    multiUserChatPlugin: MultiUserChatPlugin;\n\n    constructor(@Inject(CHAT_SERVICE_TOKEN) public chatService: ChatService,\n                private chatListService: ChatListStateService) {\n        this.multiUserChatPlugin = this.chatService.getPlugin(MultiUserChatPlugin);\n    }\n\n    ngOnInit() {\n        if (!this.contacts) {\n            this.contacts = this.chatService.contactsSubscribed$;\n        }\n        if (!this.contactRequestsReceived$) {\n            this.contactRequestsReceived$ = this.chatService.contactRequestsReceived$;\n        }\n        if (!this.contactRequestsSent$) {\n            this.contactRequestsSent$ = this.chatService.contactRequestsSent$;\n        }\n        if (!this.contactsUnaffiliated$) {\n            this.contactsUnaffiliated$ = this.chatService.contactsUnaffiliated$;\n        }\n        this.hasNoContacts$ = combineLatest([\n            this.contacts,\n            this.contactRequestsReceived$,\n            this.contactRequestsSent$,\n            this.contactsUnaffiliated$,\n        ]).pipe(\n            map(([contacts, received, sent, unaffiliated]) =>\n                contacts.length + received.length + sent.length + unaffiliated.length === 0),\n        );\n    }\n\n    onClickRecipient(recipient: Recipient) {\n        this.chatListService.openChat(recipient);\n    }\n\n    toggleVisibility() {\n        const newState = this.rosterState === 'shown' ? 'hidden' : 'shown';\n        this.rosterStateChanged.emit(newState);\n    }\n\n}\n","<div class=\"roster-drawer\" (click)=\"toggleVisibility()\" [@drawerVisibility]=\"rosterState\">\n    <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'shown'\">&raquo;</div>\n    <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'hidden'\">&laquo;</div>\n</div>\n\n<div class=\"roster-list\" [@rosterVisibility]=\"rosterState\" [attr.data-ngx-chat-state]=\"chatService.state$ | async\">\n\n    <div class=\"roster-header\">\n        {{ chatService.translations.chat }}\n    </div>\n\n    <ng-container *ngIf=\"(multiUserChatPlugin.rooms$ | async) as rooms\">\n        <ng-container *ngIf=\"rooms.length > 0\">\n            <div class=\"roster-group-header\">{{chatService.translations.rooms}}</div>\n\n            <div class=\"contact-list-wrapper\">\n                <ngx-chat-roster-recipient\n                        *ngFor=\"let room of rooms\"\n                        [recipient]=\"room\"\n                        (click)=\"onClickRecipient(room)\">\n                </ngx-chat-roster-recipient>\n            </div>\n        </ng-container>\n    </ng-container>\n\n    <ng-container *ngIf=\"(contacts | async).length > 0\">\n        <div class=\"roster-group-header\">{{chatService.translations.contacts}}</div>\n\n        <div class=\"contact-list-wrapper\">\n\n            <ngx-chat-roster-recipient\n                    *ngFor=\"let contact of (contacts | async)\"\n                    [recipient]=\"contact\"\n                    (click)=\"onClickRecipient(contact)\">\n            </ngx-chat-roster-recipient>\n\n        </div>\n    </ng-container>\n\n    <ng-container *ngIf=\"(contactRequestsReceived$ | async).length > 0\">\n        <div class=\"roster-group-header\">{{chatService.translations.contactRequestIn}}</div>\n        <div class=\"contact-list-wrapper\">\n\n            <ngx-chat-roster-recipient\n                    *ngFor=\"let contact of (contactRequestsReceived$ | async)\"\n                    [recipient]=\"contact\"\n                    (click)=\"onClickRecipient(contact)\">\n            </ngx-chat-roster-recipient>\n\n        </div>\n    </ng-container>\n\n    <ng-container *ngIf=\"(contactRequestsSent$ | async).length > 0\">\n        <div class=\"roster-group-header\">{{chatService.translations.contactRequestOut}}</div>\n        <div class=\"contact-list-wrapper\">\n\n            <ngx-chat-roster-recipient\n                    *ngFor=\"let contact of (contactRequestsSent$ | async)\"\n                    [recipient]=\"contact\"\n                    (click)=\"onClickRecipient(contact)\">\n            </ngx-chat-roster-recipient>\n\n        </div>\n    </ng-container>\n\n    <ng-container *ngIf=\"(contactsUnaffiliated$ | async).length > 0\">\n        <div class=\"roster-group-header\">{{chatService.translations.contactsUnaffiliated}}</div>\n        <div class=\"contact-list-wrapper\">\n\n            <ng-container *ngFor=\"let contact of (contactsUnaffiliated$ | async)\">\n                <ngx-chat-roster-recipient\n                        *ngIf=\"contact.messages.length > 0\"\n                        [recipient]=\"contact\"\n                        (click)=\"onClickRecipient(contact)\">\n                </ngx-chat-roster-recipient>\n            </ng-container>\n\n        </div>\n    </ng-container>\n\n    <div class=\"roster-list__empty\" *ngIf=\"hasNoContacts$ | async\">\n        {{chatService.translations.noContacts}}\n    </div>\n\n    <ng-container *ngIf=\"chatService.enableDebugging\">\n        <hr/>\n\n        <div class=\"contact-pending-request-received-wrapper\">\n            debug contact requests in:\n            <div class=\"contact-pending-request-received\"\n                 *ngFor=\"let request of (chatService.contactRequestsReceived$ | async)\">\n                {{request.name}}\n            </div>\n        </div>\n\n        <hr/>\n\n        <div class=\"contact-pending-request-sent-wrapper\">\n            debug contact requests out:\n            <div class=\"contact-pending-request-sent\"\n                 *ngFor=\"let request of (chatService.contactRequestsSent$ | async)\">\n                {{request.name}}\n            </div>\n        </div>\n\n        <hr/>\n\n        <p>\n            debug contacts (count: {{ (chatService.contacts$ | async).length }})<br/>\n        </p>\n        <p *ngFor=\"let contact of (chatService.contacts$|async)\" style=\"margin-bottom: 1em\">\n            <em>{{contact.name}}:</em><br/>\n            subscription={{contact.subscription$ | async}}<br/>\n            presence={{contact.presence$ | async}}<br/>\n            pendingIn={{contact.pendingIn$ | async}}<br/>\n            pendingOut={{contact.pendingOut$ | async}}\n        </p>\n        <p class=\"roster-debug-state\">state: {{chatService.state$ | async}}</p>\n    </ng-container>\n\n    <!--\n    <div class=\"roster-footer\">\n    </div>\n    -->\n</div>\n","import { Component, Inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Contact } from '../core/contact';\nimport { Translations } from '../core/translations';\nimport { defaultTranslations } from '../core/translations-default';\nimport { CHAT_SERVICE_TOKEN, ChatService } from '../services/chat-service';\n\n/**\n * The main UI component. Should be instantiated near the root of your application.\n *\n * ```html\n * <!-- plain usage, no configuration -->\n * <ngx-chat></ngx-chat>\n *\n * <!-- if supplied, translations contain an object with the structure of the Translations interface. -->\n * <ngx-chat translations=\"{'contacts': 'Kontakte', ...}\"></ngx-chat>\n *\n * <!-- if supplied, the contacts input attribute takes an Observable<Contact[]> as source for your roster list -->\n * <ngx-chat contacts=\"...\"></ngx-chat>\n *\n * <!-- if supplied, userAvatar$ contains an Obervable<string>, which is used as the src attribute of the img for the current user. -->\n * <ngx-chat userAvatar$=\"Observable.of('http://...')\"></ngx-chat>\n * ```\n */\n@Component({\n    selector: 'ngx-chat',\n    templateUrl: './chat.component.html',\n    styleUrls: ['./chat.component.less'],\n})\nexport class ChatComponent implements OnInit, OnChanges {\n\n    /**\n     * If supplied, translations contain an object with the structure of the Translations interface.\n     */\n    @Input()\n    public set translations(translations: Partial<Translations>) {\n        const defaultTranslation = defaultTranslations();\n        if (translations) {\n            this.chatService.translations = {\n                ...defaultTranslation,\n                ...translations,\n                presence: {\n                    ...defaultTranslation.presence,\n                    ...translations.presence,\n                },\n            };\n        }\n    }\n\n    /**\n     * If supplied, the contacts input attribute takes an [Observable<Contact[]>]{@link Contact} as source for your roster list.\n     */\n    @Input()\n    public contacts?: Observable<Contact[]>;\n\n    /**\n     * If supplied, the contacts input attribute takes an [Observable<Contact[]>]{@link Contact} as source for your incoming contact\n     * requests list.\n     */\n    @Input()\n    contactRequestsReceived$?: Observable<Contact[]>;\n\n    /**\n     * If supplied, the contacts input attribute takes an [Observable<Contact[]>]{@link Contact} as source for your outgoing contact\n     * requests list.\n     */\n    @Input()\n    contactRequestsSent$?: Observable<Contact[]>;\n\n    /**\n     * If supplied, the contacts input attribute takes an [Observable<Contact[]>]{@link Contact} as source for your unaffiliated contact\n     * list.\n     */\n    @Input()\n    contactsUnaffiliated$?: Observable<Contact[]>;\n\n    /**\n     * If supplied, userAvatar$ contains an Observable<string>, which is used as the src attribute of the img for the current user.\n     */\n    @Input()\n    public userAvatar$?: Observable<string>;\n\n    /**\n     * 'shown' shows roster list, 'hidden' hides it.\n     */\n    @Input()\n    rosterState: 'shown' | 'hidden';\n\n    showChatComponent = false;\n\n    constructor(\n        @Inject(CHAT_SERVICE_TOKEN) private chatService: ChatService,\n    ) {\n    }\n\n    ngOnInit() {\n        this.chatService.state$.subscribe($e => this.onChatStateChange($e));\n        this.onRosterStateChanged(this.rosterState);\n\n        if (this.userAvatar$) {\n            this.userAvatar$.subscribe(avatar => this.chatService.userAvatar$.next(avatar));\n        }\n    }\n\n    ngOnChanges(changes: SimpleChanges): void {\n        if (changes.rosterState) {\n            this.onRosterStateChanged(changes.rosterState.currentValue);\n        }\n    }\n\n    private onChatStateChange(state: string) {\n        this.showChatComponent = state === 'online';\n        this.updateBodyClass();\n    }\n\n    onRosterStateChanged(state: 'shown' | 'hidden') {\n        this.rosterState = state;\n        this.updateBodyClass();\n    }\n\n    private updateBodyClass() {\n        const rosterClass = 'has-roster';\n        if (this.showChatComponent && this.rosterState !== 'hidden') {\n            document.body.classList.add(rosterClass);\n        } else {\n            document.body.classList.remove(rosterClass);\n        }\n    }\n\n}\n","<ngx-chat-window-list *ngIf=\"showChatComponent\"\n                      [rosterState]=\"rosterState\">\n</ngx-chat-window-list>\n<ngx-chat-roster-list [rosterState]=\"rosterState\"\n                      [contacts]=\"contacts\"\n                      [contactRequestsReceived$]=\"contactRequestsReceived$\"\n                      [contactRequestsSent$]=\"contactRequestsSent$\"\n                      [contactsUnaffiliated$]=\"contactsUnaffiliated$\"\n                      *ngIf=\"showChatComponent\"\n                      (rosterStateChanged)=\"onRosterStateChanged($event)\">\n</ngx-chat-roster-list>\n","export function getDomain(service: string) {\n    const domain = service.split('://')[1] || service;\n    return domain.split(':')[0].split('/')[0];\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { IqResponseStanza, Stanza } from '../../../../core/stanza';\nimport { removeDuplicates } from '../../../../core/utils-array';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { PublishSubscribePlugin } from './publish-subscribe.plugin';\n\nexport interface SavedConference {\n    name: string;\n    jid: string;\n    autojoin: boolean;\n}\n\nexport const STORAGE_BOOKMARKS = 'storage:bookmarks';\n\n/**\n * XEP-0048 Bookmarks (https://xmpp.org/extensions/xep-0048.html)\n */\nexport class BookmarkPlugin extends AbstractXmppPlugin {\n\n    private pendingAddConference: Promise<IqResponseStanza<'result'>> | null = null;\n\n    constructor(private readonly publishSubscribePlugin: PublishSubscribePlugin) {\n        super();\n    }\n\n    onOffline(): void {\n        this.pendingAddConference = null;\n    }\n\n    async retrieveMultiUserChatRooms(): Promise<SavedConference[]> {\n        const itemNode = await this.publishSubscribePlugin.retrieveNodeItems(STORAGE_BOOKMARKS);\n        const storageNode = itemNode && itemNode[0] && itemNode[0].getChild('storage', STORAGE_BOOKMARKS);\n        const conferenceNodes = itemNode && storageNode.getChildren('conference');\n        if (!conferenceNodes) {\n            return [];\n        }\n        return conferenceNodes.map(c => this.convertElementToSavedConference(c));\n    }\n\n    private convertElementToSavedConference(conferenceNode: Element): SavedConference {\n        return {\n            name: conferenceNode.attrs.name,\n            jid: conferenceNode.attrs.jid,\n            autojoin: conferenceNode.attrs.autojoin === 'true',\n        };\n    }\n\n    saveConferences(conferences: SavedConference[]): Promise<IqResponseStanza<'result'>> {\n        const deduplicatedConferences = removeDuplicates(conferences, (x, y) => x.jid === y.jid);\n        return this.publishSubscribePlugin.storePrivatePayloadPersistent(\n            STORAGE_BOOKMARKS,\n            null,\n            xml('storage', {xmlns: STORAGE_BOOKMARKS},\n                ...deduplicatedConferences.map(c => this.convertSavedConferenceToElement(c)),\n            ),\n        );\n    }\n\n    async addConference(conferenceToSave: SavedConference): Promise<IqResponseStanza<'result'>> {\n        while (this.pendingAddConference) {\n            try {\n                await this.pendingAddConference; // serialize the writes, so that in case of multiple conference adds all get added\n            } catch {}\n        }\n\n        this.pendingAddConference = this.addConferenceInternal(conferenceToSave);\n\n        try {\n            return await this.pendingAddConference;\n        } finally {\n            this.pendingAddConference = null;\n        }\n    }\n\n    private async addConferenceInternal(conferenceToSave: SavedConference): Promise<IqResponseStanza<'result'>> {\n        const savedConferences = await this.retrieveMultiUserChatRooms();\n        const conferences = [...savedConferences, conferenceToSave];\n\n        return await this.saveConferences(conferences);\n    }\n\n    private convertSavedConferenceToElement({name, autojoin, jid}: SavedConference): Stanza {\n        return xml('conference', {name, jid, autojoin: autojoin.toString()}) as Stanza;\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { BehaviorSubject, of } from 'rxjs';\nimport { catchError, first, mergeMap, map, timeout } from 'rxjs/operators';\nimport { LogService } from '../../../log.service';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { ServiceDiscoveryPlugin } from './service-discovery.plugin';\n\nexport interface TimeReference {\n    utcTimestamp: number;\n    /**\n     * When was utcTimestamp seen locally according to performance.now().\n     */\n    localReference: number;\n}\n\n/**\n * Request time of entities via XEP-0202.\n */\nexport class EntityTimePlugin extends AbstractXmppPlugin {\n\n    private serverSupportsTime$ = new BehaviorSubject<boolean | 'unknown'>('unknown');\n    private serverTime$ = new BehaviorSubject<TimeReference | null>(null);\n\n    constructor(\n        private xmppChatAdapter: XmppChatAdapter,\n        private serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n        private logService: LogService,\n    ) {\n        super();\n    }\n\n    async onBeforeOnline(): Promise<void> {\n        const serverSupportsTimeRequest = await this.serviceDiscoveryPlugin.supportsFeature(\n            this.xmppChatAdapter.chatConnectionService.userJid.domain,\n            'urn:xmpp:time',\n        );\n        if (serverSupportsTimeRequest) {\n            const sharedUtcTimeStamp = await this.requestTime(this.xmppChatAdapter.chatConnectionService.userJid.domain);\n            this.serverTime$.next(sharedUtcTimeStamp);\n            this.serverSupportsTime$.next(true);\n        } else {\n            this.serverSupportsTime$.next(false);\n        }\n    }\n\n    onOffline() {\n        this.serverSupportsTime$.next('unknown');\n        this.serverTime$.next(null);\n    }\n\n    /**\n     * Returns a non-client-specific timestamp if server supports XEP-0202. Fallback to local timestamp in case of missing support.\n     */\n    async getNow(): Promise<number> {\n        const calculateNowViaServerTime$ = this.serverTime$.pipe(map(reference => this.calculateNow(reference)), first());\n        return await this.serverSupportsTime$.pipe(\n            timeout(5000),\n            first(supportsServerTime => supportsServerTime !== 'unknown'),\n            mergeMap(supportsServerTime => supportsServerTime ? calculateNowViaServerTime$ : of(Date.now())),\n            catchError(() => of(Date.now())),\n        ).toPromise();\n    }\n\n    private calculateNow(reference: TimeReference): number {\n        return reference.utcTimestamp + (performance.now() - reference.localReference);\n    }\n\n    async requestTime(jid: string): Promise<TimeReference> {\n        const response = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get', to: jid},\n                xml('time', {xmlns: 'urn:xmpp:time'}),\n            ),\n        );\n        const utcString = response.getChild('time', 'urn:xmpp:time')?.getChildText('utc');\n        if (!utcString) {\n            const message = 'invalid time response';\n            this.logService.error(message, response.toString());\n            throw new Error(message);\n        }\n        return {utcTimestamp: Date.parse(utcString), localReference: performance.now()};\n    }\n\n}\n","import { HttpClient } from '@angular/common/http';\nimport { xml } from '@xmpp/client';\nimport { LogService } from '../../../log.service';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { Service, ServiceDiscoveryPlugin } from './service-discovery.plugin';\nimport {FileUploadHandler} from '../../../../hooks/file-upload-handler';\n\n/**\n * XEP-0363 http file upload\n */\nexport class HttpFileUploadPlugin extends AbstractXmppPlugin implements FileUploadHandler {\n\n    private fileUploadSupported: boolean;\n    private uploadService: Promise<Service>;\n\n    constructor(\n        private readonly httpClient: HttpClient,\n        private readonly serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly logService: LogService\n    ) {\n        super();\n    }\n\n    onBeforeOnline(): Promise<void> {\n        this.uploadService = this.serviceDiscoveryPlugin.findService('store', 'file');\n        this.uploadService.then(() => {\n            this.fileUploadSupported = true;\n        }, () => {\n            this.fileUploadSupported = false;\n            this.logService.info('http file upload not supported');\n        });\n        return Promise.resolve();\n    }\n\n    onOffline(): void {\n        this.uploadService = null;\n        this.fileUploadSupported = false;\n    }\n\n    async upload(file: File): Promise<string> {\n        await this.uploadService;\n        const {name, size, type} = file;\n        const slotUrl = await this.requestSlot(name, size.toString(), type);\n        return await this.uploadToSlot(slotUrl, file);\n    }\n\n    isUploadSupported(): boolean {\n        return this.fileUploadSupported;\n    }\n\n    private async requestSlot(filename: string, size: string, contentType: string): Promise<string | undefined> {\n        const to = (await this.uploadService).jid;\n        const slotResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {to, type: 'get'},\n                xml('request', {xmlns: 'urn:xmpp:http:upload:0', filename, size, 'content-type': contentType})));\n        return slotResponse.getChild('slot').getChild('put').attrs.url;\n    }\n\n    private async uploadToSlot(slot: string, file: File): Promise<string> {\n        await this.httpClient.put(slot, file, {responseType: 'blob'}).toPromise();\n        return slot;\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { Element } from 'ltx';\nimport { Direction } from '../../../../core/message';\nimport {IqResponseStanza, MessageWithBodyStanza, Stanza} from '../../../../core/stanza';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { MessageReceivedEvent } from './message.plugin';\n\n/**\n * XEP-0280 Message Carbons\n */\nexport class MessageCarbonsPlugin extends AbstractXmppPlugin {\n\n    constructor(private readonly xmppChatAdapter: XmppChatAdapter) {\n        super();\n    }\n\n    async onBeforeOnline(): Promise<IqResponseStanza> {\n        return await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('enable', {xmlns: 'urn:xmpp:carbons:2'}),\n            ),\n        );\n    }\n\n    handleStanza(stanza: Stanza): boolean {\n        const receivedOrSentElement = stanza.getChildByAttr('xmlns', 'urn:xmpp:carbons:2');\n        const forwarded = receivedOrSentElement && receivedOrSentElement.getChild('forwarded', 'urn:xmpp:forward:0');\n        const messageElement = forwarded && forwarded.getChild('message', 'jabber:client');\n        const carbonFrom = stanza.attrs.from;\n        const userJid = this.xmppChatAdapter.chatConnectionService.userJid;\n        if (stanza.is('message') && receivedOrSentElement && forwarded && messageElement && userJid\n            && userJid.bare().toString() === carbonFrom) {\n            return this.handleCarbonMessageStanza(messageElement, receivedOrSentElement);\n        }\n        return false;\n    }\n\n    private handleCarbonMessageStanza(messageElement: Element, receivedOrSent: Element): boolean {\n        const direction = receivedOrSent.is('received') ? Direction.in : Direction.out;\n        // body can be missing on type=chat messageElements\n        const body = messageElement.getChildText('body')?.trim();\n\n        const message = {\n            body,\n            direction,\n            datetime: new Date(), // TODO: replace with entity time plugin\n            delayed: false,\n            fromArchive: false,\n        };\n\n        const messageReceivedEvent = new MessageReceivedEvent();\n        this.xmppChatAdapter.plugins.forEach(plugin => plugin.afterReceiveMessage(message, messageElement as MessageWithBodyStanza, messageReceivedEvent));\n        if (!messageReceivedEvent.discard) {\n            const {from, to} = messageElement.attrs;\n            const contactJid = direction === Direction.in ? from : to;\n            const contact = this.xmppChatAdapter.getOrCreateContactById(contactJid);\n            contact.addMessage(message);\n\n            if (direction === Direction.in) {\n                this.xmppChatAdapter.message$.next(contact);\n            }\n        }\n\n        return true;\n    }\n\n}\n","export class TimeoutError extends Error {\n    constructor(message?: string) {\n        super(message);\n        this.name = 'TimeoutError';\n    }\n}\n\nexport function delay(ms: number) {\n    let localDelay;\n    const promise = new Promise(resolve => {\n        localDelay = setTimeout(resolve, ms);\n    });\n    (promise as any).timeout = localDelay;\n    return promise;\n}\n\nexport function timeout(promise: Promise<any>, ms: number) {\n    const promiseDelay = delay(ms);\n\n    // eslint-disable-next-line unicorn/consistent-function-scoping\n    function cancelDelay() {\n        clearTimeout((promiseDelay as any).timeout);\n    }\n\n    return Promise.race([\n        (promise as any).finally(cancelDelay),\n        promiseDelay.then(() => {\n            throw new TimeoutError();\n        }),\n    ]);\n}\n","import { NgZone } from '@angular/core';\nimport { xml } from '@xmpp/client';\nimport { filter } from 'rxjs/operators';\nimport { timeout } from '../../../../core/utils-timeout';\nimport { LogService } from '../../../log.service';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { IqResponseStanza } from '../../../../core/stanza';\n\n/**\n * XEP-0199 XMPP Ping (https://xmpp.org/extensions/xep-0199.html)\n */\nexport class PingPlugin extends AbstractXmppPlugin {\n\n    private timeoutHandle: any;\n    private readonly pingInterval = 60_000;\n\n    constructor(\n        private readonly xmppChatAdapter: XmppChatAdapter,\n        private readonly logService: LogService,\n        private readonly ngZone: NgZone,\n    ) {\n        super();\n\n        this.xmppChatAdapter.state$.pipe(\n            filter(newState => newState === 'online'),\n        ).subscribe(() => this.schedulePings());\n\n        this.xmppChatAdapter.state$.pipe(\n            filter(newState => newState === 'disconnected'),\n        ).subscribe(() => this.unschedulePings());\n    }\n\n    private schedulePings(): void {\n        this.unschedulePings();\n        this.ngZone.runOutsideAngular(() => {\n            this.timeoutHandle = window.setInterval(() => this.ping(), this.pingInterval);\n        });\n    }\n\n    private async ping(): Promise<void> {\n        this.logService.debug('ping...');\n        try {\n            await timeout(this.sendPing(), 10_000);\n            this.logService.debug('... pong');\n        } catch {\n            if (this.xmppChatAdapter.state$.getValue() === 'online'\n                && this.xmppChatAdapter.chatConnectionService.state$.getValue() === 'online') {\n                this.logService.error('... pong errored,  connection should be online, waiting for browser websocket timeout');\n            }\n        }\n    }\n\n    private async sendPing(): Promise<IqResponseStanza<'result'>> {\n        return await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'get'},\n                xml('ping', {xmlns: 'urn:xmpp:ping'})\n            )\n        );\n    }\n\n    private unschedulePings(): void {\n        window.clearInterval(this.timeoutHandle);\n    }\n\n}\n","import { xml } from '@xmpp/client';\nimport { XmppChatAdapter } from '../xmpp-chat-adapter.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\nimport { ServiceDiscoveryPlugin } from './service-discovery.plugin';\n\n/**\n * xep-0357\n */\nexport class PushPlugin extends AbstractXmppPlugin {\n\n    constructor(\n        private xmppChatAdapter: XmppChatAdapter,\n        private serviceDiscoveryPlugin: ServiceDiscoveryPlugin,\n    ) {\n        super();\n    }\n\n    async register(node: string, jid?: string): Promise<any> {\n        if (!jid) {\n            const service = await this.getPushServiceComponent();\n            jid = service.jid;\n        }\n        return await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('enable', {xmlns: 'urn:xmpp:push:0', jid, node})\n            )\n        );\n    }\n\n    private async getPushServiceComponent() {\n        return await this.serviceDiscoveryPlugin.findService('pubsub', 'push');\n    }\n\n    async unregister(node?: string, jid?: string): Promise<any> {\n        if (!jid) {\n            const service = await this.getPushServiceComponent();\n            jid = service.jid;\n        }\n        return await this.xmppChatAdapter.chatConnectionService.sendIq(\n            xml('iq', {type: 'set'},\n                xml('disable', {xmlns: 'urn:xmpp:push:0', jid, node})\n            )\n        );\n    }\n\n}\n","import { NgZone } from '@angular/core';\nimport { Client, client, xml } from '@xmpp/client';\nimport { Subject } from 'rxjs';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { getDomain } from '../../../../core/get-domain';\nimport { timeout } from '../../../../core/utils-timeout';\nimport { LogService } from '../../../log.service';\nimport { AbstractXmppPlugin } from './abstract-xmpp-plugin';\n\n/**\n * XEP-0077: In-Band Registration\n * see: https://xmpp.org/extensions/xep-0077.html\n * Handles registration over the XMPP chat instead of relaying on a admin user account management\n */\nexport class RegistrationPlugin extends AbstractXmppPlugin {\n\n    private readonly registered$ = new Subject<void>();\n    private readonly cleanUp = new Subject<void>();\n    private readonly loggedIn$ = new Subject<void>();\n    private readonly registrationTimeout = 5000;\n    private client: Client;\n\n    constructor(private logService: LogService,\n                private ngZone: NgZone) {\n        super();\n    }\n\n    /**\n     * Promise resolves if user account is registered successfully,\n     * rejects if an error happens while registering, e.g. the username is already taken.\n     */\n    public async register(username: string,\n                          password: string,\n                          service: string,\n                          domain: string): Promise<void> {\n        await this.ngZone.runOutsideAngular(async () => {\n            try {\n                await timeout((async () => {\n                    domain = domain || getDomain(service);\n\n                    this.logService.debug('registration plugin', 'connecting...');\n                    await this.connect(username, password, service, domain);\n\n                    this.logService.debug('registration plugin', 'connection established, starting registration');\n                    await this.client.iqCaller.request(\n                        xml('iq', {type: 'get', to: domain},\n                            xml('query', {xmlns: 'jabber:iq:register'})\n                        )\n                    );\n\n                    this.logService.debug('registration plugin', 'server acknowledged registration request, sending credentials');\n                    await this.client.iqCaller.request(\n                        xml('iq', {type: 'set'},\n                            xml('query', {xmlns: 'jabber:iq:register'},\n                                xml('username', {}, username),\n                                xml('password', {}, password)\n                            )\n                        )\n                    );\n\n                    this.registered$.next();\n                    await this.loggedIn$.pipe(takeUntil(this.cleanUp), first()).toPromise();\n                    this.logService.debug('registration plugin', 'registration successful');\n                })(), this.registrationTimeout);\n            } catch (e) {\n                this.logService.warn('error registering', e);\n                throw e;\n            } finally {\n                this.cleanUp.next();\n                this.logService.debug('registration plugin', 'cleaning up');\n                await this.client.stop();\n            }\n        });\n    }\n\n    private connect(username: string, password: string, service: string, domain?: string): Promise<void> {\n        return new Promise(resolveConnectionEstablished => {\n            this.client = client({\n                domain: domain || getDomain(service),\n                service,\n                credentials: async (authenticationCallback) => {\n                    resolveConnectionEstablished();\n                    await this.registered$.pipe(takeUntil(this.cleanUp), first()).toPromise();\n                    await authenticationCallback({username, password});\n                }\n            });\n\n            this.client.reconnect.stop();\n            this.client.timeout = this.registrationTimeout;\n\n            this.client.on('online', () => {\n                this.logService.debug('registration plugin', 'online event');\n                this.loggedIn$.next();\n            });\n\n            this.client.on('error', (err: any) => {\n                this.logService.error('registration plugin', err);\n            });\n\n            this.client.on('offline', () => {\n                this.logService.debug('registration plugin', 'offline event');\n            });\n\n            return this.client.start();\n        });\n    }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { JID } from '@xmpp/jid';\nimport { Contact } from '../core/contact';\nimport { MultiUserChatPlugin} from './adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin';\nimport { CHAT_SERVICE_TOKEN, ChatService } from './chat-service';\nimport { Room } from './adapters/xmpp/plugins/multi-user-chat/room';\n\n@Injectable()\nexport class ChatBackgroundNotificationService {\n\n    private enabled = false;\n\n    constructor(@Inject(CHAT_SERVICE_TOKEN) protected chatService: ChatService) {\n        chatService.message$.subscribe((msg) => {\n            this.receivedDirectMessage(msg);\n        });\n        chatService.getPlugin(MultiUserChatPlugin).message$.subscribe(async room => {\n            await this.receivedGroupMessage(room);\n        });\n    }\n\n    enable() {\n        if (this.supportsNotification()) {\n            this.requestNotificationPermission();\n            this.enabled = true;\n        }\n    }\n\n    disable() {\n        this.enabled = false;\n    }\n\n    private requestNotificationPermission() {\n        const notification = Notification as any;\n        notification.requestPermission();\n    }\n\n    private receivedDirectMessage(contact: Contact) {\n        if (this.shouldDisplayNotification()) {\n            const notification = new Notification(contact.name, {body: contact.mostRecentMessage.body, icon: contact.avatar});\n            notification.addEventListener('click', () => {\n                window.focus();\n                notification.close();\n            });\n        }\n    }\n\n    private async receivedGroupMessage(room: Room) {\n        if (this.shouldDisplayNotification()) {\n            const message = room.mostRecentMessage.body;\n            const sender = room.mostRecentMessage.from;\n            const options = await this.customizeGroupMessage(sender, message);\n            const notification = new Notification(room.name, options);\n            notification.addEventListener('click', () => {\n                window.focus();\n                notification.close();\n            });\n        }\n    }\n\n    protected async customizeGroupMessage(sender: JID, message: string) {\n        return {body: `${sender}: ${message}`};\n    }\n\n    private shouldDisplayNotification() {\n        const notification = Notification as any;\n        return this.enabled\n            && document.visibilityState === 'hidden'\n            && this.supportsNotification()\n            && notification.permission === 'granted';\n    }\n\n    private supportsNotification() {\n        return 'Notification' in window;\n    }\n}\n","import { TextFieldModule } from '@angular/cdk/text-field';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient, HttpClientModule } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule, NgZone } from '@angular/core';\nimport { ChatAvatarComponent } from './components/chat-avatar/chat-avatar.component';\nimport { FileDropComponent } from './components/chat-filedrop/file-drop.component';\nimport { ChatMessageInputComponent } from './components/chat-message-input/chat-message-input.component';\nimport { ChatMessageLinkComponent } from './components/chat-message-link/chat-message-link.component';\nimport { ChatMessageListComponent } from './components/chat-message-list/chat-message-list.component';\nimport { ChatMessageSimpleComponent } from './components/chat-message-simple/chat-message-simple.component';\nimport { ChatMessageTextComponent } from './components/chat-message-text/chat-message-text.component';\nimport { ChatMessageComponent } from './components/chat-message/chat-message.component';\nimport { ChatVideoWindowComponent } from './components/chat-video-window/chat-video-window.component';\nimport { ChatWindowFrameComponent } from './components/chat-window-frame/chat-window-frame.component';\nimport { ChatWindowListComponent } from './components/chat-window-list/chat-window-list.component';\nimport { ChatWindowComponent } from './components/chat-window/chat-window.component';\nimport { ChatComponent } from './components/chat.component';\nimport { RosterListComponent } from './components/roster-list/roster-list.component';\nimport { RosterRecipientComponent } from './components/roster-recipient/roster-recipient.component';\nimport { IntersectionObserverDirective } from './directives/intersection-observer.directive';\nimport { LinksDirective } from './directives/links.directive';\nimport { BlockPlugin } from './services/adapters/xmpp/plugins/block.plugin';\nimport { BookmarkPlugin } from './services/adapters/xmpp/plugins/bookmark.plugin';\nimport { EntityTimePlugin } from './services/adapters/xmpp/plugins/entity-time.plugin';\nimport { HttpFileUploadPlugin } from './services/adapters/xmpp/plugins/http-file-upload.plugin';\nimport { MessageArchivePlugin } from './services/adapters/xmpp/plugins/message-archive.plugin';\nimport { MessageCarbonsPlugin } from './services/adapters/xmpp/plugins/message-carbons.plugin';\nimport { MessageStatePlugin } from './services/adapters/xmpp/plugins/message-state.plugin';\nimport { MessageUuidPlugin } from './services/adapters/xmpp/plugins/message-uuid.plugin';\nimport { MessagePlugin } from './services/adapters/xmpp/plugins/message.plugin';\nimport { MucSubPlugin } from './services/adapters/xmpp/plugins/muc-sub.plugin';\nimport { MultiUserChatPlugin } from './services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin';\nimport { PingPlugin } from './services/adapters/xmpp/plugins/ping.plugin';\nimport { PublishSubscribePlugin } from './services/adapters/xmpp/plugins/publish-subscribe.plugin';\nimport { PushPlugin } from './services/adapters/xmpp/plugins/push.plugin';\nimport { RegistrationPlugin } from './services/adapters/xmpp/plugins/registration.plugin';\nimport { RosterPlugin } from './services/adapters/xmpp/plugins/roster.plugin';\nimport { ServiceDiscoveryPlugin } from './services/adapters/xmpp/plugins/service-discovery.plugin';\nimport { UnreadMessageCountPlugin } from './services/adapters/xmpp/plugins/unread-message-count.plugin';\nimport { XmppChatAdapter } from './services/adapters/xmpp/xmpp-chat-adapter.service';\nimport { XmppChatConnectionService } from './services/adapters/xmpp/xmpp-chat-connection.service';\nimport { XmppClientFactoryService } from './services/adapters/xmpp/xmpp-client-factory.service';\nimport { ChatBackgroundNotificationService } from './services/chat-background-notification.service';\nimport { ChatListStateService } from './services/chat-list-state.service';\nimport { ChatMessageListRegistryService } from './services/chat-message-list-registry.service';\nimport { CHAT_SERVICE_TOKEN, ChatService } from './services/chat-service';\nimport { ContactFactoryService } from './services/contact-factory.service';\nimport { LogService } from './services/log.service';\nimport { FILE_UPLOAD_HANDLER_TOKEN } from './hooks/file-upload-handler';\nimport {FormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        HttpClientModule,\n        FormsModule,\n        TextFieldModule,\n        RouterModule,\n    ],\n    declarations: [\n        ChatComponent,\n        ChatMessageComponent,\n        ChatMessageInputComponent,\n        ChatMessageLinkComponent,\n        ChatMessageListComponent,\n        ChatMessageSimpleComponent,\n        ChatMessageTextComponent,\n        ChatWindowComponent,\n        ChatWindowListComponent,\n        LinksDirective,\n        IntersectionObserverDirective,\n        RosterListComponent,\n        FileDropComponent,\n        ChatWindowFrameComponent,\n        ChatVideoWindowComponent,\n        ChatAvatarComponent,\n        RosterRecipientComponent,\n    ],\n    exports: [\n        ChatComponent,\n        ChatMessageInputComponent,\n        ChatMessageListComponent,\n        ChatMessageSimpleComponent,\n        FileDropComponent,\n        LinksDirective,\n    ],\n})\nexport class NgxChatModule {\n\n    static forRoot(): ModuleWithProviders<NgxChatModule> {\n\n        return {\n            ngModule: NgxChatModule,\n            providers: [\n                ChatBackgroundNotificationService,\n                ChatListStateService,\n                ChatMessageListRegistryService,\n                ContactFactoryService,\n                LogService,\n                XmppChatConnectionService,\n                XmppClientFactoryService,\n                {\n                    provide: CHAT_SERVICE_TOKEN,\n                    deps: [\n                        XmppChatConnectionService,\n                        ChatMessageListRegistryService,\n                        ContactFactoryService,\n                        HttpClient,\n                        LogService,\n                        NgZone,\n                    ],\n                    useFactory: NgxChatModule.xmppChatAdapter,\n                },\n                {\n                    provide: FILE_UPLOAD_HANDLER_TOKEN,\n                    deps: [CHAT_SERVICE_TOKEN],\n                    useFactory: NgxChatModule.fileUploadHandlerFactory,\n                },\n            ],\n        };\n\n    }\n\n    private static fileUploadHandlerFactory(chatService: ChatService) {\n        return chatService.getPlugin(HttpFileUploadPlugin);\n    }\n\n    private static xmppChatAdapter(\n        chatConnectionService: XmppChatConnectionService,\n        chatMessageListRegistryService: ChatMessageListRegistryService,\n        contactFactory: ContactFactoryService,\n        httpClient: HttpClient,\n        logService: LogService,\n        ngZone: NgZone,\n    ): XmppChatAdapter {\n        const xmppChatAdapter = new XmppChatAdapter(chatConnectionService, logService, contactFactory);\n\n        const serviceDiscoveryPlugin = new ServiceDiscoveryPlugin(xmppChatAdapter);\n        const publishSubscribePlugin = new PublishSubscribePlugin(xmppChatAdapter, serviceDiscoveryPlugin);\n        const entityTimePlugin = new EntityTimePlugin(xmppChatAdapter, serviceDiscoveryPlugin, logService);\n        const multiUserChatPlugin = new MultiUserChatPlugin(xmppChatAdapter, logService, serviceDiscoveryPlugin);\n        const unreadMessageCountPlugin = new UnreadMessageCountPlugin(\n            xmppChatAdapter, chatMessageListRegistryService, publishSubscribePlugin, entityTimePlugin, multiUserChatPlugin);\n        const messagePlugin = new MessagePlugin(xmppChatAdapter, logService);\n\n        xmppChatAdapter.addPlugins([\n            new BookmarkPlugin(publishSubscribePlugin),\n            new MessageArchivePlugin(xmppChatAdapter, serviceDiscoveryPlugin, multiUserChatPlugin, logService, messagePlugin),\n            messagePlugin,\n            new MessageUuidPlugin(),\n            multiUserChatPlugin,\n            publishSubscribePlugin,\n            new RosterPlugin(xmppChatAdapter, logService),\n            serviceDiscoveryPlugin,\n            new PushPlugin(xmppChatAdapter, serviceDiscoveryPlugin),\n            new PingPlugin(xmppChatAdapter, logService, ngZone),\n            new RegistrationPlugin(logService, ngZone),\n            new MessageCarbonsPlugin(xmppChatAdapter),\n            unreadMessageCountPlugin,\n            new HttpFileUploadPlugin(httpClient, serviceDiscoveryPlugin, xmppChatAdapter, logService),\n            new MessageStatePlugin(publishSubscribePlugin, xmppChatAdapter, chatMessageListRegistryService, logService,\n                entityTimePlugin),\n            new MucSubPlugin(xmppChatAdapter, serviceDiscoveryPlugin),\n            new BlockPlugin(xmppChatAdapter, serviceDiscoveryPlugin),\n            entityTimePlugin,\n        ]);\n\n        return xmppChatAdapter;\n    }\n\n}\n","export interface SelectFileParameters {\n    accept?: string;\n    multiple?: boolean;\n}\n\nexport function selectFile(params: SelectFileParameters = {accept: '*', multiple: false}): Promise<FileList> {\n    return new Promise((resolve) => {\n        const htmlInputElement = document.createElement('input');\n        htmlInputElement.style.display = 'none';\n        htmlInputElement.type = 'file';\n        htmlInputElement.accept = params.accept;\n        htmlInputElement.multiple = params.multiple;\n        htmlInputElement.addEventListener('change', () => {\n            resolve(htmlInputElement.files);\n            document.body.removeChild(htmlInputElement);\n        });\n        document.body.appendChild(htmlInputElement);\n        htmlInputElement.click();\n    });\n}\n","/*\n * Public API Surface of ngx-chat\n */\n\nexport { jid as parseJid } from '@xmpp/client';\nexport { JID } from '@xmpp/jid';\nexport * from './lib/components/chat-filedrop/file-drop.component';\nexport * from './lib/components/chat-message-input/chat-message-input.component';\nexport * from './lib/components/chat-message-list/chat-message-list.component';\nexport * from './lib/components/chat-message-simple/chat-message-simple.component';\nexport * from './lib/components/chat-message/chat-message.component';\nexport * from './lib/components/chat-window/chat-window.component';\nexport * from './lib/components/chat.component';\nexport * from './lib/core/contact';\nexport * from './lib/core/contact-avatar';\nexport * from './lib/core/form';\nexport * from './lib/core/get-domain';\nexport * from './lib/core/id-generator';\nexport * from './lib/core/log-in-request';\nexport * from './lib/core/message';\nexport * from './lib/core/message-store';\nexport * from './lib/core/plugin';\nexport * from './lib/core/presence';\nexport * from './lib/core/recipient';\nexport * from './lib/core/stanza';\nexport * from './lib/core/subscription';\nexport * from './lib/core/translations';\nexport * from './lib/directives/links.directive';\nexport * from './lib/hooks/chat-contact-click-handler';\nexport * from './lib/hooks/file-upload-handler';\nexport * from './lib/ngx-chat.module';\nexport * from './lib/services/adapters/xmpp/abstract-stanza-builder';\nexport * from './lib/services/adapters/xmpp/plugins/abstract-xmpp-plugin';\nexport * from './lib/services/adapters/xmpp/plugins/block.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/bookmark.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/http-file-upload.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/message-archive.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/message-carbons.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/message-state.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/message-uuid.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/message.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/muc-sub.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/multi-user-chat/multi-user-chat.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/ping.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/publish-subscribe.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/push.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/registration.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/roster.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/service-discovery.plugin';\nexport * from './lib/services/adapters/xmpp/plugins/unread-message-count.plugin';\nexport * from './lib/services/adapters/xmpp/xmpp-chat-adapter.service';\nexport * from './lib/services/adapters/xmpp/xmpp-chat-connection.service';\nexport * from './lib/services/adapters/xmpp/xmpp-client-factory.service';\nexport * from './lib/services/adapters/xmpp/xmpp-response.error';\nexport * from './lib/services/chat-background-notification.service';\nexport * from './lib/services/chat-list-state.service';\nexport * from './lib/services/chat-message-list-registry.service';\nexport * from './lib/services/chat-style';\nexport * from './lib/services/chat-service';\nexport * from './lib/services/contact-factory.service';\nexport * from './lib/services/log.service';\nexport * from './lib/services/report-user-service';\nexport { LinkOpener, LINK_OPENER_TOKEN } from './lib/components/chat-message-link/chat-message-link.component';\nexport { selectFile } from './lib/core/utils-file';\nexport { Room } from './lib/services/adapters/xmpp/plugins/multi-user-chat/room';\nexport { Affiliation, AffiliationModification } from './lib/services/adapters/xmpp/plugins/multi-user-chat/affiliation';\nexport { Role, RoleModification } from './lib/services/adapters/xmpp/plugins/multi-user-chat/role';\nexport { RoomUser } from './lib/services/adapters/xmpp/plugins/multi-user-chat/room-user';\nexport { RoomOccupant } from './lib/services/adapters/xmpp/plugins/multi-user-chat/room-occupant';\nexport { Invitation } from './lib/services/adapters/xmpp/plugins/multi-user-chat/invitation';\nexport { RoomMessage } from './lib/services/adapters/xmpp/plugins/multi-user-chat/room-message';\nexport { OccupantChange } from './lib/services/adapters/xmpp/plugins/multi-user-chat/occupant-change';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["parseJid","wrapperNodeName","nodeName","i1.LogService","i2.XmppClientFactoryService","i1.XmppChatConnectionService","i2.LogService","i3.ContactFactoryService","i1","i2.ChatAvatarComponent","i2.ChatMessageSimpleComponent","i3.LinksDirective","i4","i1.ChatListStateService","i2.ChatMessageListRegistryService","i5.ChatMessageComponent","i6.ChatMessageSimpleComponent","i7.IntersectionObserverDirective","i2","i3.ChatMessageInputComponent","i4.ChatMessageListComponent","i5.FileDropComponent","i6.ChatWindowFrameComponent","i7.ChatAvatarComponent","i1.ChatWindowFrameComponent","i3.ChatWindowComponent","i4.ChatVideoWindowComponent","delay","i3.RosterRecipientComponent","i2.ChatWindowListComponent","i3.RosterListComponent","timeout"],"mappings":"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"}