Skip to content

Протокол моста ​

v0.js — тонкая обёртка. Если вам удобнее свой клиент — другой фреймворк, типы TypeScript, игровой движок в WebAssembly, — говорите по протоколу напрямую. Это JSON-RPC 2.0 через window.postMessage, тот же транспорт, что в стандарте MCP Apps.

Где встреча ​

ReMeet открывает страницу с двумя параметрами в адресе:

ПараметрЗначение
remeet_originOrigin страницы встречи, например https://remeet.video. Отправляйте сообщения только туда и принимайте только оттуда.
remeet_surfacepanel или 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' });

ReMeet Apps SDK v0 · бета. Файл SDK v0.js — под лицензией MIT.