−25%

yıllık Windows ödemesinde, 31 Ekim'e kadar. Paketlere git

EQVPS
Hemen başla

5 dakikada sandbox için TypeScript SDK: npm i @eqvps/sdk'den ilk çalıştırmaya

@eqvps/sdk'yı kurun, Node.js, Deno veya Bun'dan bir Firecracker sandbox başlatın, içinde Python, Node ve kabuk kodu çalıştırın, dosya taşıyın ve uzun bir işi canlı izleyin. Her kod satırıyla altı adım.

Bu rehber JavaScript veya TypeScript'ten bir sandbox çalıştırır. Yalıtılmış bir Firecracker microVM başlatacak, üç dilde kod çalıştıracak, dosya taşıyacak ve uzun bir işin çıktısını izleyeceksiniz. Her adım kısa bir kod parçasıdır.

Node.js 18+ (ya da Deno veya Bun) ve bir EQVPS hesabı gerekir.

1. Token alın

SDK, sıradan bir hesap token'ıyla kimlik doğrular. Hesabınızı bağlama sayfası onu panelden, API'den veya MCP sunucusundan nasıl alacağınızı gösterir.

export EQVPS_API_KEY="your-token"

Bakiyesi olmayan yeni bir hesap, ilk kez sandbox oluşturduğunda 1 $ sandbox kredisi alır. Bu, bu rehberi defalarca karşılar.

2. SDK'yı kurun

npm i @eqvps/sdk

Örnekler ES modüllerini ve üst düzey await kullanır. Bunları .mjs dosyası olarak ya da .ts olarak kaydedip npx tsx ile çalıştırın.

3. Sandbox başlatın ve kod çalıştırın

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);
});

Çıktı sandbox kimliğidir (sb_ ve ardından 24 karakter), sonra 0 3.12.x. Sandbox.with, geri çağırma bittiğinde sandbox'ı siler, hata fırlatsa bile.

Varsayılan dil Python'dur. Diğer ikisi tek bir seçenek uzaklıktadır:

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);
});

Başarısız olan bir betik hata fırlatmaz. exit_code 0 olduğunda ve komut zaman aşımına uğramadığında true olan r.ok değerini kontrol edin.

4. Kabuk komutları ve paketler

exec bir kabuk metni veya argv dizisi alır. Sandbox'ın internet erişimi vardır, bu yüzden npm ve pip kurulumları çalışır:

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);
});

Eşzamanlı bir çağrı en fazla 55 saniye sürebilir. Daha uzun her şey arka plan görevine gider (6. adım).

5. Dosyalar

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 bir metin veya Uint8Array alır. download bir Uint8Array, downloadText ise metin döndürür. Tek bir aktarım 5 MB ile sınırlıdır.

6. Canlı çıktılı uzun işler

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
});

Görev hemen döner ve 55 saniyelik sınırı yoktur. wait varsayılan olarak her 2 saniyede bir sorgular (pollIntervalMs bunu değiştirir). task.kill() görevi durdurur; sb.task(id) başka bir süreçten yeniden bağlanır.

Hatalar

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;
}

Sunucu Retry-After gönderdiğinde SDK, 429 ve 503'ü kendiliğinden üç kereye kadar yeniden dener. En yaygın 429, bir hesapta aynı anda ikiden fazla komut çalıştırmaktan kaynaklanır. Tüm sınıflar SDK başvurusunda yer alır.

Bu rehberin maliyeti

Her örnek birkaç saniye yaşadı ve 60 saniyelik asgari süre üzerinden faturalandı: small tarifesinde 0,00055 $, standard tarifesinde 0,0011 $. 6. adımdaki iş standard üzerinde yaklaşık 100 saniye sürdü, yani yaklaşık 0,002 $. Hepsi birlikte bir sentin çok altında kalır. Tam fiyat listesi sandbox sınırları ve faturalama sayfasındadır.

Sonraki adımlar

SSS

@eqvps/sdk hangi çalışma ortamlarını destekler?

Node.js 18 ve üstü, Deno ve Bun. Bağımlılığı yoktur ve yerleşik fetch'i kullanır, bu yüzden tarayıcıda da çalışır; ancak hesap token'ınızı ön yüz koduna koymayın.

Uygulamam TypeScript ile yazılmışsa sandbox Python çalıştırabilir mi?

Evet. Uygulamanızın dili ile sandbox kodunun dili birbirinden bağımsızdır. run, language olarak python, node veya bash kabul eder; exec ise herhangi bir kabuk komutunu çalıştırır.

Sandbox'ın silindiğinden nasıl emin olurum?

Sandbox.with(options, fn) kullanın; fn bittiğinde ya da hata fırlattığında sandbox'ı siler. TypeScript 5.2 veya üstünde await using sb = await Sandbox.create() da yazabilirsiniz.

Kod başarısız olduğunda run ne döndürür?

Sıfırdan farklı exit_code ve stderr'de hatayı içeren bir ExecResult. Hiçbir şey fırlatılmaz. İstisnalar yalnızca geçersiz token veya boş bakiye gibi API hataları içindir.

Yorumlar

Henüz yorum yok. İlk olun.

Bir yorum bırakın

Yorumlar görünmeden önce denetlenir.