Отправная точка для веб-клиента XMPP в angular5

Прошу прощения, если вопрос может быть слишком широким, конечно, потому что я новичок в XMPP.

Я разрабатываю приложение Angular6 и хочу интегрировать в него чат Jabber. Я много гуглил, но, кажется, не нашел четкого ответа.

По-видимому, strophe.js выглядит многообещающе, но я не могу найти документацию о том, как интегрировать его в проект Angular5/6.

Любой намек будет принят с благодарностью

Спасибо


person Community    schedule 30.07.2018    source источник
comment
Я не могу помочь с угловой частью, но несколько лет назад я сделал довольно примитивный клиент на основе strophe (без фреймворка, только jQuery), который может быть полезным примером для этой части: github.com/cburschka/cadence   -  person Christoph Burschka    schedule 31.07.2018
comment
@ChristophBurschka Спасибо, Кристоф, на самом деле мне удалось найти относительно хорошо документированные примеры в простом JS/jQuery. Чего я пока не нашел, так это материалов TypeScript/Angular. В любом случае, я взгляну на ваш проект, спасибо, возможно, ваш код будет объединен с проектами, упомянутыми в моем (ниже) ответе. В любом случае большое спасибо!   -  person    schedule 31.07.2018


Ответы (1)


Итак, я нашел xmpp-bosh-client и ngx-chat.

По крайней мере, первый из них задокументирован. Второго нет, но могу заглянуть в исходники.

Может быть, это может помочь кому-то еще в моих же ботинках.

Спасибо

P.S. Если кто-то знает что-то лучше, добро пожаловать

РЕДАКТИРОВАТЬ

Я публикую фрагмент кода того, как мне удалось подключиться к серверу eJabberd (локальному) с помощью strophe.js в интерфейсе TypeScript/Angular (6.x).

чат-панель.service.ts

import { Injectable } from '@angular/core';

import { Strophe, $pres } from 'strophe.js';

import { EJABBERD } from 'app/api/api.module';

var chatPanelServiceInstance: any = null;

@Injectable()
export class ChatPanelService
{
    contacts: any[];
    chats: any[];
    user: any;
    client: any;

    // Private
    private _xmppConnectionsString: String = "ws://" + EJABBERD.host + ":5280/ws"; // WebSockets
    //private _xmppConnectionsString: String = "http://" + EJABBERD.host + ":5280/bosh"; // BOSH 
    private _xmppConnection: any = null;

    /**
     * Constructor
     *
     * @param {HttpClient} _httpClient
     */
    constructor(
    )
    {
        chatPanelServiceInstance = this;
        Strophe.log = (level: any, msg: string) => { console.log(level + ": " + msg); };
    }

    /**
     * Log into eJabberd
     *
     * @param {string} jid      user name
     * @param {string} password password (actually, the user token)
     */
    login(jid: string, password: string): void
    {
        if ( ! this._xmppConnection ) {
            this._xmppConnection = new Strophe.Connection( this._xmppConnectionsString , {'keepalive': true});
        }

        // this._xmppConnection.rawInput = (data: any) => {console.log("RAW IN: " + data)};
        // this._xmppConnection.rawOutput = (data: any) => {console.log("RAW OUT: " + data)};

        this._xmppConnection.connect(jid+'@'+EJABBERD.host, password, this._onConnect);
    }

    /**
     * Disconnect from eJabberd
     */
    logOut(): void
    {
        if ( this._xmppConnection ) {
            this._xmppConnection.options.sync = true;
            this._xmppConnection.flush();
            this._xmppConnection.disconnect("logout");
            this._xmppConnection = null;
        }
    }

    /**
     * eJabberd XMPP message Handler
     * @param {string} msg Message received
     */
    private _onMessage(msg: any): boolean
    {
        console.log(msg);

        return true;
    }

    /**
     * eJabberd connection Handler
     * @param {any} status connection result
     */
    private _onConnect(status: any): void
    {
        switch (status) {
            case Strophe.Status.CONNECTING:
                console.log("Connecting to eJabberd...");
                break;
            case Strophe.Status.CONNFAIL:
                console.log("eJabberd connection failed!");
                break;
            case Strophe.Status.DISCONNECTING:
                console.log("Disconnecting from eJabberd...");
                break;
            case Strophe.Status.DISCONNECTED:
                console.log("Disconnected from eJabberd");
                break;
            case Strophe.Status.CONNECTED:
                // We could have used 'this' instead of an external pointer (chatPanelServiceInstance), 
                // but the compiler is getting the meaning of 'this' wrong since strophe.js is not a native TypeScript library.
                // This means that at run time 'this' doesn't point the service instance, rather to the connection itself.
                // In order to avoid confusion I've chosen to use an explicit pointer to the service. 
                //
                chatPanelServiceInstance._xmppConnection.addHandler(chatPanelServiceInstance._onMessage, null, 'message');

                //Setting our presence in the server so that everyone can know that we are online
                chatPanelServiceInstance._xmppConnection.send($pres().tree());

                console.log("eJabberd connected!");
                break;
            case Strophe.Status.AUTHENTICATING:
                console.log("eJabberd authenticating...");
                break;
            case Strophe.Status.AUTHFAIL:
                console.log("eJabberd authentication failed!");
                break;
            case Strophe.Status.ERROR:
                console.log("eJabberd generic connection error!");
                break;
            case Strophe.Status.ATTACHED:
                console.log("eJabberd connection attached!");
                break;
            case Strophe.Status.REDIRECT:
                console.log("eJabberd connection redirected!");
                break;
            case Strophe.Status.CONNTIMEOUT:
                console.log("eJabberd connection timeout!");
                break;
            default:
                console.log("eJabberd: Unknow connection status");
        }
    }

Соответствующие пункты:

  1. Обратите внимание на использование _xmppConnectionString: я использую веб-сокеты для подключения, но версия BOSH также работает нормально.
  2. Обратите внимание на использование внешнего указателя на службу. (chatPanelServiceInstance — см. комментарии в коде)
  3. Установите strophe.js следующим образом: в корневой папке вашего углового проекта введите npm install --save strophe.js
person Community    schedule 31.07.2018
comment
Привет, Вэй-цзе. На самом деле я использую другой strophe.js. И это работает. Могу ли я поделиться фрагментом кода того, что я сделал. - person ; 21.09.2018
comment
Привет, Раффаэле, да, пожалуйста, поделитесь со мной кодами, я могу почерпнуть оттуда идеи. Я уже несколько недель безуспешно пытаюсь настроить проект Android-приложения нативного скрипта angular для подключения к бэкэнду openfire! - person Wei-jye; 21.09.2018
comment
@Wei-jye Вот ты где - person ; 22.09.2018
comment
@Raffaele_Candeliere Спасибо. - person Wei-jye; 25.09.2018
comment
Привет, не могли бы вы поделиться подходом, который вы использовали здесь. - person avinashkr; 26.09.2019
comment
Привет @avinashkr. Код в моем ответе более или менее понятен тем, кто знаком с Angular/Ejabber. Что вы подразумеваете под общим подходом? - person ; 27.09.2019
comment
@RaffaeleCandeliere Мне особенно интересно узнать, как вы справлялись с разбором / составлением строф xml и функциями, связанными с iq. - person avinashkr; 29.09.2019
comment
Давать имя пользователя и пароль небезопасно. Есть ли другой способ подключить сервер xmpp от клиента? Я использую Openfire и strophe.js - person Sahal; 10.01.2020
comment
@sahal Если параметр механизма не указан (см. документацию: strophe.im/strophejs/doc/1.3.0/files/) Strophe по умолчанию использует SASL OAUTHBEARER, так что параметр пароля на самом деле является токеном авторизации, а не настоящим паролем (см. также описание параметр пароля в моей функции Login()) - person ; 12.01.2020
comment
@avinashkr Привет, извините за поздний ответ. На самом деле моя проблема заключалась в том, как начать разговор, и мой пример касается в основном этого. Для того, что вы спрашиваете, это может дать вам подсказку: stackoverflow.com/questions/56022820/ - person ; 12.01.2020