addons (RPC и события)

Обмен между аддонами, отдельно от events (HTTP). Главный процесс маршрутизирует запросы и подписки на события между воркерами.

addons.request(targetAddonId, method, params?)

Вызывает обработчик, зарегистрированный в другом включённом и запущенном аддоне.

const res = await addons.request('other_addon', 'getChannelId', { platform: 'example' });
if (res.success) {
  console.log(res.result);
}

Возвращает { success: true, result? } или { success: false, message? }.

addons.onRequest(method, handler)

Экспонирует метод для других аддонов.

addons.onRequest('getChannelId', async ({ fromAddonId, params }) => {
  console.log('Request from', fromAddonId);
  return { channelId: '12345' };
});

Обработчик получает { fromAddonId, params } и возвращает payload ответа.

addons.offRequest(method)

Удаляет ранее зарегистрированный обработчик.

addons.emit(event, data?)

Публикует событие всем аддонам, подписанным на это событие у текущего аддона. Доставка fire-and-forget (обработчики не отвечают эмиттеру).

await addons.emit('streamOnline', { title: 'Live now' });

Возвращает { success: true, delivered } (delivered — число запущенных подписчиков, которым ушло событие) или { success: false, message? }.

addons.subscribe(sourceAddonId, event, handler)

Подписка на события другого установленного аддона. Источник может быть выключен или ещё не запущен; события приходят, когда он эмитит в рабочем состоянии.

const sub = await addons.subscribe('twitch', 'streamOnline', ({ fromAddonId, data }) => {
  console.log('Event from', fromAddonId, data);
});
if (sub.success) {
  // later: sub.Destroy();
}

Обработчик получает { fromAddonId, data }. Возвращает { success: true, id, Destroy } или { success: false, message? }.

Вызовите Destroy(), чтобы отписаться. Допускается несколько подписок на одну пару source+event.

addons.getInfo(addonIds?)

Читает манифест и статус включения установленных аддонов. Дополнительное разрешение не требуется.

Без addonIds возвращаются все установленные аддоны. Передайте массив id, чтобы запросить конкретные аддоны. Неизвестные id включаются с missing: true и enabled: false.

const all = await addons.getInfo();
if (all.success) {
  for (const addon of all.addons) {
    console.log(addon.id, addon.enabled, addon.manifest?.version);
  }
}

const pair = await addons.getInfo(['twitch', 'other_addon']);

Каждая запись: { id, enabled, manifest, missing }. manifest — разобранный manifest.json или null, если файлов нет.

Зависимости в манифесте

Используйте depends_on: ["other_addon"] в manifest.json, если аддону нужно, чтобы другой аддон был установлен и включён до активации.

Когда использовать RPC, а когда события

Задача API
Запросить данные / действие у другого аддона и дождаться ответа request / onRequest
Пушить обновления, чтобы другие не поллили emit / subscribe