UNPKG

umbot

Version:

Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф

201 lines (200 loc) 7.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.YandexRequest = void 0; const index_1 = require("../../../index"); const constants_1 = require("../Alisa/constants"); const constants_2 = require("./constants"); /** * @class YandexRequest * Класс для работы с API Яндекса * * Предоставляет методы для отправки запросов к API Яндекса, * управления авторизацией и обработки ошибок. * * @example * ```ts * // Создание экземпляра * const api = new YandexRequest('your-token'); * * // Установка нового токена * api.setOAuth('new-token'); * * // Выполнение запроса * const result = await api.call<ApiResponse>('...'); * if (result) { * // Обработка успешного ответа * console.log(result); * } else { * // Обработка ошибки * console.error(api.#error); * } * ``` */ class YandexRequest { /** * Экземпляр класса для отправки HTTP-запросов */ _request; /** * OAuth-токен для авторизации запросов * * Используется для авторизации запросов к API Яндекса. * Подробная информация о получении токена: * @see https://yandex.ru/dev/dialogs/alice/doc/resource-upload-docpage/#http-images-load__auth */ #oauth; /** * Текст последней ошибки * * Содержит информацию о последней возникшей ошибке * при выполнении запроса к API. */ #error; /** * Контекст приложения. */ _appContext; /** * Создает экземпляр класса YandexRequest * * Инициализирует класс с OAuth-токеном и настраивает * параметры HTTP-запросов. * * @param {string | null} [oauth=null] - OAuth-токен для авторизации * @param {AppContext} [appContext] - Контекст приложения * * @remarks * Если токен не указан, будет использован токен из appContext.platformParams.yandex_token. * Если и там токена нет, запросы будут выполняться без авторизации. * * @example * ```ts * // Создание с токеном * const api = new YandexRequest('your-token'); * * // Создание без токена (будет использован токен из appContext.platformParams) * const api = new YandexRequest(); * * // Создание без авторизации * const api = new YandexRequest(null); * ``` */ constructor(oauth = null, appContext) { this._request = new index_1.Request(appContext); this._appContext = appContext; this.setOAuth(oauth || appContext.appConfig.tokens[constants_1.T_ALISA]?.token || null); this._request.maxTimeQuery = 1500; this.#error = null; } get oauth() { return this.#oauth; } /** * Устанавливает OAuth-токен для авторизации * * Обновляет токен авторизации и заголовки запросов. * При установке токена автоматически добавляется заголовок * 'Authorization: OAuth {token}' ко всем последующим запросам. * * @param {string | null} oauth - OAuth-токен для авторизации * * @remarks * - Если передать null, авторизация будет отключена * - Заголовок авторизации добавляется автоматически * - Токен сохраняется для всех последующих запросов * * @example * ```ts * const api = new YandexRequest(); * * // Установка нового токена * api.setOAuth('new-token'); * // Теперь все запросы будут с заголовком: * // Authorization: OAuth new-token * * // Сброс токена * api.setOAuth(null); * // Запросы будут без авторизации * ``` */ setOAuth(oauth) { this.#oauth = oauth; if (this._request.header) { this._request.header = { ...this._request.header, Authorization: `OAuth ${this.#oauth}`, }; } else { this._request.header = { Authorization: `OAuth ${this.#oauth}` }; } } /** * Выполняет HTTP-запрос к API Яндекса * * Отправляет запрос к указанному эндпоинту API и * обрабатывает полученный ответ. * * @template T - Тип ожидаемого ответа, наследующий интерфейс IYandexApi * @param {string | null} [url=null] - URL-адрес эндпоинта API * @returns {Promise<T | null>} - Результат запроса или null в случае ошибки * * @throws {Error} Если произошла ошибка сети или сервера * * @example * ```ts * interface MyApiResponse extends IYandexApi { * data: { * id: string; * name: string; * }; * } * * const api = new YandexRequest('token'); * * try { * // Выполнение запроса * const response = await api.call<MyApiResponse>('...'); * * if (response) { * // Обработка успешного ответа * console.log('ID:', response.data.id); * console.log('Name:', response.data.name); * } else { * // Обработка ошибки API * console.error('Ошибка API:', api.#error); * } * } catch (error) { * // Обработка ошибок сети или сервера * console.error('Ошибка запроса:', error); * } * ``` */ async call(url = null) { this.setOAuth(this.#oauth); const data = await this._request.send(url); if (data.status && data.data) { if (Object.hasOwn(data.data, 'error')) { this.#error = data; } return data.data; } this.#error = data; this._log(data.err); return null; } /** * Сохраняет информацию об ошибках в лог-файл * * Записывает детальную информацию об ошибке в файл логов, * включая время возникновения, URL запроса и текст ошибки. * * @param {string} [error=''] - Текст ошибки для логирования */ _log(error = '') { this._appContext.logError((0, constants_2.getErrorMsg)(error, 'YandexRequest', this._request.url), { error: this.#error, }); } } exports.YandexRequest = YandexRequest;