@routstr/sdk 0.1.8 → 0.2.0
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.js +27 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +27 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +2 -1
- package/dist/discovery/index.d.ts +2 -1
- package/dist/discovery/index.js +9 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +9 -1
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +226 -142
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +226 -142
- package/dist/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +21 -1
- package/dist/storage/index.d.ts +21 -1
- package/dist/storage/index.js +187 -135
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +187 -135
- package/dist/storage/index.mjs.map +1 -1
- package/dist/wallet/index.js +26 -3
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +26 -3
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15,9 +15,9 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
15
15
|
|
|
16
16
|
// core/errors.ts
|
|
17
17
|
var InsufficientBalanceError = class extends Error {
|
|
18
|
-
constructor(required, available, maxMintBalance = 0, maxMintUrl = "") {
|
|
18
|
+
constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
|
|
19
19
|
super(
|
|
20
|
-
`Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : "")
|
|
20
|
+
customMessage ?? `Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : "")
|
|
21
21
|
);
|
|
22
22
|
this.required = required;
|
|
23
23
|
this.available = available;
|
|
@@ -301,9 +301,10 @@ var ModelManager = class _ModelManager {
|
|
|
301
301
|
* Uses cache if available and not expired
|
|
302
302
|
* @param baseUrls List of provider base URLs to fetch from
|
|
303
303
|
* @param forceRefresh Ignore cache and fetch fresh data
|
|
304
|
+
* @param onProgress Callback fired after each provider completes with current combined models
|
|
304
305
|
* @returns Array of unique models with best prices selected
|
|
305
306
|
*/
|
|
306
|
-
async fetchModels(baseUrls, forceRefresh = false) {
|
|
307
|
+
async fetchModels(baseUrls, forceRefresh = false, onProgress) {
|
|
307
308
|
if (baseUrls.length === 0) {
|
|
308
309
|
throw new NoProvidersAvailableError();
|
|
309
310
|
}
|
|
@@ -313,6 +314,12 @@ var ModelManager = class _ModelManager {
|
|
|
313
314
|
const estimateMinCost = (m) => {
|
|
314
315
|
return m?.sats_pricing?.completion ?? 0;
|
|
315
316
|
};
|
|
317
|
+
const emitProgress = () => {
|
|
318
|
+
if (onProgress) {
|
|
319
|
+
const currentModels = Array.from(bestById.values()).map((v) => v.model);
|
|
320
|
+
onProgress(currentModels);
|
|
321
|
+
}
|
|
322
|
+
};
|
|
316
323
|
const fetchPromises = baseUrls.map(async (url) => {
|
|
317
324
|
const base = url.endsWith("/") ? url : `${url}/`;
|
|
318
325
|
try {
|
|
@@ -347,6 +354,7 @@ var ModelManager = class _ModelManager {
|
|
|
347
354
|
}
|
|
348
355
|
}
|
|
349
356
|
}
|
|
357
|
+
emitProgress();
|
|
350
358
|
return { success: true, base, list };
|
|
351
359
|
} catch (error) {
|
|
352
360
|
if (this.isProviderDownError(error)) {
|
|
@@ -1468,6 +1476,10 @@ var BalanceManager = class {
|
|
|
1468
1476
|
requestId
|
|
1469
1477
|
};
|
|
1470
1478
|
} catch (error) {
|
|
1479
|
+
console.log(
|
|
1480
|
+
"DEBUG",
|
|
1481
|
+
`[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`
|
|
1482
|
+
);
|
|
1471
1483
|
if (cashuToken) {
|
|
1472
1484
|
await this._recoverFailedTopUp(cashuToken);
|
|
1473
1485
|
}
|
|
@@ -1494,16 +1506,35 @@ var BalanceManager = class {
|
|
|
1494
1506
|
(sum, value) => sum + value,
|
|
1495
1507
|
0
|
|
1496
1508
|
);
|
|
1509
|
+
const targetProviderBalance = balanceState.providerBalances[baseUrl] || 0;
|
|
1497
1510
|
const refundableProviderBalance = Object.entries(
|
|
1498
1511
|
balanceState.providerBalances
|
|
1499
1512
|
).filter(([providerBaseUrl]) => providerBaseUrl !== baseUrl).reduce((sum, [, value]) => sum + value, 0);
|
|
1500
|
-
if (totalMintBalance < adjustedAmount && totalMintBalance + refundableProviderBalance >= adjustedAmount && retryCount < 1) {
|
|
1513
|
+
if (totalMintBalance + targetProviderBalance < adjustedAmount && totalMintBalance + targetProviderBalance + refundableProviderBalance >= adjustedAmount && retryCount < 1) {
|
|
1501
1514
|
await this._refundOtherProvidersForTopUp(baseUrl, mintUrl);
|
|
1502
1515
|
return this.createProviderToken({
|
|
1503
1516
|
...options,
|
|
1504
1517
|
retryCount: retryCount + 1
|
|
1505
1518
|
});
|
|
1506
1519
|
}
|
|
1520
|
+
if (totalMintBalance + targetProviderBalance < adjustedAmount) {
|
|
1521
|
+
const error = new InsufficientBalanceError(
|
|
1522
|
+
adjustedAmount,
|
|
1523
|
+
totalMintBalance + targetProviderBalance,
|
|
1524
|
+
totalMintBalance,
|
|
1525
|
+
Object.entries(balanceState.mintBalances).reduce(
|
|
1526
|
+
(max, [url, balance]) => balance > max.balance ? { url, balance } : max,
|
|
1527
|
+
{ url: "", balance: 0 }
|
|
1528
|
+
).url
|
|
1529
|
+
);
|
|
1530
|
+
return { success: false, error: error.message };
|
|
1531
|
+
}
|
|
1532
|
+
if (targetProviderBalance >= adjustedAmount) {
|
|
1533
|
+
return {
|
|
1534
|
+
success: true,
|
|
1535
|
+
amountSpent: 0
|
|
1536
|
+
};
|
|
1537
|
+
}
|
|
1507
1538
|
const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
|
|
1508
1539
|
let requiredAmount = adjustedAmount;
|
|
1509
1540
|
const supportedMintsOnly = providerMints.length > 0;
|
|
@@ -2965,7 +2996,7 @@ var RoutstrClient = class {
|
|
|
2965
2996
|
"DEBUG",
|
|
2966
2997
|
`[RoutstrClient] _handleErrorResponse: Insufficient balance, need=${required}, have=${available}`
|
|
2967
2998
|
);
|
|
2968
|
-
throw new InsufficientBalanceError(required, available);
|
|
2999
|
+
throw new InsufficientBalanceError(required, available, 0, "", message);
|
|
2969
3000
|
} else {
|
|
2970
3001
|
this._log(
|
|
2971
3002
|
"DEBUG",
|
|
@@ -3701,7 +3732,11 @@ var createSqliteDriver = (options = {}) => {
|
|
|
3701
3732
|
};
|
|
3702
3733
|
|
|
3703
3734
|
// storage/drivers/indexedDB.ts
|
|
3735
|
+
var isBrowser = typeof indexedDB !== "undefined";
|
|
3704
3736
|
var openDatabase = (dbName, storeName) => {
|
|
3737
|
+
if (!isBrowser) {
|
|
3738
|
+
return Promise.reject(new Error("IndexedDB is not available"));
|
|
3739
|
+
}
|
|
3705
3740
|
return new Promise((resolve, reject) => {
|
|
3706
3741
|
const request = indexedDB.open(dbName, 1);
|
|
3707
3742
|
request.onupgradeneeded = () => {
|
|
@@ -3806,7 +3841,8 @@ var SDK_STORAGE_KEYS = {
|
|
|
3806
3841
|
ROUTSTR21_MODELS: "routstr21Models",
|
|
3807
3842
|
LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
|
|
3808
3843
|
CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
|
|
3809
|
-
USAGE_TRACKING: "usage_tracking"
|
|
3844
|
+
USAGE_TRACKING: "usage_tracking",
|
|
3845
|
+
CLIENT_IDS: "client_ids"
|
|
3810
3846
|
};
|
|
3811
3847
|
|
|
3812
3848
|
// storage/store.ts
|
|
@@ -3824,9 +3860,159 @@ var getCashuTokenBalance = (token) => {
|
|
|
3824
3860
|
return 0;
|
|
3825
3861
|
}
|
|
3826
3862
|
};
|
|
3827
|
-
var
|
|
3828
|
-
|
|
3829
|
-
|
|
3863
|
+
var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
3864
|
+
modelsFromAllProviders: {},
|
|
3865
|
+
lastUsedModel: null,
|
|
3866
|
+
baseUrlsList: [],
|
|
3867
|
+
lastBaseUrlsUpdate: null,
|
|
3868
|
+
disabledProviders: [],
|
|
3869
|
+
mintsFromAllProviders: {},
|
|
3870
|
+
infoFromAllProviders: {},
|
|
3871
|
+
lastModelsUpdate: {},
|
|
3872
|
+
cachedTokens: [],
|
|
3873
|
+
apiKeys: [],
|
|
3874
|
+
childKeys: [],
|
|
3875
|
+
routstr21Models: [],
|
|
3876
|
+
lastRoutstr21ModelsUpdate: null,
|
|
3877
|
+
cachedReceiveTokens: [],
|
|
3878
|
+
usageTracking: [],
|
|
3879
|
+
clientIds: [],
|
|
3880
|
+
setModelsFromAllProviders: (value) => {
|
|
3881
|
+
const normalized = {};
|
|
3882
|
+
for (const [baseUrl, models] of Object.entries(value)) {
|
|
3883
|
+
normalized[normalizeBaseUrl(baseUrl)] = models;
|
|
3884
|
+
}
|
|
3885
|
+
void driver.setItem(
|
|
3886
|
+
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
3887
|
+
normalized
|
|
3888
|
+
);
|
|
3889
|
+
set({ modelsFromAllProviders: normalized });
|
|
3890
|
+
},
|
|
3891
|
+
setLastUsedModel: (value) => {
|
|
3892
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
|
|
3893
|
+
set({ lastUsedModel: value });
|
|
3894
|
+
},
|
|
3895
|
+
setBaseUrlsList: (value) => {
|
|
3896
|
+
const normalized = value.map((url) => normalizeBaseUrl(url));
|
|
3897
|
+
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
3898
|
+
set({ baseUrlsList: normalized });
|
|
3899
|
+
},
|
|
3900
|
+
setBaseUrlsLastUpdate: (value) => {
|
|
3901
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
|
|
3902
|
+
set({ lastBaseUrlsUpdate: value });
|
|
3903
|
+
},
|
|
3904
|
+
setDisabledProviders: (value) => {
|
|
3905
|
+
const normalized = value.map((url) => normalizeBaseUrl(url));
|
|
3906
|
+
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
3907
|
+
set({ disabledProviders: normalized });
|
|
3908
|
+
},
|
|
3909
|
+
setMintsFromAllProviders: (value) => {
|
|
3910
|
+
const normalized = {};
|
|
3911
|
+
for (const [baseUrl, mints] of Object.entries(value)) {
|
|
3912
|
+
normalized[normalizeBaseUrl(baseUrl)] = mints.map(
|
|
3913
|
+
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
3914
|
+
);
|
|
3915
|
+
}
|
|
3916
|
+
void driver.setItem(
|
|
3917
|
+
SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
|
|
3918
|
+
normalized
|
|
3919
|
+
);
|
|
3920
|
+
set({ mintsFromAllProviders: normalized });
|
|
3921
|
+
},
|
|
3922
|
+
setInfoFromAllProviders: (value) => {
|
|
3923
|
+
const normalized = {};
|
|
3924
|
+
for (const [baseUrl, info] of Object.entries(value)) {
|
|
3925
|
+
normalized[normalizeBaseUrl(baseUrl)] = info;
|
|
3926
|
+
}
|
|
3927
|
+
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
3928
|
+
set({ infoFromAllProviders: normalized });
|
|
3929
|
+
},
|
|
3930
|
+
setLastModelsUpdate: (value) => {
|
|
3931
|
+
const normalized = {};
|
|
3932
|
+
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
3933
|
+
normalized[normalizeBaseUrl(baseUrl)] = timestamp;
|
|
3934
|
+
}
|
|
3935
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
|
|
3936
|
+
set({ lastModelsUpdate: normalized });
|
|
3937
|
+
},
|
|
3938
|
+
setCachedTokens: (value) => {
|
|
3939
|
+
set((state) => {
|
|
3940
|
+
const updates = typeof value === "function" ? value(state.cachedTokens) : value;
|
|
3941
|
+
const normalized = updates.map((entry) => ({
|
|
3942
|
+
...entry,
|
|
3943
|
+
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
3944
|
+
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
3945
|
+
lastUsed: entry.lastUsed ?? null
|
|
3946
|
+
}));
|
|
3947
|
+
void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
|
|
3948
|
+
return { cachedTokens: normalized };
|
|
3949
|
+
});
|
|
3950
|
+
},
|
|
3951
|
+
setApiKeys: (value) => {
|
|
3952
|
+
set((state) => {
|
|
3953
|
+
const updates = typeof value === "function" ? value(state.apiKeys) : value;
|
|
3954
|
+
const normalized = updates.map((entry) => ({
|
|
3955
|
+
...entry,
|
|
3956
|
+
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
3957
|
+
balance: entry.balance ?? 0,
|
|
3958
|
+
lastUsed: entry.lastUsed ?? null
|
|
3959
|
+
}));
|
|
3960
|
+
void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
|
|
3961
|
+
return { apiKeys: normalized };
|
|
3962
|
+
});
|
|
3963
|
+
},
|
|
3964
|
+
setChildKeys: (value) => {
|
|
3965
|
+
set((state) => {
|
|
3966
|
+
const updates = typeof value === "function" ? value(state.childKeys) : value;
|
|
3967
|
+
const normalized = updates.map((entry) => ({
|
|
3968
|
+
parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
|
|
3969
|
+
childKey: entry.childKey,
|
|
3970
|
+
balance: entry.balance ?? 0,
|
|
3971
|
+
balanceLimit: entry.balanceLimit,
|
|
3972
|
+
validityDate: entry.validityDate,
|
|
3973
|
+
createdAt: entry.createdAt ?? Date.now()
|
|
3974
|
+
}));
|
|
3975
|
+
void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
|
|
3976
|
+
return { childKeys: normalized };
|
|
3977
|
+
});
|
|
3978
|
+
},
|
|
3979
|
+
setRoutstr21Models: (value) => {
|
|
3980
|
+
void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
|
|
3981
|
+
set({ routstr21Models: value });
|
|
3982
|
+
},
|
|
3983
|
+
setRoutstr21ModelsLastUpdate: (value) => {
|
|
3984
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
|
|
3985
|
+
set({ lastRoutstr21ModelsUpdate: value });
|
|
3986
|
+
},
|
|
3987
|
+
setCachedReceiveTokens: (value) => {
|
|
3988
|
+
const normalized = value.map((entry) => ({
|
|
3989
|
+
token: entry.token,
|
|
3990
|
+
amount: entry.amount,
|
|
3991
|
+
unit: entry.unit || "sat",
|
|
3992
|
+
createdAt: entry.createdAt ?? Date.now()
|
|
3993
|
+
}));
|
|
3994
|
+
void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
|
|
3995
|
+
set({ cachedReceiveTokens: normalized });
|
|
3996
|
+
},
|
|
3997
|
+
setUsageTracking: (value) => {
|
|
3998
|
+
void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
|
|
3999
|
+
set({ usageTracking: value });
|
|
4000
|
+
},
|
|
4001
|
+
setClientIds: (value) => {
|
|
4002
|
+
set((state) => {
|
|
4003
|
+
const updates = typeof value === "function" ? value(state.clientIds) : value;
|
|
4004
|
+
const normalized = updates.map((entry) => ({
|
|
4005
|
+
...entry,
|
|
4006
|
+
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
4007
|
+
createdAt: entry.createdAt ?? Date.now(),
|
|
4008
|
+
lastUsed: entry.lastUsed ?? null
|
|
4009
|
+
}));
|
|
4010
|
+
void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);
|
|
4011
|
+
return { clientIds: normalized };
|
|
4012
|
+
});
|
|
4013
|
+
}
|
|
4014
|
+
}));
|
|
4015
|
+
var hydrateStoreFromDriver = async (store, driver) => {
|
|
3830
4016
|
const [
|
|
3831
4017
|
rawModels,
|
|
3832
4018
|
lastUsedModel,
|
|
@@ -3842,7 +4028,8 @@ var createSdkStore = async ({
|
|
|
3842
4028
|
rawRoutstr21Models,
|
|
3843
4029
|
rawLastRoutstr21ModelsUpdate,
|
|
3844
4030
|
rawCachedReceiveTokens,
|
|
3845
|
-
rawUsageTracking
|
|
4031
|
+
rawUsageTracking,
|
|
4032
|
+
rawClientIds
|
|
3846
4033
|
] = await Promise.all([
|
|
3847
4034
|
driver.getItem(
|
|
3848
4035
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -3873,7 +4060,8 @@ var createSdkStore = async ({
|
|
|
3873
4060
|
null
|
|
3874
4061
|
),
|
|
3875
4062
|
driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
|
|
3876
|
-
driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, [])
|
|
4063
|
+
driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, []),
|
|
4064
|
+
driver.getItem(SDK_STORAGE_KEYS.CLIENT_IDS, [])
|
|
3877
4065
|
]);
|
|
3878
4066
|
const modelsFromAllProviders = Object.fromEntries(
|
|
3879
4067
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
@@ -3932,7 +4120,13 @@ var createSdkStore = async ({
|
|
|
3932
4120
|
createdAt: entry.createdAt ?? Date.now()
|
|
3933
4121
|
}));
|
|
3934
4122
|
const usageTracking = rawUsageTracking;
|
|
3935
|
-
|
|
4123
|
+
const clientIds = rawClientIds.map((entry) => ({
|
|
4124
|
+
...entry,
|
|
4125
|
+
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
4126
|
+
createdAt: entry.createdAt ?? Date.now(),
|
|
4127
|
+
lastUsed: entry.lastUsed ?? null
|
|
4128
|
+
}));
|
|
4129
|
+
store.setState({
|
|
3936
4130
|
modelsFromAllProviders,
|
|
3937
4131
|
lastUsedModel,
|
|
3938
4132
|
baseUrlsList,
|
|
@@ -3948,128 +4142,17 @@ var createSdkStore = async ({
|
|
|
3948
4142
|
lastRoutstr21ModelsUpdate,
|
|
3949
4143
|
cachedReceiveTokens,
|
|
3950
4144
|
usageTracking,
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
setLastUsedModel: (value) => {
|
|
3963
|
-
void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
|
|
3964
|
-
set({ lastUsedModel: value });
|
|
3965
|
-
},
|
|
3966
|
-
setBaseUrlsList: (value) => {
|
|
3967
|
-
const normalized = value.map((url) => normalizeBaseUrl(url));
|
|
3968
|
-
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
3969
|
-
set({ baseUrlsList: normalized });
|
|
3970
|
-
},
|
|
3971
|
-
setBaseUrlsLastUpdate: (value) => {
|
|
3972
|
-
void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
|
|
3973
|
-
set({ lastBaseUrlsUpdate: value });
|
|
3974
|
-
},
|
|
3975
|
-
setDisabledProviders: (value) => {
|
|
3976
|
-
const normalized = value.map((url) => normalizeBaseUrl(url));
|
|
3977
|
-
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
3978
|
-
set({ disabledProviders: normalized });
|
|
3979
|
-
},
|
|
3980
|
-
setMintsFromAllProviders: (value) => {
|
|
3981
|
-
const normalized = {};
|
|
3982
|
-
for (const [baseUrl, mints] of Object.entries(value)) {
|
|
3983
|
-
normalized[normalizeBaseUrl(baseUrl)] = mints.map(
|
|
3984
|
-
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
3985
|
-
);
|
|
3986
|
-
}
|
|
3987
|
-
void driver.setItem(
|
|
3988
|
-
SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
|
|
3989
|
-
normalized
|
|
3990
|
-
);
|
|
3991
|
-
set({ mintsFromAllProviders: normalized });
|
|
3992
|
-
},
|
|
3993
|
-
setInfoFromAllProviders: (value) => {
|
|
3994
|
-
const normalized = {};
|
|
3995
|
-
for (const [baseUrl, info] of Object.entries(value)) {
|
|
3996
|
-
normalized[normalizeBaseUrl(baseUrl)] = info;
|
|
3997
|
-
}
|
|
3998
|
-
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
3999
|
-
set({ infoFromAllProviders: normalized });
|
|
4000
|
-
},
|
|
4001
|
-
setLastModelsUpdate: (value) => {
|
|
4002
|
-
const normalized = {};
|
|
4003
|
-
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
4004
|
-
normalized[normalizeBaseUrl(baseUrl)] = timestamp;
|
|
4005
|
-
}
|
|
4006
|
-
void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
|
|
4007
|
-
set({ lastModelsUpdate: normalized });
|
|
4008
|
-
},
|
|
4009
|
-
setCachedTokens: (value) => {
|
|
4010
|
-
set((state) => {
|
|
4011
|
-
const updates = typeof value === "function" ? value(state.cachedTokens) : value;
|
|
4012
|
-
const normalized = updates.map((entry) => ({
|
|
4013
|
-
...entry,
|
|
4014
|
-
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
4015
|
-
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
4016
|
-
lastUsed: entry.lastUsed ?? null
|
|
4017
|
-
}));
|
|
4018
|
-
void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
|
|
4019
|
-
return { cachedTokens: normalized };
|
|
4020
|
-
});
|
|
4021
|
-
},
|
|
4022
|
-
setApiKeys: (value) => {
|
|
4023
|
-
set((state) => {
|
|
4024
|
-
const updates = typeof value === "function" ? value(state.apiKeys) : value;
|
|
4025
|
-
const normalized = updates.map((entry) => ({
|
|
4026
|
-
...entry,
|
|
4027
|
-
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
4028
|
-
balance: entry.balance ?? 0,
|
|
4029
|
-
lastUsed: entry.lastUsed ?? null
|
|
4030
|
-
}));
|
|
4031
|
-
void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
|
|
4032
|
-
return { apiKeys: normalized };
|
|
4033
|
-
});
|
|
4034
|
-
},
|
|
4035
|
-
setChildKeys: (value) => {
|
|
4036
|
-
set((state) => {
|
|
4037
|
-
const updates = typeof value === "function" ? value(state.childKeys) : value;
|
|
4038
|
-
const normalized = updates.map((entry) => ({
|
|
4039
|
-
parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
|
|
4040
|
-
childKey: entry.childKey,
|
|
4041
|
-
balance: entry.balance ?? 0,
|
|
4042
|
-
balanceLimit: entry.balanceLimit,
|
|
4043
|
-
validityDate: entry.validityDate,
|
|
4044
|
-
createdAt: entry.createdAt ?? Date.now()
|
|
4045
|
-
}));
|
|
4046
|
-
void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
|
|
4047
|
-
return { childKeys: normalized };
|
|
4048
|
-
});
|
|
4049
|
-
},
|
|
4050
|
-
setRoutstr21Models: (value) => {
|
|
4051
|
-
void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
|
|
4052
|
-
set({ routstr21Models: value });
|
|
4053
|
-
},
|
|
4054
|
-
setRoutstr21ModelsLastUpdate: (value) => {
|
|
4055
|
-
void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
|
|
4056
|
-
set({ lastRoutstr21ModelsUpdate: value });
|
|
4057
|
-
},
|
|
4058
|
-
setCachedReceiveTokens: (value) => {
|
|
4059
|
-
const normalized = value.map((entry) => ({
|
|
4060
|
-
token: entry.token,
|
|
4061
|
-
amount: entry.amount,
|
|
4062
|
-
unit: entry.unit || "sat",
|
|
4063
|
-
createdAt: entry.createdAt ?? Date.now()
|
|
4064
|
-
}));
|
|
4065
|
-
void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
|
|
4066
|
-
set({ cachedReceiveTokens: normalized });
|
|
4067
|
-
},
|
|
4068
|
-
setUsageTracking: (value) => {
|
|
4069
|
-
void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
|
|
4070
|
-
set({ usageTracking: value });
|
|
4071
|
-
}
|
|
4072
|
-
}));
|
|
4145
|
+
clientIds
|
|
4146
|
+
});
|
|
4147
|
+
};
|
|
4148
|
+
var createSdkStore = ({
|
|
4149
|
+
driver
|
|
4150
|
+
}) => {
|
|
4151
|
+
const store = createEmptyStore(driver);
|
|
4152
|
+
return {
|
|
4153
|
+
store,
|
|
4154
|
+
hydrate: hydrateStoreFromDriver(store, driver)
|
|
4155
|
+
};
|
|
4073
4156
|
};
|
|
4074
4157
|
var createDiscoveryAdapterFromStore = (store) => ({
|
|
4075
4158
|
getCachedModels: () => store.getState().modelsFromAllProviders,
|
|
@@ -4334,7 +4417,7 @@ var createProviderRegistryFromStore = (store) => ({
|
|
|
4334
4417
|
});
|
|
4335
4418
|
|
|
4336
4419
|
// storage/index.ts
|
|
4337
|
-
var
|
|
4420
|
+
var isBrowser2 = () => {
|
|
4338
4421
|
try {
|
|
4339
4422
|
return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
4340
4423
|
} catch {
|
|
@@ -4354,7 +4437,7 @@ var isBun2 = () => {
|
|
|
4354
4437
|
};
|
|
4355
4438
|
var getDefaultSdkDriver = () => {
|
|
4356
4439
|
if (defaultDriver) return defaultDriver;
|
|
4357
|
-
if (
|
|
4440
|
+
if (isBrowser2()) {
|
|
4358
4441
|
defaultDriver = localStorageDriver;
|
|
4359
4442
|
return defaultDriver;
|
|
4360
4443
|
}
|
|
@@ -4369,12 +4452,12 @@ var getDefaultSdkDriver = () => {
|
|
|
4369
4452
|
defaultDriver = createMemoryDriver();
|
|
4370
4453
|
return defaultDriver;
|
|
4371
4454
|
};
|
|
4372
|
-
var
|
|
4455
|
+
var defaultStore = null;
|
|
4373
4456
|
var getDefaultSdkStore = () => {
|
|
4374
|
-
if (!
|
|
4375
|
-
|
|
4457
|
+
if (!defaultStore) {
|
|
4458
|
+
defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });
|
|
4376
4459
|
}
|
|
4377
|
-
return
|
|
4460
|
+
return defaultStore.hydrate.then(() => defaultStore.store);
|
|
4378
4461
|
};
|
|
4379
4462
|
var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
|
|
4380
4463
|
var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());
|
|
@@ -4395,7 +4478,8 @@ async function routeRequests(options) {
|
|
|
4395
4478
|
torMode = false,
|
|
4396
4479
|
forceRefresh = false,
|
|
4397
4480
|
modelManager: providedModelManager,
|
|
4398
|
-
debugLevel
|
|
4481
|
+
debugLevel,
|
|
4482
|
+
mode = "apikeys"
|
|
4399
4483
|
} = options;
|
|
4400
4484
|
let modelManager;
|
|
4401
4485
|
let providers;
|
|
@@ -4460,7 +4544,7 @@ async function routeRequests(options) {
|
|
|
4460
4544
|
storageAdapter,
|
|
4461
4545
|
providerRegistry,
|
|
4462
4546
|
alertLevel,
|
|
4463
|
-
|
|
4547
|
+
mode
|
|
4464
4548
|
);
|
|
4465
4549
|
if (debugLevel) {
|
|
4466
4550
|
client.setDebugLevel(debugLevel);
|