@interopio/desktop-cli
Version:
io.Connect Desktop Seed Repository CLI Tools
235 lines • 10.9 kB
JavaScript
;
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