afrimomo-sdk
Version:
A unified SDK for African payment providers
92 lines • 3.23 kB
JavaScript
"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