MQTT прослушивает несколько раз одну и ту же тему в угловой директиве js - PullRequest
0 голосов
/ 12 сентября 2018

Я занимаюсь разработкой приложения поддержки чата, в котором сотрудник может оказывать поддержку нескольким клиентам одновременно. Я написал директиву chat-popup-box.directive.js, которая используется как персоналом, так и клиентом.

когда клиент нажимает на значок поддержки чата, запускается chat-popup-box.directive.js и открывается чат для клиента. Затем срабатывает API, который создает идентификатор сеанса, который является своего рода уникальным каналом для общения.

После этого клиент публикует следующую тему

mqtt.publish(`wrkspot/support/${scope.siteID}/${scope.sessionID}/newcall`, payload);

Персонал слушает этот новый вызов и получает sessionId и идентификатор клиента, который является родительским в полезной нагрузке. Затем клиент публикует тему по клику посетителя с таким же идентификатором сессии

 mqtt.publish(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/attend`, payload);

Клиент слушает эту тему и получает supportId из полезной нагрузки.

После этого сотрудники прослушивают любой чат, отправленный клиентом на

wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.clientSelected.clientID}/chat

и публикует чат на

mqtt.publish(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.employeeID}/chat`, chatPayload);

employeeID является идентификатором поддержки. Таким образом, персонал публикует чат по теме с идентификатором поддержки и слушает тему с идентификатором клиента. Это наоборот на стороне клиента.

Проблема в том, что сотрудники открыли 2 окна чата, что означает, что директива была дважды активирована на стороне персонала. Клиент получает одно и то же сообщение дважды, хотя тема была опубликована только один раз.

Ниже приводится выдержка из директивы, которую я создал

element.on('click', function(event){
if(!scope.isClient) {
    if(scope.clientSelected) {
        register_popup(scope.clientSelected.clientID, scope.clientSelected.senderName);
    }
    /**
     * publish attend topic on click of attend.
     * After publishing attend staff will start listening to chat published by client
     */
    publishAttendTopic(() => {
            mqtt.message(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.clientSelected.clientID}/chat`, (topic, res) => {
            var msg = JSON.parse(res) || {};
            scope.chatMessages.push(msg);
        });
    });    
} else {
    /**
     * open chat popup and Hits POST API to create sessionId when client click on chat support.
     * On creating session publish newcall
     */
    register_popup('support1', 'Chat Support');
    var payload = {
        "siteId": scope.siteID,
        "clientId": scope.clientId,
        "userId": scope.employeeID,
        "message": ""
    }
    dataservice.createSupportChannel(payload).then(res => {
        scope.sessionID = res.data.sessionId;
        var payload = {
            "clientID":scope.clientId,
            "senderName": scope.senderName,
            "sessionID":scope.sessionID,
            "siteID":scope.siteID,
            "state":"",
            "supportID":""
        }
        mqtt.publish(`wrkspot/support/${scope.siteID}/${scope.sessionID}/newcall`, payload);
        /**
         * Listens to the attend topic published by staff after staff clicks on attend.
         * subscribe to chat publihed by staff.
         * subscirbe to ack published by staff.
         */
        listenAttendTopic(staffRes => {
            scope.supportID = staffRes.supportID;

            mqtt.message(`wrkspot/support/${scope.siteID}/${scope.sessionID}/${staffRes.supportID}/chat`,(topic, res) => {
                console.log('chat topic subscribe by client :', `wrkspot/support/${scope.siteID}/${scope.sessionID}/${staffRes.supportID}/chat`);
                var msg = JSON.parse(res) || {};
                scope.chatMessages.push(msg);
            });

        });
    });
}});

Я подумал, что это может быть потому, что оба окна чата публикуют чат, так как директива была активирована дважды, но тема уникальна. и я проверил в консоли, что тема публикуется только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...