@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
@@ -1,10 +1,10 @@
1
- import { M as Model, S as SdkLogger, a as Message, T as TransactionHistory, m as StreamingResult } from '../types-DPQM6tIG.mjs';
2
- import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-Bp0Ngmqv.mjs';
3
- import { S as SdkStore, U as UsageTrackingDriver } from '../store-C4FyyOnO.mjs';
1
+ import { e as Model, S as SdkLogger, M as Message, n as TransactionHistory, m as StreamingResult } from '../types-_21yYFZG.mjs';
2
+ import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-Csn8Uq04.mjs';
3
+ import { S as SdkStore, U as UsageTrackingDriver } from '../store-C6dfj1cc.mjs';
4
4
  import { CashuSpender, BalanceManager } from '../wallet/index.mjs';
5
5
  import { Transform } from 'stream';
6
6
  import 'zustand/vanilla';
7
- import '../interfaces-Cqkt41QR.mjs';
7
+ import '../interfaces-Cv1k2EUK.mjs';
8
8
 
9
9
  /**
10
10
  * ProviderManager - Handles provider selection and failover logic
@@ -1,10 +1,10 @@
1
- import { M as Model, S as SdkLogger, a as Message, T as TransactionHistory, m as StreamingResult } from '../types-DPQM6tIG.js';
2
- import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-D2FDCLyP.js';
3
- import { S as SdkStore, U as UsageTrackingDriver } from '../store-BFUGGr_v.js';
1
+ import { e as Model, S as SdkLogger, M as Message, n as TransactionHistory, m as StreamingResult } from '../types-_21yYFZG.js';
2
+ import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-C-DYd9Jy.js';
3
+ import { S as SdkStore, U as UsageTrackingDriver } from '../store-58VcEUoA.js';
4
4
  import { CashuSpender, BalanceManager } from '../wallet/index.js';
5
5
  import { Transform } from 'stream';
6
6
  import 'zustand/vanilla';
7
- import '../interfaces-D9qI1ym6.js';
7
+ import '../interfaces-iL7CWeG5.js';
8
8
 
9
9
  /**
10
10
  * ProviderManager - Handles provider selection and failover logic
@@ -30,6 +30,10 @@ var InsufficientBalanceError = class extends Error {
30
30
  this.maxMintUrl = maxMintUrl;
31
31
  this.name = "InsufficientBalanceError";
32
32
  }
33
+ required;
34
+ available;
35
+ maxMintBalance;
36
+ maxMintUrl;
33
37
  };
34
38
  var ProviderError = class extends Error {
35
39
  constructor(baseUrl, statusCode, message, requestId) {
@@ -41,6 +45,9 @@ var ProviderError = class extends Error {
41
45
  this.requestId = requestId;
42
46
  this.name = "ProviderError";
43
47
  }
48
+ baseUrl;
49
+ statusCode;
50
+ requestId;
44
51
  };
45
52
  var FailoverError = class extends Error {
46
53
  constructor(originalProvider, failedProviders, message) {
@@ -51,6 +58,8 @@ var FailoverError = class extends Error {
51
58
  this.failedProviders = failedProviders;
52
59
  this.name = "FailoverError";
53
60
  }
61
+ originalProvider;
62
+ failedProviders;
54
63
  };
55
64
 
56
65
  // wallet/AuditLogger.ts
@@ -124,6 +133,10 @@ var CashuSpender = class {
124
133
  this.balanceManager = balanceManager;
125
134
  this.logger = (logger ?? consoleLogger).child("CashuSpender");
126
135
  }
136
+ walletAdapter;
137
+ storageAdapter;
138
+ _providerRegistry;
139
+ balanceManager;
127
140
  _isBusy = false;
128
141
  debugLevel = "WARN";
129
142
  logger;
@@ -582,6 +595,9 @@ var CashuSpender = class {
582
595
  apiKeyEntry.baseUrl
583
596
  );
584
597
  if (balanceResult.isInvalidApiKey) {
598
+ this.logger.warn(
599
+ `refundProviders: ${apiKeyEntry.baseUrl} returned invalid API key; removing local key and treating as success`
600
+ );
585
601
  this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
586
602
  results.push({
587
603
  baseUrl: apiKeyEntry.baseUrl,
@@ -595,13 +611,23 @@ var CashuSpender = class {
595
611
  apiKeyEntry.baseUrl,
596
612
  balanceSat
597
613
  );
614
+ } else {
615
+ this.logger.warn(
616
+ `refundProviders: balance refresh for ${apiKeyEntry.baseUrl} returned negative amount; keeping stale local balance=${apiKeyEntryFull.balance}`
617
+ );
598
618
  }
599
- } catch {
619
+ } catch (error) {
620
+ this.logger.warn(
621
+ `refundProviders: balance refresh threw for ${apiKeyEntry.baseUrl}; proceeding with stale local balance`,
622
+ error
623
+ );
600
624
  }
601
625
  const refreshedEntry = this.storageAdapter.getApiKey(
602
626
  apiKeyEntry.baseUrl
603
627
  );
604
- if (!refreshedEntry) continue;
628
+ if (!refreshedEntry) {
629
+ continue;
630
+ }
605
631
  const refundResult = await this.balanceManager.refundApiKey({
606
632
  mintUrl,
607
633
  baseUrl: apiKeyEntry.baseUrl,
@@ -614,6 +640,9 @@ var CashuSpender = class {
614
640
  const currentEntry = this.storageAdapter.getApiKey(
615
641
  apiKeyEntry.baseUrl
616
642
  );
643
+ this.logger.warn(
644
+ `refundProviders: refund failed for ${apiKeyEntry.baseUrl}; currentEntry=${Boolean(currentEntry)} balance=${currentEntry?.balance ?? "none"}. Touching lastUsed to rate-limit retries.`
645
+ );
617
646
  if (currentEntry) {
618
647
  this.storageAdapter.updateApiKeyBalance(
619
648
  apiKeyEntry.baseUrl,
@@ -626,6 +655,9 @@ var CashuSpender = class {
626
655
  success: refundResult.success
627
656
  });
628
657
  } else {
658
+ this.logger.warn(
659
+ `refundProviders: cannot refund ${apiKeyEntry.baseUrl}; apiKeyEntryFull=${Boolean(apiKeyEntryFull)} balanceManager=${Boolean(this.balanceManager)}`
660
+ );
629
661
  results.push({
630
662
  baseUrl: apiKeyEntry.baseUrl,
631
663
  success: false
@@ -698,10 +730,14 @@ var BalanceManager = class _BalanceManager {
698
730
  walletAdapter,
699
731
  storageAdapter,
700
732
  providerRegistry,
701
- this
733
+ this,
734
+ this.logger
702
735
  );
703
736
  }
704
737
  }
738
+ walletAdapter;
739
+ storageAdapter;
740
+ providerRegistry;
705
741
  cashuSpender;
706
742
  /** In-memory guard for per-provider wallet mutations (topup / refund) */
707
743
  providerWalletOps = /* @__PURE__ */ new Map();
@@ -795,6 +831,7 @@ var BalanceManager = class _BalanceManager {
795
831
  async _refundApiKeyImpl(options) {
796
832
  const { mintUrl, baseUrl, apiKey, forceRefund } = options;
797
833
  if (!apiKey) {
834
+ this.logger.warn(`refundApiKey: aborting for ${baseUrl} - no API key`);
798
835
  return { success: false, message: "No API key to refund" };
799
836
  }
800
837
  if (!forceRefund) {
@@ -802,7 +839,9 @@ var BalanceManager = class _BalanceManager {
802
839
  if (apiKeyEntry?.lastUsed) {
803
840
  const fiveMinutesAgo = Date.now() - 5 * 60 * 1e3;
804
841
  if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
805
- this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`);
842
+ this.logger.log(
843
+ `refundApiKey: skipping ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`
844
+ );
806
845
  return {
807
846
  success: false,
808
847
  message: "API key was used recently, skipping refund"
@@ -813,7 +852,15 @@ var BalanceManager = class _BalanceManager {
813
852
  let fetchResult;
814
853
  try {
815
854
  fetchResult = await this.fetchRefundToken(baseUrl, apiKey);
855
+ if (fetchResult.error === "No balance to refund") {
856
+ this.logger.log(`refundApiKey: provider says no balance for ${baseUrl}; removing API key`);
857
+ this.storageAdapter.removeApiKey(baseUrl);
858
+ return { success: true, message: "No balance to refund, key cleaned up" };
859
+ }
816
860
  if (!fetchResult.success) {
861
+ this.logger.warn(
862
+ `refundApiKey: fetch failed for ${baseUrl}: ${fetchResult.error || "API key refund failed"}`
863
+ );
817
864
  return {
818
865
  success: false,
819
866
  message: fetchResult.error || "API key refund failed",
@@ -821,22 +868,23 @@ var BalanceManager = class _BalanceManager {
821
868
  };
822
869
  }
823
870
  if (!fetchResult.token) {
871
+ this.logger.warn(`refundApiKey: no token received for ${baseUrl}`);
824
872
  return {
825
873
  success: false,
826
874
  message: "No token received from API key refund",
827
875
  requestId: fetchResult.requestId
828
876
  };
829
877
  }
830
- if (fetchResult.error === "No balance to refund") {
831
- this.storageAdapter.removeApiKey(baseUrl);
832
- return { success: true, message: "No balance to refund, key cleaned up" };
833
- }
834
878
  const receiveResult = await this.cashuSpender.receiveToken(
835
879
  fetchResult.token
836
880
  );
837
881
  const totalAmountMsat = receiveResult.unit === "msat" ? receiveResult.amount : receiveResult.amount * 1e3;
838
882
  if (receiveResult.success) {
839
883
  this.storageAdapter.removeApiKey(baseUrl);
884
+ } else {
885
+ this.logger.warn(
886
+ `refundApiKey: receive failed for ${baseUrl}; keeping API key. message=${receiveResult.message ?? "none"}`
887
+ );
840
888
  }
841
889
  return {
842
890
  success: receiveResult.success,
@@ -883,6 +931,10 @@ var BalanceManager = class _BalanceManager {
883
931
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
884
932
  if (!response.ok) {
885
933
  const errorData = await response.json().catch(() => ({}));
934
+ this.logger.warn(
935
+ `fetchRefundToken: non-ok response for ${url} status=${response.status} statusText=${response.statusText}`,
936
+ errorData
937
+ );
886
938
  return {
887
939
  success: false,
888
940
  requestId,
@@ -1785,6 +1837,7 @@ var ProviderManager = class _ProviderManager {
1785
1837
  this.hydrateFromStore();
1786
1838
  }
1787
1839
  }
1840
+ providerRegistry;
1788
1841
  failedProviders = /* @__PURE__ */ new Set();
1789
1842
  /** Track when each provider last failed (provider URL -> timestamp) */
1790
1843
  lastFailed = /* @__PURE__ */ new Map();
@@ -3675,13 +3728,16 @@ var RoutstrClient = class {
3675
3728
  this.balanceManager = new BalanceManager(
3676
3729
  walletAdapter,
3677
3730
  storageAdapter,
3678
- providerRegistry
3731
+ providerRegistry,
3732
+ void 0,
3733
+ this.logger
3679
3734
  );
3680
3735
  this.cashuSpender = new CashuSpender(
3681
3736
  walletAdapter,
3682
3737
  storageAdapter,
3683
3738
  providerRegistry,
3684
- this.balanceManager
3739
+ this.balanceManager,
3740
+ this.logger
3685
3741
  );
3686
3742
  this.streamProcessor = new StreamProcessor();
3687
3743
  this.alertLevel = alertLevel;
@@ -3690,6 +3746,9 @@ var RoutstrClient = class {
3690
3746
  this.sdkStore = options.sdkStore;
3691
3747
  this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
3692
3748
  }
3749
+ walletAdapter;
3750
+ storageAdapter;
3751
+ providerRegistry;
3693
3752
  cashuSpender;
3694
3753
  balanceManager;
3695
3754
  streamProcessor;