UNPKG

solver-sdk

Version:

SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system

246 lines 10.4 kB
/** * 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