−25%

kwa Windows ya mwaka, hadi 31 Okt. Tazama mipango

EQVPS
Anza

SDK ya TypeScript kwa sandbox kwa dakika 5: kutoka npm i @eqvps/sdk hadi uendeshaji wa kwanza

Sakinisha @eqvps/sdk, washa sandbox ya Firecracker kutoka Node.js, Deno au Bun, endesha msimbo wa Python, Node na shell ndani yake, hamisha faili na fuatilia kazi ndefu moja kwa moja. Hatua sita zenye kila mstari wa msimbo.

Mwongozo huu unawasha sandbox kutoka JavaScript au TypeScript. Utawasha microVM ya Firecracker iliyotengwa, utaendesha msimbo kwa lugha tatu, utahamisha faili na utafuatilia matokeo ya kazi ndefu. Kila hatua ni kipande kifupi cha msimbo.

Unahitaji Node.js 18+ (au Deno, au Bun) na akaunti ya EQVPS.

1. Pata tokeni

SDK inajithibitisha kwa tokeni ya kawaida ya akaunti. Ukurasa wa kuunganisha akaunti unaonyesha jinsi ya kuipata kutoka dashibodi, API au seva ya MCP.

export EQVPS_API_KEY="your-token"

Akaunti mpya isiyo na salio inapata $1 ya mkopo wa sandbox mara ya kwanza inapounda sandbox. Hiyo inatosha mwongozo huu mara nyingi.

2. Sakinisha SDK

npm i @eqvps/sdk

Mifano inatumia moduli za ES na await ya ngazi ya juu. Zihifadhi kama faili za .mjs, au kama .ts na uziendeshe kwa npx tsx.

3. Washa sandbox na endesha msimbo

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

Matokeo ni kitambulisho cha sandbox (sb_ na herufi 24 zaidi), kisha 0 3.12.x. Sandbox.with inafuta sandbox callback ikimaliza, hata ikirusha hitilafu.

Lugha ya chaguo-msingi ni Python. Nyingine mbili ziko chaguo moja tu mbali:

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

Skripti inayoshindwa hairushi chochote. Kagua r.ok, ambayo ni true exit_code ikiwa 0 na amri haikufikia muda wake wa mwisho.

4. Amri za shell na vifurushi

exec inapokea maandishi ya shell au safu ya argv. Sandbox ina intaneti, kwa hiyo usakinishaji kwa npm na pip unafanya kazi:

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

Wito wa kisawazishi unaweza kudumu hadi sekunde 55 tu. Chochote kirefu zaidi kinaenda kwenye kazi ya chinichini (hatua ya 6).

5. Faili

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 inapokea maandishi au Uint8Array. download inarudisha Uint8Array, downloadText inarudisha maandishi. Uhamisho mmoja una kikomo cha 5 MB.

6. Kazi ndefu zenye matokeo ya moja kwa moja

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

Kazi inarudi mara moja na haina kikomo cha sekunde 55. Kwa chaguo-msingi wait inakagua kila sekunde 2 (pollIntervalMs inabadilisha hilo). task.kill() inaisimamisha; sb.task(id) inaunganisha tena kutoka mchakato mwingine.

Hitilafu

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 yenyewe inajaribu tena 429 na 503, hadi mara tatu, seva ikituma Retry-After. 429 ya kawaida zaidi inatokana na kuendesha amri zaidi ya mbili kwa wakati mmoja kwenye akaunti moja. Kila darasa liko kwenye marejeo ya SDK.

Gharama ya mwongozo huu

Kila mfano uliishi sekunde chache na ulitozwa kima cha chini cha sekunde 60: $0.00055 kwenye small, $0.0011 kwenye standard. Kazi ya hatua ya 6 iliendeshwa takriban sekunde 100 kwenye standard, karibu $0.002. Yote kwa pamoja ni chini sana ya senti moja. Orodha kamili ya bei iko kwenye vikomo na malipo ya sandbox.

Hatua zinazofuata

Maswali

@eqvps/sdk inaunga mkono mazingira gani?

Node.js 18 na mpya zaidi, Deno na Bun. Haina utegemezi na inatumia fetch iliyojengwa ndani, kwa hiyo inafanya kazi pia kwenye kivinjari, lakini usiweke tokeni ya akaunti yako kwenye msimbo wa frontend.

Je, sandbox inaweza kuendesha Python ikiwa programu yangu imeandikwa kwa TypeScript?

Ndiyo. Lugha ya programu yako na lugha ya msimbo ndani ya sandbox hazitegemeani. run inakubali language python, node au bash, na exec inaendesha amri yoyote ya shell.

Nitahakikishaje kuwa sandbox inafutwa?

Tumia Sandbox.with(options, fn), ambayo inafuta sandbox fn ikimaliza au ikirusha hitilafu. Kwa TypeScript 5.2 au mpya zaidi unaweza pia kuandika await using sb = await Sandbox.create().

run inarudisha nini msimbo ukishindwa?

ExecResult yenye exit_code isiyo sifuri na hitilafu ndani ya stderr. Hakuna kinachorushwa. Exceptions ni kwa hitilafu za API tu, kama tokeni batili au salio tupu.

Maoni

Bado hakuna maoni. Kuwa wa kwanza.

Acha maoni

Maoni yanakaguliwa kabla ya kuonekana.