@routstr/sdk 0.3.3 → 0.3.5
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 +9 -5
- package/dist/client/index.d.ts +9 -5
- package/dist/client/index.js +107 -136
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +107 -136
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +8 -2
- package/dist/discovery/index.d.ts +8 -2
- package/dist/discovery/index.js +27 -16
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +27 -16
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +10 -8
- package/dist/index.d.ts +10 -8
- package/dist/index.js +179 -193
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +178 -194
- package/dist/index.mjs.map +1 -1
- package/dist/{interfaces-C5fLD3jB.d.mts → interfaces-Bp0Ngmqv.d.mts} +1 -1
- package/dist/{interfaces-BxDEka72.d.ts → interfaces-CIfd_phZ.d.ts} +1 -1
- package/dist/{interfaces-BWJJTCXO.d.mts → interfaces-Cxi8R4TT.d.mts} +1 -1
- package/dist/{interfaces-B62Rw-dd.d.ts → interfaces-D2FDCLyP.d.ts} +1 -1
- package/dist/storage/index.d.mts +9 -7
- package/dist/storage/index.d.ts +9 -7
- package/dist/storage/index.js +52 -37
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +52 -37
- package/dist/storage/index.mjs.map +1 -1
- package/dist/{store-h7m23ffq.d.ts → store-BD5zF9Hp.d.ts} +4 -4
- package/dist/{store-DGeLPv9E.d.mts → store-CBSyK2qg.d.mts} +4 -4
- package/dist/{types-BYj_8c5c.d.mts → types-DPQM6tIG.d.mts} +10 -1
- package/dist/{types-BYj_8c5c.d.ts → types-DPQM6tIG.d.ts} +10 -1
- package/dist/wallet/index.d.mts +8 -6
- package/dist/wallet/index.d.ts +8 -6
- package/dist/wallet/index.js +80 -57
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +80 -57
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -6,6 +6,30 @@ import { createStore } from 'zustand/vanilla';
|
|
|
6
6
|
import { Transform } from 'stream';
|
|
7
7
|
import { StringDecoder } from 'string_decoder';
|
|
8
8
|
|
|
9
|
+
// core/types.ts
|
|
10
|
+
function makeConsoleLogger(prefix) {
|
|
11
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
12
|
+
return {
|
|
13
|
+
log: (...args) => console.log(...fmt(args)),
|
|
14
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
15
|
+
error: (...args) => console.error(...fmt(args)),
|
|
16
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
17
|
+
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
var consoleLogger = makeConsoleLogger();
|
|
21
|
+
var noopLogger = {
|
|
22
|
+
log: () => {
|
|
23
|
+
},
|
|
24
|
+
warn: () => {
|
|
25
|
+
},
|
|
26
|
+
error: () => {
|
|
27
|
+
},
|
|
28
|
+
debug: () => {
|
|
29
|
+
},
|
|
30
|
+
child: () => noopLogger
|
|
31
|
+
};
|
|
32
|
+
|
|
9
33
|
// core/errors.ts
|
|
10
34
|
var InsufficientBalanceError = class extends Error {
|
|
11
35
|
constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
|
|
@@ -102,11 +126,13 @@ var ModelManager = class _ModelManager {
|
|
|
102
126
|
this.cacheTTL = config.cacheTTL || 210 * 60 * 1e3;
|
|
103
127
|
this.includeProviderUrls = config.includeProviderUrls || [];
|
|
104
128
|
this.excludeProviderUrls = config.excludeProviderUrls || [];
|
|
129
|
+
this.logger = (config.logger ?? consoleLogger).child("ModelManager");
|
|
105
130
|
}
|
|
106
131
|
cacheTTL;
|
|
107
132
|
providerDirectoryUrl;
|
|
108
133
|
includeProviderUrls;
|
|
109
134
|
excludeProviderUrls;
|
|
135
|
+
logger;
|
|
110
136
|
/**
|
|
111
137
|
* Get the list of bootstrapped provider base URLs
|
|
112
138
|
* @returns Array of provider base URLs
|
|
@@ -152,7 +178,7 @@ var ModelManager = class _ModelManager {
|
|
|
152
178
|
return filtered;
|
|
153
179
|
}
|
|
154
180
|
} catch (e) {
|
|
155
|
-
|
|
181
|
+
this.logger.warn("Nostr bootstrap failed, falling back to HTTP:", e);
|
|
156
182
|
}
|
|
157
183
|
return this.bootstrapFromHttp(torMode, forceRefresh);
|
|
158
184
|
}
|
|
@@ -228,10 +254,7 @@ var ModelManager = class _ModelManager {
|
|
|
228
254
|
}
|
|
229
255
|
}
|
|
230
256
|
} catch {
|
|
231
|
-
|
|
232
|
-
"[NostrBootstrap] Failed to parse Nostr event content:",
|
|
233
|
-
event.id
|
|
234
|
-
);
|
|
257
|
+
this.logger.warn("NostrBootstrap: failed to parse event content:", event.id);
|
|
235
258
|
}
|
|
236
259
|
}
|
|
237
260
|
}
|
|
@@ -285,7 +308,7 @@ var ModelManager = class _ModelManager {
|
|
|
285
308
|
}
|
|
286
309
|
return list;
|
|
287
310
|
} catch (e) {
|
|
288
|
-
|
|
311
|
+
this.logger.error("Failed to bootstrap providers", e);
|
|
289
312
|
throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);
|
|
290
313
|
}
|
|
291
314
|
}
|
|
@@ -351,9 +374,9 @@ var ModelManager = class _ModelManager {
|
|
|
351
374
|
return { success: true, base, list };
|
|
352
375
|
} catch (error) {
|
|
353
376
|
if (this.isProviderDownError(error)) {
|
|
354
|
-
|
|
377
|
+
this.logger.warn(`Provider ${base} is down right now.`);
|
|
355
378
|
} else {
|
|
356
|
-
|
|
379
|
+
this.logger.warn(`Failed to fetch models from ${base}:`, error);
|
|
357
380
|
}
|
|
358
381
|
this.adapter.setProviderLastUpdate(base, Date.now());
|
|
359
382
|
return { success: false, base };
|
|
@@ -510,10 +533,7 @@ var ModelManager = class _ModelManager {
|
|
|
510
533
|
this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
|
|
511
534
|
return models;
|
|
512
535
|
} catch {
|
|
513
|
-
|
|
514
|
-
"[Routstr21Models] Failed to parse Nostr event content:",
|
|
515
|
-
event.id
|
|
516
|
-
);
|
|
536
|
+
this.logger.warn("Routstr21Models: failed to parse Nostr event content:", event.id);
|
|
517
537
|
return cachedModels.length > 0 ? cachedModels : [];
|
|
518
538
|
}
|
|
519
539
|
}
|
|
@@ -524,8 +544,10 @@ var MintDiscovery = class {
|
|
|
524
544
|
constructor(adapter, config = {}) {
|
|
525
545
|
this.adapter = adapter;
|
|
526
546
|
this.cacheTTL = config.cacheTTL || 21 * 60 * 1e3;
|
|
547
|
+
this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
|
|
527
548
|
}
|
|
528
549
|
cacheTTL;
|
|
550
|
+
logger;
|
|
529
551
|
/**
|
|
530
552
|
* Fetch mints from all providers via their /v1/info endpoints
|
|
531
553
|
* Caches mints and full provider info for later access
|
|
@@ -576,9 +598,9 @@ var MintDiscovery = class {
|
|
|
576
598
|
} catch (error) {
|
|
577
599
|
this.adapter.setProviderLastUpdate(base, Date.now());
|
|
578
600
|
if (this.isProviderDownError(error)) {
|
|
579
|
-
|
|
601
|
+
this.logger.warn(`Provider ${base} is down right now.`);
|
|
580
602
|
} else {
|
|
581
|
-
|
|
603
|
+
this.logger.warn(`Failed to fetch mints from ${base}:`, error);
|
|
582
604
|
}
|
|
583
605
|
return { success: false, base, mints: [], info: null };
|
|
584
606
|
}
|
|
@@ -592,14 +614,14 @@ var MintDiscovery = class {
|
|
|
592
614
|
infoFromAllProviders[base] = info;
|
|
593
615
|
}
|
|
594
616
|
} else {
|
|
595
|
-
|
|
617
|
+
this.logger.error("Mint discovery error:", result.reason);
|
|
596
618
|
}
|
|
597
619
|
}
|
|
598
620
|
try {
|
|
599
621
|
this.adapter.setCachedMints(mintsFromAllProviders);
|
|
600
622
|
this.adapter.setCachedProviderInfo(infoFromAllProviders);
|
|
601
623
|
} catch (error) {
|
|
602
|
-
|
|
624
|
+
this.logger.error("Error caching mint discovery results:", error);
|
|
603
625
|
}
|
|
604
626
|
return {
|
|
605
627
|
mintsFromProviders: mintsFromAllProviders,
|
|
@@ -738,14 +760,16 @@ function selectMintWithBalance(balances, units, amount, excludeMints = []) {
|
|
|
738
760
|
return { selectedMintUrl: null, selectedMintBalance: 0 };
|
|
739
761
|
}
|
|
740
762
|
var CashuSpender = class {
|
|
741
|
-
constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager) {
|
|
763
|
+
constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager, logger) {
|
|
742
764
|
this.walletAdapter = walletAdapter;
|
|
743
765
|
this.storageAdapter = storageAdapter;
|
|
744
766
|
this._providerRegistry = _providerRegistry;
|
|
745
767
|
this.balanceManager = balanceManager;
|
|
768
|
+
this.logger = (logger ?? consoleLogger).child("CashuSpender");
|
|
746
769
|
}
|
|
747
770
|
_isBusy = false;
|
|
748
771
|
debugLevel = "WARN";
|
|
772
|
+
logger;
|
|
749
773
|
async receiveToken(token) {
|
|
750
774
|
try {
|
|
751
775
|
const result = await this.walletAdapter.receiveToken(token);
|
|
@@ -841,13 +865,13 @@ var CashuSpender = class {
|
|
|
841
865
|
if (levelPriority[level] >= levelPriority[this.debugLevel]) {
|
|
842
866
|
switch (level) {
|
|
843
867
|
case "DEBUG":
|
|
844
|
-
|
|
868
|
+
this.logger.log(...args);
|
|
845
869
|
break;
|
|
846
870
|
case "WARN":
|
|
847
|
-
|
|
871
|
+
this.logger.warn(...args);
|
|
848
872
|
break;
|
|
849
873
|
case "ERROR":
|
|
850
|
-
|
|
874
|
+
this.logger.error(...args);
|
|
851
875
|
break;
|
|
852
876
|
}
|
|
853
877
|
}
|
|
@@ -1195,19 +1219,50 @@ var CashuSpender = class {
|
|
|
1195
1219
|
apiKeyEntry.baseUrl
|
|
1196
1220
|
);
|
|
1197
1221
|
if (apiKeyEntryFull && this.balanceManager) {
|
|
1222
|
+
try {
|
|
1223
|
+
const balanceResult = await this.balanceManager.getTokenBalance(
|
|
1224
|
+
apiKeyEntryFull.key,
|
|
1225
|
+
apiKeyEntry.baseUrl
|
|
1226
|
+
);
|
|
1227
|
+
if (balanceResult.isInvalidApiKey) {
|
|
1228
|
+
this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
|
|
1229
|
+
results.push({
|
|
1230
|
+
baseUrl: apiKeyEntry.baseUrl,
|
|
1231
|
+
success: true
|
|
1232
|
+
});
|
|
1233
|
+
continue;
|
|
1234
|
+
}
|
|
1235
|
+
if (balanceResult.amount >= 0) {
|
|
1236
|
+
const balanceSat = balanceResult.unit === "msat" ? Math.floor(balanceResult.amount / 1e3) : balanceResult.amount;
|
|
1237
|
+
this.storageAdapter.updateApiKeyBalance(
|
|
1238
|
+
apiKeyEntry.baseUrl,
|
|
1239
|
+
balanceSat
|
|
1240
|
+
);
|
|
1241
|
+
}
|
|
1242
|
+
} catch {
|
|
1243
|
+
}
|
|
1244
|
+
const refreshedEntry = this.storageAdapter.getApiKey(
|
|
1245
|
+
apiKeyEntry.baseUrl
|
|
1246
|
+
);
|
|
1247
|
+
if (!refreshedEntry) continue;
|
|
1198
1248
|
const refundResult = await this.balanceManager.refundApiKey({
|
|
1199
1249
|
mintUrl,
|
|
1200
1250
|
baseUrl: apiKeyEntry.baseUrl,
|
|
1201
|
-
apiKey:
|
|
1251
|
+
apiKey: refreshedEntry.key,
|
|
1202
1252
|
forceRefund
|
|
1203
1253
|
});
|
|
1204
1254
|
if (refundResult.success) {
|
|
1205
1255
|
this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
|
|
1206
1256
|
} else {
|
|
1207
|
-
this.storageAdapter.
|
|
1208
|
-
apiKeyEntry.baseUrl
|
|
1209
|
-
apiKeyEntry.amount
|
|
1257
|
+
const currentEntry = this.storageAdapter.getApiKey(
|
|
1258
|
+
apiKeyEntry.baseUrl
|
|
1210
1259
|
);
|
|
1260
|
+
if (currentEntry) {
|
|
1261
|
+
this.storageAdapter.updateApiKeyBalance(
|
|
1262
|
+
apiKeyEntry.baseUrl,
|
|
1263
|
+
currentEntry.balance
|
|
1264
|
+
);
|
|
1265
|
+
}
|
|
1211
1266
|
}
|
|
1212
1267
|
results.push({
|
|
1213
1268
|
baseUrl: apiKeyEntry.baseUrl,
|
|
@@ -1274,10 +1329,11 @@ var CashuSpender = class {
|
|
|
1274
1329
|
|
|
1275
1330
|
// wallet/BalanceManager.ts
|
|
1276
1331
|
var BalanceManager = class _BalanceManager {
|
|
1277
|
-
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
|
|
1332
|
+
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger) {
|
|
1278
1333
|
this.walletAdapter = walletAdapter;
|
|
1279
1334
|
this.storageAdapter = storageAdapter;
|
|
1280
1335
|
this.providerRegistry = providerRegistry;
|
|
1336
|
+
this.logger = (logger ?? consoleLogger).child("BalanceManager");
|
|
1281
1337
|
if (cashuSpender) {
|
|
1282
1338
|
this.cashuSpender = cashuSpender;
|
|
1283
1339
|
} else {
|
|
@@ -1294,6 +1350,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1294
1350
|
providerWalletOps = /* @__PURE__ */ new Map();
|
|
1295
1351
|
/** Cooldown (ms) between opposite operations on the same provider */
|
|
1296
1352
|
static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
|
|
1353
|
+
logger;
|
|
1297
1354
|
/**
|
|
1298
1355
|
* Check whether a wallet operation (topup/refund) may run for a provider.
|
|
1299
1356
|
* Returns the reason when blocked.
|
|
@@ -1368,7 +1425,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1368
1425
|
const { mintUrl, baseUrl, apiKey, forceRefund } = options;
|
|
1369
1426
|
const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
|
|
1370
1427
|
if (!guard.allowed) {
|
|
1371
|
-
|
|
1428
|
+
this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
|
|
1372
1429
|
return { success: false, message: guard.reason };
|
|
1373
1430
|
}
|
|
1374
1431
|
this._beginProviderWalletOperation(baseUrl, "refund");
|
|
@@ -1388,9 +1445,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1388
1445
|
if (apiKeyEntry?.lastUsed) {
|
|
1389
1446
|
const fiveMinutesAgo = Date.now() - 5 * 60 * 1e3;
|
|
1390
1447
|
if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
|
|
1391
|
-
|
|
1392
|
-
`[BalanceManager] Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`
|
|
1393
|
-
);
|
|
1448
|
+
this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1e3)}s ago`);
|
|
1394
1449
|
return {
|
|
1395
1450
|
success: false,
|
|
1396
1451
|
message: "API key was used recently, skipping refund"
|
|
@@ -1416,7 +1471,8 @@ var BalanceManager = class _BalanceManager {
|
|
|
1416
1471
|
};
|
|
1417
1472
|
}
|
|
1418
1473
|
if (fetchResult.error === "No balance to refund") {
|
|
1419
|
-
|
|
1474
|
+
this.storageAdapter.removeApiKey(baseUrl);
|
|
1475
|
+
return { success: true, message: "No balance to refund, key cleaned up" };
|
|
1420
1476
|
}
|
|
1421
1477
|
const receiveResult = await this.cashuSpender.receiveToken(
|
|
1422
1478
|
fetchResult.token
|
|
@@ -1432,7 +1488,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1432
1488
|
requestId: fetchResult.requestId
|
|
1433
1489
|
};
|
|
1434
1490
|
} catch (error) {
|
|
1435
|
-
|
|
1491
|
+
this.logger.error("API key refund error", error);
|
|
1436
1492
|
return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
|
|
1437
1493
|
}
|
|
1438
1494
|
}
|
|
@@ -1484,7 +1540,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1484
1540
|
};
|
|
1485
1541
|
} catch (error) {
|
|
1486
1542
|
clearTimeout(timeoutId);
|
|
1487
|
-
|
|
1543
|
+
this.logger.error("fetchRefundToken fetch error", error);
|
|
1488
1544
|
if (error instanceof Error) {
|
|
1489
1545
|
if (error.name === "AbortError") {
|
|
1490
1546
|
return {
|
|
@@ -1510,7 +1566,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1510
1566
|
const { mintUrl, baseUrl, amount, token: providedToken } = options;
|
|
1511
1567
|
const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
|
|
1512
1568
|
if (!guard.allowed) {
|
|
1513
|
-
|
|
1569
|
+
this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
|
|
1514
1570
|
return { success: false, message: guard.reason };
|
|
1515
1571
|
}
|
|
1516
1572
|
this._beginProviderWalletOperation(baseUrl, "topup");
|
|
@@ -1547,7 +1603,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1547
1603
|
cashuToken = tokenResult.token;
|
|
1548
1604
|
const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
|
|
1549
1605
|
requestId = topUpResult.requestId;
|
|
1550
|
-
|
|
1606
|
+
this.logger.log("topUpResult:", topUpResult);
|
|
1551
1607
|
if (!topUpResult.success) {
|
|
1552
1608
|
await this._recoverFailedTopUp(cashuToken);
|
|
1553
1609
|
return {
|
|
@@ -1563,10 +1619,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1563
1619
|
requestId
|
|
1564
1620
|
};
|
|
1565
1621
|
} catch (error) {
|
|
1566
|
-
|
|
1567
|
-
"DEBUG",
|
|
1568
|
-
`[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`
|
|
1569
|
-
);
|
|
1622
|
+
this.logger.log(`topup error for ${baseUrl}: ${error}`);
|
|
1570
1623
|
if (cashuToken) {
|
|
1571
1624
|
await this._recoverFailedTopUp(cashuToken);
|
|
1572
1625
|
}
|
|
@@ -1583,13 +1636,9 @@ var BalanceManager = class _BalanceManager {
|
|
|
1583
1636
|
p2pkPubkey
|
|
1584
1637
|
} = options;
|
|
1585
1638
|
const adjustedAmount = Math.ceil(amount);
|
|
1586
|
-
|
|
1587
|
-
`[BalanceManager.createProviderToken] Starting: baseUrl=${baseUrl}, mintUrl=${mintUrl}, amount=${amount}, adjustedAmount=${adjustedAmount}, retryCount=${retryCount}`
|
|
1588
|
-
);
|
|
1639
|
+
this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
|
|
1589
1640
|
if (!adjustedAmount || isNaN(adjustedAmount)) {
|
|
1590
|
-
|
|
1591
|
-
`[BalanceManager.createProviderToken] FAILURE: Invalid amount - amount=${amount}, adjustedAmount=${adjustedAmount}`
|
|
1592
|
-
);
|
|
1641
|
+
this.logger.error(`createProviderToken: invalid amount=${amount}`);
|
|
1593
1642
|
return { success: false, error: "Invalid top up amount" };
|
|
1594
1643
|
}
|
|
1595
1644
|
const balanceState = await this.getBalanceState();
|
|
@@ -1620,9 +1669,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1620
1669
|
{ url: "", balance: 0 }
|
|
1621
1670
|
).url
|
|
1622
1671
|
);
|
|
1623
|
-
|
|
1624
|
-
`[BalanceManager.createProviderToken] FAILURE: Insufficient balance - required=${adjustedAmount}, available=${totalMintBalance + targetProviderBalance}, totalMintBalance=${totalMintBalance}, targetProviderBalance=${targetProviderBalance}, refundableProviderBalance=${refundableProviderBalance}`
|
|
1625
|
-
);
|
|
1672
|
+
this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
|
|
1626
1673
|
return { success: false, error: error.message };
|
|
1627
1674
|
}
|
|
1628
1675
|
const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
|
|
@@ -1658,9 +1705,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1658
1705
|
maxMintUrl = mintUrl2;
|
|
1659
1706
|
}
|
|
1660
1707
|
}
|
|
1661
|
-
|
|
1662
|
-
`[BalanceManager.createProviderToken] FAILURE: No candidate mints found - requiredAmount=${requiredAmount}, totalMintBalance=${totalMintBalance}, maxBalance=${maxBalance}, maxMintUrl=${maxMintUrl}, providerMints=${JSON.stringify(providerMints)}`
|
|
1663
|
-
);
|
|
1708
|
+
this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
|
|
1664
1709
|
const error = new InsufficientBalanceError(
|
|
1665
1710
|
adjustedAmount,
|
|
1666
1711
|
totalMintBalance,
|
|
@@ -1672,17 +1717,13 @@ var BalanceManager = class _BalanceManager {
|
|
|
1672
1717
|
let lastError;
|
|
1673
1718
|
for (const candidateMint of candidates) {
|
|
1674
1719
|
try {
|
|
1675
|
-
|
|
1676
|
-
`[BalanceManager.createProviderToken] Attempting mint: ${candidateMint}, amount: ${requiredAmount}`
|
|
1677
|
-
);
|
|
1720
|
+
this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
|
|
1678
1721
|
const token = await this.walletAdapter.sendToken(
|
|
1679
1722
|
candidateMint,
|
|
1680
1723
|
requiredAmount,
|
|
1681
1724
|
p2pkPubkey
|
|
1682
1725
|
);
|
|
1683
|
-
|
|
1684
|
-
`[BalanceManager.createProviderToken] SUCCESS: Token created from mint ${candidateMint}, all mint balances: ${JSON.stringify(Object.fromEntries(Object.entries(balances).map(([mint, balance]) => [mint, getBalanceInSats(balance, units[mint])])))}`
|
|
1685
|
-
);
|
|
1726
|
+
this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
|
|
1686
1727
|
return {
|
|
1687
1728
|
success: true,
|
|
1688
1729
|
token,
|
|
@@ -1691,15 +1732,11 @@ var BalanceManager = class _BalanceManager {
|
|
|
1691
1732
|
};
|
|
1692
1733
|
} catch (error) {
|
|
1693
1734
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
1694
|
-
|
|
1695
|
-
`[BalanceManager.createProviderToken] FAILURE: Mint ${candidateMint} failed with error: ${errorMsg}`
|
|
1696
|
-
);
|
|
1735
|
+
this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
|
|
1697
1736
|
if (error instanceof Error) {
|
|
1698
1737
|
lastError = errorMsg;
|
|
1699
1738
|
if (isNetworkErrorMessage(error.message)) {
|
|
1700
|
-
|
|
1701
|
-
`[BalanceManager.createProviderToken] Network error from ${candidateMint}, trying next mint...`
|
|
1702
|
-
);
|
|
1739
|
+
this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
|
|
1703
1740
|
continue;
|
|
1704
1741
|
}
|
|
1705
1742
|
}
|
|
@@ -1709,9 +1746,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1709
1746
|
};
|
|
1710
1747
|
}
|
|
1711
1748
|
}
|
|
1712
|
-
|
|
1713
|
-
`[BalanceManager.createProviderToken] FAILURE: All candidate mints exhausted - lastError=${lastError}, candidates=${JSON.stringify(candidates)}`
|
|
1714
|
-
);
|
|
1749
|
+
this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
|
|
1715
1750
|
return {
|
|
1716
1751
|
success: false,
|
|
1717
1752
|
error: lastError || "All candidate mints failed while creating top up token"
|
|
@@ -1826,7 +1861,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1826
1861
|
return { success: true, requestId };
|
|
1827
1862
|
} catch (error) {
|
|
1828
1863
|
clearTimeout(timeoutId);
|
|
1829
|
-
|
|
1864
|
+
this.logger.error("_postTopUp fetch error", error);
|
|
1830
1865
|
if (error instanceof Error) {
|
|
1831
1866
|
if (error.name === "AbortError") {
|
|
1832
1867
|
return {
|
|
@@ -1852,10 +1887,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1852
1887
|
try {
|
|
1853
1888
|
await this.cashuSpender.receiveToken(cashuToken);
|
|
1854
1889
|
} catch (error) {
|
|
1855
|
-
|
|
1856
|
-
"[BalanceManager._recoverFailedTopUp] Failed to recover token",
|
|
1857
|
-
error
|
|
1858
|
-
);
|
|
1890
|
+
this.logger.error("_recoverFailedTopUp: failed to recover token", error);
|
|
1859
1891
|
}
|
|
1860
1892
|
}
|
|
1861
1893
|
/**
|
|
@@ -1908,9 +1940,9 @@ var BalanceManager = class _BalanceManager {
|
|
|
1908
1940
|
apiKey: data.api_key
|
|
1909
1941
|
};
|
|
1910
1942
|
} else {
|
|
1911
|
-
|
|
1943
|
+
this.logger.warn(`getTokenBalance: status=${response.status}`);
|
|
1912
1944
|
const data = await response.json();
|
|
1913
|
-
|
|
1945
|
+
this.logger.warn("getTokenBalance: FAILED", data);
|
|
1914
1946
|
const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
|
|
1915
1947
|
return {
|
|
1916
1948
|
amount: -1,
|
|
@@ -1921,7 +1953,7 @@ var BalanceManager = class _BalanceManager {
|
|
|
1921
1953
|
};
|
|
1922
1954
|
}
|
|
1923
1955
|
} catch (error) {
|
|
1924
|
-
|
|
1956
|
+
this.logger.error("getTokenBalance error", error);
|
|
1925
1957
|
}
|
|
1926
1958
|
return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
|
|
1927
1959
|
}
|
|
@@ -2443,9 +2475,10 @@ function isInsecureHttpUrl(url) {
|
|
|
2443
2475
|
return url.startsWith("http://");
|
|
2444
2476
|
}
|
|
2445
2477
|
var ProviderManager = class _ProviderManager {
|
|
2446
|
-
constructor(providerRegistry, store) {
|
|
2478
|
+
constructor(providerRegistry, store, logger) {
|
|
2447
2479
|
this.providerRegistry = providerRegistry;
|
|
2448
2480
|
this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
2481
|
+
this.logger = (logger ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
|
|
2449
2482
|
if (store) {
|
|
2450
2483
|
this.store = store;
|
|
2451
2484
|
this.hydrateFromStore();
|
|
@@ -2462,6 +2495,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2462
2495
|
store = null;
|
|
2463
2496
|
/** Instance ID for debugging */
|
|
2464
2497
|
instanceId;
|
|
2498
|
+
logger;
|
|
2465
2499
|
/**
|
|
2466
2500
|
* Hydrate in-memory state from persistent store
|
|
2467
2501
|
*/
|
|
@@ -2474,10 +2508,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2474
2508
|
this.providersOnCoolDown = state.providersOnCooldown.filter(
|
|
2475
2509
|
(entry) => now - entry.timestamp < _ProviderManager.COOLDOWN_DURATION_MS
|
|
2476
2510
|
).map((entry) => [entry.baseUrl, entry.timestamp]);
|
|
2477
|
-
|
|
2478
|
-
console.log(` failedProviders: ${this.failedProviders.size}`);
|
|
2479
|
-
console.log(` lastFailed: ${this.lastFailed.size}`);
|
|
2480
|
-
console.log(` providersOnCooldown: ${this.providersOnCoolDown.length}`);
|
|
2511
|
+
this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
|
|
2481
2512
|
}
|
|
2482
2513
|
/**
|
|
2483
2514
|
* Get instance ID for debugging
|
|
@@ -2497,9 +2528,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2497
2528
|
const age = now - timestamp;
|
|
2498
2529
|
const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
|
|
2499
2530
|
if (isExpired) {
|
|
2500
|
-
|
|
2501
|
-
`[cleanupExpiredCooldowns:${this.instanceId}] Removing expired cooldown for ${url} (age: ${age}ms, cooldown: ${_ProviderManager.COOLDOWN_DURATION_MS}ms)`
|
|
2502
|
-
);
|
|
2531
|
+
this.logger.log(`Removing expired cooldown for ${url} (age: ${age}ms)`);
|
|
2503
2532
|
this.failedProviders.delete(url);
|
|
2504
2533
|
if (this.store) {
|
|
2505
2534
|
this.store.getState().removeFailedProvider(url);
|
|
@@ -2510,9 +2539,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2510
2539
|
);
|
|
2511
2540
|
const after = this.providersOnCoolDown.length;
|
|
2512
2541
|
if (before !== after) {
|
|
2513
|
-
|
|
2514
|
-
`[cleanupExpiredCooldowns:${this.instanceId}] Cleaned up ${before - after} expired cooldown(s), ${after} remaining`
|
|
2515
|
-
);
|
|
2542
|
+
this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
|
|
2516
2543
|
}
|
|
2517
2544
|
}
|
|
2518
2545
|
/**
|
|
@@ -2564,24 +2591,10 @@ var ProviderManager = class _ProviderManager {
|
|
|
2564
2591
|
markFailed(baseUrl) {
|
|
2565
2592
|
const now = Date.now();
|
|
2566
2593
|
const lastFailure = this.lastFailed.get(baseUrl);
|
|
2567
|
-
|
|
2568
|
-
console.log(
|
|
2569
|
-
`[markFailed:${this.instanceId}] lastFailure from map: ${lastFailure}`
|
|
2570
|
-
);
|
|
2571
|
-
console.log(
|
|
2572
|
-
`[markFailed:${this.instanceId}] current timestamp (now): ${now}`
|
|
2573
|
-
);
|
|
2574
|
-
console.log(
|
|
2575
|
-
`[markFailed:${this.instanceId}] COOLDOWN_DURATION_MS: ${_ProviderManager.COOLDOWN_DURATION_MS}`
|
|
2576
|
-
);
|
|
2594
|
+
this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now}`);
|
|
2577
2595
|
if (lastFailure !== void 0) {
|
|
2578
2596
|
const timeSinceLastFailure = now - lastFailure;
|
|
2579
|
-
|
|
2580
|
-
`[markFailed:${this.instanceId}] timeSinceLastFailure: ${timeSinceLastFailure}ms`
|
|
2581
|
-
);
|
|
2582
|
-
console.log(
|
|
2583
|
-
`[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`
|
|
2584
|
-
);
|
|
2597
|
+
this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
2585
2598
|
}
|
|
2586
2599
|
this.lastFailed.set(baseUrl, now);
|
|
2587
2600
|
this.failedProviders.add(baseUrl);
|
|
@@ -2589,38 +2602,23 @@ var ProviderManager = class _ProviderManager {
|
|
|
2589
2602
|
this.store.getState().setLastFailedTimestamp(baseUrl, now);
|
|
2590
2603
|
this.store.getState().addFailedProvider(baseUrl);
|
|
2591
2604
|
}
|
|
2592
|
-
|
|
2593
|
-
`[markFailed:${this.instanceId}] Updated lastFailed map for ${baseUrl} to ${now}`
|
|
2594
|
-
);
|
|
2595
|
-
console.log(
|
|
2596
|
-
`[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`
|
|
2597
|
-
);
|
|
2605
|
+
this.logger.log(`markFailed: updated ${baseUrl} to ${now}, failedProviders=${this.failedProviders.size}`);
|
|
2598
2606
|
if (lastFailure !== void 0 && now - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
|
|
2599
|
-
|
|
2600
|
-
`[markFailed:${this.instanceId}] Second failure detected within cooldown window for ${baseUrl}`
|
|
2601
|
-
);
|
|
2607
|
+
this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
|
|
2602
2608
|
if (!this.isOnCooldown(baseUrl)) {
|
|
2603
2609
|
this.providersOnCoolDown.push([baseUrl, now]);
|
|
2604
2610
|
if (this.store) {
|
|
2605
2611
|
this.store.getState().addProviderOnCooldown(baseUrl, now);
|
|
2606
2612
|
}
|
|
2607
|
-
|
|
2608
|
-
`[markFailed:${this.instanceId}] Provider ${baseUrl} added to cooldown after second failure within 5 minutes`
|
|
2609
|
-
);
|
|
2613
|
+
this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
|
|
2610
2614
|
} else {
|
|
2611
|
-
|
|
2612
|
-
`[markFailed:${this.instanceId}] Provider ${baseUrl} is already on cooldown`
|
|
2613
|
-
);
|
|
2615
|
+
this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
|
|
2614
2616
|
}
|
|
2615
2617
|
} else {
|
|
2616
2618
|
if (lastFailure === void 0) {
|
|
2617
|
-
|
|
2618
|
-
`[markFailed:${this.instanceId}] First failure for ${baseUrl} - not adding to cooldown yet`
|
|
2619
|
-
);
|
|
2619
|
+
this.logger.log(`markFailed: first failure for ${baseUrl}`);
|
|
2620
2620
|
} else {
|
|
2621
|
-
|
|
2622
|
-
`[markFailed:${this.instanceId}] Failure outside cooldown window for ${baseUrl} (timeSinceLastFailure: ${now - lastFailure}ms)`
|
|
2623
|
-
);
|
|
2621
|
+
this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now - lastFailure}ms ago)`);
|
|
2624
2622
|
}
|
|
2625
2623
|
}
|
|
2626
2624
|
}
|
|
@@ -2677,25 +2675,12 @@ var ProviderManager = class _ProviderManager {
|
|
|
2677
2675
|
const disabledProviders = new Set(
|
|
2678
2676
|
this.providerRegistry.getDisabledProviders()
|
|
2679
2677
|
);
|
|
2680
|
-
|
|
2681
|
-
`[findNextBestProvider:${this.instanceId}] Starting search for model: ${modelId}`
|
|
2682
|
-
);
|
|
2683
|
-
console.log(
|
|
2684
|
-
`[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`
|
|
2685
|
-
);
|
|
2686
|
-
console.log(
|
|
2687
|
-
`[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url]) => url)}`
|
|
2688
|
-
);
|
|
2678
|
+
this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
|
|
2689
2679
|
const allProviders = this.providerRegistry.getAllProvidersModels();
|
|
2690
|
-
|
|
2691
|
-
`[findNextBestProvider:${this.instanceId}] Total providers in registry: ${Object.keys(allProviders).length}`
|
|
2692
|
-
);
|
|
2680
|
+
this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
|
|
2693
2681
|
const candidates = [];
|
|
2694
2682
|
for (const [baseUrl, models] of Object.entries(allProviders)) {
|
|
2695
2683
|
if (baseUrl === currentBaseUrl) {
|
|
2696
|
-
console.log(
|
|
2697
|
-
`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`
|
|
2698
|
-
);
|
|
2699
2684
|
continue;
|
|
2700
2685
|
}
|
|
2701
2686
|
if (disabledProviders.has(baseUrl)) {
|
|
@@ -2721,7 +2706,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2721
2706
|
return null;
|
|
2722
2707
|
}
|
|
2723
2708
|
} catch (error) {
|
|
2724
|
-
|
|
2709
|
+
this.logger.error("findNextBestProvider error:", error);
|
|
2725
2710
|
return null;
|
|
2726
2711
|
}
|
|
2727
2712
|
}
|
|
@@ -2848,16 +2833,9 @@ var ProviderManager = class _ProviderManager {
|
|
|
2848
2833
|
res.height
|
|
2849
2834
|
);
|
|
2850
2835
|
imageTokens += tokensFromImage;
|
|
2851
|
-
|
|
2852
|
-
width: res.width,
|
|
2853
|
-
height: res.height,
|
|
2854
|
-
tokensFromImage
|
|
2855
|
-
});
|
|
2836
|
+
this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
|
|
2856
2837
|
} else {
|
|
2857
|
-
|
|
2858
|
-
"IMAGE INPUT RESOLUTION",
|
|
2859
|
-
"unknown (unsupported format or parse failure)"
|
|
2860
|
-
);
|
|
2838
|
+
this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
|
|
2861
2839
|
}
|
|
2862
2840
|
}
|
|
2863
2841
|
}
|
|
@@ -2890,7 +2868,7 @@ var ProviderManager = class _ProviderManager {
|
|
|
2890
2868
|
const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
|
|
2891
2869
|
return totalEstimatedCosts;
|
|
2892
2870
|
} catch (e) {
|
|
2893
|
-
|
|
2871
|
+
this.logger.error("getRequiredSatsForModel error:", e);
|
|
2894
2872
|
return 0;
|
|
2895
2873
|
}
|
|
2896
2874
|
}
|
|
@@ -3089,7 +3067,8 @@ var createSqliteDriver = (options = {}) => {
|
|
|
3089
3067
|
}
|
|
3090
3068
|
};
|
|
3091
3069
|
};
|
|
3092
|
-
async function createBunSqliteDriver(dbPath) {
|
|
3070
|
+
async function createBunSqliteDriver(dbPath, options) {
|
|
3071
|
+
const logger = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
|
|
3093
3072
|
const SQLite = (await import(
|
|
3094
3073
|
/* webpackIgnore: true */
|
|
3095
3074
|
'bun:sqlite'
|
|
@@ -3115,7 +3094,7 @@ async function createBunSqliteDriver(dbPath) {
|
|
|
3115
3094
|
throw parseError;
|
|
3116
3095
|
}
|
|
3117
3096
|
} catch (error) {
|
|
3118
|
-
|
|
3097
|
+
logger.error(`getItem failed for key "${key}":`, error);
|
|
3119
3098
|
return defaultValue;
|
|
3120
3099
|
}
|
|
3121
3100
|
},
|
|
@@ -3125,14 +3104,14 @@ async function createBunSqliteDriver(dbPath) {
|
|
|
3125
3104
|
"INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value"
|
|
3126
3105
|
).run(key, JSON.stringify(value));
|
|
3127
3106
|
} catch (error) {
|
|
3128
|
-
|
|
3107
|
+
logger.error(`setItem failed for key "${key}":`, error);
|
|
3129
3108
|
}
|
|
3130
3109
|
},
|
|
3131
3110
|
async removeItem(key) {
|
|
3132
3111
|
try {
|
|
3133
3112
|
db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
|
|
3134
3113
|
} catch (error) {
|
|
3135
|
-
|
|
3114
|
+
logger.error(`removeItem failed for key "${key}":`, error);
|
|
3136
3115
|
}
|
|
3137
3116
|
}
|
|
3138
3117
|
};
|
|
@@ -4306,9 +4285,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
4306
4285
|
const distributionMap = {};
|
|
4307
4286
|
for (const entry of apiKeys) {
|
|
4308
4287
|
const sum = entry.balance || 0;
|
|
4309
|
-
|
|
4310
|
-
distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
|
|
4311
|
-
}
|
|
4288
|
+
distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
|
|
4312
4289
|
}
|
|
4313
4290
|
return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
|
|
4314
4291
|
},
|
|
@@ -4483,37 +4460,40 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
4483
4460
|
store.getState().updateXcashuTokenTryCount(token, tryCount);
|
|
4484
4461
|
}
|
|
4485
4462
|
});
|
|
4486
|
-
var createProviderRegistryFromStore = (store) =>
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4494
|
-
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
4503
|
-
|
|
4463
|
+
var createProviderRegistryFromStore = (store, logger) => {
|
|
4464
|
+
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
4465
|
+
return {
|
|
4466
|
+
getModelsForProvider: (baseUrl) => {
|
|
4467
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
4468
|
+
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
4469
|
+
},
|
|
4470
|
+
getDisabledProviders: () => store.getState().disabledProviders,
|
|
4471
|
+
getProviderMints: (baseUrl) => {
|
|
4472
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
4473
|
+
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
4474
|
+
},
|
|
4475
|
+
getProviderInfo: async (baseUrl) => {
|
|
4476
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
4477
|
+
const cached = store.getState().infoFromAllProviders[normalized];
|
|
4478
|
+
if (cached) return cached;
|
|
4479
|
+
try {
|
|
4480
|
+
const response = await fetch(`${normalized}v1/info`);
|
|
4481
|
+
if (!response.ok) {
|
|
4482
|
+
throw new Error(`Failed ${response.status}`);
|
|
4483
|
+
}
|
|
4484
|
+
const info = await response.json();
|
|
4485
|
+
const next = { ...store.getState().infoFromAllProviders };
|
|
4486
|
+
next[normalized] = info;
|
|
4487
|
+
store.getState().setInfoFromAllProviders(next);
|
|
4488
|
+
return info;
|
|
4489
|
+
} catch (error) {
|
|
4490
|
+
log.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
4491
|
+
return null;
|
|
4504
4492
|
}
|
|
4505
|
-
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
|
|
4509
|
-
return info;
|
|
4510
|
-
} catch (error) {
|
|
4511
|
-
console.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
4512
|
-
return null;
|
|
4513
|
-
}
|
|
4514
|
-
},
|
|
4515
|
-
getAllProvidersModels: () => store.getState().modelsFromAllProviders
|
|
4516
|
-
});
|
|
4493
|
+
},
|
|
4494
|
+
getAllProvidersModels: () => store.getState().modelsFromAllProviders
|
|
4495
|
+
};
|
|
4496
|
+
};
|
|
4517
4497
|
|
|
4518
4498
|
// storage/index.ts
|
|
4519
4499
|
var isBrowser3 = () => {
|
|
@@ -4784,6 +4764,7 @@ var RoutstrClient = class {
|
|
|
4784
4764
|
this.walletAdapter = walletAdapter;
|
|
4785
4765
|
this.storageAdapter = storageAdapter;
|
|
4786
4766
|
this.providerRegistry = providerRegistry;
|
|
4767
|
+
this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
|
|
4787
4768
|
this.balanceManager = new BalanceManager(
|
|
4788
4769
|
walletAdapter,
|
|
4789
4770
|
storageAdapter,
|
|
@@ -4800,7 +4781,7 @@ var RoutstrClient = class {
|
|
|
4800
4781
|
this.mode = mode;
|
|
4801
4782
|
this.usageTrackingDriver = options.usageTrackingDriver;
|
|
4802
4783
|
this.sdkStore = options.sdkStore;
|
|
4803
|
-
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
|
|
4784
|
+
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
|
|
4804
4785
|
}
|
|
4805
4786
|
cashuSpender;
|
|
4806
4787
|
balanceManager;
|
|
@@ -4811,6 +4792,7 @@ var RoutstrClient = class {
|
|
|
4811
4792
|
debugLevel = "WARN";
|
|
4812
4793
|
usageTrackingDriver;
|
|
4813
4794
|
sdkStore;
|
|
4795
|
+
logger;
|
|
4814
4796
|
/**
|
|
4815
4797
|
* Get the current client mode
|
|
4816
4798
|
*/
|
|
@@ -4832,13 +4814,13 @@ var RoutstrClient = class {
|
|
|
4832
4814
|
if (levelPriority[level] >= levelPriority[this.debugLevel]) {
|
|
4833
4815
|
switch (level) {
|
|
4834
4816
|
case "DEBUG":
|
|
4835
|
-
|
|
4817
|
+
this.logger.log(...args);
|
|
4836
4818
|
break;
|
|
4837
4819
|
case "WARN":
|
|
4838
|
-
|
|
4820
|
+
this.logger.warn(...args);
|
|
4839
4821
|
break;
|
|
4840
4822
|
case "ERROR":
|
|
4841
|
-
|
|
4823
|
+
this.logger.error(...args);
|
|
4842
4824
|
break;
|
|
4843
4825
|
}
|
|
4844
4826
|
}
|
|
@@ -5442,7 +5424,7 @@ var RoutstrClient = class {
|
|
|
5442
5424
|
tryNextProvider = true;
|
|
5443
5425
|
}
|
|
5444
5426
|
}
|
|
5445
|
-
if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
|
|
5427
|
+
if ((status === 401 || status === 403 || status === 404 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
|
|
5446
5428
|
this._log(
|
|
5447
5429
|
"DEBUG",
|
|
5448
5430
|
`[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`
|
|
@@ -5946,7 +5928,8 @@ async function resolveRouteRequestContext(options) {
|
|
|
5946
5928
|
mode = "apikeys",
|
|
5947
5929
|
usageTrackingDriver,
|
|
5948
5930
|
sdkStore,
|
|
5949
|
-
providerManager: providedProviderManager
|
|
5931
|
+
providerManager: providedProviderManager,
|
|
5932
|
+
logger
|
|
5950
5933
|
} = options;
|
|
5951
5934
|
let modelManager;
|
|
5952
5935
|
let providers;
|
|
@@ -5958,7 +5941,8 @@ async function resolveRouteRequestContext(options) {
|
|
|
5958
5941
|
}
|
|
5959
5942
|
} else {
|
|
5960
5943
|
modelManager = new ModelManager(discoveryAdapter, {
|
|
5961
|
-
includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls
|
|
5944
|
+
includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls,
|
|
5945
|
+
logger
|
|
5962
5946
|
});
|
|
5963
5947
|
providers = await modelManager.bootstrapProviders(torMode);
|
|
5964
5948
|
if (providers.length === 0) {
|
|
@@ -5966,7 +5950,7 @@ async function resolveRouteRequestContext(options) {
|
|
|
5966
5950
|
}
|
|
5967
5951
|
await modelManager.fetchModels(providers, forceRefresh);
|
|
5968
5952
|
}
|
|
5969
|
-
const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore);
|
|
5953
|
+
const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore, logger);
|
|
5970
5954
|
let baseUrl;
|
|
5971
5955
|
let selectedModel;
|
|
5972
5956
|
if (forcedProvider) {
|
|
@@ -6011,7 +5995,7 @@ async function resolveRouteRequestContext(options) {
|
|
|
6011
5995
|
providerRegistry,
|
|
6012
5996
|
"min",
|
|
6013
5997
|
mode,
|
|
6014
|
-
{ usageTrackingDriver, sdkStore, providerManager }
|
|
5998
|
+
{ usageTrackingDriver, sdkStore, providerManager, logger }
|
|
6015
5999
|
);
|
|
6016
6000
|
if (debugLevel) {
|
|
6017
6001
|
client.setDebugLevel(debugLevel);
|
|
@@ -6076,6 +6060,6 @@ function extractStream(requestBody) {
|
|
|
6076
6060
|
return typeof stream === "boolean" ? stream : void 0;
|
|
6077
6061
|
}
|
|
6078
6062
|
|
|
6079
|
-
export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, createBunSqliteDriver, createBunSqliteUsageTrackingDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver };
|
|
6063
|
+
export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, consoleLogger, createBunSqliteDriver, createBunSqliteUsageTrackingDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, noopLogger, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver };
|
|
6080
6064
|
//# sourceMappingURL=index.mjs.map
|
|
6081
6065
|
//# sourceMappingURL=index.mjs.map
|