Paket
Copy sebuah prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
Paket Bundles adalah paket pembaruan inti di Capgo. Setiap paket Bundles mengandung aset web (HTML, CSS, JS) yang membentuk konten aplikasi Anda. Pengelola Bundles API memungkinkan Anda mengelola paket pembaruan ini, termasuk menampilkan dan menghapusnya.
Pengertian Bundles
Pembahasan Judul “Mengerti Paket”Paket ini mewakili paket tertentu (versi) konten web aplikasi Anda dan termasuk:
- Paket (versi): Nomor versi semantik untuk paket
- Checksum: Hash unik untuk memverifikasi integritas paket
- Info Penyimpanan: Detail tentang di mana dan bagaimana paket disimpan
- Kebutuhan Nativ: Persyaratan versi aplikasi natif minimum
- MetadataWaktu pembuatan, kepemilikan, dan informasi pelacakan lainnya
Pembuatan Paket Manual (Tanpa CLI)
Bagian berjudul “Pembuatan Paket Manual (Tanpa CLI)”Ini cara membuat dan mengunggah paket secara manual tanpa menggunakan Capgo CLI:
Langkah 1: Bangun Aplikasi Anda
Bagian berjudul “Langkah 1: Bangun Aplikasi Anda”Pertama-tama, bangun aset web aplikasi Anda:
npm run buildLangkah 2: Buat Paket Zip Menggunakan Paket yang Sama dengan Capgo CLI
Bagian berjudul “Langkah 2: Buat Paket Zip Menggunakan Paket yang Sama dengan Capgo CLI”Penting: Gunakan paket JavaScript yang sama persis seperti Capgo CLI gunakan secara internal untuk memastikan konsistensi.
Pasang Paket yang Diperlukan
Judul Bagian: Pasang Paket yang Diperlukannpm install adm-zip @tomasklaen/checksumBuat Paket Zip dengan JavaScript (Sama seperti Capgo CLI)
Judul Bagian: Buat Paket Zip dengan JavaScript (Sama seperti Capgo CLI)Perlu diingat: Dalam contoh-contoh di bawah, version merujuk pada nama paket (versi) yang digunakan oleh API.
const fs = require('node:fs');const path = require('node:path');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');
// Exact same implementation as Capgo CLIfunction zipFileUnix(filePath) { const zip = new AdmZip(); zip.addLocalFolder(filePath); return zip.toBuffer();}
async function zipFileWindows(filePath) { console.log('Zipping file windows mode'); const zip = new AdmZip();
const addToZip = (folderPath, zipPath) => { const items = fs.readdirSync(folderPath);
for (const item of items) { const itemPath = path.join(folderPath, item); const stats = fs.statSync(itemPath);
if (stats.isFile()) { const fileContent = fs.readFileSync(itemPath); zip.addFile(path.join(zipPath, item).split(path.sep).join('/'), fileContent); } else if (stats.isDirectory()) { addToZip(itemPath, path.join(zipPath, item)); } } };
addToZip(filePath, ''); return zip.toBuffer();}
// Main zipFile function (exact same logic as CLI)async function zipFile(filePath) { if (os.platform() === 'win32') { return zipFileWindows(filePath); } else { return zipFileUnix(filePath); }}
async function createBundle(inputPath, outputPath, version) { // Create zip using exact same method as Capgo CLI const zipped = await zipFile(inputPath);
// Write to file fs.writeFileSync(outputPath, zipped);
// Calculate checksum using exact same package as CLI const checksum = await getChecksum(zipped, 'sha256');
return { filename: path.basename(outputPath), version: version, size: zipped.length, checksum: checksum };}
// Usageasync function main() { try { const result = await createBundle('./dist', './my-app-1.2.3.zip', '1.2.3'); console.log('Bundle info:', JSON.stringify(result, null, 2)); } catch (error) { console.error('Error creating bundle:', error); }}
main();Langkah 3: Hitung Checksum SHA256 Menggunakan Paket yang Sama seperti CLI
Judul Bagian: Langkah 3: Hitung Checksum SHA256 Menggunakan Paket yang Sama seperti CLIconst fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Usageasync function main() { const checksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('Checksum:', checksum);}
main();Langkah 4: Unggah Paket ke Penyimpanan Anda
Judul Bagian: Langkah 4: Unggah Paket ke Penyimpanan AndaUnggah file zip Anda ke penyimpanan web yang dapat diakses:
# Example: Upload to your server via scpscp my-app-1.2.3.zip user@your-server.com:/var/www/bundles/
# Example: Upload to S3 using AWS CLIaws s3 cp my-app-1.2.3.zip s3://your-bucket/bundles/
# Example: Upload via curl to a custom endpointcurl -X POST https://your-storage-api.com/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@my-app-1.2.3.zip"PentingKonteks: Halaman/area: Halaman program hadiah bug. Peran: Label UI. Dilihat di: halaman bug-bounty.astro. Kunci pesan `bug_bounty_important_label` (Label Penting Bug Bounty). : Paket Anda harus via HTTPS URL (no authentication required). Capgo’s servers need to download the bundle from this URL.
melalui URL HTTPS (tidak memerlukan autentikasi). Server __CAPGO_KEEP_0__ memerlukan untuk mengunduh paket dari URL ini.
https://your-storage.com/bundles/my-app-1.2.3.ziphttps://github.com/username/repo/releases/download/v1.2.3/bundle.ziphttps://cdn.jsdelivr.net/gh/username/repo@v1.2.3/dist.zip
Step 5: Register Bundle with Capgo API
Judul Bagian: “Langkah 5: Daftarkan Paket dengan Capgo API”Daftarkan paket eksternal dengan Capgo menggunakan panggilan API langsung:
async function registerWithCapgo(appId, version, bundleUrl, checksum, apiKey) { const fetch = require('node-fetch');
// Create bundle (version) const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': apiKey }, body: JSON.stringify({ app_id: appId, version: version, external_url: bundleUrl, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed to create bundle: ${response.statusText}`); }
const data = await response.json(); console.log('Bundle created:', data);
return data;}API Parameter
Judul Bagian: “API Parameter”| Parameter | Deskripsi | Wajib |
|---|---|---|
app_id | Identifikasi aplikasi Anda | Iya |
version | Paket (versi) versi semantik Contoh: "1.2.3" | Ya |
external_url | Akses publik URL HTTPS di mana bundle dapat diunduh (tidak memerlukan autentikasi) | Ya |
checksum | Checksum SHA256 dari file zip | Ya |
Persyaratan Struktur Bundle
Judul bagian "Persyaratan Struktur Bundle"Zip bundle Anda harus memenuhi persyaratan berikut:
- File Index Utama: Harus memiliki
index.htmldi tingkat root - Integrasi Capacitor: Harus dipanggil
notifyAppReady()dalam aplikasi code - Jalur Aset: Gunakan jalur relatif untuk semua aset
Struktur Paket yang Valid
Judul bagian “Struktur Paket yang Valid”bundle.zip├── index.html├── assets/│ ├── app.js│ └── styles.css└── images/Contoh Langkah Manual yang Lengkap
Judul bagian “Contoh Langkah Manual yang Lengkap”Skrip Node.js sederhana untuk mengompres, cek checksum, dan unggah ke Capgo:
const fs = require('node:fs');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');const fetch = require('node-fetch');
async function deployToCapgo() { const APP_ID = 'com.example.app'; const VERSION = '1.2.3'; const BUNDLE_URL = 'https://your-storage.com/bundles/app-1.2.3.zip'; const API_KEY = process.env.CAPGO_API_KEY;
// 1. Create zip (same as Capgo CLI) const zip = new AdmZip(); zip.addLocalFolder('./dist'); const zipped = zip.toBuffer();
// 2. Calculate checksum (same as Capgo CLI) const checksum = await getChecksum(zipped, 'sha256'); console.log('Checksum:', checksum);
// 3. Upload to your storage (replace with your upload logic) // fs.writeFileSync('./bundle.zip', zipped); // ... upload bundle.zip to your storage ...
// 4. Register with Capgo API const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': API_KEY }, body: JSON.stringify({ app_id: APP_ID, version: VERSION, external_url: BUNDLE_URL, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed: ${response.statusText}`); }
console.log('Bundle registered with Capgo!');}
deployToCapgo().catch(console.error);Instal dependensi:
npm install adm-zip @tomasklaen/checksum node-fetchPenghitungan Ceksum
Judul Bagian “Penghitungan Ceksum”Penghitungan Ceksum JavaScript (Sama dengan Capgo CLI)
Judul Bagian “Penghitungan Ceksum JavaScript (Sama dengan Capgo CLI)”Gunakan paket dan metode yang sama persis seperti Capgo CLI gunakan secara internal:
const fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Verify checksum matchesasync function verifyChecksum(filePath, expectedChecksum) { const actualChecksum = await calculateChecksum(filePath); const isValid = actualChecksum === expectedChecksum;
console.log(`File: ${filePath}`); console.log(`Expected: ${expectedChecksum}`); console.log(`Actual: ${actualChecksum}`); console.log(`Valid: ${isValid}`);
return isValid;}
// Usageasync function main() { const bundleChecksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('SHA256 Checksum:', bundleChecksum);}
main();Ketetapan Ceksum
Judul Bagian “Ketetapan Ceksum”- Integritas Paket: Memastikan paket tidak rusak selama transfer
- Verifikasi API: Sebelum menerima paket, Capgo memverifikasi checksum
- Verifikasi Plugin: Sebelum menerapkan update, plugin mobile memverifikasi checksum
Praktik Terbaik
: Bagian berjudul “Praktik Terbaik”- Pengelolaan Paket (versi): Gunakan penomoran versi semantik secara konsisten
- Optimasi Penyimpanan: Hapus bundle yang tidak digunakan secara berkala
- Kompatibilitas Bundle (versi): Tetapkan persyaratan versi native minimum yang tepat
- Strategi Cadangan: Jaga cadangan bundle kritis (versi)
Endpoint
: Bagian berjudul “Endpoint”https://api.capgo.app/bundle/
Pengambilan Informasi Bundle. Mengembalikan 50 bundle per halaman.
Parameter Kueri
Judul Bagian: Parameter Kueriapp_id: Wajib. ID aplikasi Andapage: Opsional. Nomor halaman untuk pagination
Jenis Respon
Judul Bagian: Jenis Responinterface Bundle { app_id: string bucket_id: string | null checksum: string | null created_at: string | null deleted: boolean external_url: string | null id: number minUpdateVersion: string | null name: string native_packages: Json[] | null owner_org: string r2_path: string | null session_key: string | null storage_provider: string updated_at: string | null user_id: string | null}Contoh Permintaan
Judul Bagian: Contoh Permintaan# Get all bundlescurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123"
# Get next pagecurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123&page=1"Contoh Respon
Judul Bagian: Contoh Respon{ "data": [ { "id": 1, "app_id": "app_123", "name": "1.0.0", "checksum": "abc123...", "minUpdateVersion": "1.0.0", "storage_provider": "r2", "created_at": "2024-01-01T00:00:00Z", "updated_at": "2024-01-01T00:00:00Z", "deleted": false, "owner_org": "org_123", "user_id": "user_123" } ]}HAPUS
Judul Bagian “HAPUS”https://api.capgo.app/bundle/
Menghapus satu atau semua bundle untuk sebuah aplikasi. Gunakan dengan hati-hati karena aksi ini tidak dapat dibatalkan.
Parameter Kueri
Judul Bagian “Parameter Kueri”Untuk menghapus bundle tertentu:
interface BundleDelete { app_id: string version: string}Untuk menghapus semua bundle:
interface BundleDeleteAll { app_id: string}Contoh Permintaan
Judul Bagian “Contoh Permintaan”# Delete specific bundlecurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version": "1.0.0" }' \ https://api.capgo.app/bundle/
# Delete all bundlescurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123" }' \ https://api.capgo.app/bundle/Respons Berhasil
Bagian Judul “Respons Berhasil”{ "status": "ok"}https://api.capgo.app/bundle/
Buat bundle baru dengan URL eksternal.
Badan Permintaan
Bagian Judul “Badan Permintaan”interface CreateBundleBody { app_id: string version: string external_url: string // Must be publicly accessible HTTPS URL checksum: string}Contoh Permintaan
Judul Bagian berjudul “Contoh Permintaan”curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "com.example.app", "version": "1.2.3", "external_url": "https://your-storage.com/bundles/app-1.2.3.zip", "checksum": "a1b2c3d4e5f6789abcdef123456789abcdef123456789abcdef123456789abcd" }' \ https://api.capgo.app/bundle/Respons Sukses
Judul Bagian berjudul “Respons Sukses”{ "status": "ok"}POST (Metadata)
Judul Bagian berjudul “POST (Metadata)”https://api.capgo.app/bundle/metadata
Perbarui metadata paket seperti informasi tautan dan komentar.
Badan Permintaan
Judul Bagian berjudul “Badan Permintaan”interface UpdateMetadataBody { app_id: string version_id: number // bundle (version) id link?: string comment?: string}Contoh Permintaan
Judul Bagian “Contoh Permintaan”curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "link": "https://github.com/myorg/myapp/releases/tag/v1.0.0", "comment": "Fixed critical bug in authentication" }' \ https://api.capgo.app/bundle/metadataRespons Berhasil
Judul Bagian “Respons Berhasil”{ "status": "success"}https://api.capgo.app/bundle/
Setel sebuah bundle ke saluran tertentu. Ini menghubungkan sebuah bundle (versi) ke saluran untuk distribusi.
Badan Permintaan
Judul Bagian “Badan Permintaan”interface SetChannelBody { app_id: string version_id: number // bundle (version) id channel_id: number}Contoh Permintaan
Bab berjudul “Contoh Permintaan”curl -X PUT \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "channel_id": 789 }' \ https://api.capgo.app/bundle/Respons Sukses
Bab berjudul “Respons Sukses”{ "status": "success", "message": "Bundle 1.0.0 set to channel production"}Pengelolaan Kesalahan
Bab berjudul “Pengelolaan Kesalahan”Skenario kesalahan umum dan responsnya:
// Bundle not found{ "error": "Bundle not found", "status": "KO"}
// Invalid bundle (version) format{ "error": "Invalid version format", "status": "KO"}
// Storage error{ "error": "Failed to delete bundle from storage", "status": "KO"}
// Permission denied{ "error": "Insufficient permissions to manage bundles", "status": "KO"}Kasus Penggunaan Umum
Judul Bagian “Kasus Penggunaan Umum”- Pembersihan Paket Lama (Versi)
// Delete outdated beta bundles (versions){ "app_id": "app_123", "version": "1.0.0-beta.1"}- Pengaturan Ulang Aplikasi
// Remove all bundles to start fresh{ "app_id": "app_123"}Pertimbangan Penyimpanan
Judul Bagian “Pertimbangan Penyimpanan”- Kebijakan Retensi: Tentukan berapa lama menyimpan paket lama
- Pengelolaan Ukuran: Pantau ukuran paket dan penggunaan penyimpanan
- Strategi Backup: Pertimbangkan untuk mengembalikan bundle-critical (versi)
- Optimasi Biaya: Hapus bundle yang tidak perlu untuk mengoptimalkan biaya penyimpanan
Teruskan dari Bundles
Bahasa Judul “Teruskan dari Bundles”Jika Anda menggunakan Bundles untuk merencanakan penyimpanan dan pengelolaan file, hubungkan dengan @capgo/capacitor-data-storage-sqlite untuk detail implementasi di @capgo/capacitor-data-storage-sqlite, Menggunakan @capgo/capacitor-data-storage-sqlite untuk kemampuan asli dalam Menggunakan @capgo/capacitor-data-storage-sqlite, @capgo/capacitor-file untuk detail implementasi dalam @capgo/capacitor-file, Menggunakan @capgo/capacitor-file untuk kemampuan asli dalam Menggunakan @capgo/capacitor-file, dan @capgo/capacitor-uploader untuk detail implementasi dalam @capgo/capacitor-uploader.