Текстовый чат

Discussion in 'Web Call Server 5' started by Nikita, Jan 29, 2018.

  1. Nikita

    Nikita New Member

    Здравствуйте! Возможен ли текстовый чат в обычном стриме (1 камера, несколько подписчиков) или он есть только в чат-комнатах? Спасибо.
  2. Max

    Max Administrator Staff Member

    Добрый день.

    Чат можно сделать как угодно.
    Для этого нужно использовать серверные REST hooks и REST API
    На них построены комнаты.
    1. Чтобы послать асинхронное сообщение с JavaScript, нужно вызвать метод sendData()
    Code:
    session.sendData({...});
    WCS отправит хук /OnDataEvent на ваш веб-сервер.
    как показано здесь.
    2. После того, как вы получили OnDataEvent и вытащили из него текст сообщения, его можно послать любому подключенному к WCS пользователю с помощью REST-запроса
    Code:
    http://host:9091/rest-api/data/send
    {}
    Примеры есть здесь.
    Т.е. для того чтобы чат работал, вам нужно принять сообщение и разослать его по подключенным пользователям.
    Для этого нужно написать небольшой бэкенд, который обрабатывает REST-хуки.

    Если нужно чтобы работало из коробки, тогда через комнаты. Там используется встроенный бэкенд, который обрабатывает те же REST-хуки.
  3. Nikita

    Nikita New Member

    Спасибо! В продолжении вопроса - а возможно сделать только текстовый чат, без видео и аудио?
  4. Max

    Max Administrator Staff Member

    Да, можно только текстовый.
    Как показано выше, чат строится на том, что вы можете с помощью REST-запроса отправить сообщение любому клиенту, подключенному к серверу.
    При этом, клиенту не обязательно иметь с сервером аудио видео сессию.
  5. Nikita

    Nikita New Member

    Максим, большое спасибо! Чат заработал. В процессе внедрения возникло несколько вопросов:
    1. Обязательно слать с сервера в ответ на session.sendData все параметры, которые пришли или можно послать пустышку или NULL?
    2. При Ответе с сервера (всеми параметрами) на срабатывает событие SESSION_STATUS.SEND_DATA_STATUS, оно в принципе не нужно, но - не работает.
    3. Можно ли найти все подключения по какому-то custom параметру или только получать все :9091/rest-api/connection/find_all проходить по ним и искать конкретное, нужное, значение custom (это для определения кому слать сообщения, кто к кому законектился). Возможно, для этого лучше использовать chatRoom и на каждый диалог создавать свою комнату...?
    4. Возможно ли сделать свою обработку ответов сервера, на пример, 405 - закончились кредиты, 406 - вас заблокировал пользователь и тд, это нужно что бы при ответе АПИ WEB сервера я мог на стороне клиента в браузере, посредством javascript выдавать какие-то сообщения в зависимости от заголовка. Или лучше использовать все тот же SESSION_STATUS.APP_DATA и там уже разбирать что пришло и соответственно реагировать.
    Заранее, спасибо за ответы.
  6. Nikita

    Nikita New Member

    Еще вопрос вдогонку: а можно запустить несколько сессий на одной странице или, если, вариант с чат румами предпочтительнее - несколько чат румов на одной странице. Спасибо.
  7. Max

    Max Administrator Staff Member

    При вызовe session.sendData WCS вызывает REST метод /onDataEvent. Этот метод не нужно зеркалировать. Достаточно ответить 200 OK с пустым телом.

    Фильтра по custom пока нет, поэтому при поиске по подключениям нужно выбирать /find_all, потом фильтровать.
    Сustom-параметры можно просто хранить в таблице на бэкенде. В реализации комнат так и сделано - сохраняются custom-параметры каждого подключившигося, и потому известно кому что рассылать.

    Лучше делать все в одной сессии. Комнаты - это просто контексты внутри одной сессии, которые передаются в custom-параметре.
    Реализация room-модуля: https://github.com/flashphoner/flashphoner_client/blob/wcs_api-2.0/src/room-module.js
    Пример на его основе: https://github.com/flashphoner/flas...mples/demo/streaming/conference/conference.js

    Про SESSION_STATUS.SEND_DATA_STATUS, включая обработку ошибку, - уточним.
  8. Max

    Max Administrator Staff Member

    Вместо отправки SESSION_STATUS.SEND_DATA_STATUS обрабатывается Promise: https://github.com/flashphoner/flashphoner_client/blob/wcs_api-2.0/src/flashphoner-core.js#L2060

    В скрипте клиента надо определить обработчики
    Code:
    session.sendData(obj).then(onFulfilled, onRejected);
    - onFulfilled() – сработает при resolve
    - onRejected() – сработает при reject

    Например,
    Code:
    session.sendData({"message":"testMessage"}).then(
        function(info){console.log(info);},
        function(info){console.log(info);}
    );
    После вызова sendData() и ответа веб-сервера на OnDataEvent клиент получит DataStatusEvent с соответствующим operationId и статусом
    - если веб-сервер ответил 200 OK
    Code:
    [{"operationId":"b315d850-10d2-11e8-9e04-b731ad215bc4","status":"ACCEPTED"}]
    будет вызван resolve() и соответствующий обработчик
    - в случае ошибки, например, веб-сервер ответил 403 Forbidden (и restOnError:FAIL в restClientConfig)
    Code:
    [{"operationId":"cf51b2c0-10d0-11e8-9e04-b731ad215bc4","status":"FAILED","info":"com.flashphoner.server.commons.rmi.operations.exception.RestResponseException: Forbidden"}]
    будет вызван reject() и соответствующий обработчик

Share This Page