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

Nikita

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

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-хуки.
 

Nikita

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

Max

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

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 и там уже разбирать что пришло и соответственно реагировать.
Заранее, спасибо за ответы.
 

Nikita

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

Max

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

Можно ли найти все подключения по какому-то custom параметру
Фильтра по 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, включая обработку ошибку, - уточним.
 

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() и соответствующий обработчик
 
Top