@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/index.js
CHANGED
|
@@ -44,6 +44,10 @@ var InsufficientBalanceError = class extends Error {
|
|
|
44
44
|
this.maxMintUrl = maxMintUrl;
|
|
45
45
|
this.name = "InsufficientBalanceError";
|
|
46
46
|
}
|
|
47
|
+
required;
|
|
48
|
+
available;
|
|
49
|
+
maxMintBalance;
|
|
50
|
+
maxMintUrl;
|
|
47
51
|
};
|
|
48
52
|
var ProviderError = class extends Error {
|
|
49
53
|
constructor(baseUrl, statusCode, message, requestId) {
|
|
@@ -55,6 +59,9 @@ var ProviderError = class extends Error {
|
|
|
55
59
|
this.requestId = requestId;
|
|
56
60
|
this.name = "ProviderError";
|
|
57
61
|
}
|
|
62
|
+
baseUrl;
|
|
63
|
+
statusCode;
|
|
64
|
+
requestId;
|
|
58
65
|
};
|
|
59
66
|
var MintUnreachableError = class extends Error {
|
|
60
67
|
constructor(mintUrl) {
|
|
@@ -64,6 +71,7 @@ var MintUnreachableError = class extends Error {
|
|
|
64
71
|
this.mintUrl = mintUrl;
|
|
65
72
|
this.name = "MintUnreachableError";
|
|
66
73
|
}
|
|
74
|
+
mintUrl;
|
|
67
75
|
};
|
|
68
76
|
var TokenOperationError = class extends Error {
|
|
69
77
|
constructor(message, operation, mintUrl) {
|
|
@@ -72,6 +80,8 @@ var TokenOperationError = class extends Error {
|
|
|
72
80
|
this.mintUrl = mintUrl;
|
|
73
81
|
this.name = "TokenOperationError";
|
|
74
82
|
}
|
|
83
|
+
operation;
|
|
84
|
+
mintUrl;
|
|
75
85
|
};
|
|
76
86
|
var FailoverError = class extends Error {
|
|
77
87
|
constructor(originalProvider, failedProviders, message) {
|
|
@@ -82,6 +92,8 @@ var FailoverError = class extends Error {
|
|
|
82
92
|
this.failedProviders = failedProviders;
|
|
83
93
|
this.name = "FailoverError";
|
|
84
94
|
}
|
|
95
|
+
originalProvider;
|
|
96
|
+
failedProviders;
|
|
85
97
|
};
|
|
86
98
|
var StreamingError = class extends Error {
|
|
87
99
|
constructor(message, finishReason, accumulatedContent) {
|
|
@@ -90,6 +102,8 @@ var StreamingError = class extends Error {
|
|
|
90
102
|
this.accumulatedContent = accumulatedContent;
|
|
91
103
|
this.name = "StreamingError";
|
|
92
104
|
}
|
|
105
|
+
finishReason;
|
|
106
|
+
accumulatedContent;
|
|
93
107
|
};
|
|
94
108
|
var ModelNotFoundError = class extends Error {
|
|
95
109
|
constructor(modelId, baseUrl) {
|
|
@@ -98,6 +112,8 @@ var ModelNotFoundError = class extends Error {
|
|
|
98
112
|
this.baseUrl = baseUrl;
|
|
99
113
|
this.name = "ModelNotFoundError";
|
|
100
114
|
}
|
|
115
|
+
modelId;
|
|
116
|
+
baseUrl;
|
|
101
117
|
};
|
|
102
118
|
var ProviderBootstrapError = class extends Error {
|
|
103
119
|
constructor(failedProviders, message) {
|
|
@@ -107,6 +123,7 @@ var ProviderBootstrapError = class extends Error {
|
|
|
107
123
|
this.failedProviders = failedProviders;
|
|
108
124
|
this.name = "ProviderBootstrapError";
|
|
109
125
|
}
|
|
126
|
+
failedProviders;
|
|
110
127
|
};
|
|
111
128
|
var NoProvidersAvailableError = class extends Error {
|
|
112
129
|
constructor() {
|
|
@@ -120,6 +137,7 @@ var MintDiscoveryError = class extends Error {
|
|
|
120
137
|
this.baseUrl = baseUrl;
|
|
121
138
|
this.name = "MintDiscoveryError";
|
|
122
139
|
}
|
|
140
|
+
baseUrl;
|
|
123
141
|
};
|
|
124
142
|
var ModelManager = class _ModelManager {
|
|
125
143
|
constructor(adapter, config = {}) {
|
|
@@ -131,6 +149,7 @@ var ModelManager = class _ModelManager {
|
|
|
131
149
|
this.routstrPubkey = config.routstrPubkey || "4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8";
|
|
132
150
|
this.logger = (config.logger ?? consoleLogger).child("ModelManager");
|
|
133
151
|
}
|
|
152
|
+
adapter;
|
|
134
153
|
cacheTTL;
|
|
135
154
|
providerDirectoryUrl;
|
|
136
155
|
includeProviderUrls;
|
|
@@ -667,6 +686,7 @@ var MintDiscovery = class {
|
|
|
667
686
|
this.cacheTTL = config.cacheTTL || 21 * 60 * 1e3;
|
|
668
687
|
this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
|
|
669
688
|
}
|
|
689
|
+
adapter;
|
|
670
690
|
cacheTTL;
|
|
671
691
|
logger;
|
|
672
692
|
/**
|
|
@@ -888,6 +908,10 @@ var CashuSpender = class {
|
|
|
888
908
|
this.balanceManager = balanceManager;
|
|
889
909
|
this.logger = (logger ?? consoleLogger).child("CashuSpender");
|
|
890
910
|
}
|
|
911
|
+
walletAdapter;
|
|
912
|
+
storageAdapter;
|
|
913
|
+
_providerRegistry;
|
|
914
|
+
balanceManager;
|
|
891
915
|
_isBusy = false;
|
|
892
916
|
debugLevel = "WARN";
|
|
893
917
|
logger;
|
|
@@ -1346,6 +1370,9 @@ var CashuSpender = class {
|
|
|
1346
1370
|
apiKeyEntry.baseUrl
|
|
1347
1371
|
);
|
|
1348
1372
|
if (balanceResult.isInvalidApiKey) {
|
|
1373
|
+
this.logger.warn(
|
|
1374
|
+
`refundProviders: ${apiKeyEntry.baseUrl} returned invalid API key; removing local key and treating as success`
|
|
1375
|
+
);
|
|
1349
1376
|
this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
|
|
1350
1377
|
results.push({
|
|
1351
1378
|
baseUrl: apiKeyEntry.baseUrl,
|
|
@@ -1359,13 +1386,23 @@ var CashuSpender = class {
|
|
|
1359
1386
|
apiKeyEntry.baseUrl,
|
|
1360
1387
|
balanceSat
|
|
1361
1388
|
);
|
|
1389
|
+
} else {
|
|
1390
|
+
this.logger.warn(
|
|
1391
|
+
`refundProviders: balance refresh for ${apiKeyEntry.baseUrl} returned negative amount; keeping stale local balance=${apiKeyEntryFull.balance}`
|
|
1392
|
+
);
|
|
1362
1393
|
}
|
|
1363
|
-
} catch {
|
|
1394
|
+
} catch (error) {
|
|
1395
|
+
this.logger.warn(
|
|
1396
|
+
`refundProviders: balance refresh threw for ${apiKeyEntry.baseUrl}; proceeding with stale local balance`,
|
|
1397
|
+
error
|
|
1398
|
+
);
|
|
1364
1399
|
}
|
|
1365
1400
|
const refreshedEntry = this.storageAdapter.getApiKey(
|
|
1366
1401
|
apiKeyEntry.baseUrl
|
|
1367
1402
|
);
|
|
1368
|
-
if (!refreshedEntry)
|
|
1403
|
+
if (!refreshedEntry) {
|
|
1404
|
+
continue;
|
|
1405
|
+
}
|
|
1369
1406
|
const refundResult = await this.balanceManager.refundApiKey({
|
|
1370
1407
|
mintUrl,
|
|
1371
1408
|
baseUrl: apiKeyEntry.baseUrl,
|
|
@@ -1378,6 +1415,9 @@ var CashuSpender = class {
|
|
|
1378
1415
|
const currentEntry = this.storageAdapter.getApiKey(
|
|
1379
1416
|
apiKeyEntry.baseUrl
|
|
1380
1417
|
);
|
|
1418
|
+
this.logger.warn(
|
|
1419
|
+
`refundProviders: refund failed for ${apiKeyEntry.baseUrl}; currentEntry=${Boolean(currentEntry)} balance=${currentEntry?.balance ?? "none"}. Touching lastUsed to rate-limit retries.`
|
|
1420
|
+
);
|
|
1381
1421
|
if (currentEntry) {
|
|
1382
1422
|
this.storageAdapter.updateApiKeyBalance(
|
|
1383
1423
|
apiKeyEntry.baseUrl,
|
|
@@ -1390,6 +1430,9 @@ var CashuSpender = class {
|
|
|
1390
1430
|
success: refundResult.success
|
|
1391
1431
|
});
|
|
1392
1432
|
} else {
|
|
1433
|
+
this.logger.warn(
|
|
1434
|
+
`refundProviders: cannot refund ${apiKeyEntry.baseUrl}; apiKeyEntryFull=${Boolean(apiKeyEntryFull)} balanceManager=${Boolean(this.balanceManager)}`
|
|
1435
|
+
);
|
|
1393
1436
|
results.push({
|
|
1394
1437
|
baseUrl: apiKeyEntry.baseUrl,
|
|
1395
1438
|
success: false
|
|
@@ -1462,10 +1505,14 @@ var BalanceManager = class _BalanceManager {
|
|
|
1462
1505
|
walletAdapter,
|
|
1463
1506
|
storageAdapter,
|
|
1464
1507
|
providerRegistry,
|
|
1465
|
-
this
|
|
1508
|
+
this,
|
|
1509
|
+
this.logger
|
|
1466
1510
|
);
|
|
1467
1511
|
}
|
|
1468
1512
|
}
|
|
1513
|
+
walletAdapter;
|
|
1514
|
+
storageAdapter;
|
|
1515
|
+
providerRegistry;
|
|
1469
1516
|
cashuSpender;
|
|
1470
1517
|
/** In-memory guard for per-provider wallet mutations (topup / refund) */
|
|
1471
1518
|
providerWalletOps = /* @__PURE__ */ new Map();
|
|
@@ -1559,6 +1606,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1559
1606
|
async _refundApiKeyImpl(options) {
|
|
1560
1607
|
const { mintUrl, baseUrl, apiKey, forceRefund } = options;
|
|
1561
1608
|
if (!apiKey) {
|
|
1609
|
+
this.logger.warn(`refundApiKey: aborting for ${baseUrl} - no API key`);
|
|
1562
1610
|
return { success: false, message: "No API key to refund" };
|
|
1563
1611
|
}
|
|
1564
1612
|
if (!forceRefund) {
|
|
@@ -1566,7 +1614,9 @@ var BalanceManager = class _BalanceManager {
|
|
|
1566
1614
|
if (apiKeyEntry?.lastUsed) {
|
|
1567
1615
|
const fiveMinutesAgo = Date.now() - 5 * 60 * 1e3;
|
|
1568
1616
|
if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
|
|
1569
|
-
this.logger.log(
|
|
1617
|
+
this.logger.log(
|
|
1618
|
+
`refundApiKey: skipping ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`
|
|
1619
|
+
);
|
|
1570
1620
|
return {
|
|
1571
1621
|
success: false,
|
|
1572
1622
|
message: "API key was used recently, skipping refund"
|
|
@@ -1577,7 +1627,15 @@ var BalanceManager = class _BalanceManager {
|
|
|
1577
1627
|
let fetchResult;
|
|
1578
1628
|
try {
|
|
1579
1629
|
fetchResult = await this.fetchRefundToken(baseUrl, apiKey);
|
|
1630
|
+
if (fetchResult.error === "No balance to refund") {
|
|
1631
|
+
this.logger.log(`refundApiKey: provider says no balance for ${baseUrl}; removing API key`);
|
|
1632
|
+
this.storageAdapter.removeApiKey(baseUrl);
|
|
1633
|
+
return { success: true, message: "No balance to refund, key cleaned up" };
|
|
1634
|
+
}
|
|
1580
1635
|
if (!fetchResult.success) {
|
|
1636
|
+
this.logger.warn(
|
|
1637
|
+
`refundApiKey: fetch failed for ${baseUrl}: ${fetchResult.error || "API key refund failed"}`
|
|
1638
|
+
);
|
|
1581
1639
|
return {
|
|
1582
1640
|
success: false,
|
|
1583
1641
|
message: fetchResult.error || "API key refund failed",
|
|
@@ -1585,22 +1643,23 @@ var BalanceManager = class _BalanceManager {
|
|
|
1585
1643
|
};
|
|
1586
1644
|
}
|
|
1587
1645
|
if (!fetchResult.token) {
|
|
1646
|
+
this.logger.warn(`refundApiKey: no token received for ${baseUrl}`);
|
|
1588
1647
|
return {
|
|
1589
1648
|
success: false,
|
|
1590
1649
|
message: "No token received from API key refund",
|
|
1591
1650
|
requestId: fetchResult.requestId
|
|
1592
1651
|
};
|
|
1593
1652
|
}
|
|
1594
|
-
if (fetchResult.error === "No balance to refund") {
|
|
1595
|
-
this.storageAdapter.removeApiKey(baseUrl);
|
|
1596
|
-
return { success: true, message: "No balance to refund, key cleaned up" };
|
|
1597
|
-
}
|
|
1598
1653
|
const receiveResult = await this.cashuSpender.receiveToken(
|
|
1599
1654
|
fetchResult.token
|
|
1600
1655
|
);
|
|
1601
1656
|
const totalAmountMsat = receiveResult.unit === "msat" ? receiveResult.amount : receiveResult.amount * 1e3;
|
|
1602
1657
|
if (receiveResult.success) {
|
|
1603
1658
|
this.storageAdapter.removeApiKey(baseUrl);
|
|
1659
|
+
} else {
|
|
1660
|
+
this.logger.warn(
|
|
1661
|
+
`refundApiKey: receive failed for ${baseUrl}; keeping API key. message=${receiveResult.message ?? "none"}`
|
|
1662
|
+
);
|
|
1604
1663
|
}
|
|
1605
1664
|
return {
|
|
1606
1665
|
success: receiveResult.success,
|
|
@@ -1647,6 +1706,10 @@ var BalanceManager = class _BalanceManager {
|
|
|
1647
1706
|
const requestId = response.headers.get("x-routstr-request-id") || void 0;
|
|
1648
1707
|
if (!response.ok) {
|
|
1649
1708
|
const errorData = await response.json().catch(() => ({}));
|
|
1709
|
+
this.logger.warn(
|
|
1710
|
+
`fetchRefundToken: non-ok response for ${url} status=${response.status} statusText=${response.statusText}`,
|
|
1711
|
+
errorData
|
|
1712
|
+
);
|
|
1650
1713
|
return {
|
|
1651
1714
|
success: false,
|
|
1652
1715
|
requestId,
|
|
@@ -2605,6 +2668,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2605
2668
|
this.hydrateFromStore();
|
|
2606
2669
|
}
|
|
2607
2670
|
}
|
|
2671
|
+
providerRegistry;
|
|
2608
2672
|
failedProviders = /* @__PURE__ */ new Set();
|
|
2609
2673
|
/** Track when each provider last failed (provider URL -> timestamp) */
|
|
2610
2674
|
lastFailed = /* @__PURE__ */ new Map();
|
|
@@ -4895,13 +4959,16 @@ var RoutstrClient = class {
|
|
|
4895
4959
|
this.balanceManager = new BalanceManager(
|
|
4896
4960
|
walletAdapter,
|
|
4897
4961
|
storageAdapter,
|
|
4898
|
-
providerRegistry
|
|
4962
|
+
providerRegistry,
|
|
4963
|
+
void 0,
|
|
4964
|
+
this.logger
|
|
4899
4965
|
);
|
|
4900
4966
|
this.cashuSpender = new CashuSpender(
|
|
4901
4967
|
walletAdapter,
|
|
4902
4968
|
storageAdapter,
|
|
4903
4969
|
providerRegistry,
|
|
4904
|
-
this.balanceManager
|
|
4970
|
+
this.balanceManager,
|
|
4971
|
+
this.logger
|
|
4905
4972
|
);
|
|
4906
4973
|
this.streamProcessor = new StreamProcessor();
|
|
4907
4974
|
this.alertLevel = alertLevel;
|
|
@@ -4910,6 +4977,9 @@ var RoutstrClient = class {
|
|
|
4910
4977
|
this.sdkStore = options.sdkStore;
|
|
4911
4978
|
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
|
|
4912
4979
|
}
|
|
4980
|
+
walletAdapter;
|
|
4981
|
+
storageAdapter;
|
|
4982
|
+
providerRegistry;
|
|
4913
4983
|
cashuSpender;
|
|
4914
4984
|
balanceManager;
|
|
4915
4985
|
streamProcessor;
|
|
@@ -6117,7 +6187,7 @@ async function resolveRouteRequestContext(options) {
|
|
|
6117
6187
|
if (!mintUrl) {
|
|
6118
6188
|
throw new Error("No mint configured in wallet");
|
|
6119
6189
|
}
|
|
6120
|
-
const client = new RoutstrClient(
|
|
6190
|
+
const client = options.client ?? new RoutstrClient(
|
|
6121
6191
|
walletAdapter,
|
|
6122
6192
|
storageAdapter,
|
|
6123
6193
|
providerRegistry,
|
|
@@ -6125,9 +6195,6 @@ async function resolveRouteRequestContext(options) {
|
|
|
6125
6195
|
mode,
|
|
6126
6196
|
{ usageTrackingDriver, sdkStore, providerManager, logger }
|
|
6127
6197
|
);
|
|
6128
|
-
if (debugLevel) {
|
|
6129
|
-
client.setDebugLevel(debugLevel);
|
|
6130
|
-
}
|
|
6131
6198
|
const maxTokens = extractMaxTokens(requestBody);
|
|
6132
6199
|
const stream = extractStream(requestBody);
|
|
6133
6200
|
const proxiedBody = requestBody && typeof requestBody === "object" ? { ...requestBody } : {};
|