API SDK
<script src="https://sdk.remeet.video/v0.js"></script>Один файл без зависимостей, около 7 КБ. Он объявляет глобальный объект ReMeet. Адрес v0 не ломается: изменения в нём остаются совместимыми; несовместимое изменение получит новый файл (v1.js).
Все методы возвращают промисы. Если ReMeet отказывает в вызове, промис отклоняется с Error, у которого есть числовой code:
| Код | Что значит |
|---|---|
400 | Сначала не вызван ready() |
403 | Право не выдано; или это может только ведущий; или приложение не установлено у этого человека |
404 | Неизвестный метод или участник; или у приложения нет сцены |
413 | Данные broadcast больше 8 КБ |
429 | Больше 20 сообщений broadcast в секунду |
500 | Сбой внутри ReMeet |
Если ReMeet не ответил за 15 секунд, промис отклоняется с «ReMeet did not answer». Если страницу открыли не во встрече и не в симуляторе, ready() отклоняется с подсказкой открыть её в симуляторе.
ReMeet
ReMeet.ready()
Подключается к встрече. Вызывайте один раз при старте; повторные вызовы возвращают тот же объект.
const app = await ReMeet.ready();Возвращает app:
| Свойство | Тип | |
|---|---|---|
app.context | object | Всё, что ReMeet сообщил приложению при старте, см. ниже |
app.me | Participant | Человек, у которого запущена эта копия: { id, name, role } |
app.permissions | string[] | Права, которые разрешил этот человек |
app.contextToken | string | Подписанный JWT для вашего сервера, см. Контекст-токен |
app.can(permission) | boolean | true, если право выдано |
app.context:
{
sdk: 'v0',
app: { key: 'wave', version: '0.1.0' },
surface: 'panel', // или 'stage'
meeting: { id: '01m6saztdr6cafg9yzx83db0fs', title: 'Планёрка' },
me: { id: 'p_…', name: 'Анна', role: 'host' }, // 'host' | 'member' | 'guest'
locale: 'ru', // 'en' | 'ru' | 'ar'
theme: 'dark', // 'light' | 'dark'
permissions: ['participants.read', 'app.broadcast'],
participants: [ /* Participant[], пусто без participants.read */ ],
contextToken: 'eyJ…'
}ReMeet.on(name, handler) / app.on(name, handler)
Подписка на событие встречи. Возвращает функцию отписки.
const off = app.on('speaking', ({ ids }) => highlight(ids));
off();ReMeet.version, ReMeet.surface
Версия SDK ('0.1.0') и где показана эта копия ('panel' или 'stage'). Доступны ещё до ready().
Участники
Право: participants.read.
app.participants()
Все, кто сейчас во встрече, включая самого человека.
type Participant = {
id: string; // 'p_' + 24 hex: один человек — один id во всех встречах, разный в разных приложениях
name: string;
isMe: boolean;
isSpeaking: boolean;
role: string; // 'host' | 'member' | 'guest'
};Обмен данными
Право: app.broadcast.
app.broadcast(data)
Отправляет data (всё, что умещается в JSON, до 8 КБ) копиям вашего приложения у всех остальных участников, у кого оно открыто. Доставка надёжная и по порядку. Своя копия сообщение не получает.
await app.broadcast({ type: 'move', x: 3, y: 5 });Принимается событием broadcast.
Уведомления
app.notify(text)
Показывает этому человеку уведомление ReMeet: «Название приложения: текст». До 200 символов. Право не нужно.
Чат
app.chat.send(text)
Право: chat.send. Отправляет в чат встречи сообщение от этого человека, начинающееся с [Название приложения]. До 500 символов.
Читать сообщения — событием chat.message (право chat.read).
Значки
Право: badges.write.
app.badges.set(participantId, text)
Ставит короткую метку (эмодзи или до 24 символов) на плитку видео участника. Один значок от приложения на плитке; новый заменяет старый. text = null убирает его.
app.badges.clear(participantId)
Убирает значок вашего приложения с плитки.
Значки рисуются у этого человека
Значок появляется на экране того, чья копия его поставила. Чтобы значок увидели все, разошлите его через broadcast и пусть каждая копия вызовет badges.set() — как в примере «Помахать» из быстрого старта.
Сцена
app.stage.open({ everyone })
Открывает страницу stage вашего приложения поверх сетки видео.
app.stage.open()— только для этого человека. Право не нужно.app.stage.open({ everyone: true })— для всех участников, у кого установлено приложение. Нужно правоstage.start, и человек должен быть ведущим встречи; иначе403.
Ошибка 404, если в манифесте нет stage.
app.stage.close()
Закрывает сцену у этого человека.
Хранилище
Право: storage. Небольшое хранилище «ключ — значение» на приложение и на человека, на серверах ReMeet: одни и те же данные во всех встречах и на всех устройствах.
app.storage.get(key)
Возвращает сохранённое значение или null.
app.storage.set(key, value)
Сохраняет любое значение JSON: до 16 КБ на значение и до 64 КБ всего. Ключи: 1–64 символа, латиница, цифры, _ . -.
app.storage.delete(key)
Удаляет ключ.
const notes = (await app.storage.get('notes')) ?? '';
await app.storage.set('notes', notes + '\nНовая идея');
await app.storage.delete('draft');События
| Событие | Данные | Право |
|---|---|---|
participant.joined | Participant | participants.read |
participant.left | { id } | participants.read |
speaking | { ids: string[] } — кто сейчас говорит; пусто, когда тишина | participants.read |
broadcast | { data, from: Participant } | app.broadcast |
chat.message | { from: { id, name }, text } | chat.read |
captions | { from: { id, name }, text, lang } | captions.read |
theme | { theme: 'light' | 'dark' } | — |