Lompat ke konten

Bundel

Paket Bundel adalah paket pembaruan inti di Capgo. Setiap bundel mengandung aset web (HTML, CSS, JS) yang membentuk konten aplikasi Anda. Paket Bundel API memungkinkan Anda mengelola paket pembaruan ini, termasuk menampilkan dan menghapusnya.

Bundel mewakili versi tertentu konten web aplikasi Anda dan mencakup:

  • Bundel (versi): Nomor versi semantik untuk bundel untuk bundel
  • Checksum: Hash unik untuk memverifikasi integritas bundel
  • Informasi Penyimpanan: Detail tentang tempat dan cara bundel disimpan
  • Persyaratan Asli : Persyaratan versi aplikasi asli minimum
  • Metadata : Informasi waktu pembuatan, kepemilikan, dan lain-lain yang dapat diikuti

Berikut cara membuat dan mengunggah paket secara manual tanpa menggunakan Capgo CLI:

Langkah pertama, bangun aset web aplikasi Anda:

Jendela terminal
npm run build

Membuat Langkah 2: Buat Zip Bundle Menggunakan Paket yang Sama seperti Capgo CLI

Judul Bagian: “Membuat Langkah 2: Buat Zip Bundle Menggunakan Paket yang Sama seperti Capgo CLI”

Penting: Gunakan paket JavaScript yang sama persis seperti yang digunakan oleh Capgo CLI secara internal untuk memastikan konsistensi.

Tampilan Jendela Terminal
npm install adm-zip @tomasklaen/checksum

Buat Zip Bundle dengan JavaScript (Sama seperti Capgo CLI)

Judul Bagian: “Buat Zip Bundle dengan JavaScript (Sama seperti Capgo CLI)”

Perlu diingat: Dalam contoh-contoh di bawah ini, version merujuk pada nama bundle (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 CLI
function 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
};
}
// Usage
async 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 SHA256 Checksum Menggunakan Paket yang Sama sebagai CLI

Bagian berjudul “Langkah 3: Hitung SHA256 Checksum Menggunakan Paket yang Sama sebagai CLI”
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;
}
// Usage
async function main() {
const checksum = await calculateChecksum('./my-app-1.2.3.zip');
console.log('Checksum:', checksum);
}
main();

Langkah 4: Unggah Bundle ke Penyimpanan Anda

Bagian berjudul “Langkah 4: Unggah Bundle ke Penyimpanan Anda”

Unggah file zip Anda ke penyimpanan web yang dapat diakses:

Jendela terminal
# Example: Upload to your server via scp
scp my-app-1.2.3.zip user@your-server.com:/var/www/bundles/
# Example: Upload to S3 using AWS CLI
aws s3 cp my-app-1.2.3.zip s3://your-bucket/bundles/
# Example: Upload via curl to a custom endpoint
curl -X POST https://your-storage-api.com/upload \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@my-app-1.2.3.zip"

Penting: Bundel Anda harus tersedia secara publik melalui HTTPS URL (tidak diperlukan autentikasi). Server Capgo perlu mengunduh bundle dari URL ini.

Contoh URL publik yang valid:

  • https://your-storage.com/bundles/my-app-1.2.3.zip
  • https://github.com/username/repo/releases/download/v1.2.3/bundle.zip
  • https://cdn.jsdelivr.net/gh/username/repo@v1.2.3/dist.zip

Langkah 5: Daftarkan Bundle dengan Capgo API

Judul Bagian “Langkah 5: Daftarkan Bundle dengan Capgo API”

Daftarkan bundle 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;
}
ParameterDeskripsiDiperlukan
app_idIdentifikasi aplikasi AndaYes
versionPaket (versi) versi semantik (misalnya “1.2.3”)Yes
external_urlAkses publik URL HTTPS di mana paket dapat diunduh (tidak memerlukan autentikasi)Yes
checksumChecksum SHA256 dari file zipYes

Bundle zip Anda harus memenuhi persyaratan berikut:

  1. File Index Utama: Harus ada index.html di tingkat root
  2. Integrasi Capacitor: Harus memanggil notifyAppReady() dalam aplikasi Anda code
  3. Jalur Asset: Gunakan jalur relatif untuk semua asset
bundle.zip
├── index.html
├── assets/
│ ├── app.js
│ └── styles.css
└── images/

Skrip Node.js Sederhana untuk Mengompres, Menghitung Cek Palsu, dan Mengunggah 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);

Pasang Dependensi:

Jendela Terminal
npm install adm-zip @tomasklaen/checksum node-fetch

Penghitungan Cek Palsu JavaScript (Sama seperti Capgo CLI)

Judul Bagian “Penghitungan Cek Palsu JavaScript (Sama seperti 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 matches
async 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;
}
// Usage
async function main() {
const bundleChecksum = await calculateChecksum('./my-app-1.2.3.zip');
console.log('SHA256 Checksum:', bundleChecksum);
}
main();
  • Integritas Paket: Menjamin paket tidak rusak selama pengiriman
  • API Verifikasi: Capgo memverifikasi ceksum sebelum menerima paket
  • Verifikasi Plugin: Plugin mobile memverifikasi ceksum sebelum menerapkan update
  1. Pengelolaan Paket (versi): Gunakan versi semantik secara konsisten Optimasi Penyimpanan
  2. : Hapus bundle yang tidak digunakan secara berkalaKompatibilitas Bundle (versi)
  3. : Tetapkan versi native minimum yang sesuaiStrategi Cadangan
  4. : Cadangkan bundle kritis (versi)Endpoint

Bab berjudul “Endpoint”

GET

https://api.capgo.app/bundle/

Ambil informasi paket. Mengembalikan 50 paket per halaman.

  • app_id: Wajib. ID aplikasi Anda
  • page: Opsional. Nomor halaman untuk pengaturan halaman
interface 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
}
Jendela terminal
# Get all bundles
curl -H "authorization: your-api-key" \
"https://api.capgo.app/bundle/?app_id=app_123"
# Get next page
curl -H "authorization: your-api-key" \
"https://api.capgo.app/bundle/?app_id=app_123&page=1"
{
"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"
}
]
}

https://api.capgo.app/bundle/

Hapus satu atau semua bundle untuk aplikasi. Gunakan dengan hati-hati karena aksi ini tidak dapat dibatalkan.

Untuk menghapus bundle tertentu:

interface BundleDelete {
app_id: string
version: string
}

Untuk menghapus semua bundle:

interface BundleDeleteAll {
app_id: string
}
Jendela Terminal
# Delete specific bundle
curl -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 bundles
curl -X DELETE \
-H "authorization: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"app_id": "app_123"
}' \
https://api.capgo.app/bundle/
{
"status": "ok"
}

https://api.capgo.app/bundle/

Buat bundle baru dengan URL eksternal.

interface CreateBundleBody {
app_id: string
version: string
external_url: string // Must be publicly accessible HTTPS URL
checksum: string
}
Jendela Terminal
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/
{
"status": "ok"
}

https://api.capgo.app/bundle/metadata

Perbarui metadata paket seperti informasi link dan komentar.

interface UpdateMetadataBody {
app_id: string
version_id: number // bundle (version) id
link?: string
comment?: string
}
Jendela terminal
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/metadata
{
"status": "success"
}

https://api.capgo.app/bundle/

Atur sebuah bundle ke sebuah saluran. Ini menghubungkan sebuah bundle (versi) ke sebuah saluran untuk distribusi.

interface SetChannelBody {
app_id: string
version_id: number // bundle (version) id
channel_id: number
}
Jendela Terminal
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/
{
"status": "success",
"message": "Bundle 1.0.0 set to channel production"
}

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"
}
  1. Membersihkan Paket Lama (Versi)
// Delete outdated beta bundles (versions)
{
"app_id": "app_123",
"version": "1.0.0-beta.1"
}
  1. Reset Aplikasi
// Remove all bundles to start fresh
{
"app_id": "app_123"
}
  1. Kebijakan Retensi: Tentukan berapa lama untuk menyimpan bundle lama
  2. Manajemen Ukuran: Pantau ukuran bundle dan penggunaan penyimpanan
  3. Strategi Cadangan: Pertimbangkan untuk mencadangkan bundle kritis (versi)
  4. Optimasi Biaya: Hapus bundle yang tidak perlu untuk mengoptimalkan biaya penyimpanan

Jika Anda menggunakan Bundle untuk merencanakan penyimpanan dan pengelolaan file, hubungkannya dengan Penggunaan @capgo/capacitor-data-storage-sqlite untuk detail implementasi di @capgo/capacitor-data-storage-sqlite, Menggunakan @capgo/capacitor-data-storage-sqlite untuk kemampuan asli di Menggunakan @capgo/capacitor-data-storage-sqlite, Penggunaan @capgo/capacitor-file untuk detail implementasi di @capgo/capacitor-file, Menggunakan @capgo/capacitor-file untuk kemampuan asli di Menggunakan @capgo/capacitor-file, dan Penggunaan @capgo/capacitor-uploader untuk detail implementasi di @capgo/capacitor-uploader.