routstrd 0.2.18 → 0.2.20
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/bun.lock +2 -2
- package/dist/daemon/index.js +184 -124
- package/dist/index.js +2 -2
- package/package.json +2 -2
- package/dist/cli.js +0 -16372
package/dist/daemon/index.js
CHANGED
|
@@ -32087,6 +32087,7 @@ __export(exports_dist, {
|
|
|
32087
32087
|
setDefaultUsageTrackingDriver: () => setDefaultUsageTrackingDriver,
|
|
32088
32088
|
routeRequests: () => routeRequests,
|
|
32089
32089
|
normalizeProviderUrl: () => normalizeProviderUrl,
|
|
32090
|
+
noopLogger: () => noopLogger,
|
|
32090
32091
|
localStorageDriver: () => localStorageDriver,
|
|
32091
32092
|
isTorContext: () => isTorContext,
|
|
32092
32093
|
isOnionUrl: () => isOnionUrl,
|
|
@@ -32112,6 +32113,7 @@ __export(exports_dist, {
|
|
|
32112
32113
|
createDiscoveryAdapterFromStore: () => createDiscoveryAdapterFromStore,
|
|
32113
32114
|
createBunSqliteUsageTrackingDriver: () => createBunSqliteUsageTrackingDriver,
|
|
32114
32115
|
createBunSqliteDriver: () => createBunSqliteDriver,
|
|
32116
|
+
consoleLogger: () => consoleLogger,
|
|
32115
32117
|
TokenOperationError: () => TokenOperationError,
|
|
32116
32118
|
StreamingError: () => StreamingError,
|
|
32117
32119
|
StreamProcessor: () => StreamProcessor,
|
|
@@ -32133,6 +32135,16 @@ __export(exports_dist, {
|
|
|
32133
32135
|
});
|
|
32134
32136
|
import { Transform } from "stream";
|
|
32135
32137
|
import { StringDecoder } from "string_decoder";
|
|
32138
|
+
function makeConsoleLogger(prefix) {
|
|
32139
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
32140
|
+
return {
|
|
32141
|
+
log: (...args) => console.log(...fmt(args)),
|
|
32142
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
32143
|
+
error: (...args) => console.error(...fmt(args)),
|
|
32144
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
32145
|
+
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
32146
|
+
};
|
|
32147
|
+
}
|
|
32136
32148
|
function isNetworkErrorMessage(message) {
|
|
32137
32149
|
return message.includes("NetworkError when attempting to fetch resource") || message.includes("Failed to fetch") || message.includes("Load failed") || message.includes("ERR_TLS_CERT_ALTNAME_INVALID") || message.includes("ERR_TLS_CERT_NOT_YET_VALID") || message.includes("ERR_TLS_CERT_EXPIRED") || message.includes("UNABLE_TO_VERIFY_LEAF_SIGNATURE") || message.includes("SELF_SIGNED_CERT_IN_CHAIN");
|
|
32138
32150
|
}
|
|
@@ -32357,7 +32369,8 @@ function calculateImageTokens(width, height, detail = "auto") {
|
|
|
32357
32369
|
function isInsecureHttpUrl(url2) {
|
|
32358
32370
|
return url2.startsWith("http://");
|
|
32359
32371
|
}
|
|
32360
|
-
async function createBunSqliteDriver(dbPath) {
|
|
32372
|
+
async function createBunSqliteDriver(dbPath, options) {
|
|
32373
|
+
const logger3 = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
|
|
32361
32374
|
const SQLite = (await import("bun:sqlite")).default;
|
|
32362
32375
|
const db = new SQLite(dbPath);
|
|
32363
32376
|
db.run(`
|
|
@@ -32381,7 +32394,7 @@ async function createBunSqliteDriver(dbPath) {
|
|
|
32381
32394
|
throw parseError;
|
|
32382
32395
|
}
|
|
32383
32396
|
} catch (error) {
|
|
32384
|
-
|
|
32397
|
+
logger3.error(`getItem failed for key "${key}":`, error);
|
|
32385
32398
|
return defaultValue;
|
|
32386
32399
|
}
|
|
32387
32400
|
},
|
|
@@ -32389,14 +32402,14 @@ async function createBunSqliteDriver(dbPath) {
|
|
|
32389
32402
|
try {
|
|
32390
32403
|
db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
|
|
32391
32404
|
} catch (error) {
|
|
32392
|
-
|
|
32405
|
+
logger3.error(`setItem failed for key "${key}":`, error);
|
|
32393
32406
|
}
|
|
32394
32407
|
},
|
|
32395
32408
|
async removeItem(key) {
|
|
32396
32409
|
try {
|
|
32397
32410
|
db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
|
|
32398
32411
|
} catch (error) {
|
|
32399
|
-
|
|
32412
|
+
logger3.error(`removeItem failed for key "${key}":`, error);
|
|
32400
32413
|
}
|
|
32401
32414
|
}
|
|
32402
32415
|
};
|
|
@@ -32625,7 +32638,8 @@ async function resolveRouteRequestContext(options) {
|
|
|
32625
32638
|
mode = "apikeys",
|
|
32626
32639
|
usageTrackingDriver,
|
|
32627
32640
|
sdkStore,
|
|
32628
|
-
providerManager: providedProviderManager
|
|
32641
|
+
providerManager: providedProviderManager,
|
|
32642
|
+
logger: logger3
|
|
32629
32643
|
} = options;
|
|
32630
32644
|
let modelManager;
|
|
32631
32645
|
let providers;
|
|
@@ -32637,7 +32651,8 @@ async function resolveRouteRequestContext(options) {
|
|
|
32637
32651
|
}
|
|
32638
32652
|
} else {
|
|
32639
32653
|
modelManager = new ModelManager(discoveryAdapter, {
|
|
32640
|
-
includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls
|
|
32654
|
+
includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls,
|
|
32655
|
+
logger: logger3
|
|
32641
32656
|
});
|
|
32642
32657
|
providers = await modelManager.bootstrapProviders(torMode);
|
|
32643
32658
|
if (providers.length === 0) {
|
|
@@ -32645,7 +32660,7 @@ async function resolveRouteRequestContext(options) {
|
|
|
32645
32660
|
}
|
|
32646
32661
|
await modelManager.fetchModels(providers, forceRefresh);
|
|
32647
32662
|
}
|
|
32648
|
-
const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore);
|
|
32663
|
+
const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore, logger3);
|
|
32649
32664
|
let baseUrl;
|
|
32650
32665
|
let selectedModel;
|
|
32651
32666
|
if (forcedProvider) {
|
|
@@ -32680,7 +32695,7 @@ async function resolveRouteRequestContext(options) {
|
|
|
32680
32695
|
if (!mintUrl) {
|
|
32681
32696
|
throw new Error("No mint configured in wallet");
|
|
32682
32697
|
}
|
|
32683
|
-
const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager });
|
|
32698
|
+
const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager, logger: logger3 });
|
|
32684
32699
|
if (debugLevel) {
|
|
32685
32700
|
client2.setDebugLevel(debugLevel);
|
|
32686
32701
|
}
|
|
@@ -32743,18 +32758,20 @@ function extractStream(requestBody) {
|
|
|
32743
32758
|
const stream = body.stream;
|
|
32744
32759
|
return typeof stream === "boolean" ? stream : undefined;
|
|
32745
32760
|
}
|
|
32746
|
-
var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
|
|
32761
|
+
var import_rxjs24, consoleLogger, noopLogger, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
|
|
32747
32762
|
constructor(adapter, config = {}) {
|
|
32748
32763
|
this.adapter = adapter;
|
|
32749
32764
|
this.providerDirectoryUrl = config.providerDirectoryUrl || "https://api.routstr.com/v1/providers/";
|
|
32750
32765
|
this.cacheTTL = config.cacheTTL || 210 * 60 * 1000;
|
|
32751
32766
|
this.includeProviderUrls = config.includeProviderUrls || [];
|
|
32752
32767
|
this.excludeProviderUrls = config.excludeProviderUrls || [];
|
|
32768
|
+
this.logger = (config.logger ?? consoleLogger).child("ModelManager");
|
|
32753
32769
|
}
|
|
32754
32770
|
cacheTTL;
|
|
32755
32771
|
providerDirectoryUrl;
|
|
32756
32772
|
includeProviderUrls;
|
|
32757
32773
|
excludeProviderUrls;
|
|
32774
|
+
logger;
|
|
32758
32775
|
getBaseUrls() {
|
|
32759
32776
|
return this.adapter.getBaseUrlsList();
|
|
32760
32777
|
}
|
|
@@ -32788,7 +32805,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
32788
32805
|
return filtered;
|
|
32789
32806
|
}
|
|
32790
32807
|
} catch (e) {
|
|
32791
|
-
|
|
32808
|
+
this.logger.warn("Nostr bootstrap failed, falling back to HTTP:", e);
|
|
32792
32809
|
}
|
|
32793
32810
|
return this.bootstrapFromHttp(torMode, forceRefresh);
|
|
32794
32811
|
}
|
|
@@ -32855,7 +32872,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
32855
32872
|
}
|
|
32856
32873
|
}
|
|
32857
32874
|
} catch {
|
|
32858
|
-
|
|
32875
|
+
this.logger.warn("NostrBootstrap: failed to parse event content:", event3.id);
|
|
32859
32876
|
}
|
|
32860
32877
|
}
|
|
32861
32878
|
}
|
|
@@ -32899,7 +32916,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
32899
32916
|
}
|
|
32900
32917
|
return list;
|
|
32901
32918
|
} catch (e) {
|
|
32902
|
-
|
|
32919
|
+
this.logger.error("Failed to bootstrap providers", e);
|
|
32903
32920
|
throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);
|
|
32904
32921
|
}
|
|
32905
32922
|
}
|
|
@@ -32958,9 +32975,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
32958
32975
|
return { success: true, base: base2, list };
|
|
32959
32976
|
} catch (error) {
|
|
32960
32977
|
if (this.isProviderDownError(error)) {
|
|
32961
|
-
|
|
32978
|
+
this.logger.warn(`Provider ${base2} is down right now.`);
|
|
32962
32979
|
} else {
|
|
32963
|
-
|
|
32980
|
+
this.logger.warn(`Failed to fetch models from ${base2}:`, error);
|
|
32964
32981
|
}
|
|
32965
32982
|
this.adapter.setProviderLastUpdate(base2, Date.now());
|
|
32966
32983
|
return { success: false, base: base2 };
|
|
@@ -33082,7 +33099,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33082
33099
|
this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
|
|
33083
33100
|
return models;
|
|
33084
33101
|
} catch {
|
|
33085
|
-
|
|
33102
|
+
this.logger.warn("Routstr21Models: failed to parse Nostr event content:", event3.id);
|
|
33086
33103
|
return cachedModels.length > 0 ? cachedModels : [];
|
|
33087
33104
|
}
|
|
33088
33105
|
}
|
|
@@ -33090,8 +33107,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33090
33107
|
constructor(adapter, config = {}) {
|
|
33091
33108
|
this.adapter = adapter;
|
|
33092
33109
|
this.cacheTTL = config.cacheTTL || 21 * 60 * 1000;
|
|
33110
|
+
this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
|
|
33093
33111
|
}
|
|
33094
33112
|
cacheTTL;
|
|
33113
|
+
logger;
|
|
33095
33114
|
async discoverMints(baseUrls, options = {}) {
|
|
33096
33115
|
if (baseUrls.length === 0) {
|
|
33097
33116
|
return { mintsFromProviders: {}, infoFromProviders: {} };
|
|
@@ -33134,9 +33153,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33134
33153
|
} catch (error) {
|
|
33135
33154
|
this.adapter.setProviderLastUpdate(base2, Date.now());
|
|
33136
33155
|
if (this.isProviderDownError(error)) {
|
|
33137
|
-
|
|
33156
|
+
this.logger.warn(`Provider ${base2} is down right now.`);
|
|
33138
33157
|
} else {
|
|
33139
|
-
|
|
33158
|
+
this.logger.warn(`Failed to fetch mints from ${base2}:`, error);
|
|
33140
33159
|
}
|
|
33141
33160
|
return { success: false, base: base2, mints: [], info: null };
|
|
33142
33161
|
}
|
|
@@ -33150,14 +33169,14 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33150
33169
|
infoFromAllProviders[base2] = info;
|
|
33151
33170
|
}
|
|
33152
33171
|
} else {
|
|
33153
|
-
|
|
33172
|
+
this.logger.error("Mint discovery error:", result.reason);
|
|
33154
33173
|
}
|
|
33155
33174
|
}
|
|
33156
33175
|
try {
|
|
33157
33176
|
this.adapter.setCachedMints(mintsFromAllProviders);
|
|
33158
33177
|
this.adapter.setCachedProviderInfo(infoFromAllProviders);
|
|
33159
33178
|
} catch (error) {
|
|
33160
|
-
|
|
33179
|
+
this.logger.error("Error caching mint discovery results:", error);
|
|
33161
33180
|
}
|
|
33162
33181
|
return {
|
|
33163
33182
|
mintsFromProviders: mintsFromAllProviders,
|
|
@@ -33254,14 +33273,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33254
33273
|
});
|
|
33255
33274
|
}
|
|
33256
33275
|
}, auditLogger, CashuSpender = class {
|
|
33257
|
-
constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager) {
|
|
33276
|
+
constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager, logger3) {
|
|
33258
33277
|
this.walletAdapter = walletAdapter;
|
|
33259
33278
|
this.storageAdapter = storageAdapter;
|
|
33260
33279
|
this._providerRegistry = _providerRegistry;
|
|
33261
33280
|
this.balanceManager = balanceManager;
|
|
33281
|
+
this.logger = (logger3 ?? consoleLogger).child("CashuSpender");
|
|
33262
33282
|
}
|
|
33263
33283
|
_isBusy = false;
|
|
33264
33284
|
debugLevel = "WARN";
|
|
33285
|
+
logger;
|
|
33265
33286
|
async receiveToken(token) {
|
|
33266
33287
|
try {
|
|
33267
33288
|
const result = await this.walletAdapter.receiveToken(token);
|
|
@@ -33351,13 +33372,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33351
33372
|
if (levelPriority[level] >= levelPriority[this.debugLevel]) {
|
|
33352
33373
|
switch (level) {
|
|
33353
33374
|
case "DEBUG":
|
|
33354
|
-
|
|
33375
|
+
this.logger.log(...args);
|
|
33355
33376
|
break;
|
|
33356
33377
|
case "WARN":
|
|
33357
|
-
|
|
33378
|
+
this.logger.warn(...args);
|
|
33358
33379
|
break;
|
|
33359
33380
|
case "ERROR":
|
|
33360
|
-
|
|
33381
|
+
this.logger.error(...args);
|
|
33361
33382
|
break;
|
|
33362
33383
|
}
|
|
33363
33384
|
}
|
|
@@ -33607,16 +33628,38 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33607
33628
|
for (const apiKeyEntry of apiKeyDistribution) {
|
|
33608
33629
|
const apiKeyEntryFull = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
|
|
33609
33630
|
if (apiKeyEntryFull && this.balanceManager) {
|
|
33631
|
+
try {
|
|
33632
|
+
const balanceResult = await this.balanceManager.getTokenBalance(apiKeyEntryFull.key, apiKeyEntry.baseUrl);
|
|
33633
|
+
if (balanceResult.isInvalidApiKey) {
|
|
33634
|
+
this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
|
|
33635
|
+
results.push({
|
|
33636
|
+
baseUrl: apiKeyEntry.baseUrl,
|
|
33637
|
+
success: true
|
|
33638
|
+
});
|
|
33639
|
+
continue;
|
|
33640
|
+
}
|
|
33641
|
+
if (balanceResult.amount >= 0) {
|
|
33642
|
+
const balanceSat = balanceResult.unit === "msat" ? Math.floor(balanceResult.amount / 1000) : balanceResult.amount;
|
|
33643
|
+
this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, balanceSat);
|
|
33644
|
+
}
|
|
33645
|
+
} catch {
|
|
33646
|
+
}
|
|
33647
|
+
const refreshedEntry = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
|
|
33648
|
+
if (!refreshedEntry)
|
|
33649
|
+
continue;
|
|
33610
33650
|
const refundResult = await this.balanceManager.refundApiKey({
|
|
33611
33651
|
mintUrl,
|
|
33612
33652
|
baseUrl: apiKeyEntry.baseUrl,
|
|
33613
|
-
apiKey:
|
|
33653
|
+
apiKey: refreshedEntry.key,
|
|
33614
33654
|
forceRefund
|
|
33615
33655
|
});
|
|
33616
33656
|
if (refundResult.success) {
|
|
33617
33657
|
this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
|
|
33618
33658
|
} else {
|
|
33619
|
-
this.storageAdapter.
|
|
33659
|
+
const currentEntry = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
|
|
33660
|
+
if (currentEntry) {
|
|
33661
|
+
this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, currentEntry.balance);
|
|
33662
|
+
}
|
|
33620
33663
|
}
|
|
33621
33664
|
results.push({
|
|
33622
33665
|
baseUrl: apiKeyEntry.baseUrl,
|
|
@@ -33672,10 +33715,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33672
33715
|
return 0;
|
|
33673
33716
|
}
|
|
33674
33717
|
}, BalanceManager = class _BalanceManager {
|
|
33675
|
-
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
|
|
33718
|
+
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger3) {
|
|
33676
33719
|
this.walletAdapter = walletAdapter;
|
|
33677
33720
|
this.storageAdapter = storageAdapter;
|
|
33678
33721
|
this.providerRegistry = providerRegistry;
|
|
33722
|
+
this.logger = (logger3 ?? consoleLogger).child("BalanceManager");
|
|
33679
33723
|
if (cashuSpender) {
|
|
33680
33724
|
this.cashuSpender = cashuSpender;
|
|
33681
33725
|
} else {
|
|
@@ -33685,6 +33729,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33685
33729
|
cashuSpender;
|
|
33686
33730
|
providerWalletOps = /* @__PURE__ */ new Map;
|
|
33687
33731
|
static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
|
|
33732
|
+
logger;
|
|
33688
33733
|
_canRunProviderWalletOperation(baseUrl, type) {
|
|
33689
33734
|
const existing = this.providerWalletOps.get(baseUrl);
|
|
33690
33735
|
if (!existing) {
|
|
@@ -33750,7 +33795,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33750
33795
|
const { mintUrl, baseUrl, apiKey, forceRefund } = options;
|
|
33751
33796
|
const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
|
|
33752
33797
|
if (!guard.allowed) {
|
|
33753
|
-
|
|
33798
|
+
this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
|
|
33754
33799
|
return { success: false, message: guard.reason };
|
|
33755
33800
|
}
|
|
33756
33801
|
this._beginProviderWalletOperation(baseUrl, "refund");
|
|
@@ -33770,7 +33815,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33770
33815
|
if (apiKeyEntry?.lastUsed) {
|
|
33771
33816
|
const fiveMinutesAgo = Date.now() - 300000;
|
|
33772
33817
|
if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
|
|
33773
|
-
|
|
33818
|
+
this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
|
|
33774
33819
|
return {
|
|
33775
33820
|
success: false,
|
|
33776
33821
|
message: "API key was used recently, skipping refund"
|
|
@@ -33796,7 +33841,8 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33796
33841
|
};
|
|
33797
33842
|
}
|
|
33798
33843
|
if (fetchResult.error === "No balance to refund") {
|
|
33799
|
-
|
|
33844
|
+
this.storageAdapter.removeApiKey(baseUrl);
|
|
33845
|
+
return { success: true, message: "No balance to refund, key cleaned up" };
|
|
33800
33846
|
}
|
|
33801
33847
|
const receiveResult = await this.cashuSpender.receiveToken(fetchResult.token);
|
|
33802
33848
|
const totalAmountMsat = receiveResult.unit === "msat" ? receiveResult.amount : receiveResult.amount * 1000;
|
|
@@ -33810,7 +33856,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33810
33856
|
requestId: fetchResult.requestId
|
|
33811
33857
|
};
|
|
33812
33858
|
} catch (error) {
|
|
33813
|
-
|
|
33859
|
+
this.logger.error("API key refund error", error);
|
|
33814
33860
|
return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
|
|
33815
33861
|
}
|
|
33816
33862
|
}
|
|
@@ -33859,7 +33905,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33859
33905
|
};
|
|
33860
33906
|
} catch (error) {
|
|
33861
33907
|
clearTimeout(timeoutId);
|
|
33862
|
-
|
|
33908
|
+
this.logger.error("fetchRefundToken fetch error", error);
|
|
33863
33909
|
if (error instanceof Error) {
|
|
33864
33910
|
if (error.name === "AbortError") {
|
|
33865
33911
|
return {
|
|
@@ -33882,7 +33928,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33882
33928
|
const { mintUrl, baseUrl, amount, token: providedToken } = options;
|
|
33883
33929
|
const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
|
|
33884
33930
|
if (!guard.allowed) {
|
|
33885
|
-
|
|
33931
|
+
this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
|
|
33886
33932
|
return { success: false, message: guard.reason };
|
|
33887
33933
|
}
|
|
33888
33934
|
this._beginProviderWalletOperation(baseUrl, "topup");
|
|
@@ -33919,7 +33965,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33919
33965
|
cashuToken = tokenResult.token;
|
|
33920
33966
|
const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
|
|
33921
33967
|
requestId = topUpResult.requestId;
|
|
33922
|
-
|
|
33968
|
+
this.logger.log("topUpResult:", topUpResult);
|
|
33923
33969
|
if (!topUpResult.success) {
|
|
33924
33970
|
await this._recoverFailedTopUp(cashuToken);
|
|
33925
33971
|
return {
|
|
@@ -33935,7 +33981,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33935
33981
|
requestId
|
|
33936
33982
|
};
|
|
33937
33983
|
} catch (error) {
|
|
33938
|
-
|
|
33984
|
+
this.logger.log(`topup error for ${baseUrl}: ${error}`);
|
|
33939
33985
|
if (cashuToken) {
|
|
33940
33986
|
await this._recoverFailedTopUp(cashuToken);
|
|
33941
33987
|
}
|
|
@@ -33952,9 +33998,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33952
33998
|
p2pkPubkey
|
|
33953
33999
|
} = options;
|
|
33954
34000
|
const adjustedAmount = Math.ceil(amount);
|
|
33955
|
-
|
|
34001
|
+
this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
|
|
33956
34002
|
if (!adjustedAmount || isNaN(adjustedAmount)) {
|
|
33957
|
-
|
|
34003
|
+
this.logger.error(`createProviderToken: invalid amount=${amount}`);
|
|
33958
34004
|
return { success: false, error: "Invalid top up amount" };
|
|
33959
34005
|
}
|
|
33960
34006
|
const balanceState = await this.getBalanceState();
|
|
@@ -33972,7 +34018,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33972
34018
|
}
|
|
33973
34019
|
if (totalMintBalance + targetProviderBalance < adjustedAmount) {
|
|
33974
34020
|
const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance + targetProviderBalance, totalMintBalance, Object.entries(balanceState.mintBalances).reduce((max, [url2, balance]) => balance > max.balance ? { url: url2, balance } : max, { url: "", balance: 0 }).url);
|
|
33975
|
-
|
|
34021
|
+
this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
|
|
33976
34022
|
return { success: false, error: error.message };
|
|
33977
34023
|
}
|
|
33978
34024
|
const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
|
|
@@ -34008,16 +34054,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34008
34054
|
maxMintUrl = mintUrl2;
|
|
34009
34055
|
}
|
|
34010
34056
|
}
|
|
34011
|
-
|
|
34057
|
+
this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
|
|
34012
34058
|
const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance, maxBalance, maxMintUrl);
|
|
34013
34059
|
return { success: false, error: error.message };
|
|
34014
34060
|
}
|
|
34015
34061
|
let lastError;
|
|
34016
34062
|
for (const candidateMint of candidates) {
|
|
34017
34063
|
try {
|
|
34018
|
-
|
|
34064
|
+
this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
|
|
34019
34065
|
const token = await this.walletAdapter.sendToken(candidateMint, requiredAmount, p2pkPubkey);
|
|
34020
|
-
|
|
34066
|
+
this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
|
|
34021
34067
|
return {
|
|
34022
34068
|
success: true,
|
|
34023
34069
|
token,
|
|
@@ -34026,11 +34072,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34026
34072
|
};
|
|
34027
34073
|
} catch (error) {
|
|
34028
34074
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
34029
|
-
|
|
34075
|
+
this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
|
|
34030
34076
|
if (error instanceof Error) {
|
|
34031
34077
|
lastError = errorMsg;
|
|
34032
34078
|
if (isNetworkErrorMessage(error.message)) {
|
|
34033
|
-
|
|
34079
|
+
this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
|
|
34034
34080
|
continue;
|
|
34035
34081
|
}
|
|
34036
34082
|
}
|
|
@@ -34040,7 +34086,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34040
34086
|
};
|
|
34041
34087
|
}
|
|
34042
34088
|
}
|
|
34043
|
-
|
|
34089
|
+
this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
|
|
34044
34090
|
return {
|
|
34045
34091
|
success: false,
|
|
34046
34092
|
error: lastError || "All candidate mints failed while creating top up token"
|
|
@@ -34141,7 +34187,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34141
34187
|
return { success: true, requestId };
|
|
34142
34188
|
} catch (error) {
|
|
34143
34189
|
clearTimeout(timeoutId);
|
|
34144
|
-
|
|
34190
|
+
this.logger.error("_postTopUp fetch error", error);
|
|
34145
34191
|
if (error instanceof Error) {
|
|
34146
34192
|
if (error.name === "AbortError") {
|
|
34147
34193
|
return {
|
|
@@ -34164,7 +34210,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34164
34210
|
try {
|
|
34165
34211
|
await this.cashuSpender.receiveToken(cashuToken);
|
|
34166
34212
|
} catch (error) {
|
|
34167
|
-
|
|
34213
|
+
this.logger.error("_recoverFailedTopUp: failed to recover token", error);
|
|
34168
34214
|
}
|
|
34169
34215
|
}
|
|
34170
34216
|
_handleRefundError(error, mintUrl, requestId) {
|
|
@@ -34211,9 +34257,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34211
34257
|
apiKey: data.api_key
|
|
34212
34258
|
};
|
|
34213
34259
|
} else {
|
|
34214
|
-
|
|
34260
|
+
this.logger.warn(`getTokenBalance: status=${response.status}`);
|
|
34215
34261
|
const data = await response.json();
|
|
34216
|
-
|
|
34262
|
+
this.logger.warn("getTokenBalance: FAILED", data);
|
|
34217
34263
|
const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
|
|
34218
34264
|
return {
|
|
34219
34265
|
amount: -1,
|
|
@@ -34224,7 +34270,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34224
34270
|
};
|
|
34225
34271
|
}
|
|
34226
34272
|
} catch (error) {
|
|
34227
|
-
|
|
34273
|
+
this.logger.error("getTokenBalance error", error);
|
|
34228
34274
|
}
|
|
34229
34275
|
return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
|
|
34230
34276
|
}
|
|
@@ -34521,9 +34567,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34521
34567
|
const filtered = normalized.filter((value) => torMode ? true : !isOnionUrl(value));
|
|
34522
34568
|
return dedupePreserveOrder(filtered.filter((value) => shouldAllowHttp(value, torMode)));
|
|
34523
34569
|
}, ProviderManager = class _ProviderManager {
|
|
34524
|
-
constructor(providerRegistry, store) {
|
|
34570
|
+
constructor(providerRegistry, store, logger3) {
|
|
34525
34571
|
this.providerRegistry = providerRegistry;
|
|
34526
34572
|
this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
34573
|
+
this.logger = (logger3 ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
|
|
34527
34574
|
if (store) {
|
|
34528
34575
|
this.store = store;
|
|
34529
34576
|
this.hydrateFromStore();
|
|
@@ -34535,6 +34582,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34535
34582
|
static COOLDOWN_DURATION_MS = 42000;
|
|
34536
34583
|
store = null;
|
|
34537
34584
|
instanceId;
|
|
34585
|
+
logger;
|
|
34538
34586
|
hydrateFromStore() {
|
|
34539
34587
|
if (!this.store)
|
|
34540
34588
|
return;
|
|
@@ -34543,10 +34591,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34543
34591
|
this.lastFailed = new Map(Object.entries(state.lastFailed));
|
|
34544
34592
|
const now2 = Date.now();
|
|
34545
34593
|
this.providersOnCoolDown = state.providersOnCooldown.filter((entry) => now2 - entry.timestamp < _ProviderManager.COOLDOWN_DURATION_MS).map((entry) => [entry.baseUrl, entry.timestamp]);
|
|
34546
|
-
|
|
34547
|
-
console.log(` failedProviders: ${this.failedProviders.size}`);
|
|
34548
|
-
console.log(` lastFailed: ${this.lastFailed.size}`);
|
|
34549
|
-
console.log(` providersOnCooldown: ${this.providersOnCoolDown.length}`);
|
|
34594
|
+
this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
|
|
34550
34595
|
}
|
|
34551
34596
|
getInstanceId() {
|
|
34552
34597
|
return this.instanceId;
|
|
@@ -34558,7 +34603,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34558
34603
|
const age = now2 - timestamp;
|
|
34559
34604
|
const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
|
|
34560
34605
|
if (isExpired) {
|
|
34561
|
-
|
|
34606
|
+
this.logger.log(`Removing expired cooldown for ${url2} (age: ${age}ms)`);
|
|
34562
34607
|
this.failedProviders.delete(url2);
|
|
34563
34608
|
if (this.store) {
|
|
34564
34609
|
this.store.getState().removeFailedProvider(url2);
|
|
@@ -34568,7 +34613,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34568
34613
|
});
|
|
34569
34614
|
const after = this.providersOnCoolDown.length;
|
|
34570
34615
|
if (before !== after) {
|
|
34571
|
-
|
|
34616
|
+
this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
|
|
34572
34617
|
}
|
|
34573
34618
|
}
|
|
34574
34619
|
getCooldownDurationMs() {
|
|
@@ -34598,14 +34643,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34598
34643
|
markFailed(baseUrl) {
|
|
34599
34644
|
const now2 = Date.now();
|
|
34600
34645
|
const lastFailure = this.lastFailed.get(baseUrl);
|
|
34601
|
-
|
|
34602
|
-
console.log(`[markFailed:${this.instanceId}] lastFailure from map: ${lastFailure}`);
|
|
34603
|
-
console.log(`[markFailed:${this.instanceId}] current timestamp (now): ${now2}`);
|
|
34604
|
-
console.log(`[markFailed:${this.instanceId}] COOLDOWN_DURATION_MS: ${_ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
34646
|
+
this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now2}`);
|
|
34605
34647
|
if (lastFailure !== undefined) {
|
|
34606
34648
|
const timeSinceLastFailure = now2 - lastFailure;
|
|
34607
|
-
|
|
34608
|
-
console.log(`[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
34649
|
+
this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
34609
34650
|
}
|
|
34610
34651
|
this.lastFailed.set(baseUrl, now2);
|
|
34611
34652
|
this.failedProviders.add(baseUrl);
|
|
@@ -34613,24 +34654,23 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34613
34654
|
this.store.getState().setLastFailedTimestamp(baseUrl, now2);
|
|
34614
34655
|
this.store.getState().addFailedProvider(baseUrl);
|
|
34615
34656
|
}
|
|
34616
|
-
|
|
34617
|
-
console.log(`[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`);
|
|
34657
|
+
this.logger.log(`markFailed: updated ${baseUrl} to ${now2}, failedProviders=${this.failedProviders.size}`);
|
|
34618
34658
|
if (lastFailure !== undefined && now2 - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
|
|
34619
|
-
|
|
34659
|
+
this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
|
|
34620
34660
|
if (!this.isOnCooldown(baseUrl)) {
|
|
34621
34661
|
this.providersOnCoolDown.push([baseUrl, now2]);
|
|
34622
34662
|
if (this.store) {
|
|
34623
34663
|
this.store.getState().addProviderOnCooldown(baseUrl, now2);
|
|
34624
34664
|
}
|
|
34625
|
-
|
|
34665
|
+
this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
|
|
34626
34666
|
} else {
|
|
34627
|
-
|
|
34667
|
+
this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
|
|
34628
34668
|
}
|
|
34629
34669
|
} else {
|
|
34630
34670
|
if (lastFailure === undefined) {
|
|
34631
|
-
|
|
34671
|
+
this.logger.log(`markFailed: first failure for ${baseUrl}`);
|
|
34632
34672
|
} else {
|
|
34633
|
-
|
|
34673
|
+
this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now2 - lastFailure}ms ago)`);
|
|
34634
34674
|
}
|
|
34635
34675
|
}
|
|
34636
34676
|
}
|
|
@@ -34662,15 +34702,12 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34662
34702
|
try {
|
|
34663
34703
|
const torMode = isTorContext();
|
|
34664
34704
|
const disabledProviders = new Set(this.providerRegistry.getDisabledProviders());
|
|
34665
|
-
|
|
34666
|
-
console.log(`[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`);
|
|
34667
|
-
console.log(`[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url2]) => url2)}`);
|
|
34705
|
+
this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
|
|
34668
34706
|
const allProviders = this.providerRegistry.getAllProvidersModels();
|
|
34669
|
-
|
|
34707
|
+
this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
|
|
34670
34708
|
const candidates = [];
|
|
34671
34709
|
for (const [baseUrl, models] of Object.entries(allProviders)) {
|
|
34672
34710
|
if (baseUrl === currentBaseUrl) {
|
|
34673
|
-
console.log(`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`);
|
|
34674
34711
|
continue;
|
|
34675
34712
|
}
|
|
34676
34713
|
if (disabledProviders.has(baseUrl)) {
|
|
@@ -34696,7 +34733,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34696
34733
|
return null;
|
|
34697
34734
|
}
|
|
34698
34735
|
} catch (error) {
|
|
34699
|
-
|
|
34736
|
+
this.logger.error("findNextBestProvider error:", error);
|
|
34700
34737
|
return null;
|
|
34701
34738
|
}
|
|
34702
34739
|
}
|
|
@@ -34804,13 +34841,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34804
34841
|
if (res) {
|
|
34805
34842
|
const tokensFromImage = calculateImageTokens(res.width, res.height);
|
|
34806
34843
|
imageTokens += tokensFromImage;
|
|
34807
|
-
|
|
34808
|
-
width: res.width,
|
|
34809
|
-
height: res.height,
|
|
34810
|
-
tokensFromImage
|
|
34811
|
-
});
|
|
34844
|
+
this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
|
|
34812
34845
|
} else {
|
|
34813
|
-
|
|
34846
|
+
this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
|
|
34814
34847
|
}
|
|
34815
34848
|
}
|
|
34816
34849
|
}
|
|
@@ -34841,7 +34874,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34841
34874
|
const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
|
|
34842
34875
|
return totalEstimatedCosts;
|
|
34843
34876
|
} catch (e) {
|
|
34844
|
-
|
|
34877
|
+
this.logger.error("getRequiredSatsForModel error:", e);
|
|
34845
34878
|
return 0;
|
|
34846
34879
|
}
|
|
34847
34880
|
}
|
|
@@ -35967,9 +36000,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
35967
36000
|
const distributionMap = {};
|
|
35968
36001
|
for (const entry of apiKeys) {
|
|
35969
36002
|
const sum = entry.balance || 0;
|
|
35970
|
-
|
|
35971
|
-
distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
|
|
35972
|
-
}
|
|
36003
|
+
distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
|
|
35973
36004
|
}
|
|
35974
36005
|
return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
|
|
35975
36006
|
},
|
|
@@ -36132,38 +36163,41 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36132
36163
|
updateXcashuTokenTryCount: (token, tryCount) => {
|
|
36133
36164
|
store.getState().updateXcashuTokenTryCount(token, tryCount);
|
|
36134
36165
|
}
|
|
36135
|
-
}), createProviderRegistryFromStore = (store) =>
|
|
36136
|
-
|
|
36137
|
-
|
|
36138
|
-
|
|
36139
|
-
|
|
36140
|
-
|
|
36141
|
-
|
|
36142
|
-
|
|
36143
|
-
|
|
36144
|
-
|
|
36145
|
-
|
|
36146
|
-
|
|
36147
|
-
|
|
36148
|
-
|
|
36149
|
-
|
|
36150
|
-
|
|
36151
|
-
|
|
36152
|
-
|
|
36153
|
-
|
|
36166
|
+
}), createProviderRegistryFromStore = (store, logger3) => {
|
|
36167
|
+
const log3 = (logger3 ?? consoleLogger).child("ProviderRegistry");
|
|
36168
|
+
return {
|
|
36169
|
+
getModelsForProvider: (baseUrl) => {
|
|
36170
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36171
|
+
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
36172
|
+
},
|
|
36173
|
+
getDisabledProviders: () => store.getState().disabledProviders,
|
|
36174
|
+
getProviderMints: (baseUrl) => {
|
|
36175
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36176
|
+
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
36177
|
+
},
|
|
36178
|
+
getProviderInfo: async (baseUrl) => {
|
|
36179
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36180
|
+
const cached = store.getState().infoFromAllProviders[normalized];
|
|
36181
|
+
if (cached)
|
|
36182
|
+
return cached;
|
|
36183
|
+
try {
|
|
36184
|
+
const response = await fetch(`${normalized}v1/info`);
|
|
36185
|
+
if (!response.ok) {
|
|
36186
|
+
throw new Error(`Failed ${response.status}`);
|
|
36187
|
+
}
|
|
36188
|
+
const info = await response.json();
|
|
36189
|
+
const next = { ...store.getState().infoFromAllProviders };
|
|
36190
|
+
next[normalized] = info;
|
|
36191
|
+
store.getState().setInfoFromAllProviders(next);
|
|
36192
|
+
return info;
|
|
36193
|
+
} catch (error) {
|
|
36194
|
+
log3.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
36195
|
+
return null;
|
|
36154
36196
|
}
|
|
36155
|
-
|
|
36156
|
-
|
|
36157
|
-
|
|
36158
|
-
|
|
36159
|
-
return info;
|
|
36160
|
-
} catch (error) {
|
|
36161
|
-
console.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
36162
|
-
return null;
|
|
36163
|
-
}
|
|
36164
|
-
},
|
|
36165
|
-
getAllProvidersModels: () => store.getState().modelsFromAllProviders
|
|
36166
|
-
}), isBrowser3 = () => {
|
|
36197
|
+
},
|
|
36198
|
+
getAllProvidersModels: () => store.getState().modelsFromAllProviders
|
|
36199
|
+
};
|
|
36200
|
+
}, isBrowser3 = () => {
|
|
36167
36201
|
try {
|
|
36168
36202
|
return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
36169
36203
|
} catch {
|
|
@@ -36228,6 +36262,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36228
36262
|
this.walletAdapter = walletAdapter;
|
|
36229
36263
|
this.storageAdapter = storageAdapter;
|
|
36230
36264
|
this.providerRegistry = providerRegistry;
|
|
36265
|
+
this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
|
|
36231
36266
|
this.balanceManager = new BalanceManager(walletAdapter, storageAdapter, providerRegistry);
|
|
36232
36267
|
this.cashuSpender = new CashuSpender(walletAdapter, storageAdapter, providerRegistry, this.balanceManager);
|
|
36233
36268
|
this.streamProcessor = new StreamProcessor;
|
|
@@ -36235,7 +36270,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36235
36270
|
this.mode = mode;
|
|
36236
36271
|
this.usageTrackingDriver = options.usageTrackingDriver;
|
|
36237
36272
|
this.sdkStore = options.sdkStore;
|
|
36238
|
-
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
|
|
36273
|
+
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
|
|
36239
36274
|
}
|
|
36240
36275
|
cashuSpender;
|
|
36241
36276
|
balanceManager;
|
|
@@ -36246,6 +36281,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36246
36281
|
debugLevel = "WARN";
|
|
36247
36282
|
usageTrackingDriver;
|
|
36248
36283
|
sdkStore;
|
|
36284
|
+
logger;
|
|
36249
36285
|
getMode() {
|
|
36250
36286
|
return this.mode;
|
|
36251
36287
|
}
|
|
@@ -36264,13 +36300,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36264
36300
|
if (levelPriority[level] >= levelPriority[this.debugLevel]) {
|
|
36265
36301
|
switch (level) {
|
|
36266
36302
|
case "DEBUG":
|
|
36267
|
-
|
|
36303
|
+
this.logger.log(...args);
|
|
36268
36304
|
break;
|
|
36269
36305
|
case "WARN":
|
|
36270
|
-
|
|
36306
|
+
this.logger.warn(...args);
|
|
36271
36307
|
break;
|
|
36272
36308
|
case "ERROR":
|
|
36273
|
-
|
|
36309
|
+
this.logger.error(...args);
|
|
36274
36310
|
break;
|
|
36275
36311
|
}
|
|
36276
36312
|
}
|
|
@@ -36702,7 +36738,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36702
36738
|
tryNextProvider = true;
|
|
36703
36739
|
}
|
|
36704
36740
|
}
|
|
36705
|
-
if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
|
|
36741
|
+
if ((status === 401 || status === 403 || status === 404 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
|
|
36706
36742
|
this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`);
|
|
36707
36743
|
if (this.mode === "apikeys") {
|
|
36708
36744
|
this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`);
|
|
@@ -37044,6 +37080,18 @@ var init_dist3 = __esm(() => {
|
|
|
37044
37080
|
import_rxjs24 = __toESM(require_cjs(), 1);
|
|
37045
37081
|
init_cashu_ts_es();
|
|
37046
37082
|
init_vanilla();
|
|
37083
|
+
consoleLogger = makeConsoleLogger();
|
|
37084
|
+
noopLogger = {
|
|
37085
|
+
log: () => {
|
|
37086
|
+
},
|
|
37087
|
+
warn: () => {
|
|
37088
|
+
},
|
|
37089
|
+
error: () => {
|
|
37090
|
+
},
|
|
37091
|
+
debug: () => {
|
|
37092
|
+
},
|
|
37093
|
+
child: () => noopLogger
|
|
37094
|
+
};
|
|
37047
37095
|
InsufficientBalanceError = class extends Error {
|
|
37048
37096
|
constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
|
|
37049
37097
|
super(customMessage ?? `Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : ""));
|
|
@@ -37332,7 +37380,19 @@ function saveDaemonConfig(config) {
|
|
|
37332
37380
|
}
|
|
37333
37381
|
|
|
37334
37382
|
// node_modules/@routstr/sdk/dist/storage/index.mjs
|
|
37335
|
-
|
|
37383
|
+
function makeConsoleLogger2(prefix) {
|
|
37384
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
37385
|
+
return {
|
|
37386
|
+
log: (...args) => console.log(...fmt(args)),
|
|
37387
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
37388
|
+
error: (...args) => console.error(...fmt(args)),
|
|
37389
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
37390
|
+
child: (p) => makeConsoleLogger2(prefix ? `${prefix}:${p}` : p)
|
|
37391
|
+
};
|
|
37392
|
+
}
|
|
37393
|
+
var consoleLogger2 = makeConsoleLogger2();
|
|
37394
|
+
async function createBunSqliteDriver2(dbPath, options) {
|
|
37395
|
+
const logger4 = (options?.logger ?? consoleLogger2).child("BunSqliteDriver");
|
|
37336
37396
|
const SQLite = (await import("bun:sqlite")).default;
|
|
37337
37397
|
const db = new SQLite(dbPath);
|
|
37338
37398
|
db.run(`
|
|
@@ -37356,7 +37416,7 @@ async function createBunSqliteDriver2(dbPath) {
|
|
|
37356
37416
|
throw parseError;
|
|
37357
37417
|
}
|
|
37358
37418
|
} catch (error) {
|
|
37359
|
-
|
|
37419
|
+
logger4.error(`getItem failed for key "${key}":`, error);
|
|
37360
37420
|
return defaultValue;
|
|
37361
37421
|
}
|
|
37362
37422
|
},
|
|
@@ -37364,14 +37424,14 @@ async function createBunSqliteDriver2(dbPath) {
|
|
|
37364
37424
|
try {
|
|
37365
37425
|
db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
|
|
37366
37426
|
} catch (error) {
|
|
37367
|
-
|
|
37427
|
+
logger4.error(`setItem failed for key "${key}":`, error);
|
|
37368
37428
|
}
|
|
37369
37429
|
},
|
|
37370
37430
|
async removeItem(key) {
|
|
37371
37431
|
try {
|
|
37372
37432
|
db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
|
|
37373
37433
|
} catch (error) {
|
|
37374
|
-
|
|
37434
|
+
logger4.error(`removeItem failed for key "${key}":`, error);
|
|
37375
37435
|
}
|
|
37376
37436
|
}
|
|
37377
37437
|
};
|