@rendomnet/apiservice 1.4.0 → 1.4.1

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 CHANGED
@@ -1,3 +1,25 @@
1
+ interface OAuthToken {
2
+ access_token: string;
3
+ expires_in: number;
4
+ id_token: string;
5
+ refresh_token: string;
6
+ scope: string;
7
+ token_type: string;
8
+ }
9
+ interface Token {
10
+ accountId: string;
11
+ access_token: string;
12
+ refresh_token: string;
13
+ provider: string;
14
+ enabled?: boolean;
15
+ updatedAt?: string;
16
+ primary?: boolean;
17
+ }
18
+ interface AccountData {
19
+ lastRequestTime?: number;
20
+ lastFailed?: boolean;
21
+ token?: Token;
22
+ }
1
23
  interface DelayStrategy {
2
24
  calculate: (attempt: number, response?: any) => number;
3
25
  }
@@ -69,6 +91,202 @@ interface AuthProvider {
69
91
  */
70
92
  refresh?(refreshToken: string, accountId?: string): Promise<any>;
71
93
  }
94
+ interface ApiKeyAuthProviderOptions {
95
+ apiKey: string;
96
+ headerName?: string;
97
+ queryParamName?: string;
98
+ }
99
+ interface BasicAuthProviderOptions {
100
+ username: string;
101
+ password: string;
102
+ }
103
+ type TokenService$1 = {
104
+ get: (accountId?: string) => Promise<Token>;
105
+ set: (token: Partial<Token>, accountId?: string) => Promise<void>;
106
+ refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
107
+ };
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
+ /**
119
+ * Handles caching of API responses
120
+ */
121
+ declare class CacheManager {
122
+ private cache;
123
+ private cacheTime;
124
+ /**
125
+ * Get data from cache if available and not expired
126
+ */
127
+ getFromCache(apiCallParams: ApiCallParams): any;
128
+ /**
129
+ * Save data to cache
130
+ */
131
+ saveToCache(apiCallParams: ApiCallParams, data: any): void;
132
+ /**
133
+ * Generate a unique key for caching based on request parameters
134
+ */
135
+ private getRequestKey;
136
+ /**
137
+ * Set the default cache time in milliseconds
138
+ */
139
+ setCacheTime(milliseconds: number): void;
140
+ /**
141
+ * Clear the entire cache
142
+ */
143
+ clearCache(): void;
144
+ }
145
+
146
+ /**
147
+ * Handles retry logic and delay strategies for failed API calls
148
+ */
149
+ declare class RetryManager {
150
+ private defaultMaxDelay;
151
+ private defaultMaxRetries;
152
+ /**
153
+ * Default exponential backoff strategy with full jitter
154
+ */
155
+ private defaultDelayStrategy;
156
+ /**
157
+ * Calculate and wait for appropriate delay time before retry
158
+ */
159
+ calculateAndDelay(params: {
160
+ attempt: number;
161
+ response?: any;
162
+ hook: HookSettings;
163
+ }): Promise<void>;
164
+ /**
165
+ * Extract retry-after value from response
166
+ */
167
+ private getRetryAfterValue;
168
+ /**
169
+ * Get the default maximum number of retries
170
+ */
171
+ getDefaultMaxRetries(): number;
172
+ /**
173
+ * Set the default maximum number of retries
174
+ */
175
+ setDefaultMaxRetries(maxRetries: number): void;
176
+ /**
177
+ * Set the default maximum delay between retries
178
+ */
179
+ setDefaultMaxDelay(maxDelay: number): void;
180
+ }
181
+
182
+ /**
183
+ * Manages hooks for different status codes and their processing
184
+ */
185
+ declare class HookManager {
186
+ private hooks;
187
+ private hookPromises;
188
+ /**
189
+ * Set hooks for different status codes
190
+ */
191
+ setHooks(hooks: Record<StatusCode, HookSettings>): void;
192
+ /**
193
+ * Get a hook for a specific status code
194
+ */
195
+ getHook(status: StatusCode): HookSettings | undefined;
196
+ /**
197
+ * Process a hook for a specific status code
198
+ */
199
+ processHook(accountId: string, status: StatusCode, error: any): Promise<Record<string, any> | null>;
200
+ /**
201
+ * Handle a retry failure with the appropriate hook
202
+ */
203
+ handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void>;
204
+ /**
205
+ * Check if a hook exists and should retry for a given status
206
+ */
207
+ shouldRetry(status: StatusCode): boolean;
208
+ }
209
+
210
+ /**
211
+ * Handles HTTP requests to external APIs
212
+ */
213
+ declare class HttpClient {
214
+ /**
215
+ * Make an HTTP request
216
+ */
217
+ makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any>;
218
+ /**
219
+ * Build URL with query parameters
220
+ */
221
+ private buildUrl;
222
+ /**
223
+ * Prepare form data for file uploads
224
+ */
225
+ private prepareFormData;
226
+ /**
227
+ * Build fetch options for request
228
+ */
229
+ private buildFetchOptions;
230
+ /**
231
+ * Handle API response
232
+ */
233
+ private handleResponse;
234
+ }
235
+
236
+ /**
237
+ * Manages account data and state
238
+ */
239
+ declare class AccountManager {
240
+ private accounts;
241
+ private readonly DEFAULT_ACCOUNT;
242
+ /**
243
+ * Update account data for a specific account
244
+ */
245
+ updateAccountData(accountId: string | undefined, data: Partial<AccountData>): void;
246
+ /**
247
+ * Get account data for a specific account
248
+ */
249
+ getAccountData(accountId?: string): AccountData;
250
+ /**
251
+ * Check if an account's last request failed
252
+ */
253
+ didLastRequestFail(accountId?: string): boolean;
254
+ /**
255
+ * Set account's last request as failed
256
+ */
257
+ setLastRequestFailed(accountId?: string, failed?: boolean): void;
258
+ /**
259
+ * Update the last request time for an account
260
+ */
261
+ updateLastRequestTime(accountId?: string): void;
262
+ }
263
+
264
+ type TokenService = {
265
+ get: (accountId?: string) => Promise<Token>;
266
+ set: (token: Partial<Token>, accountId?: string) => Promise<void>;
267
+ refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
268
+ };
269
+ declare class TokenAuthProvider implements AuthProvider {
270
+ private tokenService;
271
+ constructor(tokenService: TokenService);
272
+ getAuthHeaders(accountId?: string): Promise<Record<string, string>>;
273
+ refresh(accountId: string): Promise<void>;
274
+ }
275
+
276
+ declare class ApiKeyAuthProvider implements AuthProvider {
277
+ private apiKey;
278
+ private headerName?;
279
+ private queryParamName?;
280
+ constructor(options: ApiKeyAuthProviderOptions);
281
+ getAuthHeaders(): Promise<Record<string, string>>;
282
+ }
283
+
284
+ declare class BasicAuthProvider implements AuthProvider {
285
+ private username;
286
+ private password;
287
+ constructor(options: BasicAuthProviderOptions);
288
+ getAuthHeaders(): Promise<Record<string, string>>;
289
+ }
72
290
 
73
291
  /**
74
292
  * ApiService - Core API service for making authenticated API calls
@@ -137,4 +355,4 @@ declare class ApiService {
137
355
  clearCache(): void;
138
356
  }
139
357
 
140
- export { ApiService as default };
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 };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,25 @@
1
+ interface OAuthToken {
2
+ access_token: string;
3
+ expires_in: number;
4
+ id_token: string;
5
+ refresh_token: string;
6
+ scope: string;
7
+ token_type: string;
8
+ }
9
+ interface Token {
10
+ accountId: string;
11
+ access_token: string;
12
+ refresh_token: string;
13
+ provider: string;
14
+ enabled?: boolean;
15
+ updatedAt?: string;
16
+ primary?: boolean;
17
+ }
18
+ interface AccountData {
19
+ lastRequestTime?: number;
20
+ lastFailed?: boolean;
21
+ token?: Token;
22
+ }
1
23
  interface DelayStrategy {
2
24
  calculate: (attempt: number, response?: any) => number;
3
25
  }
@@ -69,6 +91,202 @@ interface AuthProvider {
69
91
  */
70
92
  refresh?(refreshToken: string, accountId?: string): Promise<any>;
71
93
  }
94
+ interface ApiKeyAuthProviderOptions {
95
+ apiKey: string;
96
+ headerName?: string;
97
+ queryParamName?: string;
98
+ }
99
+ interface BasicAuthProviderOptions {
100
+ username: string;
101
+ password: string;
102
+ }
103
+ type TokenService$1 = {
104
+ get: (accountId?: string) => Promise<Token>;
105
+ set: (token: Partial<Token>, accountId?: string) => Promise<void>;
106
+ refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
107
+ };
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
+ /**
119
+ * Handles caching of API responses
120
+ */
121
+ declare class CacheManager {
122
+ private cache;
123
+ private cacheTime;
124
+ /**
125
+ * Get data from cache if available and not expired
126
+ */
127
+ getFromCache(apiCallParams: ApiCallParams): any;
128
+ /**
129
+ * Save data to cache
130
+ */
131
+ saveToCache(apiCallParams: ApiCallParams, data: any): void;
132
+ /**
133
+ * Generate a unique key for caching based on request parameters
134
+ */
135
+ private getRequestKey;
136
+ /**
137
+ * Set the default cache time in milliseconds
138
+ */
139
+ setCacheTime(milliseconds: number): void;
140
+ /**
141
+ * Clear the entire cache
142
+ */
143
+ clearCache(): void;
144
+ }
145
+
146
+ /**
147
+ * Handles retry logic and delay strategies for failed API calls
148
+ */
149
+ declare class RetryManager {
150
+ private defaultMaxDelay;
151
+ private defaultMaxRetries;
152
+ /**
153
+ * Default exponential backoff strategy with full jitter
154
+ */
155
+ private defaultDelayStrategy;
156
+ /**
157
+ * Calculate and wait for appropriate delay time before retry
158
+ */
159
+ calculateAndDelay(params: {
160
+ attempt: number;
161
+ response?: any;
162
+ hook: HookSettings;
163
+ }): Promise<void>;
164
+ /**
165
+ * Extract retry-after value from response
166
+ */
167
+ private getRetryAfterValue;
168
+ /**
169
+ * Get the default maximum number of retries
170
+ */
171
+ getDefaultMaxRetries(): number;
172
+ /**
173
+ * Set the default maximum number of retries
174
+ */
175
+ setDefaultMaxRetries(maxRetries: number): void;
176
+ /**
177
+ * Set the default maximum delay between retries
178
+ */
179
+ setDefaultMaxDelay(maxDelay: number): void;
180
+ }
181
+
182
+ /**
183
+ * Manages hooks for different status codes and their processing
184
+ */
185
+ declare class HookManager {
186
+ private hooks;
187
+ private hookPromises;
188
+ /**
189
+ * Set hooks for different status codes
190
+ */
191
+ setHooks(hooks: Record<StatusCode, HookSettings>): void;
192
+ /**
193
+ * Get a hook for a specific status code
194
+ */
195
+ getHook(status: StatusCode): HookSettings | undefined;
196
+ /**
197
+ * Process a hook for a specific status code
198
+ */
199
+ processHook(accountId: string, status: StatusCode, error: any): Promise<Record<string, any> | null>;
200
+ /**
201
+ * Handle a retry failure with the appropriate hook
202
+ */
203
+ handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void>;
204
+ /**
205
+ * Check if a hook exists and should retry for a given status
206
+ */
207
+ shouldRetry(status: StatusCode): boolean;
208
+ }
209
+
210
+ /**
211
+ * Handles HTTP requests to external APIs
212
+ */
213
+ declare class HttpClient {
214
+ /**
215
+ * Make an HTTP request
216
+ */
217
+ makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any>;
218
+ /**
219
+ * Build URL with query parameters
220
+ */
221
+ private buildUrl;
222
+ /**
223
+ * Prepare form data for file uploads
224
+ */
225
+ private prepareFormData;
226
+ /**
227
+ * Build fetch options for request
228
+ */
229
+ private buildFetchOptions;
230
+ /**
231
+ * Handle API response
232
+ */
233
+ private handleResponse;
234
+ }
235
+
236
+ /**
237
+ * Manages account data and state
238
+ */
239
+ declare class AccountManager {
240
+ private accounts;
241
+ private readonly DEFAULT_ACCOUNT;
242
+ /**
243
+ * Update account data for a specific account
244
+ */
245
+ updateAccountData(accountId: string | undefined, data: Partial<AccountData>): void;
246
+ /**
247
+ * Get account data for a specific account
248
+ */
249
+ getAccountData(accountId?: string): AccountData;
250
+ /**
251
+ * Check if an account's last request failed
252
+ */
253
+ didLastRequestFail(accountId?: string): boolean;
254
+ /**
255
+ * Set account's last request as failed
256
+ */
257
+ setLastRequestFailed(accountId?: string, failed?: boolean): void;
258
+ /**
259
+ * Update the last request time for an account
260
+ */
261
+ updateLastRequestTime(accountId?: string): void;
262
+ }
263
+
264
+ type TokenService = {
265
+ get: (accountId?: string) => Promise<Token>;
266
+ set: (token: Partial<Token>, accountId?: string) => Promise<void>;
267
+ refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
268
+ };
269
+ declare class TokenAuthProvider implements AuthProvider {
270
+ private tokenService;
271
+ constructor(tokenService: TokenService);
272
+ getAuthHeaders(accountId?: string): Promise<Record<string, string>>;
273
+ refresh(accountId: string): Promise<void>;
274
+ }
275
+
276
+ declare class ApiKeyAuthProvider implements AuthProvider {
277
+ private apiKey;
278
+ private headerName?;
279
+ private queryParamName?;
280
+ constructor(options: ApiKeyAuthProviderOptions);
281
+ getAuthHeaders(): Promise<Record<string, string>>;
282
+ }
283
+
284
+ declare class BasicAuthProvider implements AuthProvider {
285
+ private username;
286
+ private password;
287
+ constructor(options: BasicAuthProviderOptions);
288
+ getAuthHeaders(): Promise<Record<string, string>>;
289
+ }
72
290
 
73
291
  /**
74
292
  * ApiService - Core API service for making authenticated API calls
@@ -137,4 +355,4 @@ declare class ApiService {
137
355
  clearCache(): void;
138
356
  }
139
357
 
140
- export { ApiService as default };
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 };
package/dist/index.js CHANGED
@@ -30,6 +30,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ AccountManager: () => AccountManager,
34
+ ApiKeyAuthProvider: () => ApiKeyAuthProvider,
35
+ BasicAuthProvider: () => BasicAuthProvider,
36
+ CacheManager: () => CacheManager,
37
+ FetchError: () => FetchError,
38
+ HookManager: () => HookManager,
39
+ HttpClient: () => HttpClient,
40
+ RetryManager: () => RetryManager,
41
+ TokenAuthProvider: () => TokenAuthProvider,
33
42
  default: () => index_default
34
43
  });
35
44
  module.exports = __toCommonJS(index_exports);
@@ -487,6 +496,42 @@ var AccountManager = class {
487
496
  }
488
497
  };
489
498
 
499
+ // src/TokenAuthProvider.ts
500
+ var TokenAuthProvider = class {
501
+ constructor(tokenService) {
502
+ this.tokenService = tokenService;
503
+ }
504
+ async getAuthHeaders(accountId) {
505
+ const token = await this.tokenService.get(accountId);
506
+ if (!(token == null ? void 0 : token.access_token)) return {};
507
+ return { Authorization: `Bearer ${token.access_token}` };
508
+ }
509
+ async refresh(accountId) {
510
+ if (!this.tokenService.refresh) {
511
+ throw new Error("Refresh not supported");
512
+ }
513
+ const token = await this.tokenService.get(accountId);
514
+ if (!(token == null ? void 0 : token.refresh_token)) {
515
+ throw new Error("No refresh token available");
516
+ }
517
+ const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);
518
+ await this.tokenService.set(newTokens, accountId);
519
+ }
520
+ };
521
+
522
+ // src/BasicAuthProvider.ts
523
+ var BasicAuthProvider = class {
524
+ constructor(options) {
525
+ this.username = options.username;
526
+ this.password = options.password;
527
+ }
528
+ async getAuthHeaders() {
529
+ const encoded = Buffer.from(`${this.username}:${this.password}`).toString("base64");
530
+ return { Authorization: `Basic ${encoded}` };
531
+ }
532
+ // No refresh for basic auth
533
+ };
534
+
490
535
  // src/index.ts
491
536
  var ApiService = class {
492
537
  constructor() {
@@ -681,4 +726,16 @@ var ApiService = class {
681
726
  }
682
727
  };
683
728
  var index_default = ApiService;
729
+ // Annotate the CommonJS export names for ESM import in node:
730
+ 0 && (module.exports = {
731
+ AccountManager,
732
+ ApiKeyAuthProvider,
733
+ BasicAuthProvider,
734
+ CacheManager,
735
+ FetchError,
736
+ HookManager,
737
+ HttpClient,
738
+ RetryManager,
739
+ TokenAuthProvider
740
+ });
684
741
  //# sourceMappingURL=index.js.map
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"],"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 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} "],"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 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"]}
package/dist/index.mjs CHANGED
@@ -451,6 +451,42 @@ var AccountManager = class {
451
451
  }
452
452
  };
453
453
 
454
+ // src/TokenAuthProvider.ts
455
+ var TokenAuthProvider = class {
456
+ constructor(tokenService) {
457
+ this.tokenService = tokenService;
458
+ }
459
+ async getAuthHeaders(accountId) {
460
+ const token = await this.tokenService.get(accountId);
461
+ if (!(token == null ? void 0 : token.access_token)) return {};
462
+ return { Authorization: `Bearer ${token.access_token}` };
463
+ }
464
+ async refresh(accountId) {
465
+ if (!this.tokenService.refresh) {
466
+ throw new Error("Refresh not supported");
467
+ }
468
+ const token = await this.tokenService.get(accountId);
469
+ if (!(token == null ? void 0 : token.refresh_token)) {
470
+ throw new Error("No refresh token available");
471
+ }
472
+ const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);
473
+ await this.tokenService.set(newTokens, accountId);
474
+ }
475
+ };
476
+
477
+ // src/BasicAuthProvider.ts
478
+ var BasicAuthProvider = class {
479
+ constructor(options) {
480
+ this.username = options.username;
481
+ this.password = options.password;
482
+ }
483
+ async getAuthHeaders() {
484
+ const encoded = Buffer.from(`${this.username}:${this.password}`).toString("base64");
485
+ return { Authorization: `Basic ${encoded}` };
486
+ }
487
+ // No refresh for basic auth
488
+ };
489
+
454
490
  // src/index.ts
455
491
  var ApiService = class {
456
492
  constructor() {
@@ -646,6 +682,15 @@ var ApiService = class {
646
682
  };
647
683
  var index_default = ApiService;
648
684
  export {
685
+ AccountManager,
686
+ ApiKeyAuthProvider,
687
+ BasicAuthProvider,
688
+ CacheManager,
689
+ FetchError,
690
+ HookManager,
691
+ HttpClient,
692
+ RetryManager,
693
+ TokenAuthProvider,
649
694
  index_default as default
650
695
  };
651
696
  //# sourceMappingURL=index.mjs.map
@@ -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/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 { \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 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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rendomnet/apiservice",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
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",