@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.
- package/dist/client/index.d.mts +4 -4
- package/dist/client/index.d.ts +4 -4
- package/dist/client/index.js +69 -10
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +69 -10
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +2 -2
- package/dist/discovery/index.d.ts +2 -2
- package/dist/discovery/index.js +3 -0
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +3 -0
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +12 -10
- package/dist/index.d.ts +12 -10
- package/dist/index.js +81 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +81 -14
- package/dist/index.mjs.map +1 -1
- package/dist/{interfaces-D2FDCLyP.d.ts → interfaces-C-DYd9Jy.d.ts} +1 -1
- package/dist/{interfaces-Bp0Ngmqv.d.mts → interfaces-Csn8Uq04.d.mts} +1 -1
- package/dist/{interfaces-Cqkt41QR.d.mts → interfaces-Cv1k2EUK.d.mts} +1 -1
- package/dist/{interfaces-D9qI1ym6.d.ts → interfaces-iL7CWeG5.d.ts} +1 -1
- package/dist/storage/index.d.mts +6 -6
- package/dist/storage/index.d.ts +6 -6
- package/dist/{store-BFUGGr_v.d.ts → store-58VcEUoA.d.ts} +3 -3
- package/dist/{store-C4FyyOnO.d.mts → store-C6dfj1cc.d.mts} +3 -3
- package/dist/{types-DPQM6tIG.d.mts → types-_21yYFZG.d.mts} +1 -1
- package/dist/{types-DPQM6tIG.d.ts → types-_21yYFZG.d.ts} +1 -1
- package/dist/wallet/index.d.mts +4 -4
- package/dist/wallet/index.d.ts +4 -4
- package/dist/wallet/index.js +55 -8
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +55 -8
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/client/index.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-
|
|
3
|
-
import { S as SdkStore, U as UsageTrackingDriver } from '../store-
|
|
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-
|
|
7
|
+
import '../interfaces-Cv1k2EUK.mjs';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* ProviderManager - Handles provider selection and failover logic
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { P as ProviderRegistry, W as WalletAdapter, S as StorageAdapter, a as StreamingCallbacks } from '../interfaces-
|
|
3
|
-
import { S as SdkStore, U as UsageTrackingDriver } from '../store-
|
|
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-
|
|
7
|
+
import '../interfaces-iL7CWeG5.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* ProviderManager - Handles provider selection and failover logic
|
package/dist/client/index.js
CHANGED
|
@@ -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)
|
|
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(
|
|
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;
|