UnoPayv1.0.0
  1. خانه
  2. رانتایم‌های لبه

راهنماها

اجرا در رانتایم‌های لبه

پکیج هیچ وابستگی زمان اجرا ندارد و جز ماژول‌های خودش چیزی import نمی‌کند. تمام دلیل اجرا شدنش روی لبه همین است — و به‌تنهایی کافی نیست.

پکیج واقعاً چه چیزی لازم دارد

سطح کامل زمان اجرای unopay 1.0.0
نیاز دارد استفاده می‌کند از یادداشت
A network global fetch The only platform API the SDK touches
Timers setTimeout, clearTimeout Only for the 10s abort; cleared in finally
Abort AbortController Standard on every target runtime
JSON JSON.stringify, res.json() Built in everywhere
Node built-ins None No http, no crypto, no streams

سه چیزی که واقعاً گاز می‌اندازد

«آماده لبه» درباره پکیج درست است و برای استقرار کافی نیست. این‌ها محدودیت‌های رانتایم هستند که تصمیم می‌گیرند یکپارچه‌سازی درست UnoPay واقعاً آنجا اجرا شود یا نه.

  1. فرمت ماژول. package.json مقدار "type": "module" را اعلام می‌کند و هر دو شرط import و require را به dist/index.js و dist/index.cjs وصل می‌کند. Workers و Vercel Edge مستقیم مسیر ESM را می‌گیرند.
  2. سقف زمانی شماست. SDK ده ثانیه برای درگاه منتظر می‌ماند و نمی‌توانید به آن بگویید چه کند. رانتایمی با بودجه درخواست کوتاه‌تر شما را پیش از فعال شدن زمان‌بندی خود SDK قطع می‌کند و خطای پلتفرم می‌بینید نه GatewayNetworkError.
  3. هیچ تلاش مجددی. روی پلتفرمی که به ازای هر اجرا صورت‌حساب می‌کند و کار بی‌کار را می‌کشد، یک اتصال قطع‌شده یعنی یک پرداخت ناموفق بدون هیچ تلاش دوم خودکار. backoff را خودتان بسازید و داخل بودجه درخواست نگه دارید.
worker.ts ts
// Cloudflare Workers / Vercel Edge — module scope, no process.env.
import { UnoPay, ZarinpalAdapter, PaymentError } from 'unopay';

interface Env {
  ZARINPAL_MERCHANT_ID: string;
}

const client = new UnoPay({
  zarinpal: new ZarinpalAdapter({
    merchantId: '',
    sandbox: true, // set per environment
  }),
});

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    // Adapters read merchantId in the constructor, so build the client per env.
    const unopay = new UnoPay({
      zarinpal: new ZarinpalAdapter({
        merchantId: env.ZARINPAL_MERCHANT_ID,
        sandbox: true,
      }),
    });

    if (new URL(request.url).pathname === '/pay') {
      try {
        const payment = await unopay.createPayment('zarinpal', {
          amount: 1000,
          currency: 'IRT',
          callbackUrl: new URL('/callback', request.url).toString(),
        });
        return Response.redirect(payment.redirectUrl, 302);
      } catch (err) {
        if (err instanceof PaymentError) {
          return Response.json({ code: err.code }, { status: 502 });
        }
        throw err;
      }
    }

    return new Response('not found', { status: 404 });
  },
};
در لبه process.env وجود ندارد

Workers و Vercel Edge شیء process ندارند. شناسه پذیرنده را از binding پلتفرم در هندلر درخواست بخوانید و کلاینت را همان‌جا بسازید، مثل بالا — دامنه ماژول قبل از پر شدن هر binding اجرا می‌شود.

چه وقت پرداخت را خارج از لبه نگه دارید

اجرا روی لبه برای هندلر کال‌بک عالی است، چون درخواستی کوتاه روی یک درگاه است. برای هر چیزی که تراکنش پایگاه داده را در طول فراخوانی وریفای باز نگه می‌دارد بد مناسب نیست، چون نمی‌توانید به گرم ماندن اجرا تکیه کنید. تحویل سفارش را روی رانتایم بلندمدت نگه دارید و بگذارید لبه فقط رفت‌وبرگشت درگاه را انجام دهد.