−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

SDK TypeScript untuk sandbox dalam 5 menit: dari npm i @eqvps/sdk sampai run pertama

Pasang @eqvps/sdk, jalankan sandbox Firecracker dari Node.js, Deno, atau Bun, eksekusi kode Python, Node, dan shell di dalamnya, pindahkan file, dan pantau pekerjaan panjang secara langsung. Enam langkah dengan setiap baris kode.

Panduan ini menjalankan sandbox dari JavaScript atau TypeScript. Anda akan menyalakan microVM Firecracker yang terisolasi, menjalankan kode dalam tiga bahasa, memindahkan file, dan memantau output pekerjaan panjang. Setiap langkah hanya potongan kode pendek.

Anda butuh Node.js 18+ (atau Deno, atau Bun) dan akun EQVPS.

1. Dapatkan token

SDK melakukan autentikasi dengan token akun biasa. Halaman menghubungkan akun menunjukkan cara mendapatkannya dari dasbor, API, atau server MCP.

export EQVPS_API_KEY="your-token"

Akun baru tanpa saldo mendapat kredit sandbox $1 saat pertama kali membuat sandbox. Itu cukup untuk panduan ini berkali-kali.

2. Pasang SDK

npm i @eqvps/sdk

Contoh-contoh ini memakai modul ES dan await tingkat atas. Simpan sebagai file .mjs, atau sebagai .ts lalu jalankan dengan npx tsx.

3. Jalankan sandbox dan eksekusi kode

import { Sandbox } from "@eqvps/sdk";

await Sandbox.with({ tariff: "small" }, async (sb) => {
  console.log(sb.id);
  const r = await sb.run("import platform; print(platform.python_version())");
  console.log(r.exit_code, r.stdout);
});

Outputnya adalah id sandbox (sb_ dan 24 karakter lagi), lalu 0 3.12.x. Sandbox.with menghapus sandbox saat callback selesai, termasuk jika callback melempar error.

Bahasa bawaan adalah Python. Dua lainnya cukup satu opsi:

await Sandbox.with({}, async (sb) => {
  const js = await sb.run("console.log(process.version)", { language: "node" });
  const sh = await sb.run("uname -r && nproc", { language: "bash" });
  console.log(js.stdout, sh.stdout);
});

Skrip yang gagal tidak melempar apa pun. Periksa r.ok, yang bernilai true jika exit_code sama dengan 0 dan perintah tidak kena batas waktu.

4. Perintah shell dan paket

exec menerima string shell atau array argv. Sandbox punya akses internet, jadi instalasi lewat npm dan pip berfungsi:

await Sandbox.with({ tariff: "small" }, async (sb) => {
  await sb.exec("mkdir -p /root/app && cd /root/app && npm init -y && npm i lodash", { timeout: 55 });
  const r = await sb.exec(["node", "-e", "console.log(require('/root/app/node_modules/lodash').VERSION)"]);
  console.log(r.stdout);
});

Panggilan sinkron paling lama 55 detik. Apa pun yang lebih lama masuk ke tugas latar belakang (langkah 6).

5. File

await Sandbox.with({}, async (sb) => {
  await sb.upload("/root/input.json", JSON.stringify({ values: [3, 5, 8] }));
  await sb.run("import json; d = json.load(open('/root/input.json')); open('/root/out.txt', 'w').write(str(sum(d['values'])))");
  console.log(await sb.downloadText("/root/out.txt"));   // 16
});

upload menerima string atau Uint8Array. download mengembalikan Uint8Array, downloadText mengembalikan string. Satu transfer dibatasi 5 MB.

6. Pekerjaan panjang dengan output langsung

await Sandbox.with({ tariff: "standard" }, async (sb) => {
  const task = await sb.exec("for i in 1 2 3 4 5; do echo step $i; sleep 20; done", { background: true });
  const res = await task.wait({ onOutput: (out) => process.stdout.write(out) });
  console.log(res.state, res.exit_code);   // done 0
});

Tugas langsung kembali dan tidak punya batas 55 detik. Secara bawaan wait memeriksa setiap 2 detik (pollIntervalMs mengubahnya). task.kill() menghentikannya; sb.task(id) menyambung lagi dari proses lain.

Error

import { Sandbox, InsufficientBalanceError, RateLimitError } from "@eqvps/sdk";

try {
  await Sandbox.with({}, async (sb) => console.log((await sb.run("print(1)")).stdout));
} catch (e) {
  if (e instanceof InsufficientBalanceError) console.log("Top up the balance");
  else if (e instanceof RateLimitError) console.log("Busy, retry in", e.retryAfter);
  else throw e;
}

SDK sendiri mengulang 429 dan 503 hingga tiga kali saat server mengirim Retry-After. 429 yang paling sering muncul karena menjalankan lebih dari dua perintah sekaligus di satu akun. Semua kelas ada di referensi SDK.

Biaya panduan ini

Setiap contoh hidup beberapa detik dan ditagih minimum 60 detik: $0.00055 di small, $0.0011 di standard. Pekerjaan di langkah 6 berjalan sekitar 100 detik di standard, kira-kira $0.002. Semuanya jauh di bawah satu sen. Daftar harga lengkap ada di batas dan penagihan sandbox.

Langkah berikutnya

FAQ

Runtime apa saja yang didukung @eqvps/sdk?

Node.js 18 ke atas, Deno, dan Bun. Tidak ada dependensi dan memakai fetch bawaan, jadi juga berjalan di browser, tetapi jangan taruh token akun Anda di kode frontend.

Bisakah sandbox menjalankan Python jika aplikasi saya ditulis dengan TypeScript?

Bisa. Bahasa aplikasi Anda dan bahasa kode di sandbox tidak saling terkait. run menerima language python, node, atau bash, dan exec menjalankan perintah shell apa pun.

Bagaimana memastikan sandbox terhapus?

Gunakan Sandbox.with(options, fn), yang menghapus sandbox saat fn selesai atau melempar error. Dengan TypeScript 5.2 atau lebih baru Anda juga bisa menulis await using sb = await Sandbox.create().

Apa yang dikembalikan run saat kode gagal?

ExecResult dengan exit_code bukan nol dan error di stderr. Tidak ada yang dilempar. Exception hanya untuk error API, misalnya token tidak valid atau saldo kosong.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.