@oxyhq/services 5.7.4 → 5.7.5

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.
Files changed (59) hide show
  1. package/README.md +121 -264
  2. package/lib/commonjs/core/auth-manager.js +440 -0
  3. package/lib/commonjs/core/auth-manager.js.map +1 -0
  4. package/lib/commonjs/core/index.js +102 -5
  5. package/lib/commonjs/core/index.js.map +1 -1
  6. package/lib/commonjs/core/use-auth.js +244 -0
  7. package/lib/commonjs/core/use-auth.js.map +1 -0
  8. package/lib/commonjs/node/index.js +2 -49
  9. package/lib/commonjs/node/index.js.map +1 -1
  10. package/lib/commonjs/ui/index.js +1 -16
  11. package/lib/commonjs/ui/index.js.map +1 -1
  12. package/lib/module/core/auth-manager.js +432 -0
  13. package/lib/module/core/auth-manager.js.map +1 -0
  14. package/lib/module/core/index.js +41 -5
  15. package/lib/module/core/index.js.map +1 -1
  16. package/lib/module/core/use-auth.js +235 -0
  17. package/lib/module/core/use-auth.js.map +1 -0
  18. package/lib/module/node/index.js +1 -11
  19. package/lib/module/node/index.js.map +1 -1
  20. package/lib/module/ui/index.js +1 -16
  21. package/lib/module/ui/index.js.map +1 -1
  22. package/lib/typescript/core/auth-manager.d.ts +136 -0
  23. package/lib/typescript/core/auth-manager.d.ts.map +1 -0
  24. package/lib/typescript/core/index.d.ts +24 -1
  25. package/lib/typescript/core/index.d.ts.map +1 -1
  26. package/lib/typescript/core/use-auth.d.ts +79 -0
  27. package/lib/typescript/core/use-auth.d.ts.map +1 -0
  28. package/lib/typescript/node/index.d.ts +1 -7
  29. package/lib/typescript/node/index.d.ts.map +1 -1
  30. package/lib/typescript/ui/index.d.ts +1 -2
  31. package/lib/typescript/ui/index.d.ts.map +1 -1
  32. package/package.json +4 -6
  33. package/src/__tests__/zero-config-auth.test.ts +607 -0
  34. package/src/core/auth-manager.ts +500 -0
  35. package/src/core/index.ts +41 -6
  36. package/src/core/use-auth.tsx +245 -0
  37. package/src/node/index.ts +1 -17
  38. package/src/ui/index.ts +1 -19
  39. package/lib/commonjs/node/middleware.js +0 -227
  40. package/lib/commonjs/node/middleware.js.map +0 -1
  41. package/lib/commonjs/ui/zero-config/index.js +0 -25
  42. package/lib/commonjs/ui/zero-config/index.js.map +0 -1
  43. package/lib/commonjs/ui/zero-config/provider.js +0 -278
  44. package/lib/commonjs/ui/zero-config/provider.js.map +0 -1
  45. package/lib/module/node/middleware.js +0 -199
  46. package/lib/module/node/middleware.js.map +0 -1
  47. package/lib/module/ui/zero-config/index.js +0 -8
  48. package/lib/module/ui/zero-config/index.js.map +0 -1
  49. package/lib/module/ui/zero-config/provider.js +0 -270
  50. package/lib/module/ui/zero-config/provider.js.map +0 -1
  51. package/lib/typescript/node/middleware.d.ts +0 -92
  52. package/lib/typescript/node/middleware.d.ts.map +0 -1
  53. package/lib/typescript/ui/zero-config/index.d.ts +0 -5
  54. package/lib/typescript/ui/zero-config/index.d.ts.map +0 -1
  55. package/lib/typescript/ui/zero-config/provider.d.ts +0 -84
  56. package/lib/typescript/ui/zero-config/provider.d.ts.map +0 -1
  57. package/src/node/middleware.ts +0 -234
  58. package/src/ui/zero-config/index.ts +0 -11
  59. package/src/ui/zero-config/provider.tsx +0 -310
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AuthenticationManager = void 0;
7
+ exports.getAuthManager = getAuthManager;
8
+ exports.initializeAuth = initializeAuth;
9
+ var _axios = _interopRequireDefault(require("axios"));
10
+ var _jwtDecode = require("jwt-decode");
11
+ var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ /**
14
+ * Zero-Config Authentication Manager
15
+ *
16
+ * This module provides automatic token management, session handling,
17
+ * and seamless authentication for Oxy services.
18
+ */
19
+
20
+ class AuthenticationManager {
21
+ tokens = null;
22
+ user = null;
23
+ refreshPromise = null;
24
+ listeners = [];
25
+ storageKey = '@oxy/auth-tokens';
26
+ constructor(baseURL) {
27
+ this.client = _axios.default.create({
28
+ baseURL,
29
+ timeout: 15000,
30
+ withCredentials: true // Enable cookies for session management
31
+ });
32
+ this.setupInterceptors();
33
+ this.initializeFromStorage();
34
+ }
35
+
36
+ /**
37
+ * Setup axios interceptors for automatic token management
38
+ */
39
+ setupInterceptors() {
40
+ // Request interceptor - automatically add auth headers
41
+ this.client.interceptors.request.use(async config => {
42
+ // Skip auth for login/signup endpoints
43
+ if (this.isPublicEndpoint(config.url || '')) {
44
+ return config;
45
+ }
46
+
47
+ // Ensure we have a valid token
48
+ await this.ensureValidToken();
49
+
50
+ // Add authorization header if we have a token
51
+ if (this.tokens?.accessToken) {
52
+ config.headers = config.headers || {};
53
+ config.headers.Authorization = `Bearer ${this.tokens.accessToken}`;
54
+ }
55
+ return config;
56
+ }, error => Promise.reject(error));
57
+
58
+ // Response interceptor - handle token expiration and auto-retry
59
+ this.client.interceptors.response.use(response => response, async error => {
60
+ const originalRequest = error.config;
61
+
62
+ // If it's a 401 and we haven't already retried, attempt token refresh
63
+ if (error.response?.status === 401 && !originalRequest._retry && this.tokens?.refreshToken && !this.isPublicEndpoint(originalRequest?.url || '')) {
64
+ originalRequest._retry = true;
65
+ try {
66
+ await this.refreshTokens();
67
+
68
+ // Retry original request with new token
69
+ if (originalRequest && this.tokens?.accessToken) {
70
+ originalRequest.headers = originalRequest.headers || {};
71
+ originalRequest.headers.Authorization = `Bearer ${this.tokens.accessToken}`;
72
+ return this.client(originalRequest);
73
+ }
74
+ } catch (refreshError) {
75
+ // Refresh failed, clear tokens and notify listeners
76
+ await this.logout();
77
+ return Promise.reject(error);
78
+ }
79
+ }
80
+
81
+ // For non-auth errors or failed retries, reject with formatted error
82
+ return Promise.reject(this.formatError(error));
83
+ });
84
+ }
85
+
86
+ /**
87
+ * Check if endpoint is public (doesn't require authentication)
88
+ */
89
+ isPublicEndpoint(url) {
90
+ const publicPaths = ['/auth/login', '/auth/signup', '/auth/register', '/auth/check-username', '/auth/check-email', '/health', '/'];
91
+ return publicPaths.some(path => url.includes(path));
92
+ }
93
+
94
+ /**
95
+ * Initialize authentication state from persistent storage
96
+ */
97
+ async initializeFromStorage() {
98
+ try {
99
+ const storedData = await _asyncStorage.default.getItem(this.storageKey);
100
+ if (storedData) {
101
+ const tokens = JSON.parse(storedData);
102
+
103
+ // Validate that tokens haven't expired
104
+ if (await this.validateStoredTokens(tokens)) {
105
+ this.tokens = tokens;
106
+ await this.fetchCurrentUser();
107
+ this.notifyStateChange();
108
+ } else {
109
+ // Tokens expired, clear storage
110
+ await _asyncStorage.default.removeItem(this.storageKey);
111
+ }
112
+ }
113
+ } catch (error) {
114
+ console.warn('[OxyAuth] Failed to initialize from storage:', error);
115
+ await _asyncStorage.default.removeItem(this.storageKey);
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Validate stored tokens without making network calls if possible
121
+ */
122
+ async validateStoredTokens(tokens) {
123
+ try {
124
+ // First check if access token is expired
125
+ const decoded = (0, _jwtDecode.jwtDecode)(tokens.accessToken);
126
+ const now = Math.floor(Date.now() / 1000);
127
+
128
+ // If access token is still valid, we're good
129
+ if (decoded.exp > now + 60) {
130
+ // 60 second buffer
131
+ return true;
132
+ }
133
+
134
+ // Access token expired, try refresh token
135
+ const refreshDecoded = (0, _jwtDecode.jwtDecode)(tokens.refreshToken);
136
+ return refreshDecoded.exp > now;
137
+ } catch {
138
+ return false;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Ensure we have a valid access token
144
+ */
145
+ async ensureValidToken() {
146
+ if (!this.tokens?.accessToken) {
147
+ return;
148
+ }
149
+ try {
150
+ const decoded = (0, _jwtDecode.jwtDecode)(this.tokens.accessToken);
151
+ const now = Math.floor(Date.now() / 1000);
152
+
153
+ // Refresh if token expires within 5 minutes
154
+ if (decoded.exp - now < 300) {
155
+ await this.refreshTokens();
156
+ }
157
+ } catch (error) {
158
+ console.warn('[OxyAuth] Token validation error:', error);
159
+ // If token is malformed, try refresh
160
+ if (this.tokens?.refreshToken) {
161
+ await this.refreshTokens();
162
+ }
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Login with credentials
168
+ */
169
+ async login(credentials) {
170
+ try {
171
+ const response = await this.client.post('/auth/login', credentials);
172
+ const loginData = response.data;
173
+ if (loginData.success && loginData.accessToken && loginData.refreshToken) {
174
+ await this.setTokens({
175
+ accessToken: loginData.accessToken,
176
+ refreshToken: loginData.refreshToken
177
+ });
178
+ this.user = loginData.user;
179
+ this.notifyStateChange();
180
+ return loginData;
181
+ } else {
182
+ throw new Error(loginData.message || 'Login failed');
183
+ }
184
+ } catch (error) {
185
+ throw this.formatError(error);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Register new user
191
+ */
192
+ async register(userData) {
193
+ try {
194
+ const response = await this.client.post('/auth/register', userData);
195
+ const registerData = response.data;
196
+ if (registerData.success && registerData.accessToken && registerData.refreshToken) {
197
+ await this.setTokens({
198
+ accessToken: registerData.accessToken,
199
+ refreshToken: registerData.refreshToken
200
+ });
201
+ this.user = registerData.user;
202
+ this.notifyStateChange();
203
+ return registerData;
204
+ } else {
205
+ throw new Error(registerData.message || 'Registration failed');
206
+ }
207
+ } catch (error) {
208
+ throw this.formatError(error);
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Logout user and clear all tokens
214
+ */
215
+ async logout() {
216
+ // Attempt server-side logout if we have tokens
217
+ if (this.tokens?.refreshToken) {
218
+ try {
219
+ await this.client.post('/auth/logout', {
220
+ refreshToken: this.tokens.refreshToken
221
+ });
222
+ } catch (error) {
223
+ console.warn('[OxyAuth] Server logout failed:', error);
224
+ }
225
+ }
226
+
227
+ // Clear local state
228
+ this.tokens = null;
229
+ this.user = null;
230
+
231
+ // Clear storage
232
+ try {
233
+ await _asyncStorage.default.removeItem(this.storageKey);
234
+ } catch (error) {
235
+ console.warn('[OxyAuth] Failed to clear storage:', error);
236
+ }
237
+ this.notifyStateChange();
238
+ }
239
+
240
+ /**
241
+ * Refresh access token using refresh token
242
+ */
243
+ async refreshTokens() {
244
+ if (!this.tokens?.refreshToken) {
245
+ throw new Error('No refresh token available');
246
+ }
247
+
248
+ // If refresh is already in progress, return that promise
249
+ if (this.refreshPromise) {
250
+ return this.refreshPromise;
251
+ }
252
+ this.refreshPromise = this.performTokenRefresh();
253
+ try {
254
+ const newTokens = await this.refreshPromise;
255
+ this.refreshPromise = null;
256
+ return newTokens;
257
+ } catch (error) {
258
+ this.refreshPromise = null;
259
+ throw error;
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Perform the actual token refresh
265
+ */
266
+ async performTokenRefresh() {
267
+ try {
268
+ const response = await this.client.post('/auth/refresh', {
269
+ refreshToken: this.tokens.refreshToken
270
+ });
271
+ const newTokens = {
272
+ accessToken: response.data.accessToken,
273
+ refreshToken: response.data.refreshToken
274
+ };
275
+ await this.setTokens(newTokens);
276
+ return newTokens;
277
+ } catch (error) {
278
+ // Refresh failed, clear all tokens
279
+ await this.logout();
280
+ throw this.formatError(error);
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Set tokens and persist to storage
286
+ */
287
+ async setTokens(newTokens) {
288
+ this.tokens = newTokens;
289
+ try {
290
+ await _asyncStorage.default.setItem(this.storageKey, JSON.stringify(newTokens));
291
+ } catch (error) {
292
+ console.warn('[OxyAuth] Failed to persist tokens:', error);
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Fetch current user profile
298
+ */
299
+ async fetchCurrentUser() {
300
+ try {
301
+ const response = await this.client.get('/auth/me');
302
+ this.user = response.data.data || response.data;
303
+ } catch (error) {
304
+ console.warn('[OxyAuth] Failed to fetch current user:', error);
305
+ // Don't throw here, we can still function without user profile
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Get current authentication state
311
+ */
312
+ getAuthState() {
313
+ return {
314
+ isAuthenticated: !!this.tokens?.accessToken,
315
+ user: this.user,
316
+ tokens: this.tokens
317
+ };
318
+ }
319
+
320
+ /**
321
+ * Get current user (loads if not cached)
322
+ */
323
+ async getCurrentUser() {
324
+ if (!this.tokens?.accessToken) {
325
+ throw new Error('Not authenticated');
326
+ }
327
+ if (!this.user) {
328
+ await this.fetchCurrentUser();
329
+ }
330
+ return this.user;
331
+ }
332
+
333
+ /**
334
+ * Subscribe to authentication state changes
335
+ */
336
+ onAuthStateChange(callback) {
337
+ this.listeners.push(callback);
338
+
339
+ // Immediately call with current state
340
+ callback(this.getAuthState());
341
+
342
+ // Return unsubscribe function
343
+ return () => {
344
+ this.listeners = this.listeners.filter(listener => listener !== callback);
345
+ };
346
+ }
347
+
348
+ /**
349
+ * Notify all listeners of state changes
350
+ */
351
+ notifyStateChange() {
352
+ const state = this.getAuthState();
353
+ this.listeners.forEach(listener => {
354
+ try {
355
+ listener(state);
356
+ } catch (error) {
357
+ console.error('[OxyAuth] Listener error:', error);
358
+ }
359
+ });
360
+ }
361
+
362
+ /**
363
+ * Format error responses consistently
364
+ */
365
+ formatError(error) {
366
+ if (error?.response?.data?.message) {
367
+ return new Error(error.response.data.message);
368
+ }
369
+ if (error?.message) {
370
+ return new Error(error.message);
371
+ }
372
+ return new Error('An unexpected error occurred');
373
+ }
374
+
375
+ /**
376
+ * Get authenticated HTTP client for making API calls
377
+ */
378
+ getClient() {
379
+ return this.client;
380
+ }
381
+
382
+ /**
383
+ * Check username availability
384
+ */
385
+ async checkUsernameAvailability(username) {
386
+ try {
387
+ const response = await this.client.get(`/auth/check-username/${encodeURIComponent(username)}`);
388
+ return response.data;
389
+ } catch (error) {
390
+ const axiosError = error;
391
+ if (axiosError?.response?.status === 400) {
392
+ return axiosError.response.data;
393
+ }
394
+ throw this.formatError(error);
395
+ }
396
+ }
397
+
398
+ /**
399
+ * Check email availability
400
+ */
401
+ async checkEmailAvailability(email) {
402
+ try {
403
+ const response = await this.client.post('/auth/check-email', {
404
+ email
405
+ });
406
+ return response.data;
407
+ } catch (error) {
408
+ const axiosError = error;
409
+ if (axiosError?.response?.status === 400) {
410
+ return axiosError.response.data;
411
+ }
412
+ throw this.formatError(error);
413
+ }
414
+ }
415
+ }
416
+
417
+ // Global auth manager instance
418
+ exports.AuthenticationManager = AuthenticationManager;
419
+ let globalAuthManager = null;
420
+
421
+ /**
422
+ * Initialize global authentication manager
423
+ */
424
+ function initializeAuth(baseURL) {
425
+ if (!globalAuthManager) {
426
+ globalAuthManager = new AuthenticationManager(baseURL);
427
+ }
428
+ return globalAuthManager;
429
+ }
430
+
431
+ /**
432
+ * Get global authentication manager instance
433
+ */
434
+ function getAuthManager() {
435
+ if (!globalAuthManager) {
436
+ throw new Error('Authentication manager not initialized. Call initializeAuth() first.');
437
+ }
438
+ return globalAuthManager;
439
+ }
440
+ //# sourceMappingURL=auth-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_axios","_interopRequireDefault","require","_jwtDecode","_asyncStorage","e","__esModule","default","AuthenticationManager","tokens","user","refreshPromise","listeners","storageKey","constructor","baseURL","client","axios","create","timeout","withCredentials","setupInterceptors","initializeFromStorage","interceptors","request","use","config","isPublicEndpoint","url","ensureValidToken","accessToken","headers","Authorization","error","Promise","reject","response","originalRequest","status","_retry","refreshToken","refreshTokens","refreshError","logout","formatError","publicPaths","some","path","includes","storedData","AsyncStorage","getItem","JSON","parse","validateStoredTokens","fetchCurrentUser","notifyStateChange","removeItem","console","warn","decoded","jwtDecode","now","Math","floor","Date","exp","refreshDecoded","login","credentials","post","loginData","data","success","setTokens","Error","message","register","userData","registerData","performTokenRefresh","newTokens","setItem","stringify","get","getAuthState","isAuthenticated","getCurrentUser","onAuthStateChange","callback","push","filter","listener","state","forEach","getClient","checkUsernameAvailability","username","encodeURIComponent","axiosError","checkEmailAvailability","email","exports","globalAuthManager","initializeAuth","getAuthManager"],"sourceRoot":"../../../src","sources":["core/auth-manager.ts"],"mappings":"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","ignoreList":[]}
@@ -6,8 +6,29 @@ Object.defineProperty(exports, "__esModule", {
6
6
  var _exportNames = {
7
7
  OXY_CLOUD_URL: true,
8
8
  OxyServices: true,
9
+ AuthenticationManager: true,
10
+ initializeAuth: true,
11
+ getAuthManager: true,
12
+ AuthProvider: true,
13
+ useAuth: true,
14
+ useOxyClient: true,
15
+ useAuthStatus: true,
16
+ useCurrentUser: true,
17
+ withAuth: true,
9
18
  DeviceManager: true
10
19
  };
20
+ Object.defineProperty(exports, "AuthProvider", {
21
+ enumerable: true,
22
+ get: function () {
23
+ return _useAuth.AuthProvider;
24
+ }
25
+ });
26
+ Object.defineProperty(exports, "AuthenticationManager", {
27
+ enumerable: true,
28
+ get: function () {
29
+ return _authManager.AuthenticationManager;
30
+ }
31
+ });
11
32
  Object.defineProperty(exports, "DeviceManager", {
12
33
  enumerable: true,
13
34
  get: function () {
@@ -15,8 +36,52 @@ Object.defineProperty(exports, "DeviceManager", {
15
36
  }
16
37
  });
17
38
  exports.default = exports.OxyServices = exports.OXY_CLOUD_URL = void 0;
39
+ Object.defineProperty(exports, "getAuthManager", {
40
+ enumerable: true,
41
+ get: function () {
42
+ return _authManager.getAuthManager;
43
+ }
44
+ });
45
+ Object.defineProperty(exports, "initializeAuth", {
46
+ enumerable: true,
47
+ get: function () {
48
+ return _authManager.initializeAuth;
49
+ }
50
+ });
51
+ Object.defineProperty(exports, "useAuth", {
52
+ enumerable: true,
53
+ get: function () {
54
+ return _useAuth.useAuth;
55
+ }
56
+ });
57
+ Object.defineProperty(exports, "useAuthStatus", {
58
+ enumerable: true,
59
+ get: function () {
60
+ return _useAuth.useAuthStatus;
61
+ }
62
+ });
63
+ Object.defineProperty(exports, "useCurrentUser", {
64
+ enumerable: true,
65
+ get: function () {
66
+ return _useAuth.useCurrentUser;
67
+ }
68
+ });
69
+ Object.defineProperty(exports, "useOxyClient", {
70
+ enumerable: true,
71
+ get: function () {
72
+ return _useAuth.useOxyClient;
73
+ }
74
+ });
75
+ Object.defineProperty(exports, "withAuth", {
76
+ enumerable: true,
77
+ get: function () {
78
+ return _useAuth.withAuth;
79
+ }
80
+ });
18
81
  var _axios = _interopRequireDefault(require("axios"));
19
82
  var _jwtDecode = require("jwt-decode");
83
+ var _authManager = require("./auth-manager");
84
+ var _useAuth = require("./use-auth");
20
85
  var _deviceManager = require("../utils/deviceManager");
21
86
  var _interfaces = require("../models/interfaces");
22
87
  Object.keys(_interfaces).forEach(function (key) {
@@ -43,6 +108,8 @@ Object.keys(_secureSession).forEach(function (key) {
43
108
  });
44
109
  });
45
110
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
111
+ // Zero-Config Authentication Exports
112
+
46
113
  // Remove all FormData, form-data, and polyfill logic. Delete uploadFile and uploadFiles methods. Add a comment to use the new raw upload approach instead.
47
114
 
48
115
  // Import secure session types
@@ -57,24 +124,54 @@ const OXY_CLOUD_URL = exports.OXY_CLOUD_URL = 'https://cloud.oxy.so';
57
124
  /**
58
125
  * OxyServices - Client library for interacting with the Oxy API
59
126
  *
60
- * Note: For authentication status in UI components, use `isAuthenticated` from useOxy() context
127
+ * ZERO-CONFIG MODE:
128
+ * Use the new AuthProvider and useAuth hooks for automatic authentication management:
129
+ *
130
+ * import { AuthProvider, useAuth } from '@oxyhq/services';
131
+ *
132
+ * <AuthProvider baseURL="https://api.oxy.so">
133
+ * <App />
134
+ * </AuthProvider>
135
+ *
136
+ * Then in components:
137
+ * const { login, user, isAuthenticated } = useAuth();
138
+ *
139
+ * LEGACY MODE:
140
+ * The OxyServices class below is maintained for backward compatibility
141
+ * but we recommend migrating to the new zero-config approach.
142
+ *
143
+ * Note: For authentication status in UI components, use `isAuthenticated` from useAuth() context
61
144
  * instead of checking token status directly on this service.
62
145
  */
63
146
  class OxyServices {
64
147
  accessToken = null;
65
148
  refreshToken = null;
66
149
  refreshPromise = null;
150
+ authManager = null;
67
151
 
68
152
  /**
69
153
  * Creates a new instance of the OxyServices client
70
154
  * @param config - Configuration for the client
71
155
  */
72
156
  constructor(config) {
73
- this.client = _axios.default.create({
74
- baseURL: config.baseURL,
75
- timeout: 10000 // 10 second timeout
76
- });
157
+ // Try to use the new auth manager if available, otherwise fall back to legacy mode
158
+ try {
159
+ this.authManager = (0, _authManager.initializeAuth)(config.baseURL);
160
+ this.client = this.authManager.getClient();
161
+ } catch {
162
+ // Fall back to legacy implementation
163
+ this.client = _axios.default.create({
164
+ baseURL: config.baseURL,
165
+ timeout: 10000 // 10 second timeout
166
+ });
167
+ this.setupLegacyInterceptors();
168
+ }
169
+ }
77
170
 
171
+ /**
172
+ * Setup legacy interceptors (only used if auth manager is not available)
173
+ */
174
+ setupLegacyInterceptors() {
78
175
  // Interceptor for adding auth header and handling token refresh
79
176
  this.client.interceptors.request.use(async req => {
80
177
  if (!this.accessToken) {