UNPKG

@camera.ui/cloud

Version:

camera.ui cloud client package

110 lines 4.74 kB
#!/usr/bin/env node import axios from 'axios'; import fs from 'fs-extra'; import { dirname, extname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { pipeline } from 'stream/promises'; import { Open } from 'unzipper'; import { cloudPath } from './index.js'; import { getArchitecture, getPlatform } from './utils.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const CLOUD_VERSION = 'v0.0.2'; const binaries = { darwin: { x64: `cloud-darwin-x64-${CLOUD_VERSION.replace('v', '')}.zip`, arm64: `cloud-darwin-arm64-${CLOUD_VERSION.replace('v', '')}.zip`, }, linux: { x64: `cloud-linux-x64-${CLOUD_VERSION.replace('v', '')}.zip`, arm6: `cloud-linux-armv6-${CLOUD_VERSION.replace('v', '')}.zip`, arm7: `cloud-linux-armv7-${CLOUD_VERSION.replace('v', '')}.zip`, arm64: `cloud-linux-arm64-${CLOUD_VERSION.replace('v', '')}.zip`, ia32: `cloud-linux-x86-${CLOUD_VERSION.replace('v', '')}.zip`, mipsel: `cloud-linux-mipsel-${CLOUD_VERSION.replace('v', '')}.zip`, }, win32: { x64: `cloud-windows-x64-${CLOUD_VERSION.replace('v', '')}.zip`, arm64: `cloud-windows-arm64-${CLOUD_VERSION.replace('v', '')}.zip`, ia32: `cloud-windows-x86-${CLOUD_VERSION.replace('v', '')}.zip`, }, freebsd: { arm64: `cloud-freebsd-arm64-${CLOUD_VERSION.replace('v', '')}.zip`, x64: `cloud-freebsd-x64-${CLOUD_VERSION.replace('v', '')}.zip`, }, }; const arch = getArchitecture(); const sysPlatform = getPlatform(); const filename = binaries[sysPlatform]?.[arch]; const releasesUrl = 'https://api.github.com/repos/seydx/cameraui.cloud/releases'; console.log(`Detected platform: ${sysPlatform} / ${arch}`); const cloudBinaryPath = resolve(__dirname, '../binary'); fs.ensureDirSync(cloudBinaryPath); const cloudFilePath = resolve(cloudBinaryPath, filename); const cloudExtractedFilePath = cloudPath(); const isZipUrl = (url) => { const pathArray = new URL(url).pathname.split('/'); const fileName = pathArray[pathArray.length - 1]; return fileName !== undefined && extname(fileName) === '.zip'; }; const downloadFile = async (url) => { console.log(`Downloading Cloud Client ${CLOUD_VERSION} to ${cloudFilePath}...`); const { data } = await axios.get(url, { onDownloadProgress: (progressEvent) => { if (process.env.CI || !progressEvent.total) { return; } const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100) + '%'; process.stdout.write('\r' + percent); if (progressEvent.loaded === progressEvent.total) { process.stdout.write('\r'); } }, timeout: 30 * 1000, // 30s maxRedirects: 3, responseType: 'stream', }); await fs.ensureDir(cloudBinaryPath); const streams = [data, fs.createWriteStream(cloudFilePath)]; await pipeline(streams); if (isZipUrl(url)) { console.log(`Extracting ${cloudFilePath} to ${cloudExtractedFilePath}...`); const directory = await Open.file(cloudFilePath); await new Promise((resolve, reject) => { directory.files[0].stream().pipe(fs.createWriteStream(cloudExtractedFilePath)).on('error', reject).on('finish', resolve); }); console.log(`Removing ${cloudFilePath}...`); await fs.remove(cloudFilePath); } else { console.log(`Renaming ${cloudFilePath} to ${cloudExtractedFilePath}...`); await fs.rename(cloudFilePath, cloudExtractedFilePath); } }; const getReleaseAssets = async (version) => { const response = await axios.get(`${releasesUrl}/tags/${version}`); const assets = response.data.assets.map((asset) => asset.browser_download_url); const files = assets.map((asset) => asset.split(`${version}/`)[1]); return { assets, files, }; }; const downloadCloudClient = async () => { const release = await getReleaseAssets(CLOUD_VERSION); if (!filename || !release.assets.find((r) => r.endsWith(filename))) { throw new Error(`No cloud binary found for architecture (${sysPlatform} / ${arch})`); } const downloadUrl = release.assets.find((r) => r.endsWith(filename)); await downloadFile(downloadUrl); if (sysPlatform === 'linux' || sysPlatform === 'darwin') { console.log(`Making ${cloudExtractedFilePath} executable...`); fs.chmodSync(cloudExtractedFilePath, 0o755); } console.log('Done!'); }; downloadCloudClient().catch((error) => { console.error('Error downloading Cloud Client:', error); process.exit(1); }); //# sourceMappingURL=install.js.map