Чаты
SDK предоставляет полный набор инструментов для работы с чатами: REST API методы для управления каналами и сообщениями, а также WebSocket для real-time обмена сообщениями.
REST API методы
Все REST API методы доступны через emdCloud.chat.
Типы каналов
import { ChatChannelType } from '@emd-cloud/sdk';
// ChatChannelType.Public - публичные каналы
// ChatChannelType.StaffToUser - поддержка (сотрудник → пользователь)
// ChatChannelType.PeerToPeer - личные сообщения между пользователями
// ChatChannelType.Staff - внутренние каналы для сотрудников
listChannels()
Получает список каналов с фильтрацией и пагинацией.
Синтаксис
await emdCloud.chat.listChannels(options);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
type | ChatChannelType | Тип канала (по умолчанию: Public) |
search | string | Поиск по именам пользователей или содержимому |
limit | number | Количество каналов на странице (по умолчанию: 50) |
page | number | Номер страницы, начиная с 0 |
orderBy | string | Поле для сортировки (по умолчанию: 'createdAt') |
sort | 'ASC'|'DESC' | Направление сортировки (по умолчанию: 'DESC') |
unreadedChats | boolean | Показать только непрочитанные чаты |
longTimeAnswer | boolean | Чаты с долгим ожиданием ответа |
Примеры
import { ChatChannelType } from '@emd-cloud/sdk';
// Получить все публичные каналы
const channels = await emdCloud.chat.listChannels({
type: ChatChannelType.Public,
limit: 20,
page: 0
});
console.log(`Найдено ${channels.count} каналов на ${channels.pages} страницах`);
// Получить непрочитанные чаты поддержки
const unreadSupport = await emdCloud.chat.listChannels({
type: ChatChannelType.StaffToUser,
unreadedChats: true
});
createChannelByType()
Создает или получает существующий канал по типу.
Синтаксис
await emdCloud.chat.createChannelByType(type, options);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
type | ChatChannelType | Тип канала: StaffToUser, PeerToPeer или Staff |
userId | string | ID пользователя (для StaffToUser) |
id | string | Кастомный ID канала |
accesses | string[] | Массив UUID пользователей (для PeerToPeer) |
Примеры
import { ChatChannelType } from '@emd-cloud/sdk';
// Создать чат поддержки
const supportChannel = await emdCloud.chat.createChannelByType(
ChatChannelType.StaffToUser,
{ userId: 'user-uuid-123' }
);
// Создать личный чат между пользователями
const dmChannel = await emdCloud.chat.createChannelByType(
ChatChannelType.PeerToPeer,
{ accesses: ['user-uuid-1', 'user-uuid-2'] }
);
// Создать внутренний канал для команды
const staffChannel = await emdCloud.chat.createChannelByType(
ChatChannelType.Staff,
{ id: 'team-alpha' }
);
getChannel()
Получает детальную информацию о канале.
Синтаксис
await emdCloud.chat.getChannel(id, options);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | string | ID канала |
cleanupUnreaded | boolean | Очистить счетчик непрочитанных (по умолчанию: true) |
Примеры
// Получить канал и отметить как прочитанный
const channel = await emdCloud.chat.getChannel('channel-id');
console.log('Тип канала:', channel.type);
console.log('Непрочитанных сообщений:', channel.unreadCountRecipient);
// Получить канал без очистки счетчика
const channelPreview = await emdCloud.chat.getChannel('channel-id', {
cleanupUnreaded: false
});
sendMessage()
Отправляет сообщение в канал.
Синтаксис
await emdCloud.chat.sendMessage(channelId, options);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
channelId | string | ID канала |
message | string | Текст сообщения |
attaches | array | Массив вложений (макс. 10) |
Примеры
// Отправить текстовое сообщение
await emdCloud.chat.sendMessage('channel-id', {
message: 'Привет! Как дела?'
});
// Отправить сообщение с вложениями
await emdCloud.chat.sendMessage('channel-id', {
message: 'Вот файлы',
attaches: [
{
type: 'image',
attach: 'file-id-1',
name: 'screenshot.png'
},
{
type: 'file',
attach: 'file-id-2',
name: 'document.pdf'
}
]
});
listMessages()
Получает список сообщений канала.
Синтаксис
await emdCloud.chat.listMessages(channelId, options);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
channelId | string | ID канала |
limit | number | Количество сообщений (по умолчанию: 50) |
page | number | Номер страницы |
Примеры
const messages = await emdCloud.chat.listMessages('channel-id', {
limit: 50,
page: 0
});
console.log('Всего сообщений:', messages.count);
messages.data.forEach(msg => {
console.log(`${msg.user}: ${msg.message}`);
});
deleteChannel()
Удаляет канал и все его сообщения.
Примеры
const result = await emdCloud.chat.deleteChannel('channel-mongo-id');
if (result.success) {
console.log('Канал удален');
}
WebSocket для Real-time
WebSocket позволяет получать сообщения в реальном времени без постоянных запросов к API.
Создание WebSocket подключения
import { ConnectionState } from '@emd-cloud/sdk';
const chatWs = emdCloud.chatWebSocket({
autoReconnect: true,
maxReconnectAttempts: -1, // -1 = бесконечно
reconnectDelay: 1000,
maxReconnectDelay: 30000,
pingInterval: 30000,
callbacks: {
onMessageReceived: (message) => {
console.log('Новое сообщение:', message);
},
onConnectionStateChange: (state) => {
console.log('Состояние подключения:', state);
},
onError: (error) => {
console.error('Ошибка WebSocket:', error);
}
}
});
Подключение и подписка
try {
// Подключаемся к серверу
await chatWs.connect();
console.log('Подключено к чат-серверу');
// Подписываемся на канал
await chatWs.subscribeToChannel('channel-id-123');
console.log('Подписка на канал активна');
} catch (error) {
console.error('Ошибка подключения:', error);
}
Обработка событий
chatWs.setCallbacks({
onMessageReceived: (message) => {
console.log('Новое сообщение от', message.user);
console.log('Содержимое:', message.message);
// Обновляем UI
addMessageToUI(message);
},
onMessageDeleted: (data) => {
console.log('Сообщение удалено:', data._id);
removeMessageFromUI(data._id);
},
onConnectionStateChange: (state) => {
if (state === ConnectionState.Connected) {
console.log('Соединение установлено');
showOnlineStatus();
} else if (state === ConnectionState.Disconnected) {
console.log('Соединение потеряно');
showOfflineStatus();
}
},
onError: (error) => {
console.error('Ошибка:', error);
showErrorNotification(error.message);
}
});
Подписка на поддержку (для сотрудников)
// Подписка на все чаты поддержки
await chatWs.subscribeToSupport();
chatWs.setCallbacks({
onSupportCountUpdated: (data) => {
console.log('Непрочитанных чатов поддержки:', data.count);
updateSupportBadge(data.count);
},
onSupportChannelUpdated: (channel) => {
console.log('Обновление канала поддержки:', channel);
updateSupportChannelInList(channel);
}
});
Отключение
// Отписаться от канала
chatWs.unsubscribeFromChannel('channel-id-123');
// Полностью отключиться
chatWs.disconnect();
Полный пример чат-приложения
import { EmdCloud, AppEnvironment, ChatChannelType, ConnectionState } from '@emd-cloud/sdk';
class ChatApp {
constructor(appId) {
this.emdCloud = new EmdCloud({
environment: AppEnvironment.Client,
appId: appId
});
this.chatWs = null;
this.currentChannel = null;
}
async init(authToken) {
// Устанавливаем токен
this.emdCloud.setAuthToken(authToken);
// Создаем WebSocket подключение
this.chatWs = this.emdCloud.chatWebSocket({
autoReconnect: true,
callbacks: {
onMessageReceived: (msg) => this.handleNewMessage(msg),
onConnectionStateChange: (state) => this.handleConnectionChange(state)
}
});
// Подключаемся
await this.chatWs.connect();
}
async loadChannels() {
const channels = await this.emdCloud.chat.listChannels({
type: ChatChannelType.Public,
limit: 50
});
return channels.data;
}
async openChannel(channelId) {
// Отписываемся от предыдущего канала
if (this.currentChannel) {
this.chatWs.unsubscribeFromChannel(this.currentChannel);
}
// Подписываемся на новый канал
await this.chatWs.subscribeToChannel(channelId);
this.currentChannel = channelId;
// Загружаем историю сообщений
const messages = await this.emdCloud.chat.listMessages(channelId, {
limit: 50,
page: 0
});
return messages.data;
}
async sendMessage(text, attachments = []) {
await this.emdCloud.chat.sendMessage(this.currentChannel, {
message: text,
attaches: attachments
});
}
handleNewMessage(message) {
// Обновляем UI с новым сообщением
console.log('Новое сообщение:', message);
this.addMessageToUI(message);
}
handleConnectionChange(state) {
if (state === ConnectionState.Connected) {
console.log('Подключено');
} else if (state === ConnectionState.Disconnected) {
console.log('Отключено');
}
}
addMessageToUI(message) {
// Ваша логика отображения сообщения
}
destroy() {
if (this.chatWs) {
this.chatWs.disconnect();
}
}
}
// Использование
const app = new ChatApp('your-app-id');
await app.init('user-auth-token');
const channels = await app.loadChannels();
await app.openChannel(channels[0].id);
await app.sendMessage('Привет всем!');
Best Practices
Управление подключением
// ✅ Хорошо: переподключение при потере связи
const chatWs = emdCloud.chatWebSocket({
autoReconnect: true,
maxReconnectAttempts: -1
});
// ✅ Хорошо: отслеживание состояния
chatWs.setCallbacks({
onConnectionStateChange: (state) => {
updateUIConnectionStatus(state);
}
});
Оптимизация подписок
// ✅ Хорошо: отписываемся от неактивных каналов
function switchChannel(newChannelId) {
if (currentChannelId) {
chatWs.unsubscribeFromChannel(currentChannelId);
}
chatWs.subscribeToChannel(newChannelId);
currentChannelId = newChannelId;
}
// ❌ Плохо: подписка на все каналы сразу
channels.forEach(ch => chatWs.subscribeToChannel(ch.id)); // Избыточно
Обработка ошибок
// ✅ Хорошо: обрабатываем ошибки подключения
try {
await chatWs.connect();
await chatWs.subscribeToChannel(channelId);
} catch (error) {
console.error('Не удалось подключиться:', error);
showRetryButton();
}
Следующие шаги
- 📁 Узнайте о загрузке файлов для вложений в чатах
- ⚛️ Изучите React хуки для чатов
- 💡 Посмотрите примеры чат-приложений