- خانه
- رانتایمهای لبه
راهنماها
اجرا در رانتایمهای لبه
پکیج هیچ وابستگی زمان اجرا ندارد و جز ماژولهای خودش چیزی import نمیکند. تمام دلیل اجرا شدنش روی لبه همین است — و بهتنهایی کافی نیست.
پکیج واقعاً چه چیزی لازم دارد
| نیاز دارد | استفاده میکند از | یادداشت |
|---|---|---|
| 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 واقعاً آنجا اجرا شود یا نه.
- فرمت ماژول.
package.jsonمقدار"type": "module"را اعلام میکند و هر دو شرطimportوrequireرا بهdist/index.jsوdist/index.cjsوصل میکند. Workers و Vercel Edge مستقیم مسیر ESM را میگیرند. - سقف زمانی شماست. SDK ده ثانیه برای درگاه منتظر میماند و نمیتوانید به آن بگویید چه کند. رانتایمی با بودجه درخواست کوتاهتر شما را پیش از فعال شدن زمانبندی خود SDK قطع میکند و خطای پلتفرم میبینید نه
GatewayNetworkError. - هیچ تلاش مجددی. روی پلتفرمی که به ازای هر اجرا صورتحساب میکند و کار بیکار را میکشد، یک اتصال قطعشده یعنی یک پرداخت ناموفق بدون هیچ تلاش دوم خودکار. backoff را خودتان بسازید و داخل بودجه درخواست نگه دارید.
// 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 });
},
};
Workers و Vercel Edge شیء process ندارند. شناسه پذیرنده را از binding پلتفرم در هندلر درخواست بخوانید و کلاینت را همانجا بسازید، مثل بالا — دامنه ماژول قبل از پر شدن هر binding اجرا میشود.
چه وقت پرداخت را خارج از لبه نگه دارید
اجرا روی لبه برای هندلر کالبک عالی است، چون درخواستی کوتاه روی یک درگاه است. برای هر چیزی که تراکنش پایگاه داده را در طول فراخوانی وریفای باز نگه میدارد بد مناسب نیست، چون نمیتوانید به گرم ماندن اجرا تکیه کنید. تحویل سفارش را روی رانتایم بلندمدت نگه دارید و بگذارید لبه فقط رفتوبرگشت درگاه را انجام دهد.