Skip to content

Внешний API расширения (expose)

Иногда другому расширению нужен не новый кусок UI (реестр), а вызов метода уже существующего сценария — например «отправить сообщение в чат». Для этого поставщик публикует expose: объект с функциями и данными, доступный по manifest.id.

Задать API

Во время setup:

ts
defineRyntExtension((ctx) => {
  ctx.defineExpose({
    sendMessageToConversation: (
      conversationId: string,
      payload: Record<string, unknown>,
      textPreview: string,
    ) => {
      /* ваша реализация */
    },
  });
});

Или вернуть из setup:

ts
return { expose: { sendMessageToConversation: … } };

Если использованы оба варианта, значение из return { expose } применяется после завершения setup и заменяет ранее заданное через ctx.defineExpose.

Прочитать API в другом расширении

ts
import { useExtensionExpose } from '@rynt/sdk/extension';

const api = useExtensionExpose('@acme/chats');
// во Vue: api.value?.sendMessageToConversation(…)

Идентификатор строкой — это manifest.id поставщика, а не обязательно name из package.json.

Типизация

В пакете-поставщике дополните ExtensionExposeMap (модуль @rynt/sdk/extension-expose-map):

ts
export interface ChatsExtensionExpose {
  sendMessageToConversation: (
    conversationId: string,
    payload: Record<string, unknown>,
    textPreview: string,
  ) => Promise<void>;
}

declare module '@rynt/sdk/extension-expose-map' {
  interface ExtensionExposeMap {
    '@acme/chats': ChatsExtensionExpose;
  }
}

Рекомендуется держать это в одном entry вместе с типами реестров (./types) и подключать у потребителя в env.d.ts: import '@acme/chats/types'.

Полный cookbook: Типизация контрактов.