routstrd 0.2.18 → 0.2.19
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 +157 -118
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/bun.lock
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"": {
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@cashu/cashu-ts": "^3.1.1",
|
|
7
|
-
"@routstr/sdk": "^0.3.
|
|
7
|
+
"@routstr/sdk": "^0.3.4",
|
|
8
8
|
"applesauce-core": "^5.1.0",
|
|
9
9
|
"applesauce-relay": "^5.1.0",
|
|
10
10
|
"commander": "^14.0.2",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
"@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
|
|
33
33
|
|
|
34
|
-
"@routstr/sdk": ["@routstr/sdk@0.3.
|
|
34
|
+
"@routstr/sdk": ["@routstr/sdk@0.3.4", "", { "dependencies": { "@cashu/cashu-ts": "^3.1.1", "applesauce-core": "^5.1.0", "applesauce-relay": "^5.1.0", "rxjs": "^7.8.1", "zustand": "^5.0.5" }, "optionalDependencies": { "better-sqlite3": "^11.7.2" }, "peerDependencies": { "typescript": ">=5.0.0" } }, "sha512-v07U5M9r/gzRRiT3fFn5NvKv0QM17UU1h1OlGS1Yw2LpXVAVNzmrfJRyLfyx7XNz8JVRkj50AeBIoMjRBiqZMQ=="],
|
|
35
35
|
|
|
36
36
|
"@scure/base": ["@scure/base@2.0.0", "", {}, "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w=="],
|
|
37
37
|
|
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
|
}
|
|
@@ -33672,10 +33693,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33672
33693
|
return 0;
|
|
33673
33694
|
}
|
|
33674
33695
|
}, BalanceManager = class _BalanceManager {
|
|
33675
|
-
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
|
|
33696
|
+
constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger3) {
|
|
33676
33697
|
this.walletAdapter = walletAdapter;
|
|
33677
33698
|
this.storageAdapter = storageAdapter;
|
|
33678
33699
|
this.providerRegistry = providerRegistry;
|
|
33700
|
+
this.logger = (logger3 ?? consoleLogger).child("BalanceManager");
|
|
33679
33701
|
if (cashuSpender) {
|
|
33680
33702
|
this.cashuSpender = cashuSpender;
|
|
33681
33703
|
} else {
|
|
@@ -33685,6 +33707,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33685
33707
|
cashuSpender;
|
|
33686
33708
|
providerWalletOps = /* @__PURE__ */ new Map;
|
|
33687
33709
|
static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
|
|
33710
|
+
logger;
|
|
33688
33711
|
_canRunProviderWalletOperation(baseUrl, type) {
|
|
33689
33712
|
const existing = this.providerWalletOps.get(baseUrl);
|
|
33690
33713
|
if (!existing) {
|
|
@@ -33750,7 +33773,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33750
33773
|
const { mintUrl, baseUrl, apiKey, forceRefund } = options;
|
|
33751
33774
|
const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
|
|
33752
33775
|
if (!guard.allowed) {
|
|
33753
|
-
|
|
33776
|
+
this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
|
|
33754
33777
|
return { success: false, message: guard.reason };
|
|
33755
33778
|
}
|
|
33756
33779
|
this._beginProviderWalletOperation(baseUrl, "refund");
|
|
@@ -33770,7 +33793,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33770
33793
|
if (apiKeyEntry?.lastUsed) {
|
|
33771
33794
|
const fiveMinutesAgo = Date.now() - 300000;
|
|
33772
33795
|
if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
|
|
33773
|
-
|
|
33796
|
+
this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
|
|
33774
33797
|
return {
|
|
33775
33798
|
success: false,
|
|
33776
33799
|
message: "API key was used recently, skipping refund"
|
|
@@ -33810,7 +33833,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33810
33833
|
requestId: fetchResult.requestId
|
|
33811
33834
|
};
|
|
33812
33835
|
} catch (error) {
|
|
33813
|
-
|
|
33836
|
+
this.logger.error("API key refund error", error);
|
|
33814
33837
|
return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
|
|
33815
33838
|
}
|
|
33816
33839
|
}
|
|
@@ -33859,7 +33882,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33859
33882
|
};
|
|
33860
33883
|
} catch (error) {
|
|
33861
33884
|
clearTimeout(timeoutId);
|
|
33862
|
-
|
|
33885
|
+
this.logger.error("fetchRefundToken fetch error", error);
|
|
33863
33886
|
if (error instanceof Error) {
|
|
33864
33887
|
if (error.name === "AbortError") {
|
|
33865
33888
|
return {
|
|
@@ -33882,7 +33905,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33882
33905
|
const { mintUrl, baseUrl, amount, token: providedToken } = options;
|
|
33883
33906
|
const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
|
|
33884
33907
|
if (!guard.allowed) {
|
|
33885
|
-
|
|
33908
|
+
this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
|
|
33886
33909
|
return { success: false, message: guard.reason };
|
|
33887
33910
|
}
|
|
33888
33911
|
this._beginProviderWalletOperation(baseUrl, "topup");
|
|
@@ -33919,7 +33942,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33919
33942
|
cashuToken = tokenResult.token;
|
|
33920
33943
|
const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
|
|
33921
33944
|
requestId = topUpResult.requestId;
|
|
33922
|
-
|
|
33945
|
+
this.logger.log("topUpResult:", topUpResult);
|
|
33923
33946
|
if (!topUpResult.success) {
|
|
33924
33947
|
await this._recoverFailedTopUp(cashuToken);
|
|
33925
33948
|
return {
|
|
@@ -33935,7 +33958,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33935
33958
|
requestId
|
|
33936
33959
|
};
|
|
33937
33960
|
} catch (error) {
|
|
33938
|
-
|
|
33961
|
+
this.logger.log(`topup error for ${baseUrl}: ${error}`);
|
|
33939
33962
|
if (cashuToken) {
|
|
33940
33963
|
await this._recoverFailedTopUp(cashuToken);
|
|
33941
33964
|
}
|
|
@@ -33952,9 +33975,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33952
33975
|
p2pkPubkey
|
|
33953
33976
|
} = options;
|
|
33954
33977
|
const adjustedAmount = Math.ceil(amount);
|
|
33955
|
-
|
|
33978
|
+
this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
|
|
33956
33979
|
if (!adjustedAmount || isNaN(adjustedAmount)) {
|
|
33957
|
-
|
|
33980
|
+
this.logger.error(`createProviderToken: invalid amount=${amount}`);
|
|
33958
33981
|
return { success: false, error: "Invalid top up amount" };
|
|
33959
33982
|
}
|
|
33960
33983
|
const balanceState = await this.getBalanceState();
|
|
@@ -33972,7 +33995,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
33972
33995
|
}
|
|
33973
33996
|
if (totalMintBalance + targetProviderBalance < adjustedAmount) {
|
|
33974
33997
|
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
|
-
|
|
33998
|
+
this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
|
|
33976
33999
|
return { success: false, error: error.message };
|
|
33977
34000
|
}
|
|
33978
34001
|
const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
|
|
@@ -34008,16 +34031,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34008
34031
|
maxMintUrl = mintUrl2;
|
|
34009
34032
|
}
|
|
34010
34033
|
}
|
|
34011
|
-
|
|
34034
|
+
this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
|
|
34012
34035
|
const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance, maxBalance, maxMintUrl);
|
|
34013
34036
|
return { success: false, error: error.message };
|
|
34014
34037
|
}
|
|
34015
34038
|
let lastError;
|
|
34016
34039
|
for (const candidateMint of candidates) {
|
|
34017
34040
|
try {
|
|
34018
|
-
|
|
34041
|
+
this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
|
|
34019
34042
|
const token = await this.walletAdapter.sendToken(candidateMint, requiredAmount, p2pkPubkey);
|
|
34020
|
-
|
|
34043
|
+
this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
|
|
34021
34044
|
return {
|
|
34022
34045
|
success: true,
|
|
34023
34046
|
token,
|
|
@@ -34026,11 +34049,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34026
34049
|
};
|
|
34027
34050
|
} catch (error) {
|
|
34028
34051
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
34029
|
-
|
|
34052
|
+
this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
|
|
34030
34053
|
if (error instanceof Error) {
|
|
34031
34054
|
lastError = errorMsg;
|
|
34032
34055
|
if (isNetworkErrorMessage(error.message)) {
|
|
34033
|
-
|
|
34056
|
+
this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
|
|
34034
34057
|
continue;
|
|
34035
34058
|
}
|
|
34036
34059
|
}
|
|
@@ -34040,7 +34063,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34040
34063
|
};
|
|
34041
34064
|
}
|
|
34042
34065
|
}
|
|
34043
|
-
|
|
34066
|
+
this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
|
|
34044
34067
|
return {
|
|
34045
34068
|
success: false,
|
|
34046
34069
|
error: lastError || "All candidate mints failed while creating top up token"
|
|
@@ -34141,7 +34164,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34141
34164
|
return { success: true, requestId };
|
|
34142
34165
|
} catch (error) {
|
|
34143
34166
|
clearTimeout(timeoutId);
|
|
34144
|
-
|
|
34167
|
+
this.logger.error("_postTopUp fetch error", error);
|
|
34145
34168
|
if (error instanceof Error) {
|
|
34146
34169
|
if (error.name === "AbortError") {
|
|
34147
34170
|
return {
|
|
@@ -34164,7 +34187,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34164
34187
|
try {
|
|
34165
34188
|
await this.cashuSpender.receiveToken(cashuToken);
|
|
34166
34189
|
} catch (error) {
|
|
34167
|
-
|
|
34190
|
+
this.logger.error("_recoverFailedTopUp: failed to recover token", error);
|
|
34168
34191
|
}
|
|
34169
34192
|
}
|
|
34170
34193
|
_handleRefundError(error, mintUrl, requestId) {
|
|
@@ -34211,9 +34234,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34211
34234
|
apiKey: data.api_key
|
|
34212
34235
|
};
|
|
34213
34236
|
} else {
|
|
34214
|
-
|
|
34237
|
+
this.logger.warn(`getTokenBalance: status=${response.status}`);
|
|
34215
34238
|
const data = await response.json();
|
|
34216
|
-
|
|
34239
|
+
this.logger.warn("getTokenBalance: FAILED", data);
|
|
34217
34240
|
const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
|
|
34218
34241
|
return {
|
|
34219
34242
|
amount: -1,
|
|
@@ -34224,7 +34247,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34224
34247
|
};
|
|
34225
34248
|
}
|
|
34226
34249
|
} catch (error) {
|
|
34227
|
-
|
|
34250
|
+
this.logger.error("getTokenBalance error", error);
|
|
34228
34251
|
}
|
|
34229
34252
|
return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
|
|
34230
34253
|
}
|
|
@@ -34521,9 +34544,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34521
34544
|
const filtered = normalized.filter((value) => torMode ? true : !isOnionUrl(value));
|
|
34522
34545
|
return dedupePreserveOrder(filtered.filter((value) => shouldAllowHttp(value, torMode)));
|
|
34523
34546
|
}, ProviderManager = class _ProviderManager {
|
|
34524
|
-
constructor(providerRegistry, store) {
|
|
34547
|
+
constructor(providerRegistry, store, logger3) {
|
|
34525
34548
|
this.providerRegistry = providerRegistry;
|
|
34526
34549
|
this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
34550
|
+
this.logger = (logger3 ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
|
|
34527
34551
|
if (store) {
|
|
34528
34552
|
this.store = store;
|
|
34529
34553
|
this.hydrateFromStore();
|
|
@@ -34535,6 +34559,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34535
34559
|
static COOLDOWN_DURATION_MS = 42000;
|
|
34536
34560
|
store = null;
|
|
34537
34561
|
instanceId;
|
|
34562
|
+
logger;
|
|
34538
34563
|
hydrateFromStore() {
|
|
34539
34564
|
if (!this.store)
|
|
34540
34565
|
return;
|
|
@@ -34543,10 +34568,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34543
34568
|
this.lastFailed = new Map(Object.entries(state.lastFailed));
|
|
34544
34569
|
const now2 = Date.now();
|
|
34545
34570
|
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}`);
|
|
34571
|
+
this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
|
|
34550
34572
|
}
|
|
34551
34573
|
getInstanceId() {
|
|
34552
34574
|
return this.instanceId;
|
|
@@ -34558,7 +34580,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34558
34580
|
const age = now2 - timestamp;
|
|
34559
34581
|
const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
|
|
34560
34582
|
if (isExpired) {
|
|
34561
|
-
|
|
34583
|
+
this.logger.log(`Removing expired cooldown for ${url2} (age: ${age}ms)`);
|
|
34562
34584
|
this.failedProviders.delete(url2);
|
|
34563
34585
|
if (this.store) {
|
|
34564
34586
|
this.store.getState().removeFailedProvider(url2);
|
|
@@ -34568,7 +34590,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34568
34590
|
});
|
|
34569
34591
|
const after = this.providersOnCoolDown.length;
|
|
34570
34592
|
if (before !== after) {
|
|
34571
|
-
|
|
34593
|
+
this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
|
|
34572
34594
|
}
|
|
34573
34595
|
}
|
|
34574
34596
|
getCooldownDurationMs() {
|
|
@@ -34598,14 +34620,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34598
34620
|
markFailed(baseUrl) {
|
|
34599
34621
|
const now2 = Date.now();
|
|
34600
34622
|
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}`);
|
|
34623
|
+
this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now2}`);
|
|
34605
34624
|
if (lastFailure !== undefined) {
|
|
34606
34625
|
const timeSinceLastFailure = now2 - lastFailure;
|
|
34607
|
-
|
|
34608
|
-
console.log(`[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
34626
|
+
this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
|
|
34609
34627
|
}
|
|
34610
34628
|
this.lastFailed.set(baseUrl, now2);
|
|
34611
34629
|
this.failedProviders.add(baseUrl);
|
|
@@ -34613,24 +34631,23 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34613
34631
|
this.store.getState().setLastFailedTimestamp(baseUrl, now2);
|
|
34614
34632
|
this.store.getState().addFailedProvider(baseUrl);
|
|
34615
34633
|
}
|
|
34616
|
-
|
|
34617
|
-
console.log(`[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`);
|
|
34634
|
+
this.logger.log(`markFailed: updated ${baseUrl} to ${now2}, failedProviders=${this.failedProviders.size}`);
|
|
34618
34635
|
if (lastFailure !== undefined && now2 - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
|
|
34619
|
-
|
|
34636
|
+
this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
|
|
34620
34637
|
if (!this.isOnCooldown(baseUrl)) {
|
|
34621
34638
|
this.providersOnCoolDown.push([baseUrl, now2]);
|
|
34622
34639
|
if (this.store) {
|
|
34623
34640
|
this.store.getState().addProviderOnCooldown(baseUrl, now2);
|
|
34624
34641
|
}
|
|
34625
|
-
|
|
34642
|
+
this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
|
|
34626
34643
|
} else {
|
|
34627
|
-
|
|
34644
|
+
this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
|
|
34628
34645
|
}
|
|
34629
34646
|
} else {
|
|
34630
34647
|
if (lastFailure === undefined) {
|
|
34631
|
-
|
|
34648
|
+
this.logger.log(`markFailed: first failure for ${baseUrl}`);
|
|
34632
34649
|
} else {
|
|
34633
|
-
|
|
34650
|
+
this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now2 - lastFailure}ms ago)`);
|
|
34634
34651
|
}
|
|
34635
34652
|
}
|
|
34636
34653
|
}
|
|
@@ -34662,15 +34679,12 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34662
34679
|
try {
|
|
34663
34680
|
const torMode = isTorContext();
|
|
34664
34681
|
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)}`);
|
|
34682
|
+
this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
|
|
34668
34683
|
const allProviders = this.providerRegistry.getAllProvidersModels();
|
|
34669
|
-
|
|
34684
|
+
this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
|
|
34670
34685
|
const candidates = [];
|
|
34671
34686
|
for (const [baseUrl, models] of Object.entries(allProviders)) {
|
|
34672
34687
|
if (baseUrl === currentBaseUrl) {
|
|
34673
|
-
console.log(`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`);
|
|
34674
34688
|
continue;
|
|
34675
34689
|
}
|
|
34676
34690
|
if (disabledProviders.has(baseUrl)) {
|
|
@@ -34696,7 +34710,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34696
34710
|
return null;
|
|
34697
34711
|
}
|
|
34698
34712
|
} catch (error) {
|
|
34699
|
-
|
|
34713
|
+
this.logger.error("findNextBestProvider error:", error);
|
|
34700
34714
|
return null;
|
|
34701
34715
|
}
|
|
34702
34716
|
}
|
|
@@ -34804,13 +34818,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34804
34818
|
if (res) {
|
|
34805
34819
|
const tokensFromImage = calculateImageTokens(res.width, res.height);
|
|
34806
34820
|
imageTokens += tokensFromImage;
|
|
34807
|
-
|
|
34808
|
-
width: res.width,
|
|
34809
|
-
height: res.height,
|
|
34810
|
-
tokensFromImage
|
|
34811
|
-
});
|
|
34821
|
+
this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
|
|
34812
34822
|
} else {
|
|
34813
|
-
|
|
34823
|
+
this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
|
|
34814
34824
|
}
|
|
34815
34825
|
}
|
|
34816
34826
|
}
|
|
@@ -34841,7 +34851,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
34841
34851
|
const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
|
|
34842
34852
|
return totalEstimatedCosts;
|
|
34843
34853
|
} catch (e) {
|
|
34844
|
-
|
|
34854
|
+
this.logger.error("getRequiredSatsForModel error:", e);
|
|
34845
34855
|
return 0;
|
|
34846
34856
|
}
|
|
34847
34857
|
}
|
|
@@ -36132,38 +36142,41 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36132
36142
|
updateXcashuTokenTryCount: (token, tryCount) => {
|
|
36133
36143
|
store.getState().updateXcashuTokenTryCount(token, tryCount);
|
|
36134
36144
|
}
|
|
36135
|
-
}), createProviderRegistryFromStore = (store) =>
|
|
36136
|
-
|
|
36137
|
-
|
|
36138
|
-
|
|
36139
|
-
|
|
36140
|
-
|
|
36141
|
-
|
|
36142
|
-
|
|
36143
|
-
|
|
36144
|
-
|
|
36145
|
-
|
|
36146
|
-
|
|
36147
|
-
|
|
36148
|
-
|
|
36149
|
-
|
|
36150
|
-
|
|
36151
|
-
|
|
36152
|
-
|
|
36153
|
-
|
|
36145
|
+
}), createProviderRegistryFromStore = (store, logger3) => {
|
|
36146
|
+
const log3 = (logger3 ?? consoleLogger).child("ProviderRegistry");
|
|
36147
|
+
return {
|
|
36148
|
+
getModelsForProvider: (baseUrl) => {
|
|
36149
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36150
|
+
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
36151
|
+
},
|
|
36152
|
+
getDisabledProviders: () => store.getState().disabledProviders,
|
|
36153
|
+
getProviderMints: (baseUrl) => {
|
|
36154
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36155
|
+
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
36156
|
+
},
|
|
36157
|
+
getProviderInfo: async (baseUrl) => {
|
|
36158
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
36159
|
+
const cached = store.getState().infoFromAllProviders[normalized];
|
|
36160
|
+
if (cached)
|
|
36161
|
+
return cached;
|
|
36162
|
+
try {
|
|
36163
|
+
const response = await fetch(`${normalized}v1/info`);
|
|
36164
|
+
if (!response.ok) {
|
|
36165
|
+
throw new Error(`Failed ${response.status}`);
|
|
36166
|
+
}
|
|
36167
|
+
const info = await response.json();
|
|
36168
|
+
const next = { ...store.getState().infoFromAllProviders };
|
|
36169
|
+
next[normalized] = info;
|
|
36170
|
+
store.getState().setInfoFromAllProviders(next);
|
|
36171
|
+
return info;
|
|
36172
|
+
} catch (error) {
|
|
36173
|
+
log3.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
36174
|
+
return null;
|
|
36154
36175
|
}
|
|
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 = () => {
|
|
36176
|
+
},
|
|
36177
|
+
getAllProvidersModels: () => store.getState().modelsFromAllProviders
|
|
36178
|
+
};
|
|
36179
|
+
}, isBrowser3 = () => {
|
|
36167
36180
|
try {
|
|
36168
36181
|
return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
36169
36182
|
} catch {
|
|
@@ -36228,6 +36241,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36228
36241
|
this.walletAdapter = walletAdapter;
|
|
36229
36242
|
this.storageAdapter = storageAdapter;
|
|
36230
36243
|
this.providerRegistry = providerRegistry;
|
|
36244
|
+
this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
|
|
36231
36245
|
this.balanceManager = new BalanceManager(walletAdapter, storageAdapter, providerRegistry);
|
|
36232
36246
|
this.cashuSpender = new CashuSpender(walletAdapter, storageAdapter, providerRegistry, this.balanceManager);
|
|
36233
36247
|
this.streamProcessor = new StreamProcessor;
|
|
@@ -36235,7 +36249,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36235
36249
|
this.mode = mode;
|
|
36236
36250
|
this.usageTrackingDriver = options.usageTrackingDriver;
|
|
36237
36251
|
this.sdkStore = options.sdkStore;
|
|
36238
|
-
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
|
|
36252
|
+
this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
|
|
36239
36253
|
}
|
|
36240
36254
|
cashuSpender;
|
|
36241
36255
|
balanceManager;
|
|
@@ -36246,6 +36260,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36246
36260
|
debugLevel = "WARN";
|
|
36247
36261
|
usageTrackingDriver;
|
|
36248
36262
|
sdkStore;
|
|
36263
|
+
logger;
|
|
36249
36264
|
getMode() {
|
|
36250
36265
|
return this.mode;
|
|
36251
36266
|
}
|
|
@@ -36264,13 +36279,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36264
36279
|
if (levelPriority[level] >= levelPriority[this.debugLevel]) {
|
|
36265
36280
|
switch (level) {
|
|
36266
36281
|
case "DEBUG":
|
|
36267
|
-
|
|
36282
|
+
this.logger.log(...args);
|
|
36268
36283
|
break;
|
|
36269
36284
|
case "WARN":
|
|
36270
|
-
|
|
36285
|
+
this.logger.warn(...args);
|
|
36271
36286
|
break;
|
|
36272
36287
|
case "ERROR":
|
|
36273
|
-
|
|
36288
|
+
this.logger.error(...args);
|
|
36274
36289
|
break;
|
|
36275
36290
|
}
|
|
36276
36291
|
}
|
|
@@ -36702,7 +36717,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
|
|
|
36702
36717
|
tryNextProvider = true;
|
|
36703
36718
|
}
|
|
36704
36719
|
}
|
|
36705
|
-
if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
|
|
36720
|
+
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
36721
|
this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`);
|
|
36707
36722
|
if (this.mode === "apikeys") {
|
|
36708
36723
|
this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`);
|
|
@@ -37044,6 +37059,18 @@ var init_dist3 = __esm(() => {
|
|
|
37044
37059
|
import_rxjs24 = __toESM(require_cjs(), 1);
|
|
37045
37060
|
init_cashu_ts_es();
|
|
37046
37061
|
init_vanilla();
|
|
37062
|
+
consoleLogger = makeConsoleLogger();
|
|
37063
|
+
noopLogger = {
|
|
37064
|
+
log: () => {
|
|
37065
|
+
},
|
|
37066
|
+
warn: () => {
|
|
37067
|
+
},
|
|
37068
|
+
error: () => {
|
|
37069
|
+
},
|
|
37070
|
+
debug: () => {
|
|
37071
|
+
},
|
|
37072
|
+
child: () => noopLogger
|
|
37073
|
+
};
|
|
37047
37074
|
InsufficientBalanceError = class extends Error {
|
|
37048
37075
|
constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
|
|
37049
37076
|
super(customMessage ?? `Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : ""));
|
|
@@ -37332,7 +37359,19 @@ function saveDaemonConfig(config) {
|
|
|
37332
37359
|
}
|
|
37333
37360
|
|
|
37334
37361
|
// node_modules/@routstr/sdk/dist/storage/index.mjs
|
|
37335
|
-
|
|
37362
|
+
function makeConsoleLogger2(prefix) {
|
|
37363
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
37364
|
+
return {
|
|
37365
|
+
log: (...args) => console.log(...fmt(args)),
|
|
37366
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
37367
|
+
error: (...args) => console.error(...fmt(args)),
|
|
37368
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
37369
|
+
child: (p) => makeConsoleLogger2(prefix ? `${prefix}:${p}` : p)
|
|
37370
|
+
};
|
|
37371
|
+
}
|
|
37372
|
+
var consoleLogger2 = makeConsoleLogger2();
|
|
37373
|
+
async function createBunSqliteDriver2(dbPath, options) {
|
|
37374
|
+
const logger4 = (options?.logger ?? consoleLogger2).child("BunSqliteDriver");
|
|
37336
37375
|
const SQLite = (await import("bun:sqlite")).default;
|
|
37337
37376
|
const db = new SQLite(dbPath);
|
|
37338
37377
|
db.run(`
|
|
@@ -37356,7 +37395,7 @@ async function createBunSqliteDriver2(dbPath) {
|
|
|
37356
37395
|
throw parseError;
|
|
37357
37396
|
}
|
|
37358
37397
|
} catch (error) {
|
|
37359
|
-
|
|
37398
|
+
logger4.error(`getItem failed for key "${key}":`, error);
|
|
37360
37399
|
return defaultValue;
|
|
37361
37400
|
}
|
|
37362
37401
|
},
|
|
@@ -37364,14 +37403,14 @@ async function createBunSqliteDriver2(dbPath) {
|
|
|
37364
37403
|
try {
|
|
37365
37404
|
db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
|
|
37366
37405
|
} catch (error) {
|
|
37367
|
-
|
|
37406
|
+
logger4.error(`setItem failed for key "${key}":`, error);
|
|
37368
37407
|
}
|
|
37369
37408
|
},
|
|
37370
37409
|
async removeItem(key) {
|
|
37371
37410
|
try {
|
|
37372
37411
|
db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
|
|
37373
37412
|
} catch (error) {
|
|
37374
|
-
|
|
37413
|
+
logger4.error(`removeItem failed for key "${key}":`, error);
|
|
37375
37414
|
}
|
|
37376
37415
|
}
|
|
37377
37416
|
};
|
package/dist/index.js
CHANGED
|
@@ -15629,7 +15629,7 @@ async function isCocodInstalled(cocodPath) {
|
|
|
15629
15629
|
// package.json
|
|
15630
15630
|
var package_default = {
|
|
15631
15631
|
name: "routstrd",
|
|
15632
|
-
version: "0.2.
|
|
15632
|
+
version: "0.2.19",
|
|
15633
15633
|
module: "src/index.ts",
|
|
15634
15634
|
type: "module",
|
|
15635
15635
|
private: false,
|