UNPKG

afrimomo-sdk

Version:

A unified SDK for African payment providers

92 lines 3.23 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.OneKhusaTokenManager = void 0; const axios_1 = __importDefault(require("axios")); const logger_1 = require("../../utils/logger"); const providerClients_1 = require("../../utils/providerClients"); const REFRESH_BUFFER_MS = 30 * 1000; class OneKhusaTokenManager { apiKey; apiSecret; cachedToken = null; refreshPromise = null; tokenUrl; constructor(apiKey, apiSecret, environment = "DEVELOPMENT", sandboxUrl, productionUrl) { this.apiKey = apiKey; this.apiSecret = apiSecret; this.tokenUrl = (0, providerClients_1.getOneKhusaTokenUrl)(environment, sandboxUrl, productionUrl); } async getToken() { if (this.isTokenValid()) { return this.cachedToken.accessToken; } if (this.refreshPromise) { return this.refreshPromise; } this.refreshPromise = this.fetchNewToken(); try { const token = await this.refreshPromise; return token; } finally { this.refreshPromise = null; } } isTokenValid() { if (!this.cachedToken) { return false; } const now = Date.now(); const expiresAt = this.cachedToken.expiresAt - REFRESH_BUFFER_MS; return now < expiresAt; } async fetchNewToken() { logger_1.logger.debug("OneKhusa: Fetching new access token"); try { const response = await axios_1.default.post(this.tokenUrl, new URLSearchParams({ grant_type: "client_credentials", client_id: this.apiKey, client_secret: this.apiSecret, }), { headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); const { access_token, expires_in } = response.data; const expiresAt = this.parseTokenExpiration(access_token, expires_in); this.cachedToken = { accessToken: access_token, expiresAt, }; logger_1.logger.debug("OneKhusa: Token obtained successfully"); return access_token; } catch (error) { logger_1.logger.error("OneKhusa: Failed to obtain access token", error); throw error; } } parseTokenExpiration(token, defaultExpiresIn) { try { const parts = token.split("."); if (parts.length === 3) { const payload = JSON.parse(Buffer.from(parts[1], "base64").toString()); if (payload.exp) { return payload.exp * 1000; } } } catch { logger_1.logger.debug("OneKhusa: Could not parse JWT expiration, using expires_in"); } return Date.now() + defaultExpiresIn * 1000; } clearToken() { this.cachedToken = null; } } exports.OneKhusaTokenManager = OneKhusaTokenManager; //# sourceMappingURL=auth.js.map