Перейти к основному содержимому

Чаты

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);

Параметры

ПараметрТипОписание
typeChatChannelTypeТип канала (по умолчанию: Public)
searchstringПоиск по именам пользователей или содержимому
limitnumberКоличество каналов на странице (по умолчанию: 50)
pagenumberНомер страницы, начиная с 0
orderBystringПоле для сортировки (по умолчанию: 'createdAt')
sort'ASC'|'DESC'Направление сортировки (по умолчанию: 'DESC')
unreadedChatsbooleanПоказать только непрочитанные чаты
longTimeAnswerbooleanЧаты с долгим ожиданием ответа

Примеры

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);

Параметры

ПараметрТипОписание
typeChatChannelTypeТип канала: StaffToUser, PeerToPeer или Staff
userIdstringID пользователя (для StaffToUser)
idstringКастомный ID канала
accessesstring[]Массив 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);

Параметры

ПараметрТипОписание
idstringID канала
cleanupUnreadedbooleanОчистить счетчик непрочитанных (по умолчанию: 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);

Параметры

ПараметрТипОписание
channelIdstringID канала
messagestringТекст сообщения
attachesarrayМассив вложений (макс. 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);

Параметры

ПараметрТипОписание
channelIdstringID канала
limitnumberКоличество сообщений (по умолчанию: 50)
pagenumberНомер страницы

Примеры

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();
}

Следующие шаги

Полезные ссылки