UNPKG

@interopio/desktop-cli

Version:

io.Connect Desktop Seed Repository CLI Tools

235 lines 10.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitHubStorage = void 0; const axios_1 = __importDefault(require("axios")); const utils_1 = require("../../utils"); const component_downloader_1 = require("../component-downloader"); class GitHubStorage { constructor() { this.baseUrl = 'https://api.github.com'; this.orgName = 'InteropIO'; this.downloader = component_downloader_1.ComponentDownloader.fromEnvironment(); this.githubToken = process.env.GITHUB_TOKEN; // Map component names to their GitHub repository names this.repoMapping = { 'iocd': 'desktop', 'bbg-v2': 'bbg-v2-adapter', 'teams-adapter': 'teams-adapter', 'excel-adapter': 'excel-adapter' }; this.fileNameMapping = { 'iocd': 'io-connect-desktop', }; } async makeGitHubRequest(url) { const headers = { 'Accept': 'application/vnd.github.v3+json', 'User-Agent': 'iocd-cli' }; // Add authentication if token is available if (this.githubToken) { headers['Authorization'] = `token ${this.githubToken}`; utils_1.Logger.debug('Using GitHub token for authentication'); } else { utils_1.Logger.debug('No GitHub token found, using unauthenticated requests (rate limited)'); } try { const response = await axios_1.default.get(url, { headers }); return response.data; } catch (error) { if (error.response?.status === 404) { throw new Error(`Repository or release not found: ${url}`); } else if (error.response?.status === 403) { throw new Error(`GitHub API rate limit exceeded or access denied. Consider setting GITHUB_TOKEN environment variable.`); } else if (error.response?.status === 401) { throw new Error(`GitHub authentication failed. Check your GITHUB_TOKEN environment variable.`); } else { throw new Error(`GitHub API request failed: ${error.message}`); } } } async getAvailableComponents(platform, arch) { const components = []; for (const [componentName, repoName] of Object.entries(this.repoMapping)) { try { const latestVersion = await this.getLatestVersion(componentName); const metadata = await this.getComponentMetadata(componentName, latestVersion); // Filter by platform compatibility if (metadata.platforms.includes(platform)) { components.push(metadata); } } catch (error) { utils_1.Logger.warning(`Skipping ${componentName}: ${error instanceof Error ? error.message : String(error)}`); // Add fallback component metadata for components that fail to load components.push({ name: componentName, version: this.getFallbackVersion(componentName), description: `${componentName} component (fallback)`, source: 'github', licenseRequired: this.requiresLicense(componentName), platforms: this.getSupportedPlatforms(componentName) }); } } return components; } async getComponentMetadata(componentName, version) { const repoName = this.repoMapping[componentName]; if (!repoName) { throw new Error(`Unknown component: ${componentName}`); } try { // Get release information from GitHub API const releaseUrl = version === 'latest' ? `${this.baseUrl}/repos/${this.orgName}/${repoName}/releases/latest` : `${this.baseUrl}/repos/${this.orgName}/${repoName}/releases/tags/v${version}`; utils_1.Logger.debug(`Fetching metadata for ${componentName}@${version} from ${releaseUrl}`); const release = await this.makeGitHubRequest(releaseUrl); return { name: componentName, version: release.tag_name.replace('v', ''), description: release.body || `${componentName} component`, source: 'github', licenseRequired: this.requiresLicense(componentName), platforms: this.getSupportedPlatforms(componentName) }; } catch (error) { utils_1.Logger.warning(`Failed to get GitHub metadata for ${componentName}@${version}: ${error instanceof Error ? error.message : String(error)}`); // Return fallback metadata return { name: componentName, version: version === 'latest' ? this.getFallbackVersion(componentName) : version, description: `${componentName} component (fallback)`, source: 'github', licenseRequired: this.requiresLicense(componentName), platforms: this.getSupportedPlatforms(componentName) }; } } async getLatestVersion(componentName) { const repoName = this.repoMapping[componentName]; if (!repoName) { throw new Error(`Unknown component: ${componentName}`); } try { const releaseUrl = `${this.baseUrl}/repos/${this.orgName}/${repoName}/releases/latest`; utils_1.Logger.debug(`Fetching latest version for ${componentName} from ${releaseUrl}`); const release = await this.makeGitHubRequest(releaseUrl); const version = release.tag_name.replace('v', ''); utils_1.Logger.debug(`Latest version for ${componentName}: ${version}`); return version; } catch (error) { utils_1.Logger.warning(`Failed to get latest version for ${componentName} from GitHub: ${error instanceof Error ? error.message : String(error)}`); utils_1.Logger.debug(`Using fallback version for ${componentName}`); return this.getFallbackVersion(componentName); } } buildDownloadUrl(componentName, version, platform, arch) { const repoName = this.repoMapping[componentName]; if (!repoName) { throw new Error(`Unknown component: ${componentName}`); } const normalizedFileName = this.fileNameMapping[componentName] || componentName; const filename = `${normalizedFileName}-v${version}-${platform}-${arch}.zip`; utils_1.Logger.debug(`Building download URL for ${componentName}@${version} (${platform}-${arch}): ${filename}`); if (componentName === 'iocd') { // Special case for iocd, use the main repo return `http://192.168.0.29:8080/${filename}`; } return `https://github.com/${this.orgName}/${repoName}/releases/download/v${version}/${filename}`; } async componentExists(componentName, version, platform, arch) { try { const downloadUrl = this.buildDownloadUrl(componentName, version, platform, arch); const response = await axios_1.default.head(downloadUrl); return response.status === 200; } catch { return false; } } async downloadComponent(component, version, outputDir) { try { const platform = process.platform; const arch = process.arch; const downloadUrl = this.buildDownloadUrl(component.name, version, platform, arch); utils_1.Logger.info(`Downloading ${component.name}@${version} from GitHub...`); utils_1.Logger.debug(`Download URL: ${downloadUrl}`); // Use the shared ComponentDownloader return await this.downloader.downloadComponent({ url: downloadUrl, targetPath: outputDir, useCache: true, maxRetries: 3, timeout: 300000 // 5 minutes }); } catch (error) { utils_1.Logger.error(`Failed to download component from GitHub: ${error instanceof Error ? error.message : String(error)}`); throw new Error(`GitHub download failed: ${error instanceof Error ? error.message : String(error)}`); } } async checkRepositoryAccess() { const issues = []; let accessible = true; for (const [componentName, repoName] of Object.entries(this.repoMapping)) { try { const repoUrl = `${this.baseUrl}/repos/${this.orgName}/${repoName}`; await this.makeGitHubRequest(repoUrl); utils_1.Logger.debug(`✓ Repository ${this.orgName}/${repoName} is accessible`); } catch (error) { accessible = false; const errorMsg = error instanceof Error ? error.message : String(error); issues.push(`❌ Repository ${this.orgName}/${repoName} (${componentName}): ${errorMsg}`); } } if (!accessible) { issues.push(''); issues.push('💡 Troubleshooting tips:'); if (!this.githubToken) { issues.push(' • Set GITHUB_TOKEN environment variable for private repositories'); issues.push(' • Create a personal access token at https://github.com/settings/tokens'); } issues.push(' • Verify repository names and organization in the mapping'); issues.push(' • Check if repositories exist and have releases published'); issues.push(' • Some repositories might be private and require authentication'); } return { accessible, issues }; } requiresLicense(componentName) { const licenseRequired = ['iocd', 'bbg-v2']; return licenseRequired.includes(componentName); } getSupportedPlatforms(componentName) { const platformMap = { 'iocd': ['win32', 'darwin', 'linux'], 'bbg-v2': ['win32', 'darwin'], 'teams-adapter': ['win32', 'darwin', 'linux'], 'excel-adapter': ['win32'] }; return platformMap[componentName] || ['win32', 'darwin', 'linux']; } getFallbackVersion(componentName) { const fallbackVersions = { 'iocd': '10.0.0', 'bbg-v2': '2.1.0', 'teams-adapter': '1.2.0', 'excel-adapter': '4.2.0' }; return fallbackVersions[componentName] || '1.0.0'; } } exports.GitHubStorage = GitHubStorage; //# sourceMappingURL=github-storage.js.map