Edge ortamları
better-payment'i Vercel Edge, Cloudflare Workers, Deno ve Bun'da çalıştırın.
better-payment'in hiç runtime bağımlılığı yoktur ve yalnızca web standardı API'leri kullanır: fetch, WebCrypto (crypto.subtle), TextEncoder ve atob/btoa. Aynı paket şu ortamlarda çalışır:
- Node.js 20+
- Vercel Edge Functions ve
runtime = 'edge'kullanan Next.js route'ları - Cloudflare Workers
- Deno ve Deno Deploy
- Bun
Her sürüm Vercel Edge Runtime VM'inde test edilir. Bu VM'de Buffer, process ya da require yoktur. Test, dört sağlayıcının hepsi için orada istekleri imzalar ve callback'leri doğrular; sonuçları Node.js'te hesaplanan değerlerle karşılaştırır.
Next.js (edge)
Next.js route handler'ı değişmeden çalışır. Yalnızca runtime'ı değiştirin:
// app/api/pay/[...path]/route.ts
export const runtime = 'edge'; // or 'nodejs'Cloudflare Workers
import { betterPayment, iyzico, toFetchHandler } from 'better-payment';
interface Env {
IYZICO_API_KEY: string;
IYZICO_SECRET_KEY: string;
}
export default {
fetch(request: Request, env: Env): Promise<Response> {
const payment = betterPayment({
mode: 'sandbox',
providers: {
iyzico: iyzico({ apiKey: env.IYZICO_API_KEY, secretKey: env.IYZICO_SECRET_KEY }),
},
});
return toFetchHandler(payment)(request);
},
};Deno ve Bun
import { betterPayment, toFetchHandler } from 'npm:better-payment';
const payment = betterPayment({ /* ... */ });
Deno.serve(toFetchHandler(payment)); // Deno
// Bun.serve({ fetch: toFetchHandler(payment) }); // BuntoFetchHandler, handler'ı bir (request: Request) => Promise<Response> fonksiyonuna çevirir. Hono için ayrı bir adapter var.
Edge ve serverless ortamlarda idempotency
Varsayılan idempotency deposu, tekrar eden callback ve Idempotency-Key kayıtlarını bellekte tutar. Edge ve serverless platformlarda her isolate'in ya da örneğin kendi belleği vardır; bu yüzden yalnızca aynı isolate'e gelen istekleri tekilleştirir. Canlı ortamda paylaşımlı bir depo verin:
- Upstash Redis (HTTP tabanlı, her edge ortamında çalışır):
setIfAbsentiçinSET key value EX ttl NX. - Cloudflare: Durable Objects ya da D1 (
INSERT ... ON CONFLICT DO NOTHING). Workers KV nihai tutarlıdır (eventually consistent) ve atomiksetIfAbsent'i sağlayamaz.
Özel fetch
Sağlayıcı API çağrıları globalThis.fetch kullanır. Kendi uygulamanızı verin; örneğin istekleri bir proxy üzerinden geçirmek ya da testlerde taklit etmek için:
betterPayment({
fetch: (input, init) => fetch(input, { ...init, keepalive: true }),
providers: { /* ... */ },
});