@rendomnet/apiservice 1.4.1 → 1.4.2
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.
- package/dist/index.d.mts +13 -12
- package/dist/index.d.ts +13 -12
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -1
package/dist/index.d.mts
CHANGED
|
@@ -106,15 +106,6 @@ type TokenService$1 = {
|
|
|
106
106
|
refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
declare class FetchError extends Error {
|
|
110
|
-
name: string;
|
|
111
|
-
status: number;
|
|
112
|
-
code: string;
|
|
113
|
-
message: string;
|
|
114
|
-
data: any;
|
|
115
|
-
constructor(response: Response, data?: any, code?: string);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
109
|
/**
|
|
119
110
|
* Handles caching of API responses
|
|
120
111
|
*/
|
|
@@ -288,6 +279,15 @@ declare class BasicAuthProvider implements AuthProvider {
|
|
|
288
279
|
getAuthHeaders(): Promise<Record<string, string>>;
|
|
289
280
|
}
|
|
290
281
|
|
|
282
|
+
declare class FetchError extends Error {
|
|
283
|
+
name: string;
|
|
284
|
+
status: number;
|
|
285
|
+
code: string;
|
|
286
|
+
message: string;
|
|
287
|
+
data: any;
|
|
288
|
+
constructor(response: Response, data?: any, code?: string);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
291
|
/**
|
|
292
292
|
* ApiService - Core API service for making authenticated API calls
|
|
293
293
|
* with caching, retry, and hook support.
|
|
@@ -299,19 +299,20 @@ declare class ApiService {
|
|
|
299
299
|
private cacheManager;
|
|
300
300
|
private retryManager;
|
|
301
301
|
private hookManager;
|
|
302
|
-
|
|
302
|
+
protected httpClient: HttpClient;
|
|
303
303
|
private accountManager;
|
|
304
304
|
private maxAttempts;
|
|
305
305
|
constructor();
|
|
306
306
|
/**
|
|
307
307
|
* Setup the API service
|
|
308
308
|
*/
|
|
309
|
-
setup({ provider, authProvider, hooks, cacheTime, baseUrl, }: {
|
|
309
|
+
setup({ provider, authProvider, hooks, cacheTime, baseUrl, httpClient, }: {
|
|
310
310
|
provider: string;
|
|
311
311
|
authProvider: AuthProvider;
|
|
312
312
|
hooks?: Record<StatusCode, HookSettings | null>;
|
|
313
313
|
cacheTime: number;
|
|
314
314
|
baseUrl?: string;
|
|
315
|
+
httpClient?: HttpClient;
|
|
315
316
|
}): void;
|
|
316
317
|
/**
|
|
317
318
|
* Create a default handler for 401 (Unauthorized) errors
|
|
@@ -355,4 +356,4 @@ declare class ApiService {
|
|
|
355
356
|
clearCache(): void;
|
|
356
357
|
}
|
|
357
358
|
|
|
358
|
-
export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
|
|
359
|
+
export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, ApiService, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -106,15 +106,6 @@ type TokenService$1 = {
|
|
|
106
106
|
refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
declare class FetchError extends Error {
|
|
110
|
-
name: string;
|
|
111
|
-
status: number;
|
|
112
|
-
code: string;
|
|
113
|
-
message: string;
|
|
114
|
-
data: any;
|
|
115
|
-
constructor(response: Response, data?: any, code?: string);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
109
|
/**
|
|
119
110
|
* Handles caching of API responses
|
|
120
111
|
*/
|
|
@@ -288,6 +279,15 @@ declare class BasicAuthProvider implements AuthProvider {
|
|
|
288
279
|
getAuthHeaders(): Promise<Record<string, string>>;
|
|
289
280
|
}
|
|
290
281
|
|
|
282
|
+
declare class FetchError extends Error {
|
|
283
|
+
name: string;
|
|
284
|
+
status: number;
|
|
285
|
+
code: string;
|
|
286
|
+
message: string;
|
|
287
|
+
data: any;
|
|
288
|
+
constructor(response: Response, data?: any, code?: string);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
291
|
/**
|
|
292
292
|
* ApiService - Core API service for making authenticated API calls
|
|
293
293
|
* with caching, retry, and hook support.
|
|
@@ -299,19 +299,20 @@ declare class ApiService {
|
|
|
299
299
|
private cacheManager;
|
|
300
300
|
private retryManager;
|
|
301
301
|
private hookManager;
|
|
302
|
-
|
|
302
|
+
protected httpClient: HttpClient;
|
|
303
303
|
private accountManager;
|
|
304
304
|
private maxAttempts;
|
|
305
305
|
constructor();
|
|
306
306
|
/**
|
|
307
307
|
* Setup the API service
|
|
308
308
|
*/
|
|
309
|
-
setup({ provider, authProvider, hooks, cacheTime, baseUrl, }: {
|
|
309
|
+
setup({ provider, authProvider, hooks, cacheTime, baseUrl, httpClient, }: {
|
|
310
310
|
provider: string;
|
|
311
311
|
authProvider: AuthProvider;
|
|
312
312
|
hooks?: Record<StatusCode, HookSettings | null>;
|
|
313
313
|
cacheTime: number;
|
|
314
314
|
baseUrl?: string;
|
|
315
|
+
httpClient?: HttpClient;
|
|
315
316
|
}): void;
|
|
316
317
|
/**
|
|
317
318
|
* Create a default handler for 401 (Unauthorized) errors
|
|
@@ -355,4 +356,4 @@ declare class ApiService {
|
|
|
355
356
|
clearCache(): void;
|
|
356
357
|
}
|
|
357
358
|
|
|
358
|
-
export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
|
|
359
|
+
export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, ApiService, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
|
package/dist/index.js
CHANGED
|
@@ -32,6 +32,7 @@ var index_exports = {};
|
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
AccountManager: () => AccountManager,
|
|
34
34
|
ApiKeyAuthProvider: () => ApiKeyAuthProvider,
|
|
35
|
+
ApiService: () => ApiService,
|
|
35
36
|
BasicAuthProvider: () => BasicAuthProvider,
|
|
36
37
|
CacheManager: () => CacheManager,
|
|
37
38
|
FetchError: () => FetchError,
|
|
@@ -554,11 +555,15 @@ var ApiService = class {
|
|
|
554
555
|
authProvider,
|
|
555
556
|
hooks = {},
|
|
556
557
|
cacheTime,
|
|
557
|
-
baseUrl = ""
|
|
558
|
+
baseUrl = "",
|
|
559
|
+
httpClient
|
|
558
560
|
}) {
|
|
559
561
|
this.provider = provider;
|
|
560
562
|
this.authProvider = authProvider;
|
|
561
563
|
this.baseUrl = baseUrl;
|
|
564
|
+
if (httpClient) {
|
|
565
|
+
this.httpClient = httpClient;
|
|
566
|
+
}
|
|
562
567
|
const finalHooks = {};
|
|
563
568
|
if (hooks[401] === void 0 && typeof this.authProvider.refresh === "function") {
|
|
564
569
|
finalHooks[401] = this.createDefaultAuthRefreshHandler();
|
|
@@ -730,6 +735,7 @@ var index_default = ApiService;
|
|
|
730
735
|
0 && (module.exports = {
|
|
731
736
|
AccountManager,
|
|
732
737
|
ApiKeyAuthProvider,
|
|
738
|
+
ApiService,
|
|
733
739
|
BasicAuthProvider,
|
|
734
740
|
CacheManager,
|
|
735
741
|
FetchError,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts"],"sourcesContent":["import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n private httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport default ApiService;\n","import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} "],"mappings":"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","names":["data","qs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts"],"sourcesContent":["import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n protected httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n httpClient,\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n httpClient?: HttpClient;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n if (httpClient) {\n this.httpClient = httpClient;\n }\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport { ApiService };\nexport default ApiService;\n","import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} "],"mappings":"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","names":["data","qs"]}
|
package/dist/index.mjs
CHANGED
|
@@ -509,11 +509,15 @@ var ApiService = class {
|
|
|
509
509
|
authProvider,
|
|
510
510
|
hooks = {},
|
|
511
511
|
cacheTime,
|
|
512
|
-
baseUrl = ""
|
|
512
|
+
baseUrl = "",
|
|
513
|
+
httpClient
|
|
513
514
|
}) {
|
|
514
515
|
this.provider = provider;
|
|
515
516
|
this.authProvider = authProvider;
|
|
516
517
|
this.baseUrl = baseUrl;
|
|
518
|
+
if (httpClient) {
|
|
519
|
+
this.httpClient = httpClient;
|
|
520
|
+
}
|
|
517
521
|
const finalHooks = {};
|
|
518
522
|
if (hooks[401] === void 0 && typeof this.authProvider.refresh === "function") {
|
|
519
523
|
finalHooks[401] = this.createDefaultAuthRefreshHandler();
|
|
@@ -684,6 +688,7 @@ var index_default = ApiService;
|
|
|
684
688
|
export {
|
|
685
689
|
AccountManager,
|
|
686
690
|
ApiKeyAuthProvider,
|
|
691
|
+
ApiService,
|
|
687
692
|
BasicAuthProvider,
|
|
688
693
|
CacheManager,
|
|
689
694
|
FetchError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts","../src/index.ts"],"sourcesContent":["import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} ","import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n private httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport default ApiService;\n"],"mappings":"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","names":["data"]}
|
|
1
|
+
{"version":3,"sources":["../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts","../src/index.ts"],"sourcesContent":["import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} ","import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n protected httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n httpClient,\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n httpClient?: HttpClient;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n if (httpClient) {\n this.httpClient = httpClient;\n }\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport { ApiService };\nexport default ApiService;\n"],"mappings":"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","names":["data"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rendomnet/apiservice",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "A robust TypeScript API service framework for making authenticated API calls",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
11
|
"require": "./dist/index.js",
|
|
12
12
|
"import": "./dist/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"./dist/*": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"require": "./dist/index.js",
|
|
17
|
+
"import": "./dist/index.mjs"
|
|
13
18
|
}
|
|
14
19
|
},
|
|
15
20
|
"files": [
|