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