−25%

Windows-এর বার্ষিক পেমেন্টে, ৩১ অক্টোবর পর্যন্ত। প্ল্যান দেখুন

EQVPS
শুরু করুন

৫ মিনিটে স্যান্ডবক্সের TypeScript SDK: npm i @eqvps/sdk থেকে প্রথম রান পর্যন্ত

@eqvps/sdk ইনস্টল করুন, Node.js, Deno বা Bun থেকে Firecracker স্যান্ডবক্স চালু করুন, তাতে Python, Node ও shell কোড চালান, ফাইল আনা-নেওয়া করুন এবং লম্বা কাজের আউটপুট সরাসরি দেখুন। প্রতিটি লাইন কোডসহ ছয়টি ধাপ।

এই গাইড JavaScript বা TypeScript থেকে একটি স্যান্ডবক্স চালায়। আপনি একটি বিচ্ছিন্ন Firecracker microVM চালু করবেন, তিনটি ভাষায় কোড চালাবেন, ফাইল আনা-নেওয়া করবেন এবং লম্বা কাজের আউটপুট দেখবেন। প্রতিটি ধাপ একটি ছোট কোডের অংশ।

আপনার লাগবে Node.js 18+ (বা Deno, বা Bun) এবং একটি EQVPS অ্যাকাউন্ট।

১. টোকেন নিন

SDK সাধারণ অ্যাকাউন্ট টোকেন দিয়ে প্রমাণীকরণ করে। ড্যাশবোর্ড, API বা MCP সার্ভার থেকে কীভাবে টোকেন পাবেন, তা আছে অ্যাকাউন্ট সংযোগ পাতায়।

export EQVPS_API_KEY="your-token"

ব্যালেন্সহীন নতুন অ্যাকাউন্ট প্রথমবার স্যান্ডবক্স তৈরি করলে $1 স্যান্ডবক্স ক্রেডিট পায়। এই গাইড বহুবার চালানোর জন্য এটুকুই যথেষ্ট।

২. SDK ইনস্টল করুন

npm i @eqvps/sdk

উদাহরণগুলোতে ES মডিউল ও টপ-লেভেল await ব্যবহার করা হয়েছে। এগুলো .mjs ফাইল হিসেবে সেভ করুন, অথবা .ts হিসেবে সেভ করে npx tsx দিয়ে চালান।

৩. স্যান্ডবক্স চালু করুন এবং কোড চালান

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

আউটপুট হলো স্যান্ডবক্সের id (sb_ আর আরও ২৪টি অক্ষর), তারপর 0 3.12.x। callback শেষ হলে Sandbox.with স্যান্ডবক্স মুছে দেয়, ত্রুটি ছুড়লেও।

ডিফল্ট ভাষা Python। বাকি দুটি মাত্র একটি অপশন দূরে:

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

ব্যর্থ স্ক্রিপ্ট কিছু ছোড়ে না। r.ok পরীক্ষা করুন, যা true হয় যখন exit_code 0 এবং কমান্ড টাইমআউটে পৌঁছায়নি।

৪. shell কমান্ড ও প্যাকেজ

exec একটি shell স্ট্রিং বা argv অ্যারে নেয়। স্যান্ডবক্স ইন্টারনেটে যেতে পারে, তাই npm ও pip ইনস্টল কাজ করে:

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

একটি সিনক্রোনাস কল সর্বোচ্চ ৫৫ সেকেন্ড চলে। এর চেয়ে লম্বা কিছু ব্যাকগ্রাউন্ড টাস্কে যায় (ধাপ ৬)।

৫. ফাইল

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 একটি স্ট্রিং বা Uint8Array নেয়। download একটি Uint8Array ফেরত দেয়, downloadText একটি স্ট্রিং। একবারের ট্রান্সফার 5 MB পর্যন্ত।

৬. লাইভ আউটপুটসহ লম্বা কাজ

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

টাস্ক সঙ্গে সঙ্গে ফিরে আসে এবং এতে ৫৫ সেকেন্ডের সীমা নেই। wait ডিফল্টভাবে প্রতি ২ সেকেন্ডে খোঁজ নেয় (pollIntervalMs দিয়ে বদলান)। task.kill() এটি থামায়; sb.task(id) অন্য প্রসেস থেকে আবার যুক্ত হয়।

ত্রুটি

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

সার্ভার Retry-After পাঠালে SDK নিজেই 429 ও 503 তিনবার পর্যন্ত আবার চেষ্টা করে। সবচেয়ে সাধারণ 429 আসে একটি অ্যাকাউন্টে একসঙ্গে দুটির বেশি কমান্ড চালালে। সব ক্লাস আছে SDK রেফারেন্স-এ।

এই গাইডের খরচ

প্রতিটি উদাহরণ কয়েক সেকেন্ড ছিল এবং সর্বনিম্ন ৬০ সেকেন্ড হিসেবে বিল হয়েছে: small-এ $0.00055, standard-এ $0.0011। ধাপ ৬-এর কাজ standard-এ প্রায় ১০০ সেকেন্ড চলেছে, মোটামুটি $0.002। সব মিলিয়ে এক সেন্টের অনেক নিচে। পুরো দামের তালিকা আছে স্যান্ডবক্সের সীমা ও বিলিং-এ।

এরপর কী

FAQ

@eqvps/sdk কোন রানটাইমগুলোতে চলে?

Node.js 18 ও নতুন, Deno এবং Bun। এর কোনো ডিপেন্ডেন্সি নেই এবং এটি বিল্ট-ইন fetch ব্যবহার করে, তাই ব্রাউজারেও চলে, তবে অ্যাকাউন্টের টোকেন ফ্রন্টএন্ড কোডে রাখবেন না।

আমার অ্যাপ TypeScript-এ হলে কি স্যান্ডবক্স Python চালাতে পারে?

হ্যাঁ। আপনার অ্যাপের ভাষা আর স্যান্ডবক্সের কোডের ভাষা একে অপরের ওপর নির্ভর করে না। run-এর language হতে পারে python, node বা bash, আর exec যেকোনো shell কমান্ড চালায়।

কীভাবে নিশ্চিত করব যে স্যান্ডবক্স মুছে যাবে?

Sandbox.with(options, fn) ব্যবহার করুন; fn শেষ হলে বা ত্রুটি ছুড়লে এটি স্যান্ডবক্স মুছে দেয়। TypeScript 5.2 বা নতুনে await using sb = await Sandbox.create() লিখতেও পারেন।

কোড ব্যর্থ হলে run কী ফেরত দেয়?

শূন্য নয় এমন exit_code এবং stderr-এ ত্রুটিসহ একটি ExecResult। কিছু ছোড়া হয় না। exception আসে শুধু API ত্রুটিতে, যেমন ভুল টোকেন বা খালি ব্যালেন্স।

মন্তব্য

এখনো কোনো মন্তব্য নেই। প্রথম হোন।

একটি মন্তব্য দিন

মন্তব্য প্রকাশের আগে মডারেট করা হয়।