umbot
    Preparing search index...

    Class BasePlatformAdapter<TQuery>Abstract

    Базовый адаптер для создания голосовых навыков и чат-ботов для собственной платформы (WeChat, WhatsApp, Slack и др.).

    Чтобы подключить другую платформу, которая не поставляется из коробки, унаследуйтесь от класса и реализуйте все абстрактные методы. Адаптер автоматически зарегистрируется в системе при подключении через bot.use(new MyPlatformAdapter()).

    === Обязательные методы ===

    • isPlatformOnQuery — определяет, относится ли запрос к платформе или нет
    • setQueryData — обрабатывает запрос и заполняет controller данными
    • getContent — формирует ответ в формате платформы

    === Опциональные ===

    • getQueryExample — генерирует пример запроса необходимого для тестов
    • isCorrectQuery, isSignatureCheckEnabled — проверка подписи запроса (если платформа её присылает)
    • isLocalStorage, getLocalStorage, setLocalStorage — если платформа поддерживает сохранение локального состояния
    • soundProcessing — кастомная обработка TTS/звуков (для голосовых платформ, или отправка аудиофайла в боте).
    • Bot
    • BotController

    Type Parameters

    • TQuery = unknown

    Hierarchy (View Summary)

    Implements

    Index

    Constructors

    • Конструктор базового адаптера платформы.

      Type Parameters

      • TQuery = unknown

      Parameters

      • OptionalplatformToken: string

        Токен платформы (опционально)

      • OptionaladditionalPlatformOptions: IAdapterOptions

        Дополнительные опции платформы (опционально)

      Returns BasePlatformAdapter<TQuery>

    Properties

    _platformOptions?: IAdapterOptions
    _token?: string
    appContext?: AppContext<unknown, TQuery>

    Контекст приложения

    isVoice: boolean = true

    Голосовая ли платформа (TTS-ответ в теле HTTP). Чат-платформы переопределяют на false.

    limit: number | null = null

    Лимит запросов/сек для входящего rateLimiter; null — не ограничивать. Переопределяется адаптером платформы.

    MAX_TIME_REQUEST: number = 2900

    Максимальное время обработки запроса в миллисекундах: при его превышении в лог записывается ошибка (ответ платформе при этом не модифицируется)

    platformName: string = 'unknown'

    Имя платформы

    signatureName?: string

    Имя поля в заголовке запроса, по которому можно проверить корректность полученного запроса от платформы.

    supportedEvents: readonly TEventType[] = ...

    Универсальные события (TEventType), которые этот адаптер может выставить в controller.eventType.

    Источник знания для валидации bot.addEvent(...): обработчик на событие, которое ни один подключённый адаптер не поддерживает, — почти всегда опечатка, и о ней предупреждают при регистрации. Таблица живёт у адаптера, а не в ядре: кастомная платформа, унаследованная от BasePlatform, объявляет собственный перечень и автоматически участвует в проверке.

    Для кастомных платформ: перечислите события, которые ваш setQueryData реально записывает в controller.eventType:

    class MyPlatformAdapter extends BasePlatform {
    supportedEvents: readonly TEventType[] = ['message', 'photo', 'callback'];
    // ...
    }

    Если платформа умеет только текст — поле можно не трогать: базовое значение ['message'] уже корректно. Событий вне TEventType (например, платформенная «покупка») в валидации не участвуют — их можно отслеживать в action() по requestObject.

    Базовое значение — только 'message': самый минимум, верный для любой платформы. Встроенные адаптеры переопределяют поле (Telegram — медиа и callback/inline, VK — callback, MAX — start/edited и т.д.).

    WARNING_TIME_REQUEST: number = 2000

    Порог предупреждения в миллисекундах: при его превышении в лог записывается warning

    Methods

    • Protected

      Инициализирует TTS (Text-to-Speech) в контроллере. Обрабатывает звуки и стандартные звуковые эффекты

      Parameters

      • controller: BotController

        Контроллер приложения

      Returns void | Promise<void>

    • При превышении допустимого времени обработки запроса логирует информацию. Вызывается вручную в конце getContent() голосовых адаптеров (Alisa, Marusia, SmartApp); адаптеры чат-платформ его не вызывают.

      • >= WARNING_TIME_REQUEST (по умолчанию 2000 мс) — warning в лог.
      • >= MAX_TIME_REQUEST (по умолчанию 2900 мс) — текст ошибки пишется в controller.platformOptions.error (не в лог).

      Пороги вынесены в protected поля — при необходимости переопределите в потомке.

      Parameters

      Returns void

    • Создаёт API-фасад платформы для controller.api — унифицированный доступ к исходящим возможностям платформы (sendPhoto, answerCallback и т.д.).

      Базовая реализация возвращает null: фасад считается недоступным. Ядро подключает фасад к контроллеру только у адаптеров, переопределивших этот метод, — поэтому добавить фасад своей платформе можно без правок ядра.

      Для кастомных платформ: если платформа умеет исходящие API-вызовы (отправка медиа, ответ на callback-кнопку), переопределите метод и верните свой фасад IControllerApi. Удобно завернуть готовую фабрику и дополнить её, либо собрать фасад с нуля. Для голосовых платформ (ответ формируется телом webhook) переопределять не нужно.

      Parameters

      • _controller: BotController

        Контроллер текущего запроса (не используется базовой реализацией; доступен переопределяющим методам)

      Returns IControllerApi | null

      Фасад либо null, если для платформы он недоступен

      class MyPlatformAdapter extends BasePlatform {
      createApi(controller: BotController): IControllerApi | null {
      return makeMyApi(controller); // своя фабрика фасада
      }
      }
    • Метод, который вызывается при уничтожении плагина. В данном методе можно добавить отписку, либо выполнить другие действия.

      Parameters

      • _bot: Bot

        Основной класс приложения

      Returns void | Promise<void>

    • Формирует тело ответа для отправки пользователю.

      Возвращает платформо-специфичный ответ (например, JSON для Алисы). Для платформ, которые отправляют ответ напрямую (например, Telegram через sendMessage), метод может возвращать строку 'ok' или объект.

      Parameters

      • controller: BotController

        контроллер с готовым ответом

      • OptionalstateData: Record<string, unknown> | null

        данные для локального хранилища

      Returns TContent

      ответ в формате, понятном платформе

    • Генерирует пример входящего запроса для локального тестирования вашего приложения. Позволяет эмулировать запрос от платформы с заданным текстом, ID пользователя, номером сообщения и состоянием. Необходимо указывать для того, чтобы можно было корректно проверить работоспособность приложения.

      Обязательно определите метод, если планируется тестирование приложения через инструменты предоставляемые платформой. Это существенно упростит процесс разработки приложения.

      Parameters

      • query: string

        Запрос пользователя

      • userId: string

        Идентификатор пользователя

      • count: number

        Порядковый номер запроса

      • state: string | Record<string, unknown>

        Данные из локального хранилища

      Returns Record<string, unknown>

      Пример входящего запроса платформы (Record)

      // Пример переопределения для кастомной платформы
      getQueryExample(query, userId, count, state) {
      return { text: query, userId, messageId: count, state };
      }
    • Инициализация адаптера. Определять не обязательно. Стоит указывать в случаях, когда нужно выполнить доп логику, например указать токены или писать какую-то статистику по использованию.

      Parameters

      Returns void

    • Проверяет полученный запрос от платформы на корректность. Из коробки проверка идет по sha256-hmac и включается только если одновременно заданы:

      • appConfig.tokens[<platformName>].token — секретный ключ
      • this.signatureName — имя http-заголовка с подписью

      Если хотя бы один из этих параметров не задан, метод вернёт true без проверки — это opt-in механизм.

      ⚠️ Важно: не все платформы используют HMAC-SHA256 от тела. Переопределите этот метод в адаптере платформы, если её формат подписи отличается:

      • Telegram — переопределён (использует plain x-telegram-bot-api-secret-token).
      • Viber — умолчание корректно (Viber шлёт x-viber-content-signature как HMAC-SHA256(auth_token, body)).
      • VK — переопределён: сверяет поле secret из тела запроса с secret_key из конфигурации (plain-сравнение через timingSafeEqual, без HMAC).
      • Max — переопределён: сверяет заголовок x-max-bot-api-secret со значением webhook-secret (options.secret / tokens.max_app.webhookSecret).
      • Для платформ без подписи (Alisa, Marusia, SmartApp) проверка пропускается из-за отсутствия signatureName.

      Parameters

      • query: TQuery

        Объект запроса от платформы

      • Optionalheaders: Record<string, unknown>

        HTTP-заголовки запроса

      Returns boolean

      true — запрос валиден / проверка не включена, false — подпись не сошлась или отсутствует.

    • Возвращает признак того, соответствует ли запрос текущей платформе или нет

      Parameters

      • query: TQuery

        Запрос, который пришел в приложение

      • Optionalheaders: Record<string, unknown>

        Заголовок с которым был отправлен запрос

      Returns boolean

      true, если запрос относится к этой платформе, иначе false

      который определяет запрос по полю update_id в теле)

      isPlatformOnQuery(query, headers) {
      return headers?.['x-telegram-bot-api-secret-token'] === this._token;
      }
      isPlatformOnQuery(query) {
      return !!(query.request && query.version && query.session);
      }
    • Проверка подписи включена, когда выполнены оба условия базовой HMAC-схемы: задан секрет платформы и имя заголовка подписи. Платформы, переопределившие isCorrectQuery (Telegram, VK, MAX), переопределяют и этот метод — источник секрета у них другой (webhookSecret / secret_key).

      Используется ядром при старте для предупреждения о вебхуке без защиты.

      Returns boolean

    • Отправка текста пользователю Этот метод используется для активных рассылок — когда голосовой навык или чат-бот инициирует диалог первым (например, уведомление). В методе реализована механика преобразования текстового значения controllerOrText в контроллер, а также базовый механизм для отправки ответа.

      Переопределять данный метод не рекомендуется. Переопределить стоит только в том случае, если по каким-то технических условиям текущая реализация метода вам не подходит.

      Если платформа не поддерживает возможность начать диалог самостоятельно, то можно оставить метод пустым, либо вывести любую заглушку.

      Parameters

      • userId: string | number

        Ид пользователя, которому нужно отправить сообщение

      • controllerOrText: string | BotController<IUserData, IPlatformData>

        Контроллер приложения или текст. Если необходимо отправить просто текст, можно передать строку, в случае, если необходимо передать картинку звук и тд, то необходимо корректно заполнить контроллер.

      Returns boolean | TContent

      Результат getContent() — ответ в формате платформы (TContent), либо boolean для платформ без рассылки

      // Отправка простого текста
      adapter.send('user123', 'Привет!');

      // Отправка через контроллер (текст + кнопки/карточки)
      const controller = new BaseBotController(appContext);
      controller.text = 'Уведомление';
      adapter.send('user123', controller);
    • Обрабатывает входящий запрос и заполняет контроллер данными.

      Обязательно установите:

      • controller.userCommand и controller.originalUserCommand — текст сообщения пользователя
      • controller.userId — уникальный ID пользователя
      • controller.appType = this.platformName

      Опционально:

      • controller.userToken — если платформа присылает токен авторизации
      • controller.userMeta — если платформа присылает метаданные
      • controller.state — если платформа поддерживает локальное хранилище
      • controller.nlu — если платформа присылает NLU/интенты (через controller.nlu.setNlu(...))

      Parameters

      • query: TQuery

        Запрос от платформы

      • controller: BotController

        Контроллер приложения

      Returns boolean | Promise<boolean>

      false, если запрос повреждён или не может быть обработан; иначе true

    • Дополнительная обработка для звуков. В данном методе стоит реализовать логику, с помощью которой будут наложены дополнительные эффекты для озвучивания текста пользователю

      Parameters

      Returns void | Promise<void>

    • Метод-флаг: указывает, что платформа голосовая (например, Алиса, Маруся).

      Returns boolean