Внешний API расширения (expose)
Иногда другому расширению нужен не новый кусок UI (реестр), а вызов метода уже существующего сценария — например «отправить сообщение в чат». Для этого поставщик публикует expose: объект с функциями и данными, доступный по manifest.id.
Задать API
Во время setup:
defineRyntExtension((ctx) => {
ctx.defineExpose({
sendMessageToConversation: (
conversationId: string,
payload: Record<string, unknown>,
textPreview: string,
) => {
/* ваша реализация */
},
});
});Или вернуть из setup:
return { expose: { sendMessageToConversation: … } };Если использованы оба варианта, значение из return { expose } применяется после завершения setup и заменяет ранее заданное через ctx.defineExpose.
Прочитать API в другом расширении
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):
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: Типизация контрактов.
- Манифест и зависимости
REGISTRIES.mdв@rynt/sdk— раздел про expose