@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
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) continue;
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(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`);
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 } : {};