@routstr/sdk 0.3.2 → 0.3.4

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 (39) hide show
  1. package/dist/client/index.d.mts +9 -5
  2. package/dist/client/index.d.ts +9 -5
  3. package/dist/client/index.js +70 -131
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/client/index.mjs +70 -131
  6. package/dist/client/index.mjs.map +1 -1
  7. package/dist/discovery/index.d.mts +8 -2
  8. package/dist/discovery/index.d.ts +8 -2
  9. package/dist/discovery/index.js +27 -16
  10. package/dist/discovery/index.js.map +1 -1
  11. package/dist/discovery/index.mjs +27 -16
  12. package/dist/discovery/index.mjs.map +1 -1
  13. package/dist/index.d.mts +10 -8
  14. package/dist/index.d.ts +10 -8
  15. package/dist/index.js +141 -185
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.mjs +140 -186
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/{interfaces-C5fLD3jB.d.mts → interfaces-Bp0Ngmqv.d.mts} +1 -1
  20. package/dist/{interfaces-BxDEka72.d.ts → interfaces-CIfd_phZ.d.ts} +1 -1
  21. package/dist/{interfaces-BWJJTCXO.d.mts → interfaces-Cxi8R4TT.d.mts} +1 -1
  22. package/dist/{interfaces-B62Rw-dd.d.ts → interfaces-D2FDCLyP.d.ts} +1 -1
  23. package/dist/storage/index.d.mts +9 -7
  24. package/dist/storage/index.d.ts +9 -7
  25. package/dist/storage/index.js +51 -34
  26. package/dist/storage/index.js.map +1 -1
  27. package/dist/storage/index.mjs +51 -34
  28. package/dist/storage/index.mjs.map +1 -1
  29. package/dist/{store-h7m23ffq.d.ts → store-BD5zF9Hp.d.ts} +4 -4
  30. package/dist/{store-DGeLPv9E.d.mts → store-CBSyK2qg.d.mts} +4 -4
  31. package/dist/{types-BYj_8c5c.d.mts → types-DPQM6tIG.d.mts} +10 -1
  32. package/dist/{types-BYj_8c5c.d.ts → types-DPQM6tIG.d.ts} +10 -1
  33. package/dist/wallet/index.d.mts +8 -6
  34. package/dist/wallet/index.d.ts +8 -6
  35. package/dist/wallet/index.js +43 -52
  36. package/dist/wallet/index.js.map +1 -1
  37. package/dist/wallet/index.mjs +43 -52
  38. package/dist/wallet/index.mjs.map +1 -1
  39. package/package.json +3 -2
package/dist/index.mjs CHANGED
@@ -6,6 +6,30 @@ import { createStore } from 'zustand/vanilla';
6
6
  import { Transform } from 'stream';
7
7
  import { StringDecoder } from 'string_decoder';
8
8
 
9
+ // core/types.ts
10
+ function makeConsoleLogger(prefix) {
11
+ const fmt = (args) => prefix ? [prefix, ...args] : args;
12
+ return {
13
+ log: (...args) => console.log(...fmt(args)),
14
+ warn: (...args) => console.warn(...fmt(args)),
15
+ error: (...args) => console.error(...fmt(args)),
16
+ debug: (...args) => console.log(...fmt(args)),
17
+ child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
18
+ };
19
+ }
20
+ var consoleLogger = makeConsoleLogger();
21
+ var noopLogger = {
22
+ log: () => {
23
+ },
24
+ warn: () => {
25
+ },
26
+ error: () => {
27
+ },
28
+ debug: () => {
29
+ },
30
+ child: () => noopLogger
31
+ };
32
+
9
33
  // core/errors.ts
10
34
  var InsufficientBalanceError = class extends Error {
11
35
  constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
@@ -102,11 +126,13 @@ var ModelManager = class _ModelManager {
102
126
  this.cacheTTL = config.cacheTTL || 210 * 60 * 1e3;
103
127
  this.includeProviderUrls = config.includeProviderUrls || [];
104
128
  this.excludeProviderUrls = config.excludeProviderUrls || [];
129
+ this.logger = (config.logger ?? consoleLogger).child("ModelManager");
105
130
  }
106
131
  cacheTTL;
107
132
  providerDirectoryUrl;
108
133
  includeProviderUrls;
109
134
  excludeProviderUrls;
135
+ logger;
110
136
  /**
111
137
  * Get the list of bootstrapped provider base URLs
112
138
  * @returns Array of provider base URLs
@@ -152,7 +178,7 @@ var ModelManager = class _ModelManager {
152
178
  return filtered;
153
179
  }
154
180
  } catch (e) {
155
- console.warn("Nostr bootstrap failed, falling back to HTTP:", e);
181
+ this.logger.warn("Nostr bootstrap failed, falling back to HTTP:", e);
156
182
  }
157
183
  return this.bootstrapFromHttp(torMode, forceRefresh);
158
184
  }
@@ -228,10 +254,7 @@ var ModelManager = class _ModelManager {
228
254
  }
229
255
  }
230
256
  } catch {
231
- console.warn(
232
- "[NostrBootstrap] Failed to parse Nostr event content:",
233
- event.id
234
- );
257
+ this.logger.warn("NostrBootstrap: failed to parse event content:", event.id);
235
258
  }
236
259
  }
237
260
  }
@@ -285,7 +308,7 @@ var ModelManager = class _ModelManager {
285
308
  }
286
309
  return list;
287
310
  } catch (e) {
288
- console.error("Failed to bootstrap providers", e);
311
+ this.logger.error("Failed to bootstrap providers", e);
289
312
  throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);
290
313
  }
291
314
  }
@@ -351,9 +374,9 @@ var ModelManager = class _ModelManager {
351
374
  return { success: true, base, list };
352
375
  } catch (error) {
353
376
  if (this.isProviderDownError(error)) {
354
- console.warn(`Provider ${base} is down right now.`);
377
+ this.logger.warn(`Provider ${base} is down right now.`);
355
378
  } else {
356
- console.warn(`Failed to fetch models from ${base}:`, error);
379
+ this.logger.warn(`Failed to fetch models from ${base}:`, error);
357
380
  }
358
381
  this.adapter.setProviderLastUpdate(base, Date.now());
359
382
  return { success: false, base };
@@ -510,10 +533,7 @@ var ModelManager = class _ModelManager {
510
533
  this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
511
534
  return models;
512
535
  } catch {
513
- console.warn(
514
- "[Routstr21Models] Failed to parse Nostr event content:",
515
- event.id
516
- );
536
+ this.logger.warn("Routstr21Models: failed to parse Nostr event content:", event.id);
517
537
  return cachedModels.length > 0 ? cachedModels : [];
518
538
  }
519
539
  }
@@ -524,8 +544,10 @@ var MintDiscovery = class {
524
544
  constructor(adapter, config = {}) {
525
545
  this.adapter = adapter;
526
546
  this.cacheTTL = config.cacheTTL || 21 * 60 * 1e3;
547
+ this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
527
548
  }
528
549
  cacheTTL;
550
+ logger;
529
551
  /**
530
552
  * Fetch mints from all providers via their /v1/info endpoints
531
553
  * Caches mints and full provider info for later access
@@ -576,9 +598,9 @@ var MintDiscovery = class {
576
598
  } catch (error) {
577
599
  this.adapter.setProviderLastUpdate(base, Date.now());
578
600
  if (this.isProviderDownError(error)) {
579
- console.warn(`Provider ${base} is down right now.`);
601
+ this.logger.warn(`Provider ${base} is down right now.`);
580
602
  } else {
581
- console.warn(`Failed to fetch mints from ${base}:`, error);
603
+ this.logger.warn(`Failed to fetch mints from ${base}:`, error);
582
604
  }
583
605
  return { success: false, base, mints: [], info: null };
584
606
  }
@@ -592,14 +614,14 @@ var MintDiscovery = class {
592
614
  infoFromAllProviders[base] = info;
593
615
  }
594
616
  } else {
595
- console.error("Mint discovery error:", result.reason);
617
+ this.logger.error("Mint discovery error:", result.reason);
596
618
  }
597
619
  }
598
620
  try {
599
621
  this.adapter.setCachedMints(mintsFromAllProviders);
600
622
  this.adapter.setCachedProviderInfo(infoFromAllProviders);
601
623
  } catch (error) {
602
- console.error("Error caching mint discovery results:", error);
624
+ this.logger.error("Error caching mint discovery results:", error);
603
625
  }
604
626
  return {
605
627
  mintsFromProviders: mintsFromAllProviders,
@@ -738,14 +760,16 @@ function selectMintWithBalance(balances, units, amount, excludeMints = []) {
738
760
  return { selectedMintUrl: null, selectedMintBalance: 0 };
739
761
  }
740
762
  var CashuSpender = class {
741
- constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager) {
763
+ constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager, logger) {
742
764
  this.walletAdapter = walletAdapter;
743
765
  this.storageAdapter = storageAdapter;
744
766
  this._providerRegistry = _providerRegistry;
745
767
  this.balanceManager = balanceManager;
768
+ this.logger = (logger ?? consoleLogger).child("CashuSpender");
746
769
  }
747
770
  _isBusy = false;
748
771
  debugLevel = "WARN";
772
+ logger;
749
773
  async receiveToken(token) {
750
774
  try {
751
775
  const result = await this.walletAdapter.receiveToken(token);
@@ -841,13 +865,13 @@ var CashuSpender = class {
841
865
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
842
866
  switch (level) {
843
867
  case "DEBUG":
844
- console.log(...args);
868
+ this.logger.log(...args);
845
869
  break;
846
870
  case "WARN":
847
- console.warn(...args);
871
+ this.logger.warn(...args);
848
872
  break;
849
873
  case "ERROR":
850
- console.error(...args);
874
+ this.logger.error(...args);
851
875
  break;
852
876
  }
853
877
  }
@@ -1274,10 +1298,11 @@ var CashuSpender = class {
1274
1298
 
1275
1299
  // wallet/BalanceManager.ts
1276
1300
  var BalanceManager = class _BalanceManager {
1277
- constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
1301
+ constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger) {
1278
1302
  this.walletAdapter = walletAdapter;
1279
1303
  this.storageAdapter = storageAdapter;
1280
1304
  this.providerRegistry = providerRegistry;
1305
+ this.logger = (logger ?? consoleLogger).child("BalanceManager");
1281
1306
  if (cashuSpender) {
1282
1307
  this.cashuSpender = cashuSpender;
1283
1308
  } else {
@@ -1294,6 +1319,7 @@ var BalanceManager = class _BalanceManager {
1294
1319
  providerWalletOps = /* @__PURE__ */ new Map();
1295
1320
  /** Cooldown (ms) between opposite operations on the same provider */
1296
1321
  static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
1322
+ logger;
1297
1323
  /**
1298
1324
  * Check whether a wallet operation (topup/refund) may run for a provider.
1299
1325
  * Returns the reason when blocked.
@@ -1368,7 +1394,7 @@ var BalanceManager = class _BalanceManager {
1368
1394
  const { mintUrl, baseUrl, apiKey, forceRefund } = options;
1369
1395
  const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
1370
1396
  if (!guard.allowed) {
1371
- console.log(`[BalanceManager] Skipping refund for ${baseUrl} - ${guard.reason}`);
1397
+ this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
1372
1398
  return { success: false, message: guard.reason };
1373
1399
  }
1374
1400
  this._beginProviderWalletOperation(baseUrl, "refund");
@@ -1388,9 +1414,7 @@ var BalanceManager = class _BalanceManager {
1388
1414
  if (apiKeyEntry?.lastUsed) {
1389
1415
  const fiveMinutesAgo = Date.now() - 5 * 60 * 1e3;
1390
1416
  if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
1391
- console.log(
1392
- `[BalanceManager] Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`
1393
- );
1417
+ this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`);
1394
1418
  return {
1395
1419
  success: false,
1396
1420
  message: "API key was used recently, skipping refund"
@@ -1432,7 +1456,7 @@ var BalanceManager = class _BalanceManager {
1432
1456
  requestId: fetchResult.requestId
1433
1457
  };
1434
1458
  } catch (error) {
1435
- console.error("[BalanceManager] API key refund error", error);
1459
+ this.logger.error("API key refund error", error);
1436
1460
  return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
1437
1461
  }
1438
1462
  }
@@ -1484,7 +1508,7 @@ var BalanceManager = class _BalanceManager {
1484
1508
  };
1485
1509
  } catch (error) {
1486
1510
  clearTimeout(timeoutId);
1487
- console.error("[BalanceManager.fetchRefundToken] Fetch error", error);
1511
+ this.logger.error("fetchRefundToken fetch error", error);
1488
1512
  if (error instanceof Error) {
1489
1513
  if (error.name === "AbortError") {
1490
1514
  return {
@@ -1510,7 +1534,7 @@ var BalanceManager = class _BalanceManager {
1510
1534
  const { mintUrl, baseUrl, amount, token: providedToken } = options;
1511
1535
  const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
1512
1536
  if (!guard.allowed) {
1513
- console.log(`[BalanceManager] Skipping topup for ${baseUrl} - ${guard.reason}`);
1537
+ this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
1514
1538
  return { success: false, message: guard.reason };
1515
1539
  }
1516
1540
  this._beginProviderWalletOperation(baseUrl, "topup");
@@ -1547,7 +1571,7 @@ var BalanceManager = class _BalanceManager {
1547
1571
  cashuToken = tokenResult.token;
1548
1572
  const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
1549
1573
  requestId = topUpResult.requestId;
1550
- console.log(topUpResult);
1574
+ this.logger.log("topUpResult:", topUpResult);
1551
1575
  if (!topUpResult.success) {
1552
1576
  await this._recoverFailedTopUp(cashuToken);
1553
1577
  return {
@@ -1563,10 +1587,7 @@ var BalanceManager = class _BalanceManager {
1563
1587
  requestId
1564
1588
  };
1565
1589
  } catch (error) {
1566
- console.log(
1567
- "DEBUG",
1568
- `[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`
1569
- );
1590
+ this.logger.log(`topup error for ${baseUrl}: ${error}`);
1570
1591
  if (cashuToken) {
1571
1592
  await this._recoverFailedTopUp(cashuToken);
1572
1593
  }
@@ -1583,13 +1604,9 @@ var BalanceManager = class _BalanceManager {
1583
1604
  p2pkPubkey
1584
1605
  } = options;
1585
1606
  const adjustedAmount = Math.ceil(amount);
1586
- console.log(
1587
- `[BalanceManager.createProviderToken] Starting: baseUrl=${baseUrl}, mintUrl=${mintUrl}, amount=${amount}, adjustedAmount=${adjustedAmount}, retryCount=${retryCount}`
1588
- );
1607
+ this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
1589
1608
  if (!adjustedAmount || isNaN(adjustedAmount)) {
1590
- console.error(
1591
- `[BalanceManager.createProviderToken] FAILURE: Invalid amount - amount=${amount}, adjustedAmount=${adjustedAmount}`
1592
- );
1609
+ this.logger.error(`createProviderToken: invalid amount=${amount}`);
1593
1610
  return { success: false, error: "Invalid top up amount" };
1594
1611
  }
1595
1612
  const balanceState = await this.getBalanceState();
@@ -1620,9 +1637,7 @@ var BalanceManager = class _BalanceManager {
1620
1637
  { url: "", balance: 0 }
1621
1638
  ).url
1622
1639
  );
1623
- console.error(
1624
- `[BalanceManager.createProviderToken] FAILURE: Insufficient balance - required=${adjustedAmount}, available=${totalMintBalance + targetProviderBalance}, totalMintBalance=${totalMintBalance}, targetProviderBalance=${targetProviderBalance}, refundableProviderBalance=${refundableProviderBalance}`
1625
- );
1640
+ this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
1626
1641
  return { success: false, error: error.message };
1627
1642
  }
1628
1643
  const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
@@ -1658,9 +1673,7 @@ var BalanceManager = class _BalanceManager {
1658
1673
  maxMintUrl = mintUrl2;
1659
1674
  }
1660
1675
  }
1661
- console.error(
1662
- `[BalanceManager.createProviderToken] FAILURE: No candidate mints found - requiredAmount=${requiredAmount}, totalMintBalance=${totalMintBalance}, maxBalance=${maxBalance}, maxMintUrl=${maxMintUrl}, providerMints=${JSON.stringify(providerMints)}`
1663
- );
1676
+ this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
1664
1677
  const error = new InsufficientBalanceError(
1665
1678
  adjustedAmount,
1666
1679
  totalMintBalance,
@@ -1672,17 +1685,13 @@ var BalanceManager = class _BalanceManager {
1672
1685
  let lastError;
1673
1686
  for (const candidateMint of candidates) {
1674
1687
  try {
1675
- console.log(
1676
- `[BalanceManager.createProviderToken] Attempting mint: ${candidateMint}, amount: ${requiredAmount}`
1677
- );
1688
+ this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
1678
1689
  const token = await this.walletAdapter.sendToken(
1679
1690
  candidateMint,
1680
1691
  requiredAmount,
1681
1692
  p2pkPubkey
1682
1693
  );
1683
- console.log(
1684
- `[BalanceManager.createProviderToken] SUCCESS: Token created from mint ${candidateMint}, all mint balances: ${JSON.stringify(Object.fromEntries(Object.entries(balances).map(([mint, balance]) => [mint, getBalanceInSats(balance, units[mint])])))}`
1685
- );
1694
+ this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
1686
1695
  return {
1687
1696
  success: true,
1688
1697
  token,
@@ -1691,15 +1700,11 @@ var BalanceManager = class _BalanceManager {
1691
1700
  };
1692
1701
  } catch (error) {
1693
1702
  const errorMsg = error instanceof Error ? error.message : String(error);
1694
- console.error(
1695
- `[BalanceManager.createProviderToken] FAILURE: Mint ${candidateMint} failed with error: ${errorMsg}`
1696
- );
1703
+ this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
1697
1704
  if (error instanceof Error) {
1698
1705
  lastError = errorMsg;
1699
1706
  if (isNetworkErrorMessage(error.message)) {
1700
- console.warn(
1701
- `[BalanceManager.createProviderToken] Network error from ${candidateMint}, trying next mint...`
1702
- );
1707
+ this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
1703
1708
  continue;
1704
1709
  }
1705
1710
  }
@@ -1709,9 +1714,7 @@ var BalanceManager = class _BalanceManager {
1709
1714
  };
1710
1715
  }
1711
1716
  }
1712
- console.error(
1713
- `[BalanceManager.createProviderToken] FAILURE: All candidate mints exhausted - lastError=${lastError}, candidates=${JSON.stringify(candidates)}`
1714
- );
1717
+ this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
1715
1718
  return {
1716
1719
  success: false,
1717
1720
  error: lastError || "All candidate mints failed while creating top up token"
@@ -1826,7 +1829,7 @@ var BalanceManager = class _BalanceManager {
1826
1829
  return { success: true, requestId };
1827
1830
  } catch (error) {
1828
1831
  clearTimeout(timeoutId);
1829
- console.error("[BalanceManager._postTopUp] Fetch error", error);
1832
+ this.logger.error("_postTopUp fetch error", error);
1830
1833
  if (error instanceof Error) {
1831
1834
  if (error.name === "AbortError") {
1832
1835
  return {
@@ -1852,10 +1855,7 @@ var BalanceManager = class _BalanceManager {
1852
1855
  try {
1853
1856
  await this.cashuSpender.receiveToken(cashuToken);
1854
1857
  } catch (error) {
1855
- console.error(
1856
- "[BalanceManager._recoverFailedTopUp] Failed to recover token",
1857
- error
1858
- );
1858
+ this.logger.error("_recoverFailedTopUp: failed to recover token", error);
1859
1859
  }
1860
1860
  }
1861
1861
  /**
@@ -1908,9 +1908,9 @@ var BalanceManager = class _BalanceManager {
1908
1908
  apiKey: data.api_key
1909
1909
  };
1910
1910
  } else {
1911
- console.log(response.status);
1911
+ this.logger.warn(`getTokenBalance: status=${response.status}`);
1912
1912
  const data = await response.json();
1913
- console.log("FAILED ", data);
1913
+ this.logger.warn("getTokenBalance: FAILED", data);
1914
1914
  const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
1915
1915
  return {
1916
1916
  amount: -1,
@@ -1921,7 +1921,7 @@ var BalanceManager = class _BalanceManager {
1921
1921
  };
1922
1922
  }
1923
1923
  } catch (error) {
1924
- console.error("ERRORR IN RESTPONSE", error);
1924
+ this.logger.error("getTokenBalance error", error);
1925
1925
  }
1926
1926
  return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
1927
1927
  }
@@ -2443,9 +2443,10 @@ function isInsecureHttpUrl(url) {
2443
2443
  return url.startsWith("http://");
2444
2444
  }
2445
2445
  var ProviderManager = class _ProviderManager {
2446
- constructor(providerRegistry, store) {
2446
+ constructor(providerRegistry, store, logger) {
2447
2447
  this.providerRegistry = providerRegistry;
2448
2448
  this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
2449
+ this.logger = (logger ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
2449
2450
  if (store) {
2450
2451
  this.store = store;
2451
2452
  this.hydrateFromStore();
@@ -2462,6 +2463,7 @@ var ProviderManager = class _ProviderManager {
2462
2463
  store = null;
2463
2464
  /** Instance ID for debugging */
2464
2465
  instanceId;
2466
+ logger;
2465
2467
  /**
2466
2468
  * Hydrate in-memory state from persistent store
2467
2469
  */
@@ -2474,10 +2476,7 @@ var ProviderManager = class _ProviderManager {
2474
2476
  this.providersOnCoolDown = state.providersOnCooldown.filter(
2475
2477
  (entry) => now - entry.timestamp < _ProviderManager.COOLDOWN_DURATION_MS
2476
2478
  ).map((entry) => [entry.baseUrl, entry.timestamp]);
2477
- console.log(`[ProviderManager:${this.instanceId}] Hydrated from store:`);
2478
- console.log(` failedProviders: ${this.failedProviders.size}`);
2479
- console.log(` lastFailed: ${this.lastFailed.size}`);
2480
- console.log(` providersOnCooldown: ${this.providersOnCoolDown.length}`);
2479
+ this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
2481
2480
  }
2482
2481
  /**
2483
2482
  * Get instance ID for debugging
@@ -2497,9 +2496,7 @@ var ProviderManager = class _ProviderManager {
2497
2496
  const age = now - timestamp;
2498
2497
  const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
2499
2498
  if (isExpired) {
2500
- console.log(
2501
- `[cleanupExpiredCooldowns:${this.instanceId}] Removing expired cooldown for ${url} (age: ${age}ms, cooldown: ${_ProviderManager.COOLDOWN_DURATION_MS}ms)`
2502
- );
2499
+ this.logger.log(`Removing expired cooldown for ${url} (age: ${age}ms)`);
2503
2500
  this.failedProviders.delete(url);
2504
2501
  if (this.store) {
2505
2502
  this.store.getState().removeFailedProvider(url);
@@ -2510,9 +2507,7 @@ var ProviderManager = class _ProviderManager {
2510
2507
  );
2511
2508
  const after = this.providersOnCoolDown.length;
2512
2509
  if (before !== after) {
2513
- console.log(
2514
- `[cleanupExpiredCooldowns:${this.instanceId}] Cleaned up ${before - after} expired cooldown(s), ${after} remaining`
2515
- );
2510
+ this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
2516
2511
  }
2517
2512
  }
2518
2513
  /**
@@ -2564,24 +2559,10 @@ var ProviderManager = class _ProviderManager {
2564
2559
  markFailed(baseUrl) {
2565
2560
  const now = Date.now();
2566
2561
  const lastFailure = this.lastFailed.get(baseUrl);
2567
- console.log(`[markFailed:${this.instanceId}] baseUrl: ${baseUrl}`);
2568
- console.log(
2569
- `[markFailed:${this.instanceId}] lastFailure from map: ${lastFailure}`
2570
- );
2571
- console.log(
2572
- `[markFailed:${this.instanceId}] current timestamp (now): ${now}`
2573
- );
2574
- console.log(
2575
- `[markFailed:${this.instanceId}] COOLDOWN_DURATION_MS: ${_ProviderManager.COOLDOWN_DURATION_MS}`
2576
- );
2562
+ this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now}`);
2577
2563
  if (lastFailure !== void 0) {
2578
2564
  const timeSinceLastFailure = now - lastFailure;
2579
- console.log(
2580
- `[markFailed:${this.instanceId}] timeSinceLastFailure: ${timeSinceLastFailure}ms`
2581
- );
2582
- console.log(
2583
- `[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`
2584
- );
2565
+ this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
2585
2566
  }
2586
2567
  this.lastFailed.set(baseUrl, now);
2587
2568
  this.failedProviders.add(baseUrl);
@@ -2589,38 +2570,23 @@ var ProviderManager = class _ProviderManager {
2589
2570
  this.store.getState().setLastFailedTimestamp(baseUrl, now);
2590
2571
  this.store.getState().addFailedProvider(baseUrl);
2591
2572
  }
2592
- console.log(
2593
- `[markFailed:${this.instanceId}] Updated lastFailed map for ${baseUrl} to ${now}`
2594
- );
2595
- console.log(
2596
- `[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`
2597
- );
2573
+ this.logger.log(`markFailed: updated ${baseUrl} to ${now}, failedProviders=${this.failedProviders.size}`);
2598
2574
  if (lastFailure !== void 0 && now - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
2599
- console.log(
2600
- `[markFailed:${this.instanceId}] Second failure detected within cooldown window for ${baseUrl}`
2601
- );
2575
+ this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
2602
2576
  if (!this.isOnCooldown(baseUrl)) {
2603
2577
  this.providersOnCoolDown.push([baseUrl, now]);
2604
2578
  if (this.store) {
2605
2579
  this.store.getState().addProviderOnCooldown(baseUrl, now);
2606
2580
  }
2607
- console.log(
2608
- `[markFailed:${this.instanceId}] Provider ${baseUrl} added to cooldown after second failure within 5 minutes`
2609
- );
2581
+ this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
2610
2582
  } else {
2611
- console.log(
2612
- `[markFailed:${this.instanceId}] Provider ${baseUrl} is already on cooldown`
2613
- );
2583
+ this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
2614
2584
  }
2615
2585
  } else {
2616
2586
  if (lastFailure === void 0) {
2617
- console.log(
2618
- `[markFailed:${this.instanceId}] First failure for ${baseUrl} - not adding to cooldown yet`
2619
- );
2587
+ this.logger.log(`markFailed: first failure for ${baseUrl}`);
2620
2588
  } else {
2621
- console.log(
2622
- `[markFailed:${this.instanceId}] Failure outside cooldown window for ${baseUrl} (timeSinceLastFailure: ${now - lastFailure}ms)`
2623
- );
2589
+ this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now - lastFailure}ms ago)`);
2624
2590
  }
2625
2591
  }
2626
2592
  }
@@ -2677,25 +2643,12 @@ var ProviderManager = class _ProviderManager {
2677
2643
  const disabledProviders = new Set(
2678
2644
  this.providerRegistry.getDisabledProviders()
2679
2645
  );
2680
- console.log(
2681
- `[findNextBestProvider:${this.instanceId}] Starting search for model: ${modelId}`
2682
- );
2683
- console.log(
2684
- `[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`
2685
- );
2686
- console.log(
2687
- `[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url]) => url)}`
2688
- );
2646
+ this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
2689
2647
  const allProviders = this.providerRegistry.getAllProvidersModels();
2690
- console.log(
2691
- `[findNextBestProvider:${this.instanceId}] Total providers in registry: ${Object.keys(allProviders).length}`
2692
- );
2648
+ this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
2693
2649
  const candidates = [];
2694
2650
  for (const [baseUrl, models] of Object.entries(allProviders)) {
2695
2651
  if (baseUrl === currentBaseUrl) {
2696
- console.log(
2697
- `[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`
2698
- );
2699
2652
  continue;
2700
2653
  }
2701
2654
  if (disabledProviders.has(baseUrl)) {
@@ -2721,7 +2674,7 @@ var ProviderManager = class _ProviderManager {
2721
2674
  return null;
2722
2675
  }
2723
2676
  } catch (error) {
2724
- console.error("Error finding next best provider:", error);
2677
+ this.logger.error("findNextBestProvider error:", error);
2725
2678
  return null;
2726
2679
  }
2727
2680
  }
@@ -2848,16 +2801,9 @@ var ProviderManager = class _ProviderManager {
2848
2801
  res.height
2849
2802
  );
2850
2803
  imageTokens += tokensFromImage;
2851
- console.log("IMAGE INPUT RESOLUTION", {
2852
- width: res.width,
2853
- height: res.height,
2854
- tokensFromImage
2855
- });
2804
+ this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
2856
2805
  } else {
2857
- console.log(
2858
- "IMAGE INPUT RESOLUTION",
2859
- "unknown (unsupported format or parse failure)"
2860
- );
2806
+ this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
2861
2807
  }
2862
2808
  }
2863
2809
  }
@@ -2890,7 +2836,7 @@ var ProviderManager = class _ProviderManager {
2890
2836
  const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
2891
2837
  return totalEstimatedCosts;
2892
2838
  } catch (e) {
2893
- console.error(e);
2839
+ this.logger.error("getRequiredSatsForModel error:", e);
2894
2840
  return 0;
2895
2841
  }
2896
2842
  }
@@ -3089,7 +3035,8 @@ var createSqliteDriver = (options = {}) => {
3089
3035
  }
3090
3036
  };
3091
3037
  };
3092
- async function createBunSqliteDriver(dbPath) {
3038
+ async function createBunSqliteDriver(dbPath, options) {
3039
+ const logger = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
3093
3040
  const SQLite = (await import(
3094
3041
  /* webpackIgnore: true */
3095
3042
  'bun:sqlite'
@@ -3115,7 +3062,7 @@ async function createBunSqliteDriver(dbPath) {
3115
3062
  throw parseError;
3116
3063
  }
3117
3064
  } catch (error) {
3118
- console.error(`SQLite getItem failed for key "${key}":`, error);
3065
+ logger.error(`getItem failed for key "${key}":`, error);
3119
3066
  return defaultValue;
3120
3067
  }
3121
3068
  },
@@ -3125,14 +3072,14 @@ async function createBunSqliteDriver(dbPath) {
3125
3072
  "INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value"
3126
3073
  ).run(key, JSON.stringify(value));
3127
3074
  } catch (error) {
3128
- console.error(`SQLite setItem failed for key "${key}":`, error);
3075
+ logger.error(`setItem failed for key "${key}":`, error);
3129
3076
  }
3130
3077
  },
3131
3078
  async removeItem(key) {
3132
3079
  try {
3133
3080
  db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
3134
3081
  } catch (error) {
3135
- console.error(`SQLite removeItem failed for key "${key}":`, error);
3082
+ logger.error(`removeItem failed for key "${key}":`, error);
3136
3083
  }
3137
3084
  }
3138
3085
  };
@@ -4483,37 +4430,40 @@ var createStorageAdapterFromStore = (store) => ({
4483
4430
  store.getState().updateXcashuTokenTryCount(token, tryCount);
4484
4431
  }
4485
4432
  });
4486
- var createProviderRegistryFromStore = (store) => ({
4487
- getModelsForProvider: (baseUrl) => {
4488
- const normalized = normalizeBaseUrl5(baseUrl);
4489
- return store.getState().modelsFromAllProviders[normalized] || [];
4490
- },
4491
- getDisabledProviders: () => store.getState().disabledProviders,
4492
- getProviderMints: (baseUrl) => {
4493
- const normalized = normalizeBaseUrl5(baseUrl);
4494
- return store.getState().mintsFromAllProviders[normalized] || [];
4495
- },
4496
- getProviderInfo: async (baseUrl) => {
4497
- const normalized = normalizeBaseUrl5(baseUrl);
4498
- const cached = store.getState().infoFromAllProviders[normalized];
4499
- if (cached) return cached;
4500
- try {
4501
- const response = await fetch(`${normalized}v1/info`);
4502
- if (!response.ok) {
4503
- throw new Error(`Failed ${response.status}`);
4433
+ var createProviderRegistryFromStore = (store, logger) => {
4434
+ const log = (logger ?? consoleLogger).child("ProviderRegistry");
4435
+ return {
4436
+ getModelsForProvider: (baseUrl) => {
4437
+ const normalized = normalizeBaseUrl5(baseUrl);
4438
+ return store.getState().modelsFromAllProviders[normalized] || [];
4439
+ },
4440
+ getDisabledProviders: () => store.getState().disabledProviders,
4441
+ getProviderMints: (baseUrl) => {
4442
+ const normalized = normalizeBaseUrl5(baseUrl);
4443
+ return store.getState().mintsFromAllProviders[normalized] || [];
4444
+ },
4445
+ getProviderInfo: async (baseUrl) => {
4446
+ const normalized = normalizeBaseUrl5(baseUrl);
4447
+ const cached = store.getState().infoFromAllProviders[normalized];
4448
+ if (cached) return cached;
4449
+ try {
4450
+ const response = await fetch(`${normalized}v1/info`);
4451
+ if (!response.ok) {
4452
+ throw new Error(`Failed ${response.status}`);
4453
+ }
4454
+ const info = await response.json();
4455
+ const next = { ...store.getState().infoFromAllProviders };
4456
+ next[normalized] = info;
4457
+ store.getState().setInfoFromAllProviders(next);
4458
+ return info;
4459
+ } catch (error) {
4460
+ log.warn(`Failed to fetch provider info from ${normalized}:`, error);
4461
+ return null;
4504
4462
  }
4505
- const info = await response.json();
4506
- const next = { ...store.getState().infoFromAllProviders };
4507
- next[normalized] = info;
4508
- store.getState().setInfoFromAllProviders(next);
4509
- return info;
4510
- } catch (error) {
4511
- console.warn(`Failed to fetch provider info from ${normalized}:`, error);
4512
- return null;
4513
- }
4514
- },
4515
- getAllProvidersModels: () => store.getState().modelsFromAllProviders
4516
- });
4463
+ },
4464
+ getAllProvidersModels: () => store.getState().modelsFromAllProviders
4465
+ };
4466
+ };
4517
4467
 
4518
4468
  // storage/index.ts
4519
4469
  var isBrowser3 = () => {
@@ -4784,6 +4734,7 @@ var RoutstrClient = class {
4784
4734
  this.walletAdapter = walletAdapter;
4785
4735
  this.storageAdapter = storageAdapter;
4786
4736
  this.providerRegistry = providerRegistry;
4737
+ this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
4787
4738
  this.balanceManager = new BalanceManager(
4788
4739
  walletAdapter,
4789
4740
  storageAdapter,
@@ -4800,7 +4751,7 @@ var RoutstrClient = class {
4800
4751
  this.mode = mode;
4801
4752
  this.usageTrackingDriver = options.usageTrackingDriver;
4802
4753
  this.sdkStore = options.sdkStore;
4803
- this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
4754
+ this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
4804
4755
  }
4805
4756
  cashuSpender;
4806
4757
  balanceManager;
@@ -4811,6 +4762,7 @@ var RoutstrClient = class {
4811
4762
  debugLevel = "WARN";
4812
4763
  usageTrackingDriver;
4813
4764
  sdkStore;
4765
+ logger;
4814
4766
  /**
4815
4767
  * Get the current client mode
4816
4768
  */
@@ -4832,13 +4784,13 @@ var RoutstrClient = class {
4832
4784
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
4833
4785
  switch (level) {
4834
4786
  case "DEBUG":
4835
- console.log(...args);
4787
+ this.logger.log(...args);
4836
4788
  break;
4837
4789
  case "WARN":
4838
- console.warn(...args);
4790
+ this.logger.warn(...args);
4839
4791
  break;
4840
4792
  case "ERROR":
4841
- console.error(...args);
4793
+ this.logger.error(...args);
4842
4794
  break;
4843
4795
  }
4844
4796
  }
@@ -5442,7 +5394,7 @@ var RoutstrClient = class {
5442
5394
  tryNextProvider = true;
5443
5395
  }
5444
5396
  }
5445
- if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
5397
+ if ((status === 401 || status === 403 || status === 404 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
5446
5398
  this._log(
5447
5399
  "DEBUG",
5448
5400
  `[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`
@@ -5946,7 +5898,8 @@ async function resolveRouteRequestContext(options) {
5946
5898
  mode = "apikeys",
5947
5899
  usageTrackingDriver,
5948
5900
  sdkStore,
5949
- providerManager: providedProviderManager
5901
+ providerManager: providedProviderManager,
5902
+ logger
5950
5903
  } = options;
5951
5904
  let modelManager;
5952
5905
  let providers;
@@ -5958,7 +5911,8 @@ async function resolveRouteRequestContext(options) {
5958
5911
  }
5959
5912
  } else {
5960
5913
  modelManager = new ModelManager(discoveryAdapter, {
5961
- includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls
5914
+ includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls,
5915
+ logger
5962
5916
  });
5963
5917
  providers = await modelManager.bootstrapProviders(torMode);
5964
5918
  if (providers.length === 0) {
@@ -5966,7 +5920,7 @@ async function resolveRouteRequestContext(options) {
5966
5920
  }
5967
5921
  await modelManager.fetchModels(providers, forceRefresh);
5968
5922
  }
5969
- const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore);
5923
+ const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore, logger);
5970
5924
  let baseUrl;
5971
5925
  let selectedModel;
5972
5926
  if (forcedProvider) {
@@ -6011,7 +5965,7 @@ async function resolveRouteRequestContext(options) {
6011
5965
  providerRegistry,
6012
5966
  "min",
6013
5967
  mode,
6014
- { usageTrackingDriver, sdkStore, providerManager }
5968
+ { usageTrackingDriver, sdkStore, providerManager, logger }
6015
5969
  );
6016
5970
  if (debugLevel) {
6017
5971
  client.setDebugLevel(debugLevel);
@@ -6076,6 +6030,6 @@ function extractStream(requestBody) {
6076
6030
  return typeof stream === "boolean" ? stream : void 0;
6077
6031
  }
6078
6032
 
6079
- export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, createBunSqliteDriver, createBunSqliteUsageTrackingDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver };
6033
+ export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, consoleLogger, createBunSqliteDriver, createBunSqliteUsageTrackingDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, noopLogger, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver };
6080
6034
  //# sourceMappingURL=index.mjs.map
6081
6035
  //# sourceMappingURL=index.mjs.map