@explorins/pers-sdk 1.6.11 → 1.6.12

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 (69) hide show
  1. package/dist/chunks/{explorer.utils-Bq1zyCPD.cjs → explorer.utils-BfWBpq26.cjs} +217 -252
  2. package/dist/chunks/explorer.utils-BfWBpq26.cjs.map +1 -0
  3. package/dist/chunks/{explorer.utils-D7EVBxr7.js → explorer.utils-O4TGwQB1.js} +217 -252
  4. package/dist/chunks/explorer.utils-O4TGwQB1.js.map +1 -0
  5. package/dist/chunks/index-60201NKa.js +265 -0
  6. package/dist/chunks/index-60201NKa.js.map +1 -0
  7. package/dist/chunks/index-CcQkbZBZ.cjs +269 -0
  8. package/dist/chunks/index-CcQkbZBZ.cjs.map +1 -0
  9. package/dist/chunks/{pers-sdk-DoLwmPFK.js → pers-sdk-CpK-yTid.js} +31 -99
  10. package/dist/chunks/pers-sdk-CpK-yTid.js.map +1 -0
  11. package/dist/chunks/{pers-sdk-DLSGm4gV.cjs → pers-sdk-nfljnU3z.cjs} +35 -103
  12. package/dist/chunks/pers-sdk-nfljnU3z.cjs.map +1 -0
  13. package/dist/chunks/{web3-chain-service-D75TcHkh.cjs → web3-chain-service-CCs1U95-.cjs} +191 -109
  14. package/dist/chunks/web3-chain-service-CCs1U95-.cjs.map +1 -0
  15. package/dist/chunks/{web3-chain-service-Dp5Z8p9I.js → web3-chain-service-DniirmTp.js} +190 -110
  16. package/dist/chunks/web3-chain-service-DniirmTp.js.map +1 -0
  17. package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
  18. package/dist/core/auth/refresh-manager.d.ts.map +1 -1
  19. package/dist/core/auth/services/auth-service.d.ts +5 -0
  20. package/dist/core/auth/services/auth-service.d.ts.map +1 -1
  21. package/dist/core/cache/cache.service.d.ts +82 -0
  22. package/dist/core/cache/cache.service.d.ts.map +1 -0
  23. package/dist/core/cache/index.d.ts +13 -0
  24. package/dist/core/cache/index.d.ts.map +1 -0
  25. package/dist/core/index.d.ts +1 -0
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/pers-api-client.d.ts.map +1 -1
  28. package/dist/core.cjs +7 -3
  29. package/dist/core.cjs.map +1 -1
  30. package/dist/core.js +4 -3
  31. package/dist/core.js.map +1 -1
  32. package/dist/index.cjs +9 -5
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.js +4 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/package.json +1 -1
  37. package/dist/web3/domain/services/metadata-domain.service.d.ts +6 -1
  38. package/dist/web3/domain/services/metadata-domain.service.d.ts.map +1 -1
  39. package/dist/web3/domain/services/token-domain.service.d.ts +24 -22
  40. package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
  41. package/dist/web3/infrastructure/api/ipfs-api.d.ts +6 -1
  42. package/dist/web3/infrastructure/api/ipfs-api.d.ts.map +1 -1
  43. package/dist/web3-chain/api/web3-chain-api.d.ts +0 -1
  44. package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -1
  45. package/dist/web3-chain/services/getWeb3FCD.service.d.ts +2 -10
  46. package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
  47. package/dist/web3-chain/services/web3-chain-service.d.ts +11 -5
  48. package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -1
  49. package/dist/web3-chain.cjs +2 -1
  50. package/dist/web3-chain.cjs.map +1 -1
  51. package/dist/web3-chain.js +2 -1
  52. package/dist/web3-chain.js.map +1 -1
  53. package/dist/web3.cjs +2 -1
  54. package/dist/web3.cjs.map +1 -1
  55. package/dist/web3.js +2 -1
  56. package/dist/web3.js.map +1 -1
  57. package/package.json +1 -1
  58. package/dist/chunks/explorer.utils-Bq1zyCPD.cjs.map +0 -1
  59. package/dist/chunks/explorer.utils-D7EVBxr7.js.map +0 -1
  60. package/dist/chunks/pers-sdk-DLSGm4gV.cjs.map +0 -1
  61. package/dist/chunks/pers-sdk-DoLwmPFK.js.map +0 -1
  62. package/dist/chunks/web3-chain-service-D75TcHkh.cjs.map +0 -1
  63. package/dist/chunks/web3-chain-service-Dp5Z8p9I.js.map +0 -1
  64. package/dist/web3-chain/services/ethers-provider.service.d.ts +0 -11
  65. package/dist/web3-chain/services/ethers-provider.service.d.ts.map +0 -1
  66. package/dist/web3-chain/services/public-http-provider.service.d.ts +0 -1
  67. package/dist/web3-chain/services/public-http-provider.service.d.ts.map +0 -1
  68. package/dist/web3-chain/services/web3-provider.service.d.ts +0 -1
  69. package/dist/web3-chain/services/web3-provider.service.d.ts.map +0 -1
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var index = require('./index-CcQkbZBZ.cjs');
3
4
  var ethers = require('@explorins/web3-ts/ethers');
4
5
 
5
6
  /**
@@ -28,6 +29,139 @@ const isTokenExpired = (token, margin = 60) => {
28
29
  }
29
30
  };
30
31
 
32
+ /**
33
+ * PERS SDK Error Handling - Optimized for Performance
34
+ *
35
+ * Consolidated API and auth errors for fast SDK performance
36
+ * Uses @explorins/pers-shared when available, fallback to SDK errors
37
+ */
38
+ // Fast type guards and utilities
39
+ class ErrorUtils {
40
+ /**
41
+ * Fast token expiration detection
42
+ */
43
+ static isTokenExpiredError(error) {
44
+ console.log('Checking if error is token expired error:', error);
45
+ if (typeof error !== 'object' || error === null)
46
+ return false;
47
+ const err = error;
48
+ const apiError = err?.error || err?.response?.data || err;
49
+ const status = err?.status || err?.response?.status || err?.statusCode;
50
+ // Explicit token expired messages
51
+ if (apiError?.code === 'TOKEN_EXPIRED' || apiError?.errorCode === 'TOKEN_EXPIRED') {
52
+ return true;
53
+ }
54
+ // Any 401 Unauthorized error should be treated as token expiration for auth flows
55
+ if (status === 401) {
56
+ return true;
57
+ }
58
+ // Check for token-related messages in other error formats
59
+ const message = apiError?.message || err?.message || '';
60
+ if (message && typeof message === 'string') {
61
+ const lowerMessage = message.toLowerCase();
62
+ return lowerMessage.includes('token') ||
63
+ lowerMessage.includes('unauthorized') ||
64
+ lowerMessage.includes('authentication');
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Fast error message extraction
70
+ */
71
+ static getMessage(error) {
72
+ if (typeof error !== 'object' || error === null)
73
+ return 'Unknown error';
74
+ const err = error;
75
+ const apiError = err?.error || err?.response?.data || err;
76
+ return apiError?.message || apiError?.detail || err?.message || 'Request failed';
77
+ }
78
+ /**
79
+ * Fast status code extraction
80
+ */
81
+ static getStatus(error) {
82
+ if (typeof error !== 'object' || error === null)
83
+ return null;
84
+ const err = error;
85
+ return err?.status || err?.statusCode || err?.response?.status || null;
86
+ }
87
+ /**
88
+ * Fast retryability check
89
+ */
90
+ static isRetryable(error) {
91
+ if (typeof error !== 'object' || error === null)
92
+ return false;
93
+ const err = error;
94
+ // Check explicit retryable property first (fastest)
95
+ if (typeof err?.retryable === 'boolean')
96
+ return err.retryable;
97
+ // Fast status-based check
98
+ const status = ErrorUtils.getStatus(error);
99
+ return status === null || status >= 500 || status === 429;
100
+ }
101
+ /**
102
+ * Check if error is from PERS API (uses @explorins/pers-shared format)
103
+ */
104
+ static isPersApiError(error) {
105
+ return typeof error === 'object' && error !== null &&
106
+ 'errorCode' in error && 'domain' in error && 'category' in error;
107
+ }
108
+ }
109
+ // SDK-specific error classes for auth flows
110
+ class TokenRefreshNeeded extends Error {
111
+ constructor(refreshToken) {
112
+ super('Token refresh needed');
113
+ this.refreshToken = refreshToken;
114
+ this.errorCode = 'TOKEN_REFRESH_NEEDED';
115
+ this.domain = 'auth';
116
+ this.category = 'SECURITY';
117
+ this.retryable = true;
118
+ this.name = 'TokenRefreshNeeded';
119
+ }
120
+ }
121
+ class ProviderTokenRefreshNeeded extends Error {
122
+ constructor(providerToken) {
123
+ super('Provider token refresh needed');
124
+ this.providerToken = providerToken;
125
+ this.errorCode = 'PROVIDER_TOKEN_REFRESH_NEEDED';
126
+ this.domain = 'auth';
127
+ this.category = 'SECURITY';
128
+ this.retryable = true;
129
+ this.name = 'ProviderTokenRefreshNeeded';
130
+ }
131
+ }
132
+ class LogoutRequired extends Error {
133
+ constructor(message) {
134
+ super(message);
135
+ this.errorCode = 'LOGOUT_REQUIRED';
136
+ this.domain = 'auth';
137
+ this.category = 'SECURITY';
138
+ this.retryable = false;
139
+ this.name = 'LogoutRequired';
140
+ }
141
+ }
142
+ class PersApiError extends Error {
143
+ constructor(message, endpoint, method, status, retryable = false) {
144
+ super(`API request failed: ${message}`);
145
+ this.endpoint = endpoint;
146
+ this.method = method;
147
+ this.status = status;
148
+ this.errorCode = 'PERS_API_ERROR';
149
+ this.domain = 'api';
150
+ this.category = 'TECHNICAL';
151
+ this.name = 'PersApiError';
152
+ this.retryable = retryable;
153
+ }
154
+ }
155
+ const ApiErrorDetector = {
156
+ getErrorMessage: (error) => ErrorUtils.getMessage(error),
157
+ getStatusCode: (error) => ErrorUtils.getStatus(error),
158
+ isRetryable: (error) => ErrorUtils.isRetryable(error),
159
+ isAuthError: (error) => error instanceof TokenRefreshNeeded ||
160
+ error instanceof ProviderTokenRefreshNeeded ||
161
+ error instanceof LogoutRequired ||
162
+ ErrorUtils.isTokenExpiredError(error)
163
+ };
164
+
31
165
  /**
32
166
  * Platform-Agnostic Web3 Chain API Client
33
167
  *
@@ -44,7 +178,6 @@ class Web3ChainApi {
44
178
  // ==========================================
45
179
  /**
46
180
  * PUBLIC: Get chain data by chain ID
47
- * ✅ Returns ChainData exactly as framework expects from @explorins/web3-ts
48
181
  */
49
182
  async getChainData(chainId) {
50
183
  try {
@@ -82,25 +215,21 @@ const getWeb3ProviderFromChainData = (chainData, timeout = 15000, customUserAgen
82
215
  if (customUserAgentName) {
83
216
  fetchRequest.setHeader('User-Agent', customUserAgentName);
84
217
  }
85
- ethersProvider = new ethers.JsonRpcProvider(fetchRequest, undefined, {
86
- staticNetwork: false,
218
+ ethersProvider = new ethers.JsonRpcProvider(fetchRequest, chainData.chainId, {
219
+ staticNetwork: true, // PREVENT eth_chainId calls - we know the chain
87
220
  polling: false,
88
- batchMaxCount: 1, // DISABLE BATCHING: Better for private chains
221
+ batchMaxCount: 1, // DISABLE BATCHING: Better for private chains
89
222
  });
90
223
  }
91
224
  else {
92
225
  // ✅ PUBLIC: For public chains
93
- ethersProvider = new ethers.JsonRpcProvider(chainData.rpcUrl, undefined, {
94
- staticNetwork: false,
226
+ ethersProvider = new ethers.JsonRpcProvider(chainData.rpcUrl, chainData.chainId, {
227
+ staticNetwork: true, // PREVENT eth_chainId calls - we know the chain
95
228
  polling: false,
96
229
  });
97
230
  }
98
231
  console.log(`✅ [getWeb3FCD] Provider created successfully`);
99
- return {
100
- web3Provider: null,
101
- ethersProvider: ethersProvider,
102
- isAuthenticated: !!chainData.authHeader,
103
- };
232
+ return ethersProvider;
104
233
  };
105
234
  // ✅ NEW: Async wrapper with retry for higher-level usage
106
235
  const getWeb3ProviderWithRetry = async (chainData, timeout = 15000, customUserAgentName = '', tokenRefresher, retryConfig = { maxAttempts: 3, baseDelay: 1000, maxDelay: 8000 }) => {
@@ -110,7 +239,7 @@ const getWeb3ProviderWithRetry = async (chainData, timeout = 15000, customUserAg
110
239
  console.log(`🔄 [Web3Provider] Attempt ${attempt}/${retryConfig.maxAttempts} for chain ${chainData.chainId || 'unknown'}`);
111
240
  // ✅ SYNC CALL: Use the original sync function
112
241
  const provider = getWeb3ProviderFromChainData(chainData, timeout, customUserAgentName, tokenRefresher);
113
- await validateChainConnection(provider.ethersProvider, chainData.authHeader ? 'private' : 'public');
242
+ await validateChainConnection(provider, chainData.authHeader ? 'private' : 'public');
114
243
  console.log(`✅ [Web3Provider] Successfully connected on attempt ${attempt}`);
115
244
  return provider;
116
245
  }
@@ -118,7 +247,7 @@ const getWeb3ProviderWithRetry = async (chainData, timeout = 15000, customUserAg
118
247
  lastError = error instanceof Error ? error : new Error(String(error));
119
248
  console.warn(`⚠️ [Web3Provider] Attempt ${attempt} failed:`, lastError.message);
120
249
  // ✅ NO RETRY: if auth error, no retry
121
- if (isAuthError(lastError) && chainData.authHeader) {
250
+ if (ApiErrorDetector.isAuthError(lastError) && chainData.authHeader) {
122
251
  console.error(`❌ [Web3Provider] Auth error, stopping retries`);
123
252
  break;
124
253
  }
@@ -159,154 +288,107 @@ async function validateChainConnection(provider, chainType) {
159
288
  }
160
289
  }
161
290
  }
162
- // ✅ HELPER: Auth error detection
163
- function isAuthError(error) {
164
- const message = error.message.toLowerCase();
165
- return (message.includes('unauthorized') ||
166
- message.includes('401') ||
167
- message.includes('token expired') ||
168
- message.includes('-40100'));
169
- }
170
291
  // ✅ HELPER: Sleep utility
171
292
  function sleep(ms) {
172
293
  return new Promise(resolve => setTimeout(resolve, ms));
173
294
  }
174
295
 
175
- class EthersProviderService {
176
- constructor() {
177
- this._provider = null;
178
- this._currentChainId = null;
179
- this._creationPromise = null;
180
- console.log('[PERS SDK] EthersProviderService initialized with enhanced instanceof handling');
181
- }
182
- async getEthersProvider(chainId, chainType, chainData) {
183
- // ✅ EARLY RETURN: Reuse existing provider
184
- if (this._provider && this._currentChainId === chainId) {
185
- return this._provider;
186
- }
187
- // ✅ PREVENT RACE CONDITION: Wait for ongoing creation
188
- if (this._creationPromise) {
189
- return await this._creationPromise;
190
- }
191
- if (!chainId)
192
- throw new Error('ChainId not found');
193
- if (!chainData)
194
- throw new Error('ChainData not found');
195
- // ✅ CREATE AND CACHE: Single promise for concurrent calls
196
- const ethersPromise = this.createEthersProvider(chainId, chainType, chainData);
197
- try {
198
- const { web3Provider, ethersProvider, isAuthenticated } = await ethersPromise;
199
- this._provider = ethersProvider;
200
- this._currentChainId = chainId;
201
- return ethersProvider;
202
- }
203
- finally {
204
- // ✅ CLEANUP: Always reset promise after completion
205
- this._creationPromise = null;
206
- }
207
- }
208
- async createEthersProvider(chainId, chainType, chainData) {
209
- console.log(`🔧 [createProvider] Creating provider for chain ${chainId}`);
210
- const provider = await getWeb3ProviderWithRetry(chainData);
211
- return provider;
212
- }
213
- }
214
-
215
296
  class Web3ChainService {
216
297
  constructor(web3ChainApi) {
217
298
  this.web3ChainApi = web3ChainApi;
218
- this.web3InstanceCache = new Map();
219
- // TODO: Fix any
220
- this.providerCache = new Map();
221
- // private providerService: Web3ProviderService = new Web3ProviderService();
222
- this.ethersProviderService = new EthersProviderService();
299
+ this.cache = index.globalCacheService.createNamespace('web3-chain');
223
300
  }
224
301
  async getEthersProviderByChainId(chainId) {
225
- const cached = this.providerCache.get(chainId);
226
- // ✅ SMART CACHE: Check if cache is valid based on token expiration
227
- if (cached && !this.checkIsTokenExpired(cached.authHeader)) {
228
- // Using cached provider
302
+ const cacheKey = `provider:${chainId}`;
303
+ // Check if we have a valid cached provider
304
+ const cached = this.cache.get(cacheKey);
305
+ if (cached && !this.checkIsTokenExpired(cached.chainData.authHeader)) {
229
306
  return cached.provider;
230
307
  }
231
308
  try {
232
- // Creating new Web3 instance
309
+ // Create new provider instance
233
310
  const { provider, chainData } = await this.createProviderInstance(chainId);
234
- this.providerCache.set(chainId, {
311
+ // Cache the provider with chain data
312
+ const cacheEntry = {
235
313
  provider,
236
314
  chainData,
237
315
  createdAt: Date.now(),
238
316
  chainId
239
- });
317
+ };
318
+ this.cache.set(cacheKey, cacheEntry, index.CacheTTL.PROVIDER);
240
319
  return provider;
241
320
  }
242
321
  catch (error) {
243
322
  // ✅ AUTH ERROR RECOVERY: Clear cache and retry once
244
- if (this.isAuthError(error)) {
245
- // Auth error detected, clearing cache and retrying
246
- this.providerCache.delete(chainId);
323
+ if (ApiErrorDetector.isAuthError(error)) {
324
+ this.cache.delete(cacheKey);
247
325
  // Retry once with fresh instance
248
326
  const { provider, chainData } = await this.createProviderInstance(chainId);
249
- this.providerCache.set(chainId, {
327
+ const cacheEntry = {
250
328
  provider,
251
329
  chainData,
252
330
  createdAt: Date.now(),
253
331
  chainId
254
- });
332
+ };
333
+ this.cache.set(cacheKey, cacheEntry, index.CacheTTL.PROVIDER);
255
334
  return provider;
256
335
  }
257
336
  throw error;
258
337
  }
259
338
  }
260
339
  async createProviderInstance(chainId) {
261
- const chainData = await this.getChainDataById(chainId);
340
+ const chainData = await this.getChainDataWithCache(chainId);
262
341
  if (!chainData) {
263
342
  throw new Error(`Chain data not found for chainId: ${chainId}`);
264
343
  }
265
- const provider = await this.ethersProviderService.getEthersProvider(chainId, chainData.chainType || 'PUBLIC', chainData);
344
+ const provider = await getWeb3ProviderWithRetry(chainData);
266
345
  return { provider, chainData };
267
346
  }
268
347
  async getChainDataWithCache(chainId) {
269
- const cached = this.web3InstanceCache.get(chainId);
270
- //const now = Date.now();
271
- if (cached && !this.checkIsTokenExpired(cached.chainData.authHeader)) {
272
- // Using cached ChainData
273
- return cached.chainData;
274
- }
275
- // If not cached, fetch fresh data
276
- const chainData = await this.getChainDataById(chainId);
277
- if (!chainData) {
278
- throw new Error(`Chain data not found for chainId: ${chainId}`);
348
+ const cacheKey = `chainData:${chainId}`;
349
+ // First check if we have it in the provider cache (includes token validation)
350
+ const providerCached = this.cache.get(`provider:${chainId}`);
351
+ if (providerCached && !this.checkIsTokenExpired(providerCached.chainData.authHeader)) {
352
+ return providerCached.chainData;
279
353
  }
280
- return chainData;
354
+ // Otherwise use getOrSet for chainData only
355
+ return this.cache.getOrSet(cacheKey, async () => {
356
+ const chainData = await this.web3ChainApi.getChainData(chainId);
357
+ if (!chainData) {
358
+ throw new Error(`Chain data not found for chainId: ${chainId}`);
359
+ }
360
+ return chainData;
361
+ }, index.CacheTTL.MEDIUM // 30 minutes for chain data
362
+ );
281
363
  }
282
364
  checkIsTokenExpired(authHeader) {
283
- // NULL CHECK: Handle undefined case
365
+ // NULL CHECK: Handle undefined case
284
366
  if (!authHeader) {
285
367
  return false; // No token means no expiration (public chains)
286
368
  }
287
- // FUNCTION CALL: Use imported function, not method
369
+ // FUNCTION CALL: Use imported function, not method
288
370
  return isTokenExpired(authHeader);
289
371
  }
290
- // ✅ HELPER: Type-safe error checking
291
- isAuthError(error) {
292
- const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
293
- return (message.includes('unauthorized') ||
294
- message.includes('401') ||
295
- message.includes('token expired') ||
296
- message.includes('invalid token'));
372
+ /**
373
+ * Clear all cached providers and chain data
374
+ * Useful for logout scenarios or when authentication context changes
375
+ */
376
+ clearCache() {
377
+ this.cache.clear();
297
378
  }
298
- async getChainDataById(chainId) {
299
- try {
300
- return await this.web3ChainApi.getChainData(chainId);
301
- }
302
- catch (error) {
303
- console.error('❌ [SDK Web3ChainService] Error getting chain data for chainId:', chainId, error);
304
- return null;
305
- }
379
+ /**
380
+ * Clear cache for a specific chain
381
+ * Useful when a specific chain's authentication fails
382
+ */
383
+ clearCacheForChain(chainId) {
384
+ this.cache.delete(`provider:${chainId}`);
385
+ this.cache.delete(`chainData:${chainId}`);
306
386
  }
307
387
  }
308
388
 
389
+ exports.ErrorUtils = ErrorUtils;
390
+ exports.PersApiError = PersApiError;
309
391
  exports.Web3ChainApi = Web3ChainApi;
310
392
  exports.Web3ChainService = Web3ChainService;
311
393
  exports.isTokenExpired = isTokenExpired;
312
- //# sourceMappingURL=web3-chain-service-D75TcHkh.cjs.map
394
+ //# sourceMappingURL=web3-chain-service-CCs1U95-.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web3-chain-service-CCs1U95-.cjs","sources":["../../src/core/utils/jwt.function.ts","../../src/core/errors/index.ts","../../src/web3-chain/api/web3-chain-api.ts","../../src/web3-chain/services/getWeb3FCD.service.ts","../../src/web3-chain/services/web3-chain-service.ts"],"sourcesContent":[null,null,null,null,null],"names":["FetchRequest","JsonRpcProvider","globalCacheService","CacheTTL"],"mappings":"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"}