@routstr/sdk 0.3.6 → 0.3.8

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 (35) hide show
  1. package/dist/client/index.d.mts +4 -4
  2. package/dist/client/index.d.ts +4 -4
  3. package/dist/client/index.js +69 -10
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/client/index.mjs +69 -10
  6. package/dist/client/index.mjs.map +1 -1
  7. package/dist/discovery/index.d.mts +2 -2
  8. package/dist/discovery/index.d.ts +2 -2
  9. package/dist/discovery/index.js +3 -0
  10. package/dist/discovery/index.js.map +1 -1
  11. package/dist/discovery/index.mjs +3 -0
  12. package/dist/discovery/index.mjs.map +1 -1
  13. package/dist/index.d.mts +12 -10
  14. package/dist/index.d.ts +12 -10
  15. package/dist/index.js +81 -14
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.mjs +81 -14
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/{interfaces-D2FDCLyP.d.ts → interfaces-C-DYd9Jy.d.ts} +1 -1
  20. package/dist/{interfaces-Bp0Ngmqv.d.mts → interfaces-Csn8Uq04.d.mts} +1 -1
  21. package/dist/{interfaces-Cqkt41QR.d.mts → interfaces-Cv1k2EUK.d.mts} +1 -1
  22. package/dist/{interfaces-D9qI1ym6.d.ts → interfaces-iL7CWeG5.d.ts} +1 -1
  23. package/dist/storage/index.d.mts +6 -6
  24. package/dist/storage/index.d.ts +6 -6
  25. package/dist/{store-BFUGGr_v.d.ts → store-58VcEUoA.d.ts} +3 -3
  26. package/dist/{store-C4FyyOnO.d.mts → store-C6dfj1cc.d.mts} +3 -3
  27. package/dist/{types-DPQM6tIG.d.mts → types-_21yYFZG.d.mts} +1 -1
  28. package/dist/{types-DPQM6tIG.d.ts → types-_21yYFZG.d.ts} +1 -1
  29. package/dist/wallet/index.d.mts +4 -4
  30. package/dist/wallet/index.d.ts +4 -4
  31. package/dist/wallet/index.js +55 -8
  32. package/dist/wallet/index.js.map +1 -1
  33. package/dist/wallet/index.mjs +55 -8
  34. package/dist/wallet/index.mjs.map +1 -1
  35. package/package.json +2 -2
@@ -28,6 +28,10 @@ var InsufficientBalanceError = class extends Error {
28
28
  this.maxMintUrl = maxMintUrl;
29
29
  this.name = "InsufficientBalanceError";
30
30
  }
31
+ required;
32
+ available;
33
+ maxMintBalance;
34
+ maxMintUrl;
31
35
  };
32
36
  var ProviderError = class extends Error {
33
37
  constructor(baseUrl, statusCode, message, requestId) {
@@ -39,6 +43,9 @@ var ProviderError = class extends Error {
39
43
  this.requestId = requestId;
40
44
  this.name = "ProviderError";
41
45
  }
46
+ baseUrl;
47
+ statusCode;
48
+ requestId;
42
49
  };
43
50
  var FailoverError = class extends Error {
44
51
  constructor(originalProvider, failedProviders, message) {
@@ -49,6 +56,8 @@ var FailoverError = class extends Error {
49
56
  this.failedProviders = failedProviders;
50
57
  this.name = "FailoverError";
51
58
  }
59
+ originalProvider;
60
+ failedProviders;
52
61
  };
53
62
 
54
63
  // wallet/AuditLogger.ts
@@ -122,6 +131,10 @@ var CashuSpender = class {
122
131
  this.balanceManager = balanceManager;
123
132
  this.logger = (logger ?? consoleLogger).child("CashuSpender");
124
133
  }
134
+ walletAdapter;
135
+ storageAdapter;
136
+ _providerRegistry;
137
+ balanceManager;
125
138
  _isBusy = false;
126
139
  debugLevel = "WARN";
127
140
  logger;
@@ -580,6 +593,9 @@ var CashuSpender = class {
580
593
  apiKeyEntry.baseUrl
581
594
  );
582
595
  if (balanceResult.isInvalidApiKey) {
596
+ this.logger.warn(
597
+ `refundProviders: ${apiKeyEntry.baseUrl} returned invalid API key; removing local key and treating as success`
598
+ );
583
599
  this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
584
600
  results.push({
585
601
  baseUrl: apiKeyEntry.baseUrl,
@@ -593,13 +609,23 @@ var CashuSpender = class {
593
609
  apiKeyEntry.baseUrl,
594
610
  balanceSat
595
611
  );
612
+ } else {
613
+ this.logger.warn(
614
+ `refundProviders: balance refresh for ${apiKeyEntry.baseUrl} returned negative amount; keeping stale local balance=${apiKeyEntryFull.balance}`
615
+ );
596
616
  }
597
- } catch {
617
+ } catch (error) {
618
+ this.logger.warn(
619
+ `refundProviders: balance refresh threw for ${apiKeyEntry.baseUrl}; proceeding with stale local balance`,
620
+ error
621
+ );
598
622
  }
599
623
  const refreshedEntry = this.storageAdapter.getApiKey(
600
624
  apiKeyEntry.baseUrl
601
625
  );
602
- if (!refreshedEntry) continue;
626
+ if (!refreshedEntry) {
627
+ continue;
628
+ }
603
629
  const refundResult = await this.balanceManager.refundApiKey({
604
630
  mintUrl,
605
631
  baseUrl: apiKeyEntry.baseUrl,
@@ -612,6 +638,9 @@ var CashuSpender = class {
612
638
  const currentEntry = this.storageAdapter.getApiKey(
613
639
  apiKeyEntry.baseUrl
614
640
  );
641
+ this.logger.warn(
642
+ `refundProviders: refund failed for ${apiKeyEntry.baseUrl}; currentEntry=${Boolean(currentEntry)} balance=${currentEntry?.balance ?? "none"}. Touching lastUsed to rate-limit retries.`
643
+ );
615
644
  if (currentEntry) {
616
645
  this.storageAdapter.updateApiKeyBalance(
617
646
  apiKeyEntry.baseUrl,
@@ -624,6 +653,9 @@ var CashuSpender = class {
624
653
  success: refundResult.success
625
654
  });
626
655
  } else {
656
+ this.logger.warn(
657
+ `refundProviders: cannot refund ${apiKeyEntry.baseUrl}; apiKeyEntryFull=${Boolean(apiKeyEntryFull)} balanceManager=${Boolean(this.balanceManager)}`
658
+ );
627
659
  results.push({
628
660
  baseUrl: apiKeyEntry.baseUrl,
629
661
  success: false
@@ -696,10 +728,14 @@ var BalanceManager = class _BalanceManager {
696
728
  walletAdapter,
697
729
  storageAdapter,
698
730
  providerRegistry,
699
- this
731
+ this,
732
+ this.logger
700
733
  );
701
734
  }
702
735
  }
736
+ walletAdapter;
737
+ storageAdapter;
738
+ providerRegistry;
703
739
  cashuSpender;
704
740
  /** In-memory guard for per-provider wallet mutations (topup / refund) */
705
741
  providerWalletOps = /* @__PURE__ */ new Map();
@@ -793,6 +829,7 @@ var BalanceManager = class _BalanceManager {
793
829
  async _refundApiKeyImpl(options) {
794
830
  const { mintUrl, baseUrl, apiKey, forceRefund } = options;
795
831
  if (!apiKey) {
832
+ this.logger.warn(`refundApiKey: aborting for ${baseUrl} - no API key`);
796
833
  return { success: false, message: "No API key to refund" };
797
834
  }
798
835
  if (!forceRefund) {
@@ -800,7 +837,9 @@ var BalanceManager = class _BalanceManager {
800
837
  if (apiKeyEntry?.lastUsed) {
801
838
  const fiveMinutesAgo = Date.now() - 5 * 60 * 1e3;
802
839
  if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
803
- this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`);
840
+ this.logger.log(
841
+ `refundApiKey: skipping ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`
842
+ );
804
843
  return {
805
844
  success: false,
806
845
  message: "API key was used recently, skipping refund"
@@ -811,7 +850,15 @@ var BalanceManager = class _BalanceManager {
811
850
  let fetchResult;
812
851
  try {
813
852
  fetchResult = await this.fetchRefundToken(baseUrl, apiKey);
853
+ if (fetchResult.error === "No balance to refund") {
854
+ this.logger.log(`refundApiKey: provider says no balance for ${baseUrl}; removing API key`);
855
+ this.storageAdapter.removeApiKey(baseUrl);
856
+ return { success: true, message: "No balance to refund, key cleaned up" };
857
+ }
814
858
  if (!fetchResult.success) {
859
+ this.logger.warn(
860
+ `refundApiKey: fetch failed for ${baseUrl}: ${fetchResult.error || "API key refund failed"}`
861
+ );
815
862
  return {
816
863
  success: false,
817
864
  message: fetchResult.error || "API key refund failed",
@@ -819,22 +866,23 @@ var BalanceManager = class _BalanceManager {
819
866
  };
820
867
  }
821
868
  if (!fetchResult.token) {
869
+ this.logger.warn(`refundApiKey: no token received for ${baseUrl}`);
822
870
  return {
823
871
  success: false,
824
872
  message: "No token received from API key refund",
825
873
  requestId: fetchResult.requestId
826
874
  };
827
875
  }
828
- if (fetchResult.error === "No balance to refund") {
829
- this.storageAdapter.removeApiKey(baseUrl);
830
- return { success: true, message: "No balance to refund, key cleaned up" };
831
- }
832
876
  const receiveResult = await this.cashuSpender.receiveToken(
833
877
  fetchResult.token
834
878
  );
835
879
  const totalAmountMsat = receiveResult.unit === "msat" ? receiveResult.amount : receiveResult.amount * 1e3;
836
880
  if (receiveResult.success) {
837
881
  this.storageAdapter.removeApiKey(baseUrl);
882
+ } else {
883
+ this.logger.warn(
884
+ `refundApiKey: receive failed for ${baseUrl}; keeping API key. message=${receiveResult.message ?? "none"}`
885
+ );
838
886
  }
839
887
  return {
840
888
  success: receiveResult.success,
@@ -881,6 +929,10 @@ var BalanceManager = class _BalanceManager {
881
929
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
882
930
  if (!response.ok) {
883
931
  const errorData = await response.json().catch(() => ({}));
932
+ this.logger.warn(
933
+ `fetchRefundToken: non-ok response for ${url} status=${response.status} statusText=${response.statusText}`,
934
+ errorData
935
+ );
884
936
  return {
885
937
  success: false,
886
938
  requestId,
@@ -1783,6 +1835,7 @@ var ProviderManager = class _ProviderManager {
1783
1835
  this.hydrateFromStore();
1784
1836
  }
1785
1837
  }
1838
+ providerRegistry;
1786
1839
  failedProviders = /* @__PURE__ */ new Set();
1787
1840
  /** Track when each provider last failed (provider URL -> timestamp) */
1788
1841
  lastFailed = /* @__PURE__ */ new Map();
@@ -3673,13 +3726,16 @@ var RoutstrClient = class {
3673
3726
  this.balanceManager = new BalanceManager(
3674
3727
  walletAdapter,
3675
3728
  storageAdapter,
3676
- providerRegistry
3729
+ providerRegistry,
3730
+ void 0,
3731
+ this.logger
3677
3732
  );
3678
3733
  this.cashuSpender = new CashuSpender(
3679
3734
  walletAdapter,
3680
3735
  storageAdapter,
3681
3736
  providerRegistry,
3682
- this.balanceManager
3737
+ this.balanceManager,
3738
+ this.logger
3683
3739
  );
3684
3740
  this.streamProcessor = new StreamProcessor();
3685
3741
  this.alertLevel = alertLevel;
@@ -3688,6 +3744,9 @@ var RoutstrClient = class {
3688
3744
  this.sdkStore = options.sdkStore;
3689
3745
  this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
3690
3746
  }
3747
+ walletAdapter;
3748
+ storageAdapter;
3749
+ providerRegistry;
3691
3750
  cashuSpender;
3692
3751
  balanceManager;
3693
3752
  streamProcessor;