@camera.ui/cloud
Version:
camera.ui cloud client package
110 lines • 4.74 kB
JavaScript
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