voko-sdk
Version:
Process payments with ease
113 lines (112 loc) • 4.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VokoClient = void 0;
const types_1 = require("../core/types");
const models_1 = require("../core/models");
const errors_1 = require("../core/errors");
const types_2 = require("../core/types");
const adapter_registry_1 = require("../registry/adapter-registry");
class VokoClient {
config;
constructor(config) {
this.config = config;
this.validateProvider();
}
async requestPayment(request) {
try {
const adapter = this.createAdapter();
const paymentRequest = {
amount: request.amount,
currency: request.currency || types_1.Currency.TZS,
phoneNumber: request.phoneNumber,
email: request.email,
fullName: request.fullName,
accountNumber: request.accountNumber,
reference: request.reference || this.generateReference(),
description: request.description,
paymentMethod: request.paymentMethod,
operator: request.operator,
otp: request.otp,
metadata: request.metadata || {},
callbackUrl: request.callbackUrl,
};
const vokoRequest = new models_1.VokoPaymentRequest(paymentRequest);
const response = await adapter.initiatePayment(vokoRequest);
return response;
}
catch (error) {
if (error instanceof errors_1.VokoError) {
throw error;
}
throw new errors_1.VokoError('Payment request failed', types_2.VokoErrorCode.UNKNOWN_ERROR, undefined, error instanceof Error ? error.message : 'Unknown error');
}
}
async checkPaymentStatus(transactionId) {
try {
const adapter = this.createAdapter();
return await adapter.checkPaymentStatus({
transactionId,
});
}
catch (error) {
if (error instanceof errors_1.VokoError) {
throw error;
}
throw new errors_1.VokoError('Status check failed', types_2.VokoErrorCode.TRANSACTION_NOT_FOUND, undefined, error instanceof Error ? error.message : 'Unknown error');
}
}
async verifyWebhook(payload, signature) {
const adapter = this.createAdapter();
return await adapter.verifyWebhook(payload, signature);
}
getSupportedPaymentMethods() {
const adapter = this.createAdapter();
return adapter.getSupportedPaymentMethods();
}
getSupportedOperators() {
const adapter = this.createAdapter();
return adapter.getSupportedOperators();
}
getProviderInfo() {
return {
provider: this.config.provider,
environment: this.config.environment,
};
}
static validatePhoneNumber(phoneNumber) {
return /^\+255[67]\d{8}$/.test(phoneNumber.replace(/[^\d+]/g, ''));
}
static normalizePhoneNumber(phoneNumber) {
let cleaned = phoneNumber.replace(/[^\d+]/g, '');
if (cleaned.startsWith('0')) {
cleaned = '+255' + cleaned.substring(1);
}
else if (cleaned.startsWith('255')) {
cleaned = '+' + cleaned;
}
else if (!cleaned.startsWith('+255')) {
cleaned = '+255' + cleaned;
}
return cleaned;
}
static getSupportedProviders() {
return adapter_registry_1.AdapterRegistry.getSupportedProviders();
}
validateProvider() {
try {
this.createAdapter();
}
catch (error) {
throw error;
}
}
createAdapter() {
return adapter_registry_1.AdapterRegistry.createAdapter(this.config);
}
generateReference() {
const timestamp = Date.now();
const random = Math.random().toString(36).substring(2, 8);
return `VOKO_${timestamp}_${random}`.toUpperCase();
}
}
exports.VokoClient = VokoClient;