رفتن به محتوا
سارویتوسعه‌دهندگان
مستندات/ابر ساروی

تابع‌های سرور

JavaScript همگام در محیط مستقل و محدود.

JavaScript سمت سرور

Starter حداکثر ۳ تابع نگه می‌دارد. تابع باید همگام باشد و handler(input) را تعریف کند؛ نتیجه باید JSON تا ۶۴ KB باشد. هر درخواست در مفسر WebAssembly مستقل با حافظهٔ ۱۶ MiB و مهلت ۵۰۰ ms اجرا می‌شود. globalها بین درخواست‌ها باقی نمی‌مانند. Node، Deno، import، شبکه، فایل سیستم، async و پایگاه‌دادهٔ مستقیم در این طرح در دسترس نیستند. برای پردازش کوتاه، اعتبارسنجی و محاسبهٔ سمت سرور استفاده کنید؛ کارهای طولانی و وابسته به کتابخانه نیاز به زیرساخت بعدی دارند.

انتشار

POST /v1/cloud/{id}/functions با cloud:functions:

Python
import json, os, urllib.request, urllib.error

payload = {
    "name": "hello-world",
    "code": "function handler(input) { return { message: 'Hello ' + (input.body.name || 'world'), user: input.user }; }",
    "verify_jwt": True
}

request = urllib.request.Request(
    "https://api.sarovi.ir/v1/cloud/{id}/functions",
    data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + os.environ["SAROVI_API_KEY"],
        "Content-Type": "application/json"
    },
    method="POST"
)
try:
    with urllib.request.urlopen(request, timeout=300) as response:
        result = json.load(response)
        print(result)
except urllib.error.HTTPError as error:
    detail = json.load(error)
    raise RuntimeError(f"{error.code}: {detail['error'].get('code', detail['error'].get('type', 'HTTP_ERROR'))}") from error

کلید را در متغیر محیطی SAROVI_API_KEY قرار بده. بدون نصب کتابخانه؛ با Python استاندارد.

نام تابع باید ۲ تا ۶۳ نویسه باشد؛ با حرف کوچک انگلیسی شروع شود و فقط حرف کوچک انگلیسی، عدد و خط تیره داشته باشد (مانند hello-world). فاصله، زیرخط و حروف بزرگ مجاز نیستند. نام موجود نسخهٔ جدید می‌گیرد. کد تا ۶۰٬۰۰۰ نویسه پذیرفته می‌شود. GET همان مسیر نسخه‌ها را نشان می‌دهد. verify_jwt:true توکن نشست معتبر برنامه را لازم دارد؛ در Starter این توکن opaque است، نه JWT. false اجرا را برای دارندهٔ کلید عمومی باز می‌کند. نام فیلد برای سازگاری با قرارداد Cloud حفظ شده است.

فراخوانی از برنامه

javascript
const result = await cloud("/functions/hello-world", "POST", { name: "Sarovi" });
console.log(result.data.message);
python
result = cloud("/functions/hello-world", "POST", {"name": "Sarovi"})
print(result["data"]["message"])

input شامل body، method، user و secrets است. user فقط شناسهٔ کاربر معتبر همین برنامه را دارد یا null است. برای تست مدیریتی، POST /v1/cloud/{id}/functions/{name}/invoke ورودی JSON می‌گیرد؛ این مسیر با cloud:functions اجرا می‌شود و user:null است.

متغیرهای محرمانه

POST /v1/cloud/{id}/secrets با name و value، حداکثر ۱۰ مقدار مخصوص همین ابر ذخیره می‌کند. داخل تابع از input.secrets.MY_SERVICE_TOKEN بخوانید. مقدارها در فهرست یا گزارش درخواست برگردانده نمی‌شوند. خودتان secret را در نتیجهٔ تابع قرار ندهید. توکن مدیریت ساروی و credential مشترک سرویس هرگز به کد تابع داده نمی‌شوند.

خطا و ظرفیت

AUTH_REQUIRED یعنی نشست لازم است. FUNCTION_FAILED با 422 خطای کد، خروجی نامعتبر، async یا مهلت اجراست. پاسخ timeout موفقیت نیست. یک بار اصلاح کنید و دوباره بفرستید؛ حلقهٔ تلاش بی‌وقفه نسازید. میزبانی هنگام بیکاری به صفر می‌رسد؛ اولین درخواست ممکن است دیرتر پاسخ دهد. زیرساخت اختصاصی قرارداد Deno/TypeScript و سقف جداگانه دارد؛ کد Starter و Deno قابل جایگزینی مستقیم نیستند.

قرارداد API 1.6.0 · تاریخچهٔ تغییرات