Протокол моста
v0.js — тонкая обёртка. Если вам удобнее свой клиент — другой фреймворк, типы TypeScript, игровой движок в WebAssembly, — говорите по протоколу напрямую. Это JSON-RPC 2.0 через window.postMessage, тот же транспорт, что в стандарте MCP Apps.
Где встреча
ReMeet открывает страницу с двумя параметрами в адресе:
| Параметр | Значение |
|---|---|
remeet_origin | Origin страницы встречи, например https://remeet.video. Отправляйте сообщения только туда и принимайте только оттуда. |
remeet_surface | panel или stage |
Встреча — это window.parent.
Конверт
Каждое сообщение — объект с remeet: 'v0' и jsonrpc: '2.0'.
Запрос от приложения:
json
{ "remeet": "v0", "jsonrpc": "2.0", "id": 1, "method": "app.broadcast", "params": { "data": { "x": 3 } } }js
parent.postMessage(request, remeetOrigin);Ответ встречи — result или error:
json
{ "remeet": "v0", "jsonrpc": "2.0", "id": 1, "result": { "ok": true } }
{ "remeet": "v0", "jsonrpc": "2.0", "id": 2, "error": { "code": 403, "message": "Permission \"chat.send\" was not granted" } }Событие от встречи — без id, method всегда event:
json
{ "remeet": "v0", "jsonrpc": "2.0", "method": "event", "params": { "name": "speaking", "data": { "ids": ["p_…"] } } }Проверяйте каждое входящее сообщение: event.source === window.parent, event.origin === remeet_origin, remeet === 'v0'.
Методы
Первым должен быть ready; всё до него завершается ошибкой 400.
| Метод | Параметры | Результат | Право |
|---|---|---|---|
ready | { sdk: '0.1.0' } | объект контекста, см. app.context | — |
participants.list | — | Participant[] | participants.read |
app.broadcast | { data } | { ok: true } | app.broadcast |
ui.notify | { text } | { ok: true } | — |
chat.send | { text } | { ok: true } | chat.send |
badges.set | { participant, text | null } | { ok: true } | badges.write |
stage.open | { everyone: boolean } | { ok: true } | stage.start, если everyone |
stage.close | — | { ok: true } | — |
storage.get | { key } | { value } | storage |
storage.set | { key, value } | { ok: true } | storage |
storage.delete | { key } | { ok: true } | storage |
События и их данные — в разделе API SDK → События.
Минимальный клиент
js
const query = new URLSearchParams(location.search);
const origin = query.get('remeet_origin');
const pending = new Map();
let seq = 0;
function call(method, params = {}) {
return new Promise((resolve, reject) => {
const id = ++seq;
pending.set(id, { resolve, reject });
parent.postMessage({ remeet: 'v0', jsonrpc: '2.0', id, method, params }, origin);
});
}
addEventListener('message', (event) => {
const message = event.data;
if (event.source !== parent || event.origin !== origin || message?.remeet !== 'v0') return;
if (message.id != null && pending.has(message.id)) {
const { resolve, reject } = pending.get(message.id);
pending.delete(message.id);
message.error ? reject(Object.assign(new Error(message.error.message), { code: message.error.code })) : resolve(message.result);
} else if (message.method === 'event') {
console.log('event', message.params.name, message.params.data);
}
});
const context = await call('ready', { sdk: '0.1.0' });