umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
201 lines (200 loc) • 7.56 kB
JavaScript
"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;