@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.mjs
CHANGED
|
@@ -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)
|
|
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(
|
|
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;
|