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