@madapay/alefa 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts","../src/status.ts","../src/fixtures.ts","../src/index.ts"],"names":["ProviderTimeoutError","ProviderUnavailableError","AuthenticationError","PaymentNotFoundError","DuplicatePaymentError","ValidationError","createHmac","PROVIDER","validateCurrency","validateAmount","toNationalFormat","executeWithRetry","WebhookVerificationError","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n AuthenticationError,\n DuplicatePaymentError,\n PaymentNotFoundError,\n ProviderTimeoutError,\n ProviderUnavailableError,\n ValidationError,\n} from '@madapay/core';\nimport type { AlefaFetch } from './types.js';\n\nexport interface AlefaRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n timeoutMs: number;\n signal?: AbortSignal;\n fetchImpl: AlefaFetch;\n /** True for payment creation: failures after dispatch represent an uncertain outcome. */\n uncertainOnFailure?: boolean;\n}\n\nconst PROVIDER = 'alefa';\n\nfunction safeProviderError(payload: unknown): Record<string, unknown> {\n if (typeof payload !== 'object' || payload === null) return {};\n const p = payload as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of ['code', 'error', 'message', 'detail']) {\n if (typeof p[k] === 'string') out[`provider_${k}`] = (p[k] as string).slice(0, 200);\n }\n return out;\n}\n\nexport async function alefaRequest(opts: AlefaRequestOptions): Promise<unknown> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), opts.timeoutMs);\n const onAbort = () => controller.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n let response: Response;\n try {\n response = await opts.fetchImpl(opts.url, {\n method: opts.method,\n headers: opts.headers,\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch {\n if (opts.signal?.aborted) throw new Error('Operation aborted by caller');\n const timedOut = controller.signal.aborted;\n if (opts.uncertainOnFailure || timedOut) {\n throw new ProviderTimeoutError(\n timedOut\n ? `Alefa request timed out after ${opts.timeoutMs}ms`\n : 'Alefa request failed after dispatch; outcome is uncertain (network error)',\n { timeoutMs: opts.timeoutMs },\n PROVIDER,\n );\n }\n throw new ProviderUnavailableError('Alefa is unreachable', undefined, PROVIDER);\n } finally {\n clearTimeout(timer);\n opts.signal?.removeEventListener('abort', onAbort);\n }\n\n const text = await response.text().catch(() => '');\n let payload: unknown;\n try {\n payload = text ? JSON.parse(text) : undefined;\n } catch {\n payload = undefined;\n }\n\n if (response.ok) {\n if (payload === undefined) {\n throw opts.uncertainOnFailure\n ? new ProviderTimeoutError(\n 'Alefa returned an unreadable success response; outcome is uncertain',\n { status: response.status },\n PROVIDER,\n )\n : new ProviderUnavailableError(\n 'Alefa returned an unreadable response',\n undefined,\n PROVIDER,\n );\n }\n return payload;\n }\n\n const details = { status: response.status, ...safeProviderError(payload) };\n const s = response.status;\n if (s === 401 || s === 403) {\n throw new AuthenticationError('Alefa rejected credentials', details, PROVIDER);\n }\n if (s === 404) {\n throw new PaymentNotFoundError('Alefa payment or resource not found', details, PROVIDER);\n }\n if (s === 409) {\n throw new DuplicatePaymentError(\n 'Alefa idempotency conflict: request reference already processed or conflicting payload',\n details,\n PROVIDER,\n );\n }\n if (s === 400 || s === 422) {\n const errorMsg =\n (typeof (payload as Record<string, unknown> | undefined)?.message === 'string'\n ? ((payload as Record<string, unknown>).message as string)\n : undefined) || 'Alefa rejected request validation';\n throw new ValidationError(errorMsg, 'VALIDATION_FAILED', details, PROVIDER);\n }\n if (s >= 500) {\n throw new ProviderUnavailableError(`Alefa service unavailable (HTTP ${s})`, details, PROVIDER);\n }\n\n throw new ProviderUnavailableError(\n `Alefa returned unexpected status HTTP ${s}`,\n details,\n PROVIDER,\n );\n}\n","import type { PaymentStatus } from '@madapay/core';\n\nexport interface AlefaStatusMapping {\n status: PaymentStatus;\n known: boolean;\n}\n\n/**\n * Normalizes Alefa provider status codes to canonical MadaPay PaymentStatus (D-06, ALEFA-03).\n *\n * Known Alefa statuses:\n * - CREATED / INIT -> 'created'\n * - PENDING / AWAITING_ACTION / ACTION_REQUIRED / PENDING_ACTION -> 'pending'\n * - PROCESSING / IN_PROGRESS -> 'processing'\n * - SUCCEEDED / SUCCESS / COMPLETED / PAID -> 'succeeded'\n * - FAILED / DECLINED / REJECTED / ERROR -> 'failed'\n * - EXPIRED / TIMEOUT / TIMED_OUT -> 'expired'\n * - CANCELLED / CANCELED -> 'cancelled'\n *\n * Any unknown status maps to non-terminal 'processing' per Decision D-06.\n */\nexport function mapAlefaStatus(rawStatus?: unknown): AlefaStatusMapping {\n if (typeof rawStatus !== 'string' || rawStatus.trim() === '') {\n return { status: 'processing', known: false };\n }\n\n const s = rawStatus.trim().toUpperCase();\n\n switch (s) {\n case 'CREATED':\n case 'INIT':\n case 'INITIAL':\n return { status: 'created', known: true };\n\n case 'PENDING':\n case 'WAITING':\n case 'AWAITING_ACTION':\n case 'ACTION_REQUIRED':\n case 'PENDING_ACTION':\n case 'PENDING_CUSTOMER_ACTION':\n return { status: 'pending', known: true };\n\n case 'PROCESSING':\n case 'IN_PROGRESS':\n case 'IN_FLIGHT':\n return { status: 'processing', known: true };\n\n case 'SUCCEEDED':\n case 'SUCCESS':\n case 'COMPLETED':\n case 'PAID':\n return { status: 'succeeded', known: true };\n\n case 'FAILED':\n case 'DECLINED':\n case 'REJECTED':\n case 'ERROR':\n return { status: 'failed', known: true };\n\n case 'EXPIRED':\n case 'TIMEOUT':\n case 'TIMED_OUT':\n return { status: 'expired', known: true };\n\n case 'CANCELLED':\n case 'CANCELED':\n return { status: 'cancelled', known: true };\n\n default:\n return { status: 'processing', known: false };\n }\n}\n","import { createHmac } from 'node:crypto';\nimport type { PaymentCustomerAction } from '@madapay/core';\nimport type { AlefaPaymentResponse, AlefaWebhookPayload } from './types.js';\n\n/**\n * Verified Alefa aggregator contract metadata (GOV-07, ALEFA-01 through ALEFA-04).\n * Source: https://alefa.mg/docs (Verified 2026-10-31)\n * Operating company: Alefa SAS (Antananarivo, Madagascar).\n */\nexport const ALEFA_CONTRACT_METADATA = {\n contractVersion: 'Alefa Payment Gateway API v1.0.0',\n reviewDate: '2026-10-31',\n source: 'https://alefa.mg/docs',\n operatingEntity: 'Alefa SAS (Antananarivo, Madagascar)',\n indicativeCommissionPercent: 2.5,\n settlementFeeAriary: 0,\n} as const;\n\nexport const alefaSandboxNumbers = {\n mvola: '+261340000001',\n mvola_qr: '+261340000002',\n mvola_expired: '+261340000003',\n mvola_failed: '+261340000004',\n\n orange_money: '+261320000001',\n orange_money_ussd: '+261320000002',\n orange_money_expired: '+261320000003',\n orange_money_failed: '+261320000004',\n\n airtel_money: '+261330000001',\n airtel_money_redirect: '+261330000002',\n airtel_money_expired: '+261330000003',\n airtel_money_failed: '+261330000004',\n};\n\nexport const alefaQrActionFixture: PaymentCustomerAction = {\n type: 'qr_code',\n qrData: 'alefa://pay/tx_alefa_qr_12345?amount=10000&cur=MGA&ref=ORDER-QR-001',\n qrImageUrl: 'https://api.sandbox.alefa.mg/qr/tx_alefa_qr_12345.png',\n expiresAt: '2026-10-31T20:00:00.000Z',\n};\n\nexport const alefaUssdActionFixture: PaymentCustomerAction = {\n type: 'ussd',\n ussdCode: '#144*31*654321#',\n instructions:\n 'Composez #144*31*654321# depuis votre mobile Orange Money et validez avec votre code secret.',\n expiresAt: '2026-10-31T19:30:00.000Z',\n};\n\nexport const alefaRedirectActionFixture: PaymentCustomerAction = {\n type: 'redirect_url',\n url: 'https://pay.sandbox.alefa.mg/checkout/tx_alefa_red_12345',\n returnUrl: 'https://merchant.mg/checkout/complete',\n};\n\nexport function createMockAlefaPaymentResponse(\n overrides: Partial<AlefaPaymentResponse> = {},\n): AlefaPaymentResponse {\n return {\n transactionId: overrides.transactionId ?? `alefa_tx_${Date.now()}`,\n reference: overrides.reference ?? `ORDER_${Date.now()}`,\n status: overrides.status ?? 'PENDING',\n amount: overrides.amount ?? 10000,\n currency: 'MGA',\n operator: overrides.operator ?? 'mvola',\n customerPhone: overrides.customerPhone ?? '0340000001',\n checkoutUrl: overrides.checkoutUrl ?? 'https://pay.sandbox.alefa.mg/checkout/mock',\n action: overrides.action ?? alefaQrActionFixture,\n expiresAt: overrides.expiresAt ?? new Date(Date.now() + 30 * 60 * 1000).toISOString(),\n createdAt: overrides.createdAt ?? new Date().toISOString(),\n updatedAt: overrides.updatedAt ?? new Date().toISOString(),\n };\n}\n\nexport function createMockAlefaWebhook(\n payload: Partial<AlefaWebhookPayload>,\n secret: string,\n): { rawBody: Uint8Array; headers: Record<string, string>; payload: AlefaWebhookPayload } {\n const fullPayload: AlefaWebhookPayload = {\n eventId: payload.eventId ?? `evt_alefa_${Date.now()}`,\n eventType: payload.eventType ?? 'payment.succeeded',\n transactionId: payload.transactionId ?? `alefa_tx_${Date.now()}`,\n reference: payload.reference ?? `ORDER_${Date.now()}`,\n status: payload.status ?? 'SUCCEEDED',\n amount: payload.amount ?? 10000,\n currency: 'MGA',\n operator: payload.operator ?? 'mvola',\n timestamp: payload.timestamp ?? new Date().toISOString(),\n };\n\n const bodyString = JSON.stringify(fullPayload);\n const rawBody = new TextEncoder().encode(bodyString);\n const signature = createHmac('sha256', secret).update(rawBody).digest('hex');\n\n return {\n rawBody,\n headers: {\n 'content-type': 'application/json',\n 'x-alefa-signature': signature,\n 'x-alefa-timestamp': fullPayload.timestamp,\n },\n payload: fullPayload,\n };\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport {\n AuthenticationError,\n ValidationError,\n WebhookVerificationError,\n executeWithRetry,\n toNationalFormat,\n validateAmount,\n validateCurrency,\n} from '@madapay/core';\nimport type {\n PaymentCustomerAction,\n PaymentLookup,\n PaymentMethod,\n PaymentProvider,\n ProviderCreatePaymentRequest,\n ProviderPayment,\n ProviderWebhookEvent,\n ProviderWebhookRequest,\n} from '@madapay/core';\nimport { alefaRequest } from './http.js';\nimport { mapAlefaStatus } from './status.js';\nimport type {\n AlefaActionMode,\n AlefaCapabilities,\n AlefaConfig,\n AlefaEnvironment,\n AlefaFetch,\n} from './types.js';\n\nexport * from './types.js';\nexport * from './fixtures.js';\nexport { mapAlefaStatus } from './status.js';\nexport { alefaRequest } from './http.js';\n\nexport const ALEFA_BASE_URLS: Record<AlefaEnvironment, string> = {\n sandbox: 'https://api.sandbox.alefa.mg',\n production: 'https://api.alefa.mg',\n};\n\nconst PROVIDER = 'alefa';\nconst SUPPORTED_METHODS: PaymentMethod[] = ['mvola', 'orange_money', 'airtel_money'];\nconst MIN_AMOUNT_MGA = 100;\nconst MAX_AMOUNT_MGA = 5_000_000;\n\nfunction validateConfig(config: AlefaConfig): string {\n if (!config || typeof config.apiKey !== 'string' || config.apiKey.trim() === '') {\n throw new AuthenticationError('Alefa apiKey is required', undefined, PROVIDER);\n }\n if (config.environment !== 'sandbox' && config.environment !== 'production') {\n throw new ValidationError(\n \"Alefa environment must be explicitly 'sandbox' or 'production'\",\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n const baseUrl = (config.baseUrl ?? ALEFA_BASE_URLS[config.environment]).replace(/\\/+$/, '');\n if (!baseUrl.startsWith('https://')) {\n throw new ValidationError(\n 'Alefa baseUrl must use https',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n const looksSandbox = /sandbox|test|dev/i.test(new URL(baseUrl).hostname);\n if (config.environment === 'production' && looksSandbox) {\n throw new ValidationError(\n 'Alefa production environment configured with a sandbox base URL',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n if (config.environment === 'sandbox' && !looksSandbox) {\n throw new ValidationError(\n 'Alefa sandbox environment configured with a non-sandbox base URL',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n return baseUrl;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ValidationError(\n 'Unexpected Alefa response format',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n return value as Record<string, unknown>;\n}\n\nfunction parseCustomerAction(rawAction: unknown): PaymentCustomerAction | undefined {\n if (typeof rawAction !== 'object' || rawAction === null) return undefined;\n const a = rawAction as Record<string, unknown>;\n\n if (a.type === 'qr_code' && typeof a.qrData === 'string') {\n return {\n type: 'qr_code',\n qrData: a.qrData,\n qrImageUrl: typeof a.qrImageUrl === 'string' ? a.qrImageUrl : undefined,\n expiresAt: typeof a.expiresAt === 'string' ? a.expiresAt : undefined,\n };\n }\n\n if (a.type === 'ussd' && typeof a.ussdCode === 'string') {\n return {\n type: 'ussd',\n ussdCode: a.ussdCode,\n instructions: typeof a.instructions === 'string' ? a.instructions : undefined,\n expiresAt: typeof a.expiresAt === 'string' ? a.expiresAt : undefined,\n };\n }\n\n if (a.type === 'redirect_url' && typeof a.url === 'string') {\n return {\n type: 'redirect_url',\n url: a.url,\n returnUrl: typeof a.returnUrl === 'string' ? a.returnUrl : undefined,\n };\n }\n\n return undefined;\n}\n\nexport class AlefaPaymentProvider implements PaymentProvider {\n public readonly id = PROVIDER;\n public readonly name = 'Alefa';\n private readonly apiKey: string;\n private readonly webhookSecret?: string;\n private readonly baseUrl: string;\n private readonly environment: AlefaEnvironment;\n private readonly callbackUrl?: string;\n private readonly defaultValidityMinutes: number;\n private readonly timeoutMs: number;\n private readonly maxCreationRetries: number;\n private readonly retryInitialDelayMs: number;\n private readonly fetchImpl: AlefaFetch;\n private readonly onUnknownStatus?: (raw: string, reference: string) => void;\n\n constructor(config: AlefaConfig) {\n this.baseUrl = validateConfig(config);\n this.apiKey = config.apiKey;\n this.environment = config.environment;\n this.webhookSecret = config.webhookSecret;\n this.callbackUrl = config.callbackUrl;\n this.defaultValidityMinutes = config.defaultValidityMinutes ?? 30;\n this.timeoutMs = config.timeoutMs ?? 15_000;\n this.maxCreationRetries = config.maxCreationRetries ?? 2;\n this.retryInitialDelayMs = config.retryInitialDelayMs ?? 200;\n this.fetchImpl = config.fetch ?? ((url, init) => fetch(url, init));\n this.onUnknownStatus = config.onUnknownStatus;\n }\n\n /** Never exposes credentials or secrets. */\n public toJSON(): Record<string, unknown> {\n return { id: this.id, environment: this.environment, baseUrl: this.baseUrl };\n }\n\n /**\n * Capability truth table (D-07, ALEFA-01 through ALEFA-04).\n * QR/USSD customer actions and hosted checkout are enabled.\n * Direct refunds, payouts, payment links, and fee quotes remain unsupported.\n */\n public getCapabilities(): AlefaCapabilities {\n return {\n payment: true,\n asynchronousConfirmation: true,\n synchronousConfirmation: false,\n webhooks: true,\n polling: true,\n refunds: false,\n payouts: false,\n paymentLinks: false,\n hostedCheckout: true,\n feeQuote: false,\n cancellation: false,\n customerActions: true,\n supportedMethods: [...SUPPORTED_METHODS],\n syncConfirmation: false,\n asyncConfirmation: true,\n webhookEvents: true,\n feeCalculation: false,\n };\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...extra,\n };\n }\n\n public async createPayment(request: ProviderCreatePaymentRequest): Promise<ProviderPayment> {\n // 1. Validate payment rail\n if (!SUPPORTED_METHODS.includes(request.paymentMethod)) {\n throw new ValidationError(\n `Alefa does not support payment method '${request.paymentMethod}'. Supported: ${SUPPORTED_METHODS.join(', ')}`,\n 'VALIDATION_FAILED',\n { method: request.paymentMethod },\n PROVIDER,\n );\n }\n\n // 2. Validate currency and amount bounds\n validateCurrency(request.currency);\n validateAmount(request.amount, {\n min: MIN_AMOUNT_MGA,\n max: MAX_AMOUNT_MGA,\n providerName: PROVIDER,\n });\n\n if (!request.idempotencyKey) {\n throw new ValidationError(\n 'Alefa payment creation requires an idempotency key',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n\n const customerPhone = toNationalFormat(request.customer.phone);\n\n // Extract optional typed action preference or validity from providerData\n const preferredAction = (request.providerData?.preferredAction as AlefaActionMode) || 'auto';\n const validityMinutes =\n typeof request.providerData?.validityMinutes === 'number'\n ? request.providerData.validityMinutes\n : this.defaultValidityMinutes;\n\n const body: Record<string, unknown> = {\n amount: request.amount,\n currency: request.currency,\n operator: request.paymentMethod,\n customer: { phone: customerPhone },\n reference: request.reference,\n preferredAction,\n validityMinutes,\n };\n\n if (this.callbackUrl) body.callbackUrl = this.callbackUrl;\n if (request.description) body.description = request.description;\n if (request.returnUrls) body.returnUrls = request.returnUrls;\n if (request.metadata) body.metadata = request.metadata;\n\n // Retry payment initiation with identical Idempotency-Key\n const raw = await executeWithRetry(\n () =>\n alefaRequest({\n method: 'POST',\n url: `${this.baseUrl}/api/v1/payments`,\n headers: this.headers({ 'Idempotency-Key': request.idempotencyKey }),\n body,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n uncertainOnFailure: true,\n }),\n { maxRetries: this.maxCreationRetries, initialDelayMs: this.retryInitialDelayMs },\n );\n\n const p = asRecord(raw);\n const providerReference = String(p.transactionId || p.paymentReference || p.id || '');\n if (!providerReference) {\n throw new ValidationError(\n 'Alefa response missing transactionId',\n 'VALIDATION_FAILED',\n undefined,\n PROVIDER,\n );\n }\n\n const { status, known } = mapAlefaStatus(p.status);\n if (!known) {\n this.onUnknownStatus?.(String(p.status), request.reference);\n }\n\n const action = parseCustomerAction(p.action);\n\n return {\n providerReference,\n reference: typeof p.reference === 'string' ? p.reference : request.reference,\n amount: typeof p.amount === 'number' ? p.amount : request.amount,\n currency: 'MGA',\n status,\n paymentMethod: request.paymentMethod,\n rawProviderStatus: typeof p.status === 'string' ? p.status : undefined,\n checkoutUrl: typeof p.checkoutUrl === 'string' ? p.checkoutUrl : undefined,\n action,\n expiresAt: typeof p.expiresAt === 'string' ? p.expiresAt : undefined,\n };\n }\n\n public async getPayment(\n providerReferenceOrLookup: string | PaymentLookup,\n ): Promise<ProviderPayment> {\n let identifier: string;\n let isMerchantRef = false;\n\n if (typeof providerReferenceOrLookup === 'string') {\n identifier = providerReferenceOrLookup.trim();\n } else {\n if (providerReferenceOrLookup.providerReference) {\n identifier = providerReferenceOrLookup.providerReference.trim();\n } else if (providerReferenceOrLookup.reference) {\n identifier = providerReferenceOrLookup.reference.trim();\n isMerchantRef = true;\n } else if (providerReferenceOrLookup.id) {\n identifier = providerReferenceOrLookup.id.trim();\n } else {\n throw new ValidationError(\n 'Invalid payment lookup selector',\n 'INVALID_SELECTOR',\n undefined,\n PROVIDER,\n );\n }\n }\n\n if (!identifier) {\n throw new ValidationError(\n 'Empty payment identifier provided',\n 'INVALID_SELECTOR',\n undefined,\n PROVIDER,\n );\n }\n\n const url = isMerchantRef\n ? `${this.baseUrl}/api/v1/payments?reference=${encodeURIComponent(identifier)}`\n : `${this.baseUrl}/api/v1/payments/${encodeURIComponent(identifier)}`;\n\n const raw = await alefaRequest({\n method: 'GET',\n url,\n headers: this.headers(),\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n uncertainOnFailure: false,\n });\n\n const p = asRecord(raw);\n const providerReference = String(p.transactionId || p.paymentReference || p.id || identifier);\n const { status, known } = mapAlefaStatus(p.status);\n if (!known) {\n this.onUnknownStatus?.(String(p.status), providerReference);\n }\n\n const action = parseCustomerAction(p.action);\n\n const operatorMethod =\n typeof p.operator === 'string' && SUPPORTED_METHODS.includes(p.operator as PaymentMethod)\n ? (p.operator as PaymentMethod)\n : 'mvola';\n\n return {\n providerReference,\n reference: typeof p.reference === 'string' ? p.reference : providerReference,\n amount: typeof p.amount === 'number' ? p.amount : 0,\n currency: 'MGA',\n status,\n paymentMethod: operatorMethod,\n rawProviderStatus: typeof p.status === 'string' ? p.status : undefined,\n checkoutUrl: typeof p.checkoutUrl === 'string' ? p.checkoutUrl : undefined,\n action,\n expiresAt: typeof p.expiresAt === 'string' ? p.expiresAt : undefined,\n };\n }\n\n public async verifyWebhook(request: ProviderWebhookRequest): Promise<ProviderWebhookEvent> {\n if (!request || !(request.rawBody instanceof Uint8Array)) {\n throw new WebhookVerificationError(\n 'Webhook verification requires unmodified rawBody as a Uint8Array (D-04)',\n undefined,\n PROVIDER,\n );\n }\n\n if (!this.webhookSecret) {\n throw new WebhookVerificationError(\n 'Alefa webhook verification requires a configured webhookSecret',\n undefined,\n PROVIDER,\n );\n }\n\n // Extract signature from headers (case-insensitive)\n const headerSig =\n request.headers['x-alefa-signature'] ||\n request.headers['X-Alefa-Signature'] ||\n request.headers['x-signature'];\n\n if (!headerSig || typeof headerSig !== 'string') {\n throw new WebhookVerificationError(\n 'Missing required X-Alefa-Signature header on webhook request',\n undefined,\n PROVIDER,\n );\n }\n\n // Optional timestamp check for replay attack prevention\n const timestampHeader =\n request.headers['x-alefa-timestamp'] || request.headers['X-Alefa-Timestamp'];\n\n if (typeof timestampHeader === 'string') {\n const webhookTime = new Date(timestampHeader).getTime();\n const now = Date.now();\n const maxDriftMs = 300_000; // 5 minutes tolerance\n if (Number.isNaN(webhookTime) || Math.abs(now - webhookTime) > maxDriftMs) {\n throw new WebhookVerificationError(\n `Alefa webhook timestamp drift exceeds ${maxDriftMs / 1000}s tolerance`,\n undefined,\n PROVIDER,\n );\n }\n }\n\n // Verify HMAC-SHA256 signature\n const computedSig = createHmac('sha256', this.webhookSecret)\n .update(request.rawBody)\n .digest('hex');\n\n const expectedBuf = Buffer.from(computedSig, 'hex');\n const actualBuf = Buffer.from(headerSig.trim(), 'hex');\n\n if (expectedBuf.length !== actualBuf.length || !timingSafeEqual(expectedBuf, actualBuf)) {\n throw new WebhookVerificationError(\n 'Alefa webhook signature verification failed: invalid HMAC digest',\n undefined,\n PROVIDER,\n );\n }\n\n // Parse verified JSON body\n let payload: Record<string, unknown>;\n try {\n const text = new TextDecoder().decode(request.rawBody);\n payload = asRecord(JSON.parse(text));\n } catch {\n throw new WebhookVerificationError(\n 'Alefa webhook body is not valid JSON after signature validation',\n undefined,\n PROVIDER,\n );\n }\n\n const transactionId = String(\n payload.transactionId || payload.paymentReference || payload.id || '',\n );\n if (!transactionId) {\n throw new WebhookVerificationError(\n 'Alefa webhook payload missing transactionId or payment reference',\n undefined,\n PROVIDER,\n );\n }\n\n const { status, known } = mapAlefaStatus(payload.status);\n if (!known) {\n this.onUnknownStatus?.(String(payload.status), transactionId);\n }\n\n const eventId = String(payload.eventId || payload.id || `evt_${Date.now()}`);\n const occurredAt =\n typeof payload.timestamp === 'string' ? payload.timestamp : new Date().toISOString();\n\n return {\n providerEventId: eventId,\n providerReference: transactionId,\n reference: typeof payload.reference === 'string' ? payload.reference : undefined,\n status,\n occurredAt,\n rawProviderStatus: typeof payload.status === 'string' ? payload.status : undefined,\n };\n }\n}\n\nexport { AlefaPaymentProvider as AlefaProvider };\n"]}
@@ -0,0 +1,159 @@
1
+ import { ProviderCapabilities, PaymentMethod, PaymentCustomerAction, PaymentStatus, PaymentProvider, ProviderCreatePaymentRequest, ProviderPayment, PaymentLookup, ProviderWebhookRequest, ProviderWebhookEvent } from '@madapay/core';
2
+
3
+ type AlefaEnvironment = 'sandbox' | 'production';
4
+ type AlefaFetch = (url: string, init?: RequestInit) => Promise<Response>;
5
+ type AlefaActionMode = 'qr_code' | 'ussd' | 'redirect_url' | 'auto';
6
+ interface AlefaConfig {
7
+ /** Server-side API key / Bearer token. Never expose to client applications. */
8
+ apiKey: string;
9
+ /** Selects the API base URL and guards against environment mixups. */
10
+ environment: AlefaEnvironment;
11
+ /** Secret used to verify HMAC-SHA256 signature in `x-alefa-signature`. */
12
+ webhookSecret?: string;
13
+ /** Override base URL for custom gateways or sandbox proxies. */
14
+ baseUrl?: string;
15
+ /** Default callback URL registered for asynchronous payment notifications. */
16
+ callbackUrl?: string;
17
+ /** Default expiration window in minutes for created payments. Defaults to 30. */
18
+ defaultValidityMinutes?: number;
19
+ /** HTTP request timeout in milliseconds. Defaults to 15,000ms. */
20
+ timeoutMs?: number;
21
+ /** Maximum retry attempts on network failures during creation. Defaults to 2. */
22
+ maxCreationRetries?: number;
23
+ /** Initial delay for exponential backoff on retries. Defaults to 200ms. */
24
+ retryInitialDelayMs?: number;
25
+ /** Custom fetch implementation for mocking or edge environments. */
26
+ fetch?: AlefaFetch;
27
+ /** Diagnostic hook invoked when an unmapped or unrecognized status is received. */
28
+ onUnknownStatus?: (raw: string, reference: string) => void;
29
+ }
30
+ interface AlefaPaymentResponse {
31
+ transactionId: string;
32
+ reference: string;
33
+ status: string;
34
+ amount: number;
35
+ currency: string;
36
+ operator: PaymentMethod;
37
+ customerPhone?: string;
38
+ checkoutUrl?: string;
39
+ action?: PaymentCustomerAction;
40
+ expiresAt?: string;
41
+ createdAt?: string;
42
+ updatedAt?: string;
43
+ }
44
+ interface AlefaWebhookPayload {
45
+ eventId: string;
46
+ eventType: string;
47
+ transactionId: string;
48
+ reference?: string;
49
+ status: string;
50
+ amount: number;
51
+ currency: string;
52
+ operator: PaymentMethod;
53
+ timestamp: string;
54
+ }
55
+ type AlefaCapabilities = ProviderCapabilities & {
56
+ customerActions: boolean;
57
+ };
58
+
59
+ /**
60
+ * Verified Alefa aggregator contract metadata (GOV-07, ALEFA-01 through ALEFA-04).
61
+ * Source: https://alefa.mg/docs (Verified 2026-10-31)
62
+ * Operating company: Alefa SAS (Antananarivo, Madagascar).
63
+ */
64
+ declare const ALEFA_CONTRACT_METADATA: {
65
+ readonly contractVersion: "Alefa Payment Gateway API v1.0.0";
66
+ readonly reviewDate: "2026-10-31";
67
+ readonly source: "https://alefa.mg/docs";
68
+ readonly operatingEntity: "Alefa SAS (Antananarivo, Madagascar)";
69
+ readonly indicativeCommissionPercent: 2.5;
70
+ readonly settlementFeeAriary: 0;
71
+ };
72
+ declare const alefaSandboxNumbers: {
73
+ mvola: string;
74
+ mvola_qr: string;
75
+ mvola_expired: string;
76
+ mvola_failed: string;
77
+ orange_money: string;
78
+ orange_money_ussd: string;
79
+ orange_money_expired: string;
80
+ orange_money_failed: string;
81
+ airtel_money: string;
82
+ airtel_money_redirect: string;
83
+ airtel_money_expired: string;
84
+ airtel_money_failed: string;
85
+ };
86
+ declare const alefaQrActionFixture: PaymentCustomerAction;
87
+ declare const alefaUssdActionFixture: PaymentCustomerAction;
88
+ declare const alefaRedirectActionFixture: PaymentCustomerAction;
89
+ declare function createMockAlefaPaymentResponse(overrides?: Partial<AlefaPaymentResponse>): AlefaPaymentResponse;
90
+ declare function createMockAlefaWebhook(payload: Partial<AlefaWebhookPayload>, secret: string): {
91
+ rawBody: Uint8Array;
92
+ headers: Record<string, string>;
93
+ payload: AlefaWebhookPayload;
94
+ };
95
+
96
+ interface AlefaStatusMapping {
97
+ status: PaymentStatus;
98
+ known: boolean;
99
+ }
100
+ /**
101
+ * Normalizes Alefa provider status codes to canonical MadaPay PaymentStatus (D-06, ALEFA-03).
102
+ *
103
+ * Known Alefa statuses:
104
+ * - CREATED / INIT -> 'created'
105
+ * - PENDING / AWAITING_ACTION / ACTION_REQUIRED / PENDING_ACTION -> 'pending'
106
+ * - PROCESSING / IN_PROGRESS -> 'processing'
107
+ * - SUCCEEDED / SUCCESS / COMPLETED / PAID -> 'succeeded'
108
+ * - FAILED / DECLINED / REJECTED / ERROR -> 'failed'
109
+ * - EXPIRED / TIMEOUT / TIMED_OUT -> 'expired'
110
+ * - CANCELLED / CANCELED -> 'cancelled'
111
+ *
112
+ * Any unknown status maps to non-terminal 'processing' per Decision D-06.
113
+ */
114
+ declare function mapAlefaStatus(rawStatus?: unknown): AlefaStatusMapping;
115
+
116
+ interface AlefaRequestOptions {
117
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
118
+ url: string;
119
+ headers: Record<string, string>;
120
+ body?: unknown;
121
+ timeoutMs: number;
122
+ signal?: AbortSignal;
123
+ fetchImpl: AlefaFetch;
124
+ /** True for payment creation: failures after dispatch represent an uncertain outcome. */
125
+ uncertainOnFailure?: boolean;
126
+ }
127
+ declare function alefaRequest(opts: AlefaRequestOptions): Promise<unknown>;
128
+
129
+ declare const ALEFA_BASE_URLS: Record<AlefaEnvironment, string>;
130
+ declare class AlefaPaymentProvider implements PaymentProvider {
131
+ readonly id = "alefa";
132
+ readonly name = "Alefa";
133
+ private readonly apiKey;
134
+ private readonly webhookSecret?;
135
+ private readonly baseUrl;
136
+ private readonly environment;
137
+ private readonly callbackUrl?;
138
+ private readonly defaultValidityMinutes;
139
+ private readonly timeoutMs;
140
+ private readonly maxCreationRetries;
141
+ private readonly retryInitialDelayMs;
142
+ private readonly fetchImpl;
143
+ private readonly onUnknownStatus?;
144
+ constructor(config: AlefaConfig);
145
+ /** Never exposes credentials or secrets. */
146
+ toJSON(): Record<string, unknown>;
147
+ /**
148
+ * Capability truth table (D-07, ALEFA-01 through ALEFA-04).
149
+ * QR/USSD customer actions and hosted checkout are enabled.
150
+ * Direct refunds, payouts, payment links, and fee quotes remain unsupported.
151
+ */
152
+ getCapabilities(): AlefaCapabilities;
153
+ private headers;
154
+ createPayment(request: ProviderCreatePaymentRequest): Promise<ProviderPayment>;
155
+ getPayment(providerReferenceOrLookup: string | PaymentLookup): Promise<ProviderPayment>;
156
+ verifyWebhook(request: ProviderWebhookRequest): Promise<ProviderWebhookEvent>;
157
+ }
158
+
159
+ export { ALEFA_BASE_URLS, ALEFA_CONTRACT_METADATA, type AlefaActionMode, type AlefaCapabilities, type AlefaConfig, type AlefaEnvironment, type AlefaFetch, AlefaPaymentProvider, type AlefaPaymentResponse, AlefaPaymentProvider as AlefaProvider, type AlefaWebhookPayload, alefaQrActionFixture, alefaRedirectActionFixture, alefaRequest, alefaSandboxNumbers, alefaUssdActionFixture, createMockAlefaPaymentResponse, createMockAlefaWebhook, mapAlefaStatus };
@@ -0,0 +1,159 @@
1
+ import { ProviderCapabilities, PaymentMethod, PaymentCustomerAction, PaymentStatus, PaymentProvider, ProviderCreatePaymentRequest, ProviderPayment, PaymentLookup, ProviderWebhookRequest, ProviderWebhookEvent } from '@madapay/core';
2
+
3
+ type AlefaEnvironment = 'sandbox' | 'production';
4
+ type AlefaFetch = (url: string, init?: RequestInit) => Promise<Response>;
5
+ type AlefaActionMode = 'qr_code' | 'ussd' | 'redirect_url' | 'auto';
6
+ interface AlefaConfig {
7
+ /** Server-side API key / Bearer token. Never expose to client applications. */
8
+ apiKey: string;
9
+ /** Selects the API base URL and guards against environment mixups. */
10
+ environment: AlefaEnvironment;
11
+ /** Secret used to verify HMAC-SHA256 signature in `x-alefa-signature`. */
12
+ webhookSecret?: string;
13
+ /** Override base URL for custom gateways or sandbox proxies. */
14
+ baseUrl?: string;
15
+ /** Default callback URL registered for asynchronous payment notifications. */
16
+ callbackUrl?: string;
17
+ /** Default expiration window in minutes for created payments. Defaults to 30. */
18
+ defaultValidityMinutes?: number;
19
+ /** HTTP request timeout in milliseconds. Defaults to 15,000ms. */
20
+ timeoutMs?: number;
21
+ /** Maximum retry attempts on network failures during creation. Defaults to 2. */
22
+ maxCreationRetries?: number;
23
+ /** Initial delay for exponential backoff on retries. Defaults to 200ms. */
24
+ retryInitialDelayMs?: number;
25
+ /** Custom fetch implementation for mocking or edge environments. */
26
+ fetch?: AlefaFetch;
27
+ /** Diagnostic hook invoked when an unmapped or unrecognized status is received. */
28
+ onUnknownStatus?: (raw: string, reference: string) => void;
29
+ }
30
+ interface AlefaPaymentResponse {
31
+ transactionId: string;
32
+ reference: string;
33
+ status: string;
34
+ amount: number;
35
+ currency: string;
36
+ operator: PaymentMethod;
37
+ customerPhone?: string;
38
+ checkoutUrl?: string;
39
+ action?: PaymentCustomerAction;
40
+ expiresAt?: string;
41
+ createdAt?: string;
42
+ updatedAt?: string;
43
+ }
44
+ interface AlefaWebhookPayload {
45
+ eventId: string;
46
+ eventType: string;
47
+ transactionId: string;
48
+ reference?: string;
49
+ status: string;
50
+ amount: number;
51
+ currency: string;
52
+ operator: PaymentMethod;
53
+ timestamp: string;
54
+ }
55
+ type AlefaCapabilities = ProviderCapabilities & {
56
+ customerActions: boolean;
57
+ };
58
+
59
+ /**
60
+ * Verified Alefa aggregator contract metadata (GOV-07, ALEFA-01 through ALEFA-04).
61
+ * Source: https://alefa.mg/docs (Verified 2026-10-31)
62
+ * Operating company: Alefa SAS (Antananarivo, Madagascar).
63
+ */
64
+ declare const ALEFA_CONTRACT_METADATA: {
65
+ readonly contractVersion: "Alefa Payment Gateway API v1.0.0";
66
+ readonly reviewDate: "2026-10-31";
67
+ readonly source: "https://alefa.mg/docs";
68
+ readonly operatingEntity: "Alefa SAS (Antananarivo, Madagascar)";
69
+ readonly indicativeCommissionPercent: 2.5;
70
+ readonly settlementFeeAriary: 0;
71
+ };
72
+ declare const alefaSandboxNumbers: {
73
+ mvola: string;
74
+ mvola_qr: string;
75
+ mvola_expired: string;
76
+ mvola_failed: string;
77
+ orange_money: string;
78
+ orange_money_ussd: string;
79
+ orange_money_expired: string;
80
+ orange_money_failed: string;
81
+ airtel_money: string;
82
+ airtel_money_redirect: string;
83
+ airtel_money_expired: string;
84
+ airtel_money_failed: string;
85
+ };
86
+ declare const alefaQrActionFixture: PaymentCustomerAction;
87
+ declare const alefaUssdActionFixture: PaymentCustomerAction;
88
+ declare const alefaRedirectActionFixture: PaymentCustomerAction;
89
+ declare function createMockAlefaPaymentResponse(overrides?: Partial<AlefaPaymentResponse>): AlefaPaymentResponse;
90
+ declare function createMockAlefaWebhook(payload: Partial<AlefaWebhookPayload>, secret: string): {
91
+ rawBody: Uint8Array;
92
+ headers: Record<string, string>;
93
+ payload: AlefaWebhookPayload;
94
+ };
95
+
96
+ interface AlefaStatusMapping {
97
+ status: PaymentStatus;
98
+ known: boolean;
99
+ }
100
+ /**
101
+ * Normalizes Alefa provider status codes to canonical MadaPay PaymentStatus (D-06, ALEFA-03).
102
+ *
103
+ * Known Alefa statuses:
104
+ * - CREATED / INIT -> 'created'
105
+ * - PENDING / AWAITING_ACTION / ACTION_REQUIRED / PENDING_ACTION -> 'pending'
106
+ * - PROCESSING / IN_PROGRESS -> 'processing'
107
+ * - SUCCEEDED / SUCCESS / COMPLETED / PAID -> 'succeeded'
108
+ * - FAILED / DECLINED / REJECTED / ERROR -> 'failed'
109
+ * - EXPIRED / TIMEOUT / TIMED_OUT -> 'expired'
110
+ * - CANCELLED / CANCELED -> 'cancelled'
111
+ *
112
+ * Any unknown status maps to non-terminal 'processing' per Decision D-06.
113
+ */
114
+ declare function mapAlefaStatus(rawStatus?: unknown): AlefaStatusMapping;
115
+
116
+ interface AlefaRequestOptions {
117
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
118
+ url: string;
119
+ headers: Record<string, string>;
120
+ body?: unknown;
121
+ timeoutMs: number;
122
+ signal?: AbortSignal;
123
+ fetchImpl: AlefaFetch;
124
+ /** True for payment creation: failures after dispatch represent an uncertain outcome. */
125
+ uncertainOnFailure?: boolean;
126
+ }
127
+ declare function alefaRequest(opts: AlefaRequestOptions): Promise<unknown>;
128
+
129
+ declare const ALEFA_BASE_URLS: Record<AlefaEnvironment, string>;
130
+ declare class AlefaPaymentProvider implements PaymentProvider {
131
+ readonly id = "alefa";
132
+ readonly name = "Alefa";
133
+ private readonly apiKey;
134
+ private readonly webhookSecret?;
135
+ private readonly baseUrl;
136
+ private readonly environment;
137
+ private readonly callbackUrl?;
138
+ private readonly defaultValidityMinutes;
139
+ private readonly timeoutMs;
140
+ private readonly maxCreationRetries;
141
+ private readonly retryInitialDelayMs;
142
+ private readonly fetchImpl;
143
+ private readonly onUnknownStatus?;
144
+ constructor(config: AlefaConfig);
145
+ /** Never exposes credentials or secrets. */
146
+ toJSON(): Record<string, unknown>;
147
+ /**
148
+ * Capability truth table (D-07, ALEFA-01 through ALEFA-04).
149
+ * QR/USSD customer actions and hosted checkout are enabled.
150
+ * Direct refunds, payouts, payment links, and fee quotes remain unsupported.
151
+ */
152
+ getCapabilities(): AlefaCapabilities;
153
+ private headers;
154
+ createPayment(request: ProviderCreatePaymentRequest): Promise<ProviderPayment>;
155
+ getPayment(providerReferenceOrLookup: string | PaymentLookup): Promise<ProviderPayment>;
156
+ verifyWebhook(request: ProviderWebhookRequest): Promise<ProviderWebhookEvent>;
157
+ }
158
+
159
+ export { ALEFA_BASE_URLS, ALEFA_CONTRACT_METADATA, type AlefaActionMode, type AlefaCapabilities, type AlefaConfig, type AlefaEnvironment, type AlefaFetch, AlefaPaymentProvider, type AlefaPaymentResponse, AlefaPaymentProvider as AlefaProvider, type AlefaWebhookPayload, alefaQrActionFixture, alefaRedirectActionFixture, alefaRequest, alefaSandboxNumbers, alefaUssdActionFixture, createMockAlefaPaymentResponse, createMockAlefaWebhook, mapAlefaStatus };