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