ministry-platform-provider
Version:
TypeScript client library for Ministry Platform API integration
69 lines (59 loc) • 2.85 kB
text/typescript
import { getClientCredentialsToken } from "../clientCredentials.js";
import { HttpClient } from "../utils/httpClient.js";
// Token refresh interval - refresh 5 minutes before actual expiration for safety
const TOKEN_LIFE = 5 * 60 * 1000; // 5 minutes
/**
* MinistryPlatformClient - Core HTTP client with automatic authentication management
*
* Manages OAuth2 client credentials authentication and provides a configured HttpClient
* instance for all Ministry Platform API operations. Handles token lifecycle including
* automatic refresh before expiration.
*/
export class MinistryPlatformClient {
private token: string = ""; // Current access token
private expiresAt: Date = new Date(0); // Token expiration time (initialized to epoch to force refresh)
private baseUrl: string; // Ministry Platform instance base URL
private httpClient: HttpClient; // HTTP client instance with token injection
/**
* Creates a new MinistryPlatformClient instance
* Initializes the HTTP client and sets up token management
*/
constructor() {
// Get base URL from environment variable
this.baseUrl = process.env.MINISTRY_PLATFORM_BASE_URL!;
// Create HTTP client with token getter function for automatic authentication
this.httpClient = new HttpClient(this.baseUrl, () => this.token);
}
/**
* Ensures the authentication token is valid and refreshes if necessary
* This method should be called before making any API requests to guarantee authentication
* @throws Error if token refresh fails
*/
public async ensureValidToken(): Promise<void> {
console.log("Checking token validity...");
console.log("Expires at: ", this.expiresAt);
console.log("Current time: ", new Date());
// Check if token is expired or about to expire
if (this.expiresAt < new Date()) {
console.log("Token expired, refreshing...");
try {
// Get new access token using client credentials flow
const creds = await getClientCredentialsToken();
this.token = creds.access_token;
// Set expiration time with safety buffer (TOKEN_LIFE before actual expiration)
this.expiresAt = new Date(Date.now() + TOKEN_LIFE);
console.log("Token refreshed. Expires at: ", this.expiresAt);
} catch (error) {
console.error("Failed to refresh token:", error);
throw error;
}
}
}
/**
* Returns the configured HTTP client instance for making authenticated requests
* @returns HttpClient instance with automatic token injection
*/
public getHttpClient(): HttpClient {
return this.httpClient;
}
}