@pooflabs/web 0.0.79 → 0.0.80

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 (72) hide show
  1. package/dist/{index-DwU9hjtr.js → index-BNyxZ82q.js} +365 -23
  2. package/dist/index-BNyxZ82q.js.map +1 -0
  3. package/dist/{index-zS_Y-wbi.js → index-BVi7fTm2.js} +2 -2
  4. package/dist/{index-zS_Y-wbi.js.map → index-BVi7fTm2.js.map} +1 -1
  5. package/dist/{index-CiwYJvf8.esm.js → index-BbtYb8sE.esm.js} +3 -3
  6. package/dist/{index-CiwYJvf8.esm.js.map → index-BbtYb8sE.esm.js.map} +1 -1
  7. package/dist/{index-BHGEc97p.js → index-BhfNMrC0.js} +3 -3
  8. package/dist/{index-BHGEc97p.js.map → index-BhfNMrC0.js.map} +1 -1
  9. package/dist/index-CKIoDkjJ.esm.js +6 -0
  10. package/dist/index-CKIoDkjJ.esm.js.map +1 -0
  11. package/dist/{index-U-xlsKRI.esm.js → index-COIUWugk.esm.js} +2 -2
  12. package/dist/{index-U-xlsKRI.esm.js.map → index-COIUWugk.esm.js.map} +1 -1
  13. package/dist/{index-D9BY44i-.js → index-CSraUgD6.js} +2 -2
  14. package/dist/index-CSraUgD6.js.map +1 -0
  15. package/dist/{index-CsIXFm8d.esm.js → index-Db0NqU8R.esm.js} +365 -23
  16. package/dist/index-Db0NqU8R.esm.js.map +1 -0
  17. package/dist/{index.browser-Cpi4W_1r.js → index.browser-8hyi2LOX.js} +1696 -1366
  18. package/dist/index.browser-8hyi2LOX.js.map +1 -0
  19. package/dist/{index.browser-Dbq5Qf1G.esm.js → index.browser-B4zXnffD.esm.js} +81 -98
  20. package/dist/index.browser-B4zXnffD.esm.js.map +1 -0
  21. package/dist/{index.browser-Df7yN8D5.js → index.browser-BJ_TdUVA.js} +80 -97
  22. package/dist/index.browser-BJ_TdUVA.js.map +1 -0
  23. package/dist/index.browser-BkNaRRVe.js +1222 -0
  24. package/dist/index.browser-BkNaRRVe.js.map +1 -0
  25. package/dist/{index.browser-CMEwqnEe.esm.js → index.browser-BuHl80dp.esm.js} +1696 -1366
  26. package/dist/index.browser-BuHl80dp.esm.js.map +1 -0
  27. package/dist/index.browser-CnbxBj3-.esm.js +1219 -0
  28. package/dist/index.browser-CnbxBj3-.esm.js.map +1 -0
  29. package/dist/index.browser-OvGNsMPu.esm.js +1002 -0
  30. package/dist/index.browser-OvGNsMPu.esm.js.map +1 -0
  31. package/dist/index.browser-vuTr40so.js +1008 -0
  32. package/dist/index.browser-vuTr40so.js.map +1 -0
  33. package/dist/index.esm.js +1 -1
  34. package/dist/index.js +1 -1
  35. package/dist/{index.native-DtxPWD00.js → index.native-DUnE51Mx.js} +365 -23
  36. package/dist/index.native-DUnE51Mx.js.map +1 -0
  37. package/dist/{index.native-CEf5PJ_g.esm.js → index.native-DuKhZcus.esm.js} +365 -23
  38. package/dist/index.native-DuKhZcus.esm.js.map +1 -0
  39. package/dist/index.native.esm.js +1 -1
  40. package/dist/index.native.js +1 -1
  41. package/dist/{phantom-wallet-provider-B0UmUtfB.esm.js → phantom-wallet-provider--BJjVUA1.esm.js} +4 -4
  42. package/dist/{phantom-wallet-provider-B0UmUtfB.esm.js.map → phantom-wallet-provider--BJjVUA1.esm.js.map} +1 -1
  43. package/dist/{phantom-wallet-provider-BbyQIlro.js → phantom-wallet-provider-Cg-srwP4.js} +4 -4
  44. package/dist/{phantom-wallet-provider-BbyQIlro.js.map → phantom-wallet-provider-Cg-srwP4.js.map} +1 -1
  45. package/dist/{privy-wallet-provider-DGjYglh7.esm.js → privy-wallet-provider-BLcur3Ue.esm.js} +3 -3
  46. package/dist/{privy-wallet-provider-DGjYglh7.esm.js.map → privy-wallet-provider-BLcur3Ue.esm.js.map} +1 -1
  47. package/dist/{privy-wallet-provider-CoQzq0F4.js → privy-wallet-provider-DpNVyaXa.js} +3 -3
  48. package/dist/{privy-wallet-provider-CoQzq0F4.js.map → privy-wallet-provider-DpNVyaXa.js.map} +1 -1
  49. package/dist/{solana-mobile-wallet-provider-DIyP-Az5.esm.js → solana-mobile-wallet-provider-CFaubssb.esm.js} +4 -4
  50. package/dist/{solana-mobile-wallet-provider-DIyP-Az5.esm.js.map → solana-mobile-wallet-provider-CFaubssb.esm.js.map} +1 -1
  51. package/dist/{solana-mobile-wallet-provider-BLoovRsJ.js → solana-mobile-wallet-provider-zXAk2tfS.js} +4 -4
  52. package/dist/{solana-mobile-wallet-provider-BLoovRsJ.js.map → solana-mobile-wallet-provider-zXAk2tfS.js.map} +1 -1
  53. package/package.json +24 -24
  54. package/dist/index-6pNPzV1t.esm.js +0 -6
  55. package/dist/index-6pNPzV1t.esm.js.map +0 -1
  56. package/dist/index-CsIXFm8d.esm.js.map +0 -1
  57. package/dist/index-D9BY44i-.js.map +0 -1
  58. package/dist/index-DwU9hjtr.js.map +0 -1
  59. package/dist/index.browser-C-_FEr5M.esm.js +0 -1134
  60. package/dist/index.browser-C-_FEr5M.esm.js.map +0 -1
  61. package/dist/index.browser-C9bFQZyQ.esm.js +0 -1373
  62. package/dist/index.browser-C9bFQZyQ.esm.js.map +0 -1
  63. package/dist/index.browser-CMEwqnEe.esm.js.map +0 -1
  64. package/dist/index.browser-Cpi4W_1r.js.map +0 -1
  65. package/dist/index.browser-Dbq5Qf1G.esm.js.map +0 -1
  66. package/dist/index.browser-Df7yN8D5.js.map +0 -1
  67. package/dist/index.browser-DjEZSiqI.js +0 -1137
  68. package/dist/index.browser-DjEZSiqI.js.map +0 -1
  69. package/dist/index.browser-dszs5oe5.js +0 -1376
  70. package/dist/index.browser-dszs5oe5.js.map +0 -1
  71. package/dist/index.native-CEf5PJ_g.esm.js.map +0 -1
  72. package/dist/index.native-DtxPWD00.js.map +0 -1
@@ -6394,6 +6394,261 @@ var ReconnectingWebSocket = /** @class */ (function () {
6394
6394
  return ReconnectingWebSocket;
6395
6395
  }());
6396
6396
 
6397
+ function getDefaultExportFromCjs (x) {
6398
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
6399
+ }
6400
+
6401
+ var isRetryAllowed$1;
6402
+ var hasRequiredIsRetryAllowed;
6403
+
6404
+ function requireIsRetryAllowed () {
6405
+ if (hasRequiredIsRetryAllowed) return isRetryAllowed$1;
6406
+ hasRequiredIsRetryAllowed = 1;
6407
+
6408
+ const denyList = new Set([
6409
+ 'ENOTFOUND',
6410
+ 'ENETUNREACH',
6411
+
6412
+ // SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328
6413
+ 'UNABLE_TO_GET_ISSUER_CERT',
6414
+ 'UNABLE_TO_GET_CRL',
6415
+ 'UNABLE_TO_DECRYPT_CERT_SIGNATURE',
6416
+ 'UNABLE_TO_DECRYPT_CRL_SIGNATURE',
6417
+ 'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',
6418
+ 'CERT_SIGNATURE_FAILURE',
6419
+ 'CRL_SIGNATURE_FAILURE',
6420
+ 'CERT_NOT_YET_VALID',
6421
+ 'CERT_HAS_EXPIRED',
6422
+ 'CRL_NOT_YET_VALID',
6423
+ 'CRL_HAS_EXPIRED',
6424
+ 'ERROR_IN_CERT_NOT_BEFORE_FIELD',
6425
+ 'ERROR_IN_CERT_NOT_AFTER_FIELD',
6426
+ 'ERROR_IN_CRL_LAST_UPDATE_FIELD',
6427
+ 'ERROR_IN_CRL_NEXT_UPDATE_FIELD',
6428
+ 'OUT_OF_MEM',
6429
+ 'DEPTH_ZERO_SELF_SIGNED_CERT',
6430
+ 'SELF_SIGNED_CERT_IN_CHAIN',
6431
+ 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',
6432
+ 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
6433
+ 'CERT_CHAIN_TOO_LONG',
6434
+ 'CERT_REVOKED',
6435
+ 'INVALID_CA',
6436
+ 'PATH_LENGTH_EXCEEDED',
6437
+ 'INVALID_PURPOSE',
6438
+ 'CERT_UNTRUSTED',
6439
+ 'CERT_REJECTED',
6440
+ 'HOSTNAME_MISMATCH'
6441
+ ]);
6442
+
6443
+ // TODO: Use `error?.code` when targeting Node.js 14
6444
+ isRetryAllowed$1 = error => !denyList.has(error && error.code);
6445
+ return isRetryAllowed$1;
6446
+ }
6447
+
6448
+ var isRetryAllowedExports = requireIsRetryAllowed();
6449
+ var isRetryAllowed = /*@__PURE__*/getDefaultExportFromCjs(isRetryAllowedExports);
6450
+
6451
+ const namespace = 'axios-retry';
6452
+ function isNetworkError(error) {
6453
+ const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];
6454
+ if (error.response) {
6455
+ return false;
6456
+ }
6457
+ if (!error.code) {
6458
+ return false;
6459
+ }
6460
+ // Prevents retrying timed out & cancelled requests
6461
+ if (CODE_EXCLUDE_LIST.includes(error.code)) {
6462
+ return false;
6463
+ }
6464
+ // Prevents retrying unsafe errors
6465
+ return isRetryAllowed(error);
6466
+ }
6467
+ const SAFE_HTTP_METHODS = ['get', 'head', 'options'];
6468
+ const IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);
6469
+ function isRetryableError(error) {
6470
+ return (error.code !== 'ECONNABORTED' &&
6471
+ (!error.response ||
6472
+ error.response.status === 429 ||
6473
+ (error.response.status >= 500 && error.response.status <= 599)));
6474
+ }
6475
+ function isSafeRequestError(error) {
6476
+ if (!error.config?.method) {
6477
+ // Cannot determine if the request can be retried
6478
+ return false;
6479
+ }
6480
+ return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;
6481
+ }
6482
+ function isIdempotentRequestError(error) {
6483
+ if (!error.config?.method) {
6484
+ // Cannot determine if the request can be retried
6485
+ return false;
6486
+ }
6487
+ return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;
6488
+ }
6489
+ function isNetworkOrIdempotentRequestError(error) {
6490
+ return isNetworkError(error) || isIdempotentRequestError(error);
6491
+ }
6492
+ function retryAfter(error = undefined) {
6493
+ const retryAfterHeader = error?.response?.headers['retry-after'];
6494
+ if (!retryAfterHeader) {
6495
+ return 0;
6496
+ }
6497
+ // if the retry after header is a number, convert it to milliseconds
6498
+ let retryAfterMs = (Number(retryAfterHeader) || 0) * 1000;
6499
+ // If the retry after header is a date, get the number of milliseconds until that date
6500
+ if (retryAfterMs === 0) {
6501
+ retryAfterMs = (new Date(retryAfterHeader).valueOf() || 0) - Date.now();
6502
+ }
6503
+ return Math.max(0, retryAfterMs);
6504
+ }
6505
+ function noDelay(_retryNumber = 0, error = undefined) {
6506
+ return Math.max(0, retryAfter(error));
6507
+ }
6508
+ function exponentialDelay(retryNumber = 0, error = undefined, delayFactor = 100) {
6509
+ const calculatedDelay = 2 ** retryNumber * delayFactor;
6510
+ const delay = Math.max(calculatedDelay, retryAfter(error));
6511
+ const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay
6512
+ return delay + randomSum;
6513
+ }
6514
+ /**
6515
+ * Linear delay
6516
+ * @param {number | undefined} delayFactor - delay factor in milliseconds (default: 100)
6517
+ * @returns {function} (retryNumber: number, error: AxiosError | undefined) => number
6518
+ */
6519
+ function linearDelay(delayFactor = 100) {
6520
+ return (retryNumber = 0, error = undefined) => {
6521
+ const delay = retryNumber * delayFactor;
6522
+ return Math.max(delay, retryAfter(error));
6523
+ };
6524
+ }
6525
+ const DEFAULT_OPTIONS = {
6526
+ retries: 3,
6527
+ retryCondition: isNetworkOrIdempotentRequestError,
6528
+ retryDelay: noDelay,
6529
+ shouldResetTimeout: false,
6530
+ onRetry: () => { },
6531
+ onMaxRetryTimesExceeded: () => { },
6532
+ validateResponse: null
6533
+ };
6534
+ function getRequestOptions(config, defaultOptions) {
6535
+ return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };
6536
+ }
6537
+ function setCurrentState(config, defaultOptions, resetLastRequestTime = false) {
6538
+ const currentState = getRequestOptions(config, defaultOptions || {});
6539
+ currentState.retryCount = currentState.retryCount || 0;
6540
+ if (!currentState.lastRequestTime || resetLastRequestTime) {
6541
+ currentState.lastRequestTime = Date.now();
6542
+ }
6543
+ config[namespace] = currentState;
6544
+ return currentState;
6545
+ }
6546
+ function fixConfig(axiosInstance, config) {
6547
+ // @ts-ignore
6548
+ if (axiosInstance.defaults.agent === config.agent) {
6549
+ // @ts-ignore
6550
+ delete config.agent;
6551
+ }
6552
+ if (axiosInstance.defaults.httpAgent === config.httpAgent) {
6553
+ delete config.httpAgent;
6554
+ }
6555
+ if (axiosInstance.defaults.httpsAgent === config.httpsAgent) {
6556
+ delete config.httpsAgent;
6557
+ }
6558
+ }
6559
+ async function shouldRetry(currentState, error) {
6560
+ const { retries, retryCondition } = currentState;
6561
+ const shouldRetryOrPromise = (currentState.retryCount || 0) < retries && retryCondition(error);
6562
+ // This could be a promise
6563
+ if (typeof shouldRetryOrPromise === 'object') {
6564
+ try {
6565
+ const shouldRetryPromiseResult = await shouldRetryOrPromise;
6566
+ // keep return true unless shouldRetryPromiseResult return false for compatibility
6567
+ return shouldRetryPromiseResult !== false;
6568
+ }
6569
+ catch (_err) {
6570
+ return false;
6571
+ }
6572
+ }
6573
+ return shouldRetryOrPromise;
6574
+ }
6575
+ async function handleRetry(axiosInstance, currentState, error, config) {
6576
+ currentState.retryCount += 1;
6577
+ const { retryDelay, shouldResetTimeout, onRetry } = currentState;
6578
+ const delay = retryDelay(currentState.retryCount, error);
6579
+ // Axios fails merging this configuration to the default configuration because it has an issue
6580
+ // with circular structures: https://github.com/mzabriskie/axios/issues/370
6581
+ fixConfig(axiosInstance, config);
6582
+ if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {
6583
+ const lastRequestDuration = Date.now() - currentState.lastRequestTime;
6584
+ const timeout = config.timeout - lastRequestDuration - delay;
6585
+ if (timeout <= 0) {
6586
+ return Promise.reject(error);
6587
+ }
6588
+ config.timeout = timeout;
6589
+ }
6590
+ config.transformRequest = [(data) => data];
6591
+ await onRetry(currentState.retryCount, error, config);
6592
+ if (config.signal?.aborted) {
6593
+ return Promise.resolve(axiosInstance(config));
6594
+ }
6595
+ return new Promise((resolve) => {
6596
+ const abortListener = () => {
6597
+ clearTimeout(timeout);
6598
+ resolve(axiosInstance(config));
6599
+ };
6600
+ const timeout = setTimeout(() => {
6601
+ resolve(axiosInstance(config));
6602
+ if (config.signal?.removeEventListener) {
6603
+ config.signal.removeEventListener('abort', abortListener);
6604
+ }
6605
+ }, delay);
6606
+ if (config.signal?.addEventListener) {
6607
+ config.signal.addEventListener('abort', abortListener, { once: true });
6608
+ }
6609
+ });
6610
+ }
6611
+ async function handleMaxRetryTimesExceeded(currentState, error) {
6612
+ if (currentState.retryCount >= currentState.retries)
6613
+ await currentState.onMaxRetryTimesExceeded(error, currentState.retryCount);
6614
+ }
6615
+ const axiosRetry = (axiosInstance, defaultOptions) => {
6616
+ const requestInterceptorId = axiosInstance.interceptors.request.use((config) => {
6617
+ setCurrentState(config, defaultOptions, true);
6618
+ if (config[namespace]?.validateResponse) {
6619
+ // by setting this, all HTTP responses will be go through the error interceptor first
6620
+ config.validateStatus = () => false;
6621
+ }
6622
+ return config;
6623
+ });
6624
+ const responseInterceptorId = axiosInstance.interceptors.response.use(null, async (error) => {
6625
+ const { config } = error;
6626
+ // If we have no information to retry the request
6627
+ if (!config) {
6628
+ return Promise.reject(error);
6629
+ }
6630
+ const currentState = setCurrentState(config, defaultOptions);
6631
+ if (error.response && currentState.validateResponse?.(error.response)) {
6632
+ // no issue with response
6633
+ return error.response;
6634
+ }
6635
+ if (await shouldRetry(currentState, error)) {
6636
+ return handleRetry(axiosInstance, currentState, error, config);
6637
+ }
6638
+ await handleMaxRetryTimesExceeded(currentState, error);
6639
+ return Promise.reject(error);
6640
+ });
6641
+ return { requestInterceptorId, responseInterceptorId };
6642
+ };
6643
+ // Compatibility with CommonJS
6644
+ axiosRetry.isNetworkError = isNetworkError;
6645
+ axiosRetry.isSafeRequestError = isSafeRequestError;
6646
+ axiosRetry.isIdempotentRequestError = isIdempotentRequestError;
6647
+ axiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;
6648
+ axiosRetry.exponentialDelay = exponentialDelay;
6649
+ axiosRetry.linearDelay = linearDelay;
6650
+ axiosRetry.isRetryableError = isRetryableError;
6651
+
6397
6652
  let axiosClient;
6398
6653
  async function getAxiosAuthClient() {
6399
6654
  if (!axiosClient) {
@@ -6403,6 +6658,7 @@ async function getAxiosAuthClient() {
6403
6658
  headers: {
6404
6659
  'Content-Type': 'application/json',
6405
6660
  },
6661
+ timeout: 30000, // 30s timeout, matching makeApiRequest
6406
6662
  });
6407
6663
  }
6408
6664
  return axiosClient;
@@ -6449,15 +6705,41 @@ async function createSessionWithPrivy(authToken, address, privyIdToken) {
6449
6705
  });
6450
6706
  return response.data;
6451
6707
  }
6708
+ // Deduplicate concurrent refreshSession calls to prevent multiple code paths
6709
+ // (WebSocket reconnection, periodic refresh, API 401 retry) from all hitting
6710
+ // /session/refresh simultaneously.
6711
+ // Note: module-level state is shared across requests in SSR/Node — acceptable
6712
+ // since there is only one active session per server instance (same pattern as
6713
+ // refreshInFlight in api.ts).
6714
+ let refreshInFlight$1 = null;
6715
+ let refreshInFlightToken = null;
6452
6716
  async function refreshSession(refreshToken) {
6453
- const client = await getAxiosAuthClient();
6454
- const config = await getConfig();
6455
- const appId = config.appId;
6456
- const response = await client.post('/session/refresh', {
6457
- refreshToken,
6458
- appId
6459
- });
6460
- return response.data;
6717
+ if (refreshInFlight$1 && refreshInFlightToken === refreshToken) {
6718
+ return refreshInFlight$1;
6719
+ }
6720
+ refreshInFlightToken = refreshToken;
6721
+ let currentFlight;
6722
+ currentFlight = refreshInFlight$1 = (async () => {
6723
+ try {
6724
+ const client = await getAxiosAuthClient();
6725
+ const config = await getConfig();
6726
+ const appId = config.appId;
6727
+ const response = await client.post('/session/refresh', {
6728
+ refreshToken,
6729
+ appId
6730
+ });
6731
+ return response.data;
6732
+ }
6733
+ finally {
6734
+ // Only clear if we're still the active in-flight request.
6735
+ // A second call with a different token may have replaced us.
6736
+ if (refreshInFlight$1 === currentFlight) {
6737
+ refreshInFlight$1 = null;
6738
+ refreshInFlightToken = null;
6739
+ }
6740
+ }
6741
+ })();
6742
+ return refreshInFlight$1;
6461
6743
  }
6462
6744
  async function signSessionCreateMessage(_signMessageFunction) {
6463
6745
  }
@@ -6595,14 +6877,10 @@ class WebSessionManager {
6595
6877
  WebSessionManager.TAROBASE_SESSION_STORAGE_KEY = "tarobase_session_storage";
6596
6878
 
6597
6879
  var webSessionManager = /*#__PURE__*/Object.freeze({
6598
- __proto__: null,
6599
- WebSessionManager: WebSessionManager
6880
+ __proto__: null,
6881
+ WebSessionManager: WebSessionManager
6600
6882
  });
6601
6883
 
6602
- function getDefaultExportFromCjs (x) {
6603
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
6604
- }
6605
-
6606
6884
  var buffer$1 = {};
6607
6885
 
6608
6886
  var base64Js$1 = {};
@@ -9399,7 +9677,19 @@ async function buildSetDocumentsTransaction(connection, idl, anchorProvider, pay
9399
9677
  }
9400
9678
  }
9401
9679
  else if (lutKey != null) {
9402
- const { value: table } = await connection.getAddressLookupTable(new PublicKey(lutKey));
9680
+ // The LUT may have just been created server-side and the client's RPC node
9681
+ // may not have indexed it yet (load-balancer split). Retry with exponential
9682
+ // back-off; first retry at 100 ms almost always resolves it.
9683
+ let table = null;
9684
+ for (let attempt = 0; attempt < 5; attempt++) {
9685
+ const { value } = await connection.getAddressLookupTable(new PublicKey(lutKey));
9686
+ if (value) {
9687
+ table = value;
9688
+ break;
9689
+ }
9690
+ if (attempt < 4)
9691
+ await new Promise(r => setTimeout(r, 100 * Math.pow(2, attempt)));
9692
+ }
9403
9693
  if (!table)
9404
9694
  throw new Error('LUT not found after creation/extend');
9405
9695
  lookupTables.push(table);
@@ -9534,8 +9824,8 @@ class ServerSessionManager {
9534
9824
  ServerSessionManager.instance = new ServerSessionManager();
9535
9825
 
9536
9826
  var serverSessionManager = /*#__PURE__*/Object.freeze({
9537
- __proto__: null,
9538
- ServerSessionManager: ServerSessionManager
9827
+ __proto__: null,
9828
+ ServerSessionManager: ServerSessionManager
9539
9829
  });
9540
9830
 
9541
9831
  /**
@@ -9634,6 +9924,23 @@ async function updateIdTokenAndAccessToken(idToken, accessToken, isServer = fals
9634
9924
  await WebSessionManager.updateIdTokenAndAccessToken(idToken, accessToken);
9635
9925
  }
9636
9926
 
9927
+ const apiClient = globalAxios.create();
9928
+ axiosRetry(apiClient, {
9929
+ retries: 2,
9930
+ retryCondition: (error) => {
9931
+ var _a, _b;
9932
+ // Only retry GET requests on network errors (ECONNRESET, ETIMEDOUT, etc.)
9933
+ // Writes (POST/PUT) are not retried — the server may have processed
9934
+ // the request before the connection was reset.
9935
+ return axiosRetry.isNetworkError(error) && ((_b = (_a = error.config) === null || _a === void 0 ? void 0 : _a.method) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'get';
9936
+ },
9937
+ retryDelay: axiosRetry.exponentialDelay,
9938
+ shouldResetTimeout: true,
9939
+ onRetry: (retryCount, error, requestConfig) => {
9940
+ var _a;
9941
+ console.warn(`[tarobase-sdk] retry ${retryCount} for ${(_a = requestConfig.method) === null || _a === void 0 ? void 0 : _a.toUpperCase()} ${requestConfig.url} — ${error.code || error.message}`);
9942
+ },
9943
+ });
9637
9944
  const refreshInFlight = new Map();
9638
9945
  async function refreshAuthSessionOnce(appId, isServer) {
9639
9946
  const key = `${isServer ? "server" : "web"}:${appId}`;
@@ -9680,6 +9987,7 @@ async function makeApiRequest(method, urlPath, data, _overrides) {
9680
9987
  ServerSessionManager.instance.clearSession();
9681
9988
  };
9682
9989
  async function executeRequest() {
9990
+ var _a;
9683
9991
  // When _getAuthHeaders is provided (wallet client), use it as the sole auth source.
9684
9992
  // Otherwise use the global createAuthHeader (default path).
9685
9993
  const authHeader = (_overrides === null || _overrides === void 0 ? void 0 : _overrides._getAuthHeaders)
@@ -9701,11 +10009,12 @@ async function makeApiRequest(method, urlPath, data, _overrides) {
9701
10009
  method,
9702
10010
  url: `${config.apiUrl}${urlPath.startsWith("/") ? urlPath : `/${urlPath}`}`,
9703
10011
  headers,
10012
+ timeout: (_a = _overrides === null || _overrides === void 0 ? void 0 : _overrides.timeout) !== null && _a !== void 0 ? _a : 30000,
9704
10013
  };
9705
10014
  if (method !== "GET" && method !== "get") {
9706
10015
  requestConfig.data = data ? JSON.stringify(data) : {};
9707
10016
  }
9708
- const response = await globalAxios(requestConfig);
10017
+ const response = await apiClient(requestConfig);
9709
10018
  return { data: response.data, status: response.status, headers: response.headers };
9710
10019
  }
9711
10020
  try {
@@ -10641,6 +10950,7 @@ function scheduleTokenRefresh(connection, isServer) {
10641
10950
  // This replaces the old single setTimeout approach which was unreliable for long
10642
10951
  // delays (browsers throttle/suspend timers in background tabs).
10643
10952
  connection.tokenRefreshTimer = setInterval(async () => {
10953
+ var _a, _b;
10644
10954
  try {
10645
10955
  const currentToken = await getIdToken$1(isServer);
10646
10956
  if (!currentToken)
@@ -10671,6 +10981,17 @@ function scheduleTokenRefresh(connection, isServer) {
10671
10981
  }
10672
10982
  }
10673
10983
  catch (refreshError) {
10984
+ // If the refresh token itself is invalid (401/403), stop retrying —
10985
+ // the token won't magically become valid next interval, and continuing
10986
+ // to hammer /session/refresh causes 429 rate-limit storms.
10987
+ if (((_a = refreshError === null || refreshError === void 0 ? void 0 : refreshError.response) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = refreshError === null || refreshError === void 0 ? void 0 : refreshError.response) === null || _b === void 0 ? void 0 : _b.status) === 403) {
10988
+ console.warn('[WS v2] Refresh token rejected (401/403), stopping periodic refresh');
10989
+ if (connection.tokenRefreshTimer) {
10990
+ clearInterval(connection.tokenRefreshTimer);
10991
+ connection.tokenRefreshTimer = null;
10992
+ }
10993
+ return;
10994
+ }
10674
10995
  console.warn('[WS v2] Proactive token refresh failed, will retry next interval:', refreshError);
10675
10996
  }
10676
10997
  }
@@ -10681,6 +11002,7 @@ function scheduleTokenRefresh(connection, isServer) {
10681
11002
  }, TOKEN_CHECK_INTERVAL);
10682
11003
  }
10683
11004
  async function getFreshAuthToken(isServer) {
11005
+ var _a, _b;
10684
11006
  const currentToken = await getIdToken$1(isServer);
10685
11007
  if (!currentToken) {
10686
11008
  return null;
@@ -10703,6 +11025,17 @@ async function getFreshAuthToken(isServer) {
10703
11025
  }
10704
11026
  catch (error) {
10705
11027
  console.error('[WS v2] Error refreshing token:', error);
11028
+ // If the refresh token is permanently invalid (401/403), clear the stale
11029
+ // session from storage so future attempts don't keep retrying with it.
11030
+ if (!isServer && (((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.status) === 403)) {
11031
+ try {
11032
+ const { WebSessionManager } = await Promise.resolve().then(function () { return webSessionManager; });
11033
+ WebSessionManager.clearSession();
11034
+ }
11035
+ catch (clearError) {
11036
+ console.warn('[WS v2] Failed to clear stale session:', clearError);
11037
+ }
11038
+ }
10706
11039
  }
10707
11040
  // Return null instead of the expired token to prevent infinite 401 reconnect storms.
10708
11041
  // The server accepts unauthenticated connections; auth-required subscriptions will
@@ -10823,7 +11156,16 @@ async function getOrCreateConnection(appId, isServer) {
10823
11156
  ws.addEventListener('open', () => {
10824
11157
  connection.isConnecting = false;
10825
11158
  connection.isConnected = true;
10826
- connection.consecutiveAuthFailures = 0;
11159
+ // NOTE: Do NOT reset consecutiveAuthFailures here. It is reset when a
11160
+ // fresh auth token is actually obtained (in urlProvider, line ~389) or on
11161
+ // an explicit auth change (reconnectWithNewAuthV2, line ~854). Resetting
11162
+ // on every 'open' event created an infinite loop: auth fails 5x → connect
11163
+ // without auth → open resets counter → disconnect → auth fails 5x again →
11164
+ // repeat forever, hammering /session/refresh and causing 429s.
11165
+ //
11166
+ // An elevated counter is safe for anonymous/guest sessions: when there's no
11167
+ // token at all (getIdToken returns null), the counter is never checked —
11168
+ // urlProvider skips straight to unauthenticated connection.
10827
11169
  // Schedule periodic token freshness checks
10828
11170
  scheduleTokenRefresh(connection, isServer);
10829
11171
  // Re-subscribe to all existing subscriptions after reconnect
@@ -12485,15 +12827,15 @@ function clearIncompatibleSession() {
12485
12827
  // Lazy loaders for web-only providers.
12486
12828
  // Using dynamic import() ensures Metro (RN) never resolves these modules.
12487
12829
  async function loadPrivyWalletProvider() {
12488
- const mod = await import('./privy-wallet-provider-DGjYglh7.esm.js');
12830
+ const mod = await import('./privy-wallet-provider-BLcur3Ue.esm.js');
12489
12831
  return mod.PrivyWalletProvider;
12490
12832
  }
12491
12833
  async function loadPhantomWalletProvider() {
12492
- const mod = await import('./phantom-wallet-provider-B0UmUtfB.esm.js');
12834
+ const mod = await import('./phantom-wallet-provider--BJjVUA1.esm.js');
12493
12835
  return { PhantomWalletProvider: mod.PhantomWalletProvider };
12494
12836
  }
12495
12837
  async function loadSolanaMobileWalletProvider() {
12496
- const mod = await import('./solana-mobile-wallet-provider-DIyP-Az5.esm.js');
12838
+ const mod = await import('./solana-mobile-wallet-provider-CFaubssb.esm.js');
12497
12839
  return mod.SolanaMobileWalletProvider;
12498
12840
  }
12499
12841
  async function hotSwapToPrivyProvider(config) {
@@ -15842,4 +16184,4 @@ class PrivyExpoProvider {
15842
16184
  }
15843
16185
 
15844
16186
  export { ReactNativeSessionManager as $, getAuthProvider as A, get as B, set as C, setMany as D, setFile as E, getFiles as F, runQuery as G, runQueryMany as H, runExpression as I, runExpressionMany as J, signMessage as K, signTransaction as L, signAndSubmitTransaction as M, count as N, aggregate as O, subscribe as P, useAuth as Q, deserializeTransaction as R, SOLANA_MAINNET_RPC_URL as S, getIdToken as T, setPlatform as U, MockAuthProvider as V, WebSessionManager as W, DEFAULT_TEST_ADDRESS as X, OffchainAuthProvider as Y, PrivyExpoProvider as Z, InsufficientBalanceError as _, SOLANA_DEVNET_RPC_URL as a, ServerSessionManager as a0, clearCache as a1, closeAllSubscriptions as a2, getCachedData as a3, getMany as a4, reconnectWithNewAuth as a5, refreshSession as a6, signSessionCreateMessage as a7, buildSetDocumentsTransaction as b, convertRemainingAccounts as c, bs58 as d, confirmAndCheckTransaction as e, createSessionWithPrivy as f, getPlatform as g, SURFNET_RPC_URL$1 as h, index as i, detectMobile as j, detectAndroid as k, setAuthLoading as l, genAuthNonce as m, genSolanaMessage as n, createSessionWithSignature as o, getDefaultExportFromCjs$1 as p, init as q, requireBuffer as r, setCurrentUser as s, getCurrentUser as t, onAuthStateChanged as u, onAuthLoadingChanged as v, getAuthLoading as w, login as x, logout as y, getConfig as z };
15845
- //# sourceMappingURL=index.native-CEf5PJ_g.esm.js.map
16187
+ //# sourceMappingURL=index.native-DuKhZcus.esm.js.map