solver-sdk
Version:
SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system
246 lines • 10.4 kB
JavaScript
/**
* API для работы с системой обновлений WorkAI
*
* Предоставляет методы для проверки обновлений, получения changelog'ов
* и отправки статистики использования обновлений.
*
* @example
* ```javascript
* // Проверка обновлений
* const updateInfo = await sdk.updates.checkForUpdates({
* currentVersion: '1.0.0',
* channel: 'stable',
* platform: 'win32-x64',
* locale: 'ru'
* });
*
* if (updateInfo.hasUpdate) {
* console.log(`Доступно обновление: ${updateInfo.version}`);
*
* // Получение описания изменений
* const changelog = await sdk.updates.getChangelog('1.1.0', 'ru');
* console.log(changelog);
*
* // Отправка статистики
* await sdk.updates.sendStats({
* event: 'update_started',
* currentVersion: '1.0.0',
* targetVersion: updateInfo.version
* });
* }
* ```
*/
export class UpdatesApi {
/**
* Создает новый экземпляр API для работы с обновлениями
* @param {HttpClient} httpClient HTTP клиент
*/
constructor(httpClient) {
this.httpClient = httpClient;
}
/**
* Проверяет наличие обновлений для текущей версии клиента
*
* @param {UpdateCheckOptions} options Параметры проверки обновления
* @returns {Promise<UpdateResponse>} Информация об обновлении
* @throws {Error} При ошибке запроса к API
*
* @example
* ```javascript
* const updateInfo = await sdk.updates.checkForUpdates({
* currentVersion: '1.0.0',
* channel: 'stable',
* platform: 'win32-x64',
* locale: 'ru'
* });
*
* if (updateInfo.hasUpdate) {
* console.log(`Новая версия: ${updateInfo.version}`);
* console.log(`Размер: ${updateInfo.size} байт`);
* console.log(`URL: ${updateInfo.downloadUrl}`);
* }
* ```
*/
async checkForUpdates(options) {
const { currentVersion, channel = 'stable', platform, locale } = options;
try {
// Используем VS Code совместимый endpoint
const endpoint = `/api/update/${platform}/${channel}/${currentVersion}`;
const response = await this.httpClient.get(endpoint, {
locale
});
// ✅ ИСПРАВЛЕНИЕ: Проверяем наличие обязательных полей для определения hasUpdate
// HTTP 204 возвращает пустой объект (не ошибку!), поэтому проверяем response.version
if (!response || !response.version) {
// Пустой ответ или 204 No Content = нет обновлений
return {
hasUpdate: false,
currentVersion
};
}
// ✅ Есть version в ответе = есть обновление (200 OK)
// Преобразуем ответ backend'а в формат, ожидаемый клиентом
return {
hasUpdate: true,
version: response.version,
downloadUrl: response.url || response.downloadUrl, // ✅ Поддержка обоих форматов
checksum: response.sha256hash || response.sha256, // ✅ Поддержка обоих форматов
size: response.size,
changelog: Array.isArray(response.releaseNotes)
? response.releaseNotes.join('\\n')
: response.releaseNotes,
releaseDate: response.createdAt,
isForced: response.metadata?.critical || false,
signature: response.signature,
currentVersion,
platform,
channel
};
}
catch (error) {
// Обработка реальных ошибок сети или сервера (500, timeout и т.д.)
throw new Error(`Ошибка проверки обновлений: ${error.message}`);
}
}
/**
* Получает описание изменений (changelog) для указанной версии
*
* @param {string} version Версия для получения changelog
* @param {string} locale Локаль для получения переводов
* @returns {Promise<string>} Описание изменений в формате Markdown
* @throws {Error} При ошибке запроса к API
*
* @example
* ```javascript
* const changelog = await sdk.updates.getChangelog('1.1.0', 'ru');
* console.log(changelog); // Markdown текст с изменениями
* ```
*/
async getChangelog(version, locale) {
if (!version) {
throw new Error('Версия не может быть пустой');
}
try {
// Получаем информацию о версии через admin API или публичный endpoint
const versionInfo = await this.httpClient.get(`/api/update/releases/latest`, {
quality: 'stable' // По умолчанию, может быть параметром
});
if (versionInfo.version === version) {
return Array.isArray(versionInfo.releaseNotes)
? versionInfo.releaseNotes.join('\\n')
: versionInfo.releaseNotes || `Описание изменений для версии ${version}`;
}
// Если версия не совпадает, возвращаем базовое описание
return `Описание изменений для версии ${version} (${locale})`;
}
catch (error) {
throw new Error(`Ошибка получения changelog: ${error.message}`);
}
}
/**
* Отправляет статистику событий обновления
*
* @param {UpdateStatsEvent} event Событие для отправки статистики
* @returns {Promise<void>} Promise, который разрешается при успешной отправке
* @throws {Error} При ошибке отправки статистики
*
* @example
* ```javascript
* // Начало обновления
* await sdk.updates.sendStats({
* event: 'update_started',
* currentVersion: '1.0.0',
* targetVersion: '1.1.0'
* });
*
* // Завершение обновления
* await sdk.updates.sendStats({
* event: 'update_completed',
* currentVersion: '1.0.0',
* targetVersion: '1.1.0'
* });
*
* // Ошибка обновления
* await sdk.updates.sendStats({
* event: 'update_failed',
* currentVersion: '1.0.0',
* targetVersion: '1.1.0',
* error: 'Ошибка загрузки файла'
* });
* ```
*/
async sendStats(event) {
if (!event.event || !event.currentVersion || !event.targetVersion) {
throw new Error('Обязательные поля события: event, currentVersion, targetVersion');
}
try {
await this.httpClient.post('/api/update/stats', {
...event,
timestamp: new Date().toISOString()
});
}
catch (error) {
// Статистика не критична, но логируем ошибку
console.warn(`Не удалось отправить статистику обновления: ${error.message}`);
throw new Error(`Ошибка отправки статистики: ${error.message}`);
}
}
/**
* Получает информацию о последней доступной версии
*
* @param {string} channel Канал обновлений (stable, beta, insider)
* @returns {Promise<LatestVersionInfo>} Информация о последней версии
* @throws {Error} При ошибке запроса к API
*
* @example
* ```javascript
* const latestVersion = await sdk.updates.getLatestVersion('stable');
* console.log(`Последняя версия: ${latestVersion.version}`);
* console.log(`Платформы: ${Object.keys(latestVersion.platforms)}`);
* ```
*/
async getLatestVersion(channel = 'stable') {
try {
const response = await this.httpClient.get('/api/update/releases/latest', {
quality: channel
});
return {
version: response.version,
quality: response.quality,
platforms: response.platforms,
releaseNotes: response.releaseNotes,
createdAt: new Date(response.createdAt),
isActive: response.isActive
};
}
catch (error) {
if (error.status === 404) {
throw new Error(`Версия для канала '${channel}' не найдена`);
}
throw new Error(`Ошибка получения последней версии: ${error.message}`);
}
}
/**
* Проверяет доступность API обновлений
*
* @returns {Promise<boolean>} True, если API доступен
*
* @example
* ```javascript
* const isAvailable = await sdk.updates.checkAvailability();
* if (!isAvailable) {
* console.log('API обновлений недоступен');
* }
* ```
*/
async checkAvailability() {
try {
await this.httpClient.get('/api/update/releases/latest', { quality: 'stable' });
return true;
}
catch (error) {
return false;
}
}
}
//# sourceMappingURL=updates-api.js.map