routstrd 0.2.18 → 0.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lock CHANGED
@@ -4,7 +4,7 @@
4
4
  "": {
5
5
  "dependencies": {
6
6
  "@cashu/cashu-ts": "^3.1.1",
7
- "@routstr/sdk": "^0.3.2",
7
+ "@routstr/sdk": "^0.3.4",
8
8
  "applesauce-core": "^5.1.0",
9
9
  "applesauce-relay": "^5.1.0",
10
10
  "commander": "^14.0.2",
@@ -31,7 +31,7 @@
31
31
 
32
32
  "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
33
33
 
34
- "@routstr/sdk": ["@routstr/sdk@0.3.2", "", { "dependencies": { "@cashu/cashu-ts": "^3.1.1", "applesauce-core": "^5.1.0", "applesauce-relay": "^5.1.0", "rxjs": "^7.8.1", "zustand": "^5.0.5" }, "optionalDependencies": { "better-sqlite3": "^11.7.2" }, "peerDependencies": { "typescript": ">=5.0.0" } }, "sha512-sNUa48UwNcoFRidfVLOFQ+VGX723G1In5L1nb2w1C45GeiofSTUj9v+eBJCEU12WpBafFahHYaqQaaTzZ8LWKw=="],
34
+ "@routstr/sdk": ["@routstr/sdk@0.3.4", "", { "dependencies": { "@cashu/cashu-ts": "^3.1.1", "applesauce-core": "^5.1.0", "applesauce-relay": "^5.1.0", "rxjs": "^7.8.1", "zustand": "^5.0.5" }, "optionalDependencies": { "better-sqlite3": "^11.7.2" }, "peerDependencies": { "typescript": ">=5.0.0" } }, "sha512-v07U5M9r/gzRRiT3fFn5NvKv0QM17UU1h1OlGS1Yw2LpXVAVNzmrfJRyLfyx7XNz8JVRkj50AeBIoMjRBiqZMQ=="],
35
35
 
36
36
  "@scure/base": ["@scure/base@2.0.0", "", {}, "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w=="],
37
37
 
@@ -32087,6 +32087,7 @@ __export(exports_dist, {
32087
32087
  setDefaultUsageTrackingDriver: () => setDefaultUsageTrackingDriver,
32088
32088
  routeRequests: () => routeRequests,
32089
32089
  normalizeProviderUrl: () => normalizeProviderUrl,
32090
+ noopLogger: () => noopLogger,
32090
32091
  localStorageDriver: () => localStorageDriver,
32091
32092
  isTorContext: () => isTorContext,
32092
32093
  isOnionUrl: () => isOnionUrl,
@@ -32112,6 +32113,7 @@ __export(exports_dist, {
32112
32113
  createDiscoveryAdapterFromStore: () => createDiscoveryAdapterFromStore,
32113
32114
  createBunSqliteUsageTrackingDriver: () => createBunSqliteUsageTrackingDriver,
32114
32115
  createBunSqliteDriver: () => createBunSqliteDriver,
32116
+ consoleLogger: () => consoleLogger,
32115
32117
  TokenOperationError: () => TokenOperationError,
32116
32118
  StreamingError: () => StreamingError,
32117
32119
  StreamProcessor: () => StreamProcessor,
@@ -32133,6 +32135,16 @@ __export(exports_dist, {
32133
32135
  });
32134
32136
  import { Transform } from "stream";
32135
32137
  import { StringDecoder } from "string_decoder";
32138
+ function makeConsoleLogger(prefix) {
32139
+ const fmt = (args) => prefix ? [prefix, ...args] : args;
32140
+ return {
32141
+ log: (...args) => console.log(...fmt(args)),
32142
+ warn: (...args) => console.warn(...fmt(args)),
32143
+ error: (...args) => console.error(...fmt(args)),
32144
+ debug: (...args) => console.log(...fmt(args)),
32145
+ child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
32146
+ };
32147
+ }
32136
32148
  function isNetworkErrorMessage(message) {
32137
32149
  return message.includes("NetworkError when attempting to fetch resource") || message.includes("Failed to fetch") || message.includes("Load failed") || message.includes("ERR_TLS_CERT_ALTNAME_INVALID") || message.includes("ERR_TLS_CERT_NOT_YET_VALID") || message.includes("ERR_TLS_CERT_EXPIRED") || message.includes("UNABLE_TO_VERIFY_LEAF_SIGNATURE") || message.includes("SELF_SIGNED_CERT_IN_CHAIN");
32138
32150
  }
@@ -32357,7 +32369,8 @@ function calculateImageTokens(width, height, detail = "auto") {
32357
32369
  function isInsecureHttpUrl(url2) {
32358
32370
  return url2.startsWith("http://");
32359
32371
  }
32360
- async function createBunSqliteDriver(dbPath) {
32372
+ async function createBunSqliteDriver(dbPath, options) {
32373
+ const logger3 = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
32361
32374
  const SQLite = (await import("bun:sqlite")).default;
32362
32375
  const db = new SQLite(dbPath);
32363
32376
  db.run(`
@@ -32381,7 +32394,7 @@ async function createBunSqliteDriver(dbPath) {
32381
32394
  throw parseError;
32382
32395
  }
32383
32396
  } catch (error) {
32384
- console.error(`SQLite getItem failed for key "${key}":`, error);
32397
+ logger3.error(`getItem failed for key "${key}":`, error);
32385
32398
  return defaultValue;
32386
32399
  }
32387
32400
  },
@@ -32389,14 +32402,14 @@ async function createBunSqliteDriver(dbPath) {
32389
32402
  try {
32390
32403
  db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
32391
32404
  } catch (error) {
32392
- console.error(`SQLite setItem failed for key "${key}":`, error);
32405
+ logger3.error(`setItem failed for key "${key}":`, error);
32393
32406
  }
32394
32407
  },
32395
32408
  async removeItem(key) {
32396
32409
  try {
32397
32410
  db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
32398
32411
  } catch (error) {
32399
- console.error(`SQLite removeItem failed for key "${key}":`, error);
32412
+ logger3.error(`removeItem failed for key "${key}":`, error);
32400
32413
  }
32401
32414
  }
32402
32415
  };
@@ -32625,7 +32638,8 @@ async function resolveRouteRequestContext(options) {
32625
32638
  mode = "apikeys",
32626
32639
  usageTrackingDriver,
32627
32640
  sdkStore,
32628
- providerManager: providedProviderManager
32641
+ providerManager: providedProviderManager,
32642
+ logger: logger3
32629
32643
  } = options;
32630
32644
  let modelManager;
32631
32645
  let providers;
@@ -32637,7 +32651,8 @@ async function resolveRouteRequestContext(options) {
32637
32651
  }
32638
32652
  } else {
32639
32653
  modelManager = new ModelManager(discoveryAdapter, {
32640
- includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls
32654
+ includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls,
32655
+ logger: logger3
32641
32656
  });
32642
32657
  providers = await modelManager.bootstrapProviders(torMode);
32643
32658
  if (providers.length === 0) {
@@ -32645,7 +32660,7 @@ async function resolveRouteRequestContext(options) {
32645
32660
  }
32646
32661
  await modelManager.fetchModels(providers, forceRefresh);
32647
32662
  }
32648
- const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore);
32663
+ const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore, logger3);
32649
32664
  let baseUrl;
32650
32665
  let selectedModel;
32651
32666
  if (forcedProvider) {
@@ -32680,7 +32695,7 @@ async function resolveRouteRequestContext(options) {
32680
32695
  if (!mintUrl) {
32681
32696
  throw new Error("No mint configured in wallet");
32682
32697
  }
32683
- const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager });
32698
+ const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager, logger: logger3 });
32684
32699
  if (debugLevel) {
32685
32700
  client2.setDebugLevel(debugLevel);
32686
32701
  }
@@ -32743,18 +32758,20 @@ function extractStream(requestBody) {
32743
32758
  const stream = body.stream;
32744
32759
  return typeof stream === "boolean" ? stream : undefined;
32745
32760
  }
32746
- var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
32761
+ var import_rxjs24, consoleLogger, noopLogger, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
32747
32762
  constructor(adapter, config = {}) {
32748
32763
  this.adapter = adapter;
32749
32764
  this.providerDirectoryUrl = config.providerDirectoryUrl || "https://api.routstr.com/v1/providers/";
32750
32765
  this.cacheTTL = config.cacheTTL || 210 * 60 * 1000;
32751
32766
  this.includeProviderUrls = config.includeProviderUrls || [];
32752
32767
  this.excludeProviderUrls = config.excludeProviderUrls || [];
32768
+ this.logger = (config.logger ?? consoleLogger).child("ModelManager");
32753
32769
  }
32754
32770
  cacheTTL;
32755
32771
  providerDirectoryUrl;
32756
32772
  includeProviderUrls;
32757
32773
  excludeProviderUrls;
32774
+ logger;
32758
32775
  getBaseUrls() {
32759
32776
  return this.adapter.getBaseUrlsList();
32760
32777
  }
@@ -32788,7 +32805,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32788
32805
  return filtered;
32789
32806
  }
32790
32807
  } catch (e) {
32791
- console.warn("Nostr bootstrap failed, falling back to HTTP:", e);
32808
+ this.logger.warn("Nostr bootstrap failed, falling back to HTTP:", e);
32792
32809
  }
32793
32810
  return this.bootstrapFromHttp(torMode, forceRefresh);
32794
32811
  }
@@ -32855,7 +32872,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32855
32872
  }
32856
32873
  }
32857
32874
  } catch {
32858
- console.warn("[NostrBootstrap] Failed to parse Nostr event content:", event3.id);
32875
+ this.logger.warn("NostrBootstrap: failed to parse event content:", event3.id);
32859
32876
  }
32860
32877
  }
32861
32878
  }
@@ -32899,7 +32916,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32899
32916
  }
32900
32917
  return list;
32901
32918
  } catch (e) {
32902
- console.error("Failed to bootstrap providers", e);
32919
+ this.logger.error("Failed to bootstrap providers", e);
32903
32920
  throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);
32904
32921
  }
32905
32922
  }
@@ -32958,9 +32975,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32958
32975
  return { success: true, base: base2, list };
32959
32976
  } catch (error) {
32960
32977
  if (this.isProviderDownError(error)) {
32961
- console.warn(`Provider ${base2} is down right now.`);
32978
+ this.logger.warn(`Provider ${base2} is down right now.`);
32962
32979
  } else {
32963
- console.warn(`Failed to fetch models from ${base2}:`, error);
32980
+ this.logger.warn(`Failed to fetch models from ${base2}:`, error);
32964
32981
  }
32965
32982
  this.adapter.setProviderLastUpdate(base2, Date.now());
32966
32983
  return { success: false, base: base2 };
@@ -33082,7 +33099,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33082
33099
  this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
33083
33100
  return models;
33084
33101
  } catch {
33085
- console.warn("[Routstr21Models] Failed to parse Nostr event content:", event3.id);
33102
+ this.logger.warn("Routstr21Models: failed to parse Nostr event content:", event3.id);
33086
33103
  return cachedModels.length > 0 ? cachedModels : [];
33087
33104
  }
33088
33105
  }
@@ -33090,8 +33107,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33090
33107
  constructor(adapter, config = {}) {
33091
33108
  this.adapter = adapter;
33092
33109
  this.cacheTTL = config.cacheTTL || 21 * 60 * 1000;
33110
+ this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
33093
33111
  }
33094
33112
  cacheTTL;
33113
+ logger;
33095
33114
  async discoverMints(baseUrls, options = {}) {
33096
33115
  if (baseUrls.length === 0) {
33097
33116
  return { mintsFromProviders: {}, infoFromProviders: {} };
@@ -33134,9 +33153,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33134
33153
  } catch (error) {
33135
33154
  this.adapter.setProviderLastUpdate(base2, Date.now());
33136
33155
  if (this.isProviderDownError(error)) {
33137
- console.warn(`Provider ${base2} is down right now.`);
33156
+ this.logger.warn(`Provider ${base2} is down right now.`);
33138
33157
  } else {
33139
- console.warn(`Failed to fetch mints from ${base2}:`, error);
33158
+ this.logger.warn(`Failed to fetch mints from ${base2}:`, error);
33140
33159
  }
33141
33160
  return { success: false, base: base2, mints: [], info: null };
33142
33161
  }
@@ -33150,14 +33169,14 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33150
33169
  infoFromAllProviders[base2] = info;
33151
33170
  }
33152
33171
  } else {
33153
- console.error("Mint discovery error:", result.reason);
33172
+ this.logger.error("Mint discovery error:", result.reason);
33154
33173
  }
33155
33174
  }
33156
33175
  try {
33157
33176
  this.adapter.setCachedMints(mintsFromAllProviders);
33158
33177
  this.adapter.setCachedProviderInfo(infoFromAllProviders);
33159
33178
  } catch (error) {
33160
- console.error("Error caching mint discovery results:", error);
33179
+ this.logger.error("Error caching mint discovery results:", error);
33161
33180
  }
33162
33181
  return {
33163
33182
  mintsFromProviders: mintsFromAllProviders,
@@ -33254,14 +33273,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33254
33273
  });
33255
33274
  }
33256
33275
  }, auditLogger, CashuSpender = class {
33257
- constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager) {
33276
+ constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager, logger3) {
33258
33277
  this.walletAdapter = walletAdapter;
33259
33278
  this.storageAdapter = storageAdapter;
33260
33279
  this._providerRegistry = _providerRegistry;
33261
33280
  this.balanceManager = balanceManager;
33281
+ this.logger = (logger3 ?? consoleLogger).child("CashuSpender");
33262
33282
  }
33263
33283
  _isBusy = false;
33264
33284
  debugLevel = "WARN";
33285
+ logger;
33265
33286
  async receiveToken(token) {
33266
33287
  try {
33267
33288
  const result = await this.walletAdapter.receiveToken(token);
@@ -33351,13 +33372,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33351
33372
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
33352
33373
  switch (level) {
33353
33374
  case "DEBUG":
33354
- console.log(...args);
33375
+ this.logger.log(...args);
33355
33376
  break;
33356
33377
  case "WARN":
33357
- console.warn(...args);
33378
+ this.logger.warn(...args);
33358
33379
  break;
33359
33380
  case "ERROR":
33360
- console.error(...args);
33381
+ this.logger.error(...args);
33361
33382
  break;
33362
33383
  }
33363
33384
  }
@@ -33672,10 +33693,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33672
33693
  return 0;
33673
33694
  }
33674
33695
  }, BalanceManager = class _BalanceManager {
33675
- constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
33696
+ constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger3) {
33676
33697
  this.walletAdapter = walletAdapter;
33677
33698
  this.storageAdapter = storageAdapter;
33678
33699
  this.providerRegistry = providerRegistry;
33700
+ this.logger = (logger3 ?? consoleLogger).child("BalanceManager");
33679
33701
  if (cashuSpender) {
33680
33702
  this.cashuSpender = cashuSpender;
33681
33703
  } else {
@@ -33685,6 +33707,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33685
33707
  cashuSpender;
33686
33708
  providerWalletOps = /* @__PURE__ */ new Map;
33687
33709
  static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
33710
+ logger;
33688
33711
  _canRunProviderWalletOperation(baseUrl, type) {
33689
33712
  const existing = this.providerWalletOps.get(baseUrl);
33690
33713
  if (!existing) {
@@ -33750,7 +33773,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33750
33773
  const { mintUrl, baseUrl, apiKey, forceRefund } = options;
33751
33774
  const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
33752
33775
  if (!guard.allowed) {
33753
- console.log(`[BalanceManager] Skipping refund for ${baseUrl} - ${guard.reason}`);
33776
+ this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
33754
33777
  return { success: false, message: guard.reason };
33755
33778
  }
33756
33779
  this._beginProviderWalletOperation(baseUrl, "refund");
@@ -33770,7 +33793,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33770
33793
  if (apiKeyEntry?.lastUsed) {
33771
33794
  const fiveMinutesAgo = Date.now() - 300000;
33772
33795
  if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
33773
- console.log(`[BalanceManager] Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
33796
+ this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
33774
33797
  return {
33775
33798
  success: false,
33776
33799
  message: "API key was used recently, skipping refund"
@@ -33810,7 +33833,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33810
33833
  requestId: fetchResult.requestId
33811
33834
  };
33812
33835
  } catch (error) {
33813
- console.error("[BalanceManager] API key refund error", error);
33836
+ this.logger.error("API key refund error", error);
33814
33837
  return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
33815
33838
  }
33816
33839
  }
@@ -33859,7 +33882,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33859
33882
  };
33860
33883
  } catch (error) {
33861
33884
  clearTimeout(timeoutId);
33862
- console.error("[BalanceManager.fetchRefundToken] Fetch error", error);
33885
+ this.logger.error("fetchRefundToken fetch error", error);
33863
33886
  if (error instanceof Error) {
33864
33887
  if (error.name === "AbortError") {
33865
33888
  return {
@@ -33882,7 +33905,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33882
33905
  const { mintUrl, baseUrl, amount, token: providedToken } = options;
33883
33906
  const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
33884
33907
  if (!guard.allowed) {
33885
- console.log(`[BalanceManager] Skipping topup for ${baseUrl} - ${guard.reason}`);
33908
+ this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
33886
33909
  return { success: false, message: guard.reason };
33887
33910
  }
33888
33911
  this._beginProviderWalletOperation(baseUrl, "topup");
@@ -33919,7 +33942,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33919
33942
  cashuToken = tokenResult.token;
33920
33943
  const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
33921
33944
  requestId = topUpResult.requestId;
33922
- console.log(topUpResult);
33945
+ this.logger.log("topUpResult:", topUpResult);
33923
33946
  if (!topUpResult.success) {
33924
33947
  await this._recoverFailedTopUp(cashuToken);
33925
33948
  return {
@@ -33935,7 +33958,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33935
33958
  requestId
33936
33959
  };
33937
33960
  } catch (error) {
33938
- console.log("DEBUG", `[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`);
33961
+ this.logger.log(`topup error for ${baseUrl}: ${error}`);
33939
33962
  if (cashuToken) {
33940
33963
  await this._recoverFailedTopUp(cashuToken);
33941
33964
  }
@@ -33952,9 +33975,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33952
33975
  p2pkPubkey
33953
33976
  } = options;
33954
33977
  const adjustedAmount = Math.ceil(amount);
33955
- console.log(`[BalanceManager.createProviderToken] Starting: baseUrl=${baseUrl}, mintUrl=${mintUrl}, amount=${amount}, adjustedAmount=${adjustedAmount}, retryCount=${retryCount}`);
33978
+ this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
33956
33979
  if (!adjustedAmount || isNaN(adjustedAmount)) {
33957
- console.error(`[BalanceManager.createProviderToken] FAILURE: Invalid amount - amount=${amount}, adjustedAmount=${adjustedAmount}`);
33980
+ this.logger.error(`createProviderToken: invalid amount=${amount}`);
33958
33981
  return { success: false, error: "Invalid top up amount" };
33959
33982
  }
33960
33983
  const balanceState = await this.getBalanceState();
@@ -33972,7 +33995,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33972
33995
  }
33973
33996
  if (totalMintBalance + targetProviderBalance < adjustedAmount) {
33974
33997
  const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance + targetProviderBalance, totalMintBalance, Object.entries(balanceState.mintBalances).reduce((max, [url2, balance]) => balance > max.balance ? { url: url2, balance } : max, { url: "", balance: 0 }).url);
33975
- console.error(`[BalanceManager.createProviderToken] FAILURE: Insufficient balance - required=${adjustedAmount}, available=${totalMintBalance + targetProviderBalance}, totalMintBalance=${totalMintBalance}, targetProviderBalance=${targetProviderBalance}, refundableProviderBalance=${refundableProviderBalance}`);
33998
+ this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
33976
33999
  return { success: false, error: error.message };
33977
34000
  }
33978
34001
  const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
@@ -34008,16 +34031,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34008
34031
  maxMintUrl = mintUrl2;
34009
34032
  }
34010
34033
  }
34011
- console.error(`[BalanceManager.createProviderToken] FAILURE: No candidate mints found - requiredAmount=${requiredAmount}, totalMintBalance=${totalMintBalance}, maxBalance=${maxBalance}, maxMintUrl=${maxMintUrl}, providerMints=${JSON.stringify(providerMints)}`);
34034
+ this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
34012
34035
  const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance, maxBalance, maxMintUrl);
34013
34036
  return { success: false, error: error.message };
34014
34037
  }
34015
34038
  let lastError;
34016
34039
  for (const candidateMint of candidates) {
34017
34040
  try {
34018
- console.log(`[BalanceManager.createProviderToken] Attempting mint: ${candidateMint}, amount: ${requiredAmount}`);
34041
+ this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
34019
34042
  const token = await this.walletAdapter.sendToken(candidateMint, requiredAmount, p2pkPubkey);
34020
- console.log(`[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])])))}`);
34043
+ this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
34021
34044
  return {
34022
34045
  success: true,
34023
34046
  token,
@@ -34026,11 +34049,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34026
34049
  };
34027
34050
  } catch (error) {
34028
34051
  const errorMsg = error instanceof Error ? error.message : String(error);
34029
- console.error(`[BalanceManager.createProviderToken] FAILURE: Mint ${candidateMint} failed with error: ${errorMsg}`);
34052
+ this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
34030
34053
  if (error instanceof Error) {
34031
34054
  lastError = errorMsg;
34032
34055
  if (isNetworkErrorMessage(error.message)) {
34033
- console.warn(`[BalanceManager.createProviderToken] Network error from ${candidateMint}, trying next mint...`);
34056
+ this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
34034
34057
  continue;
34035
34058
  }
34036
34059
  }
@@ -34040,7 +34063,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34040
34063
  };
34041
34064
  }
34042
34065
  }
34043
- console.error(`[BalanceManager.createProviderToken] FAILURE: All candidate mints exhausted - lastError=${lastError}, candidates=${JSON.stringify(candidates)}`);
34066
+ this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
34044
34067
  return {
34045
34068
  success: false,
34046
34069
  error: lastError || "All candidate mints failed while creating top up token"
@@ -34141,7 +34164,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34141
34164
  return { success: true, requestId };
34142
34165
  } catch (error) {
34143
34166
  clearTimeout(timeoutId);
34144
- console.error("[BalanceManager._postTopUp] Fetch error", error);
34167
+ this.logger.error("_postTopUp fetch error", error);
34145
34168
  if (error instanceof Error) {
34146
34169
  if (error.name === "AbortError") {
34147
34170
  return {
@@ -34164,7 +34187,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34164
34187
  try {
34165
34188
  await this.cashuSpender.receiveToken(cashuToken);
34166
34189
  } catch (error) {
34167
- console.error("[BalanceManager._recoverFailedTopUp] Failed to recover token", error);
34190
+ this.logger.error("_recoverFailedTopUp: failed to recover token", error);
34168
34191
  }
34169
34192
  }
34170
34193
  _handleRefundError(error, mintUrl, requestId) {
@@ -34211,9 +34234,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34211
34234
  apiKey: data.api_key
34212
34235
  };
34213
34236
  } else {
34214
- console.log(response.status);
34237
+ this.logger.warn(`getTokenBalance: status=${response.status}`);
34215
34238
  const data = await response.json();
34216
- console.log("FAILED ", data);
34239
+ this.logger.warn("getTokenBalance: FAILED", data);
34217
34240
  const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
34218
34241
  return {
34219
34242
  amount: -1,
@@ -34224,7 +34247,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34224
34247
  };
34225
34248
  }
34226
34249
  } catch (error) {
34227
- console.error("ERRORR IN RESTPONSE", error);
34250
+ this.logger.error("getTokenBalance error", error);
34228
34251
  }
34229
34252
  return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
34230
34253
  }
@@ -34521,9 +34544,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34521
34544
  const filtered = normalized.filter((value) => torMode ? true : !isOnionUrl(value));
34522
34545
  return dedupePreserveOrder(filtered.filter((value) => shouldAllowHttp(value, torMode)));
34523
34546
  }, ProviderManager = class _ProviderManager {
34524
- constructor(providerRegistry, store) {
34547
+ constructor(providerRegistry, store, logger3) {
34525
34548
  this.providerRegistry = providerRegistry;
34526
34549
  this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
34550
+ this.logger = (logger3 ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
34527
34551
  if (store) {
34528
34552
  this.store = store;
34529
34553
  this.hydrateFromStore();
@@ -34535,6 +34559,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34535
34559
  static COOLDOWN_DURATION_MS = 42000;
34536
34560
  store = null;
34537
34561
  instanceId;
34562
+ logger;
34538
34563
  hydrateFromStore() {
34539
34564
  if (!this.store)
34540
34565
  return;
@@ -34543,10 +34568,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34543
34568
  this.lastFailed = new Map(Object.entries(state.lastFailed));
34544
34569
  const now2 = Date.now();
34545
34570
  this.providersOnCoolDown = state.providersOnCooldown.filter((entry) => now2 - entry.timestamp < _ProviderManager.COOLDOWN_DURATION_MS).map((entry) => [entry.baseUrl, entry.timestamp]);
34546
- console.log(`[ProviderManager:${this.instanceId}] Hydrated from store:`);
34547
- console.log(` failedProviders: ${this.failedProviders.size}`);
34548
- console.log(` lastFailed: ${this.lastFailed.size}`);
34549
- console.log(` providersOnCooldown: ${this.providersOnCoolDown.length}`);
34571
+ this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
34550
34572
  }
34551
34573
  getInstanceId() {
34552
34574
  return this.instanceId;
@@ -34558,7 +34580,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34558
34580
  const age = now2 - timestamp;
34559
34581
  const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
34560
34582
  if (isExpired) {
34561
- console.log(`[cleanupExpiredCooldowns:${this.instanceId}] Removing expired cooldown for ${url2} (age: ${age}ms, cooldown: ${_ProviderManager.COOLDOWN_DURATION_MS}ms)`);
34583
+ this.logger.log(`Removing expired cooldown for ${url2} (age: ${age}ms)`);
34562
34584
  this.failedProviders.delete(url2);
34563
34585
  if (this.store) {
34564
34586
  this.store.getState().removeFailedProvider(url2);
@@ -34568,7 +34590,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34568
34590
  });
34569
34591
  const after = this.providersOnCoolDown.length;
34570
34592
  if (before !== after) {
34571
- console.log(`[cleanupExpiredCooldowns:${this.instanceId}] Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
34593
+ this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
34572
34594
  }
34573
34595
  }
34574
34596
  getCooldownDurationMs() {
@@ -34598,14 +34620,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34598
34620
  markFailed(baseUrl) {
34599
34621
  const now2 = Date.now();
34600
34622
  const lastFailure = this.lastFailed.get(baseUrl);
34601
- console.log(`[markFailed:${this.instanceId}] baseUrl: ${baseUrl}`);
34602
- console.log(`[markFailed:${this.instanceId}] lastFailure from map: ${lastFailure}`);
34603
- console.log(`[markFailed:${this.instanceId}] current timestamp (now): ${now2}`);
34604
- console.log(`[markFailed:${this.instanceId}] COOLDOWN_DURATION_MS: ${_ProviderManager.COOLDOWN_DURATION_MS}`);
34623
+ this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now2}`);
34605
34624
  if (lastFailure !== undefined) {
34606
34625
  const timeSinceLastFailure = now2 - lastFailure;
34607
- console.log(`[markFailed:${this.instanceId}] timeSinceLastFailure: ${timeSinceLastFailure}ms`);
34608
- console.log(`[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
34626
+ this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
34609
34627
  }
34610
34628
  this.lastFailed.set(baseUrl, now2);
34611
34629
  this.failedProviders.add(baseUrl);
@@ -34613,24 +34631,23 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34613
34631
  this.store.getState().setLastFailedTimestamp(baseUrl, now2);
34614
34632
  this.store.getState().addFailedProvider(baseUrl);
34615
34633
  }
34616
- console.log(`[markFailed:${this.instanceId}] Updated lastFailed map for ${baseUrl} to ${now2}`);
34617
- console.log(`[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`);
34634
+ this.logger.log(`markFailed: updated ${baseUrl} to ${now2}, failedProviders=${this.failedProviders.size}`);
34618
34635
  if (lastFailure !== undefined && now2 - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
34619
- console.log(`[markFailed:${this.instanceId}] Second failure detected within cooldown window for ${baseUrl}`);
34636
+ this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
34620
34637
  if (!this.isOnCooldown(baseUrl)) {
34621
34638
  this.providersOnCoolDown.push([baseUrl, now2]);
34622
34639
  if (this.store) {
34623
34640
  this.store.getState().addProviderOnCooldown(baseUrl, now2);
34624
34641
  }
34625
- console.log(`[markFailed:${this.instanceId}] Provider ${baseUrl} added to cooldown after second failure within 5 minutes`);
34642
+ this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
34626
34643
  } else {
34627
- console.log(`[markFailed:${this.instanceId}] Provider ${baseUrl} is already on cooldown`);
34644
+ this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
34628
34645
  }
34629
34646
  } else {
34630
34647
  if (lastFailure === undefined) {
34631
- console.log(`[markFailed:${this.instanceId}] First failure for ${baseUrl} - not adding to cooldown yet`);
34648
+ this.logger.log(`markFailed: first failure for ${baseUrl}`);
34632
34649
  } else {
34633
- console.log(`[markFailed:${this.instanceId}] Failure outside cooldown window for ${baseUrl} (timeSinceLastFailure: ${now2 - lastFailure}ms)`);
34650
+ this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now2 - lastFailure}ms ago)`);
34634
34651
  }
34635
34652
  }
34636
34653
  }
@@ -34662,15 +34679,12 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34662
34679
  try {
34663
34680
  const torMode = isTorContext();
34664
34681
  const disabledProviders = new Set(this.providerRegistry.getDisabledProviders());
34665
- console.log(`[findNextBestProvider:${this.instanceId}] Starting search for model: ${modelId}`);
34666
- console.log(`[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`);
34667
- console.log(`[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url2]) => url2)}`);
34682
+ this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
34668
34683
  const allProviders = this.providerRegistry.getAllProvidersModels();
34669
- console.log(`[findNextBestProvider:${this.instanceId}] Total providers in registry: ${Object.keys(allProviders).length}`);
34684
+ this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
34670
34685
  const candidates = [];
34671
34686
  for (const [baseUrl, models] of Object.entries(allProviders)) {
34672
34687
  if (baseUrl === currentBaseUrl) {
34673
- console.log(`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`);
34674
34688
  continue;
34675
34689
  }
34676
34690
  if (disabledProviders.has(baseUrl)) {
@@ -34696,7 +34710,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34696
34710
  return null;
34697
34711
  }
34698
34712
  } catch (error) {
34699
- console.error("Error finding next best provider:", error);
34713
+ this.logger.error("findNextBestProvider error:", error);
34700
34714
  return null;
34701
34715
  }
34702
34716
  }
@@ -34804,13 +34818,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34804
34818
  if (res) {
34805
34819
  const tokensFromImage = calculateImageTokens(res.width, res.height);
34806
34820
  imageTokens += tokensFromImage;
34807
- console.log("IMAGE INPUT RESOLUTION", {
34808
- width: res.width,
34809
- height: res.height,
34810
- tokensFromImage
34811
- });
34821
+ this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
34812
34822
  } else {
34813
- console.log("IMAGE INPUT RESOLUTION", "unknown (unsupported format or parse failure)");
34823
+ this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
34814
34824
  }
34815
34825
  }
34816
34826
  }
@@ -34841,7 +34851,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34841
34851
  const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
34842
34852
  return totalEstimatedCosts;
34843
34853
  } catch (e) {
34844
- console.error(e);
34854
+ this.logger.error("getRequiredSatsForModel error:", e);
34845
34855
  return 0;
34846
34856
  }
34847
34857
  }
@@ -36132,38 +36142,41 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36132
36142
  updateXcashuTokenTryCount: (token, tryCount) => {
36133
36143
  store.getState().updateXcashuTokenTryCount(token, tryCount);
36134
36144
  }
36135
- }), createProviderRegistryFromStore = (store) => ({
36136
- getModelsForProvider: (baseUrl) => {
36137
- const normalized = normalizeBaseUrl5(baseUrl);
36138
- return store.getState().modelsFromAllProviders[normalized] || [];
36139
- },
36140
- getDisabledProviders: () => store.getState().disabledProviders,
36141
- getProviderMints: (baseUrl) => {
36142
- const normalized = normalizeBaseUrl5(baseUrl);
36143
- return store.getState().mintsFromAllProviders[normalized] || [];
36144
- },
36145
- getProviderInfo: async (baseUrl) => {
36146
- const normalized = normalizeBaseUrl5(baseUrl);
36147
- const cached = store.getState().infoFromAllProviders[normalized];
36148
- if (cached)
36149
- return cached;
36150
- try {
36151
- const response = await fetch(`${normalized}v1/info`);
36152
- if (!response.ok) {
36153
- throw new Error(`Failed ${response.status}`);
36145
+ }), createProviderRegistryFromStore = (store, logger3) => {
36146
+ const log3 = (logger3 ?? consoleLogger).child("ProviderRegistry");
36147
+ return {
36148
+ getModelsForProvider: (baseUrl) => {
36149
+ const normalized = normalizeBaseUrl5(baseUrl);
36150
+ return store.getState().modelsFromAllProviders[normalized] || [];
36151
+ },
36152
+ getDisabledProviders: () => store.getState().disabledProviders,
36153
+ getProviderMints: (baseUrl) => {
36154
+ const normalized = normalizeBaseUrl5(baseUrl);
36155
+ return store.getState().mintsFromAllProviders[normalized] || [];
36156
+ },
36157
+ getProviderInfo: async (baseUrl) => {
36158
+ const normalized = normalizeBaseUrl5(baseUrl);
36159
+ const cached = store.getState().infoFromAllProviders[normalized];
36160
+ if (cached)
36161
+ return cached;
36162
+ try {
36163
+ const response = await fetch(`${normalized}v1/info`);
36164
+ if (!response.ok) {
36165
+ throw new Error(`Failed ${response.status}`);
36166
+ }
36167
+ const info = await response.json();
36168
+ const next = { ...store.getState().infoFromAllProviders };
36169
+ next[normalized] = info;
36170
+ store.getState().setInfoFromAllProviders(next);
36171
+ return info;
36172
+ } catch (error) {
36173
+ log3.warn(`Failed to fetch provider info from ${normalized}:`, error);
36174
+ return null;
36154
36175
  }
36155
- const info = await response.json();
36156
- const next = { ...store.getState().infoFromAllProviders };
36157
- next[normalized] = info;
36158
- store.getState().setInfoFromAllProviders(next);
36159
- return info;
36160
- } catch (error) {
36161
- console.warn(`Failed to fetch provider info from ${normalized}:`, error);
36162
- return null;
36163
- }
36164
- },
36165
- getAllProvidersModels: () => store.getState().modelsFromAllProviders
36166
- }), isBrowser3 = () => {
36176
+ },
36177
+ getAllProvidersModels: () => store.getState().modelsFromAllProviders
36178
+ };
36179
+ }, isBrowser3 = () => {
36167
36180
  try {
36168
36181
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
36169
36182
  } catch {
@@ -36228,6 +36241,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36228
36241
  this.walletAdapter = walletAdapter;
36229
36242
  this.storageAdapter = storageAdapter;
36230
36243
  this.providerRegistry = providerRegistry;
36244
+ this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
36231
36245
  this.balanceManager = new BalanceManager(walletAdapter, storageAdapter, providerRegistry);
36232
36246
  this.cashuSpender = new CashuSpender(walletAdapter, storageAdapter, providerRegistry, this.balanceManager);
36233
36247
  this.streamProcessor = new StreamProcessor;
@@ -36235,7 +36249,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36235
36249
  this.mode = mode;
36236
36250
  this.usageTrackingDriver = options.usageTrackingDriver;
36237
36251
  this.sdkStore = options.sdkStore;
36238
- this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
36252
+ this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
36239
36253
  }
36240
36254
  cashuSpender;
36241
36255
  balanceManager;
@@ -36246,6 +36260,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36246
36260
  debugLevel = "WARN";
36247
36261
  usageTrackingDriver;
36248
36262
  sdkStore;
36263
+ logger;
36249
36264
  getMode() {
36250
36265
  return this.mode;
36251
36266
  }
@@ -36264,13 +36279,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36264
36279
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
36265
36280
  switch (level) {
36266
36281
  case "DEBUG":
36267
- console.log(...args);
36282
+ this.logger.log(...args);
36268
36283
  break;
36269
36284
  case "WARN":
36270
- console.warn(...args);
36285
+ this.logger.warn(...args);
36271
36286
  break;
36272
36287
  case "ERROR":
36273
- console.error(...args);
36288
+ this.logger.error(...args);
36274
36289
  break;
36275
36290
  }
36276
36291
  }
@@ -36702,7 +36717,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36702
36717
  tryNextProvider = true;
36703
36718
  }
36704
36719
  }
36705
- if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
36720
+ if ((status === 401 || status === 403 || status === 404 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
36706
36721
  this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`);
36707
36722
  if (this.mode === "apikeys") {
36708
36723
  this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`);
@@ -37044,6 +37059,18 @@ var init_dist3 = __esm(() => {
37044
37059
  import_rxjs24 = __toESM(require_cjs(), 1);
37045
37060
  init_cashu_ts_es();
37046
37061
  init_vanilla();
37062
+ consoleLogger = makeConsoleLogger();
37063
+ noopLogger = {
37064
+ log: () => {
37065
+ },
37066
+ warn: () => {
37067
+ },
37068
+ error: () => {
37069
+ },
37070
+ debug: () => {
37071
+ },
37072
+ child: () => noopLogger
37073
+ };
37047
37074
  InsufficientBalanceError = class extends Error {
37048
37075
  constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
37049
37076
  super(customMessage ?? `Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : ""));
@@ -37332,7 +37359,19 @@ function saveDaemonConfig(config) {
37332
37359
  }
37333
37360
 
37334
37361
  // node_modules/@routstr/sdk/dist/storage/index.mjs
37335
- async function createBunSqliteDriver2(dbPath) {
37362
+ function makeConsoleLogger2(prefix) {
37363
+ const fmt = (args) => prefix ? [prefix, ...args] : args;
37364
+ return {
37365
+ log: (...args) => console.log(...fmt(args)),
37366
+ warn: (...args) => console.warn(...fmt(args)),
37367
+ error: (...args) => console.error(...fmt(args)),
37368
+ debug: (...args) => console.log(...fmt(args)),
37369
+ child: (p) => makeConsoleLogger2(prefix ? `${prefix}:${p}` : p)
37370
+ };
37371
+ }
37372
+ var consoleLogger2 = makeConsoleLogger2();
37373
+ async function createBunSqliteDriver2(dbPath, options) {
37374
+ const logger4 = (options?.logger ?? consoleLogger2).child("BunSqliteDriver");
37336
37375
  const SQLite = (await import("bun:sqlite")).default;
37337
37376
  const db = new SQLite(dbPath);
37338
37377
  db.run(`
@@ -37356,7 +37395,7 @@ async function createBunSqliteDriver2(dbPath) {
37356
37395
  throw parseError;
37357
37396
  }
37358
37397
  } catch (error) {
37359
- console.error(`SQLite getItem failed for key "${key}":`, error);
37398
+ logger4.error(`getItem failed for key "${key}":`, error);
37360
37399
  return defaultValue;
37361
37400
  }
37362
37401
  },
@@ -37364,14 +37403,14 @@ async function createBunSqliteDriver2(dbPath) {
37364
37403
  try {
37365
37404
  db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
37366
37405
  } catch (error) {
37367
- console.error(`SQLite setItem failed for key "${key}":`, error);
37406
+ logger4.error(`setItem failed for key "${key}":`, error);
37368
37407
  }
37369
37408
  },
37370
37409
  async removeItem(key) {
37371
37410
  try {
37372
37411
  db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
37373
37412
  } catch (error) {
37374
- console.error(`SQLite removeItem failed for key "${key}":`, error);
37413
+ logger4.error(`removeItem failed for key "${key}":`, error);
37375
37414
  }
37376
37415
  }
37377
37416
  };
package/dist/index.js CHANGED
@@ -15629,7 +15629,7 @@ async function isCocodInstalled(cocodPath) {
15629
15629
  // package.json
15630
15630
  var package_default = {
15631
15631
  name: "routstrd",
15632
- version: "0.2.18",
15632
+ version: "0.2.19",
15633
15633
  module: "src/index.ts",
15634
15634
  type: "module",
15635
15635
  private: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "routstrd",
3
- "version": "0.2.18",
3
+ "version": "0.2.19",
4
4
  "module": "src/index.ts",
5
5
  "type": "module",
6
6
  "private": false,