@routstr/sdk 0.1.6 → 0.1.8
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 +190 -66
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +190 -66
- package/dist/client/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +206 -73
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +206 -73
- package/dist/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +31 -0
- package/dist/storage/index.d.ts +31 -0
- package/dist/storage/index.js +16 -7
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +16 -7
- package/dist/storage/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +8 -1
- package/dist/wallet/index.d.ts +8 -1
- package/dist/wallet/index.js +93 -39
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +93 -39
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/storage/index.d.mts
CHANGED
|
@@ -45,6 +45,21 @@ interface SdkStorageState {
|
|
|
45
45
|
unit: "sat" | "msat";
|
|
46
46
|
createdAt: number;
|
|
47
47
|
}>;
|
|
48
|
+
usageTracking: Array<{
|
|
49
|
+
id: string;
|
|
50
|
+
timestamp: number;
|
|
51
|
+
modelId: string;
|
|
52
|
+
baseUrl: string;
|
|
53
|
+
requestId: string;
|
|
54
|
+
cost: number;
|
|
55
|
+
satsCost: number;
|
|
56
|
+
promptTokens: number;
|
|
57
|
+
completionTokens: number;
|
|
58
|
+
totalTokens: number;
|
|
59
|
+
client?: string;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
tags?: string[];
|
|
62
|
+
}>;
|
|
48
63
|
}
|
|
49
64
|
|
|
50
65
|
declare const localStorageDriver: StorageDriver;
|
|
@@ -103,6 +118,21 @@ interface SdkStorageStore extends SdkStorageState {
|
|
|
103
118
|
unit: "sat" | "msat";
|
|
104
119
|
createdAt?: number;
|
|
105
120
|
}>) => void;
|
|
121
|
+
setUsageTracking: (value: Array<{
|
|
122
|
+
id: string;
|
|
123
|
+
timestamp: number;
|
|
124
|
+
modelId: string;
|
|
125
|
+
baseUrl: string;
|
|
126
|
+
requestId: string;
|
|
127
|
+
cost: number;
|
|
128
|
+
satsCost: number;
|
|
129
|
+
promptTokens: number;
|
|
130
|
+
completionTokens: number;
|
|
131
|
+
totalTokens: number;
|
|
132
|
+
client?: string;
|
|
133
|
+
sessionId?: string;
|
|
134
|
+
tags?: string[];
|
|
135
|
+
}>) => void;
|
|
106
136
|
}
|
|
107
137
|
/** Store type returned after async initialization */
|
|
108
138
|
type SdkStore = StoreApi<SdkStorageStore>;
|
|
@@ -126,6 +156,7 @@ declare const SDK_STORAGE_KEYS: {
|
|
|
126
156
|
readonly ROUTSTR21_MODELS: "routstr21Models";
|
|
127
157
|
readonly LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate";
|
|
128
158
|
readonly CACHED_RECEIVE_TOKENS: "cached_receive_tokens";
|
|
159
|
+
readonly USAGE_TRACKING: "usage_tracking";
|
|
129
160
|
};
|
|
130
161
|
|
|
131
162
|
declare const getDefaultSdkDriver: () => StorageDriver;
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -45,6 +45,21 @@ interface SdkStorageState {
|
|
|
45
45
|
unit: "sat" | "msat";
|
|
46
46
|
createdAt: number;
|
|
47
47
|
}>;
|
|
48
|
+
usageTracking: Array<{
|
|
49
|
+
id: string;
|
|
50
|
+
timestamp: number;
|
|
51
|
+
modelId: string;
|
|
52
|
+
baseUrl: string;
|
|
53
|
+
requestId: string;
|
|
54
|
+
cost: number;
|
|
55
|
+
satsCost: number;
|
|
56
|
+
promptTokens: number;
|
|
57
|
+
completionTokens: number;
|
|
58
|
+
totalTokens: number;
|
|
59
|
+
client?: string;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
tags?: string[];
|
|
62
|
+
}>;
|
|
48
63
|
}
|
|
49
64
|
|
|
50
65
|
declare const localStorageDriver: StorageDriver;
|
|
@@ -103,6 +118,21 @@ interface SdkStorageStore extends SdkStorageState {
|
|
|
103
118
|
unit: "sat" | "msat";
|
|
104
119
|
createdAt?: number;
|
|
105
120
|
}>) => void;
|
|
121
|
+
setUsageTracking: (value: Array<{
|
|
122
|
+
id: string;
|
|
123
|
+
timestamp: number;
|
|
124
|
+
modelId: string;
|
|
125
|
+
baseUrl: string;
|
|
126
|
+
requestId: string;
|
|
127
|
+
cost: number;
|
|
128
|
+
satsCost: number;
|
|
129
|
+
promptTokens: number;
|
|
130
|
+
completionTokens: number;
|
|
131
|
+
totalTokens: number;
|
|
132
|
+
client?: string;
|
|
133
|
+
sessionId?: string;
|
|
134
|
+
tags?: string[];
|
|
135
|
+
}>) => void;
|
|
106
136
|
}
|
|
107
137
|
/** Store type returned after async initialization */
|
|
108
138
|
type SdkStore = StoreApi<SdkStorageStore>;
|
|
@@ -126,6 +156,7 @@ declare const SDK_STORAGE_KEYS: {
|
|
|
126
156
|
readonly ROUTSTR21_MODELS: "routstr21Models";
|
|
127
157
|
readonly LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate";
|
|
128
158
|
readonly CACHED_RECEIVE_TOKENS: "cached_receive_tokens";
|
|
159
|
+
readonly USAGE_TRACKING: "usage_tracking";
|
|
129
160
|
};
|
|
130
161
|
|
|
131
162
|
declare const getDefaultSdkDriver: () => StorageDriver;
|
package/dist/storage/index.js
CHANGED
|
@@ -291,12 +291,13 @@ var SDK_STORAGE_KEYS = {
|
|
|
291
291
|
CHILD_KEYS: "child_keys",
|
|
292
292
|
ROUTSTR21_MODELS: "routstr21Models",
|
|
293
293
|
LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
|
|
294
|
-
CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
|
|
294
|
+
CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
|
|
295
|
+
USAGE_TRACKING: "usage_tracking"
|
|
295
296
|
};
|
|
296
297
|
|
|
297
298
|
// storage/store.ts
|
|
298
299
|
var normalizeBaseUrl = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
299
|
-
var
|
|
300
|
+
var getCashuTokenBalance = (token) => {
|
|
300
301
|
try {
|
|
301
302
|
const decoded = cashuTs.getDecodedToken(token);
|
|
302
303
|
const unitDivisor = decoded.unit === "msat" ? 1e3 : 1;
|
|
@@ -326,7 +327,8 @@ var createSdkStore = async ({
|
|
|
326
327
|
rawChildKeys,
|
|
327
328
|
rawRoutstr21Models,
|
|
328
329
|
rawLastRoutstr21ModelsUpdate,
|
|
329
|
-
rawCachedReceiveTokens
|
|
330
|
+
rawCachedReceiveTokens,
|
|
331
|
+
rawUsageTracking
|
|
330
332
|
] = await Promise.all([
|
|
331
333
|
driver.getItem(
|
|
332
334
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -356,7 +358,8 @@ var createSdkStore = async ({
|
|
|
356
358
|
SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
|
|
357
359
|
null
|
|
358
360
|
),
|
|
359
|
-
driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
|
|
361
|
+
driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
|
|
362
|
+
driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, [])
|
|
360
363
|
]);
|
|
361
364
|
const modelsFromAllProviders = Object.fromEntries(
|
|
362
365
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
@@ -389,7 +392,7 @@ var createSdkStore = async ({
|
|
|
389
392
|
const cachedTokens = rawCachedTokens.map((entry) => ({
|
|
390
393
|
...entry,
|
|
391
394
|
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
392
|
-
balance: typeof entry.balance === "number" ? entry.balance :
|
|
395
|
+
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
393
396
|
lastUsed: entry.lastUsed ?? null
|
|
394
397
|
}));
|
|
395
398
|
const apiKeys = rawApiKeys.map((entry) => ({
|
|
@@ -414,6 +417,7 @@ var createSdkStore = async ({
|
|
|
414
417
|
unit: entry.unit || "sat",
|
|
415
418
|
createdAt: entry.createdAt ?? Date.now()
|
|
416
419
|
}));
|
|
420
|
+
const usageTracking = rawUsageTracking;
|
|
417
421
|
return vanilla.createStore((set, get) => ({
|
|
418
422
|
modelsFromAllProviders,
|
|
419
423
|
lastUsedModel,
|
|
@@ -429,6 +433,7 @@ var createSdkStore = async ({
|
|
|
429
433
|
routstr21Models,
|
|
430
434
|
lastRoutstr21ModelsUpdate,
|
|
431
435
|
cachedReceiveTokens,
|
|
436
|
+
usageTracking,
|
|
432
437
|
setModelsFromAllProviders: (value) => {
|
|
433
438
|
const normalized = {};
|
|
434
439
|
for (const [baseUrl, models] of Object.entries(value)) {
|
|
@@ -493,7 +498,7 @@ var createSdkStore = async ({
|
|
|
493
498
|
const normalized = updates.map((entry) => ({
|
|
494
499
|
...entry,
|
|
495
500
|
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
496
|
-
balance: typeof entry.balance === "number" ? entry.balance :
|
|
501
|
+
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
497
502
|
lastUsed: entry.lastUsed ?? null
|
|
498
503
|
}));
|
|
499
504
|
void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
|
|
@@ -545,6 +550,10 @@ var createSdkStore = async ({
|
|
|
545
550
|
}));
|
|
546
551
|
void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
|
|
547
552
|
set({ cachedReceiveTokens: normalized });
|
|
553
|
+
},
|
|
554
|
+
setUsageTracking: (value) => {
|
|
555
|
+
void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
|
|
556
|
+
set({ usageTracking: value });
|
|
548
557
|
}
|
|
549
558
|
}));
|
|
550
559
|
};
|
|
@@ -592,7 +601,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
592
601
|
setToken: (baseUrl, token) => {
|
|
593
602
|
const normalized = normalizeBaseUrl(baseUrl);
|
|
594
603
|
const tokens = store.getState().cachedTokens;
|
|
595
|
-
const balance =
|
|
604
|
+
const balance = getCashuTokenBalance(token);
|
|
596
605
|
const existingIndex = tokens.findIndex(
|
|
597
606
|
(entry) => entry.baseUrl === normalized
|
|
598
607
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../storage/drivers/sqlite.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/store.ts","../../storage/index.ts"],"names":["getDecodedToken","createStore","isBun"],"mappings":"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","file":"index.js","sourcesContent":["import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nexport const createSdkStore = async ({\n driver,\n}: SdkStoreOptions): Promise<SdkStore> => {\n // Hydrate all initial state from the async driver in parallel\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n ]);\n\n // Normalize all hydrated state\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n // Create the store with hydrated state.\n // All setters update in-memory state synchronously and persist to driver\n // as fire-and-forget (no await on setItem).\n return createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n }));\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStorePromise: Promise<SdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStorePromise) {\n defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStorePromise;\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n"]}
|
|
1
|
+
{"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../storage/drivers/sqlite.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/store.ts","../../storage/index.ts"],"names":["getDecodedToken","createStore","isBun"],"mappings":"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","file":"index.js","sourcesContent":["import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n USAGE_TRACKING: \"usage_tracking\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getCashuTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n setUsageTracking: (\n value: Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nexport const createSdkStore = async ({\n driver,\n}: SdkStoreOptions): Promise<SdkStore> => {\n // Hydrate all initial state from the async driver in parallel\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n rawUsageTracking,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n driver.getItem<\n Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n >(SDK_STORAGE_KEYS.USAGE_TRACKING, []),\n ]);\n\n // Normalize all hydrated state\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const usageTracking = rawUsageTracking;\n\n // Create the store with hydrated state.\n // All setters update in-memory state synchronously and persist to driver\n // as fire-and-forget (no await on setItem).\n return createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n usageTracking,\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n setUsageTracking: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);\n set({ usageTracking: value });\n },\n }));\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getCashuTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStorePromise: Promise<SdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStorePromise) {\n defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStorePromise;\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n"]}
|
package/dist/storage/index.mjs
CHANGED
|
@@ -289,12 +289,13 @@ var SDK_STORAGE_KEYS = {
|
|
|
289
289
|
CHILD_KEYS: "child_keys",
|
|
290
290
|
ROUTSTR21_MODELS: "routstr21Models",
|
|
291
291
|
LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
|
|
292
|
-
CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
|
|
292
|
+
CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
|
|
293
|
+
USAGE_TRACKING: "usage_tracking"
|
|
293
294
|
};
|
|
294
295
|
|
|
295
296
|
// storage/store.ts
|
|
296
297
|
var normalizeBaseUrl = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
297
|
-
var
|
|
298
|
+
var getCashuTokenBalance = (token) => {
|
|
298
299
|
try {
|
|
299
300
|
const decoded = getDecodedToken(token);
|
|
300
301
|
const unitDivisor = decoded.unit === "msat" ? 1e3 : 1;
|
|
@@ -324,7 +325,8 @@ var createSdkStore = async ({
|
|
|
324
325
|
rawChildKeys,
|
|
325
326
|
rawRoutstr21Models,
|
|
326
327
|
rawLastRoutstr21ModelsUpdate,
|
|
327
|
-
rawCachedReceiveTokens
|
|
328
|
+
rawCachedReceiveTokens,
|
|
329
|
+
rawUsageTracking
|
|
328
330
|
] = await Promise.all([
|
|
329
331
|
driver.getItem(
|
|
330
332
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -354,7 +356,8 @@ var createSdkStore = async ({
|
|
|
354
356
|
SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
|
|
355
357
|
null
|
|
356
358
|
),
|
|
357
|
-
driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
|
|
359
|
+
driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
|
|
360
|
+
driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, [])
|
|
358
361
|
]);
|
|
359
362
|
const modelsFromAllProviders = Object.fromEntries(
|
|
360
363
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
@@ -387,7 +390,7 @@ var createSdkStore = async ({
|
|
|
387
390
|
const cachedTokens = rawCachedTokens.map((entry) => ({
|
|
388
391
|
...entry,
|
|
389
392
|
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
390
|
-
balance: typeof entry.balance === "number" ? entry.balance :
|
|
393
|
+
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
391
394
|
lastUsed: entry.lastUsed ?? null
|
|
392
395
|
}));
|
|
393
396
|
const apiKeys = rawApiKeys.map((entry) => ({
|
|
@@ -412,6 +415,7 @@ var createSdkStore = async ({
|
|
|
412
415
|
unit: entry.unit || "sat",
|
|
413
416
|
createdAt: entry.createdAt ?? Date.now()
|
|
414
417
|
}));
|
|
418
|
+
const usageTracking = rawUsageTracking;
|
|
415
419
|
return createStore((set, get) => ({
|
|
416
420
|
modelsFromAllProviders,
|
|
417
421
|
lastUsedModel,
|
|
@@ -427,6 +431,7 @@ var createSdkStore = async ({
|
|
|
427
431
|
routstr21Models,
|
|
428
432
|
lastRoutstr21ModelsUpdate,
|
|
429
433
|
cachedReceiveTokens,
|
|
434
|
+
usageTracking,
|
|
430
435
|
setModelsFromAllProviders: (value) => {
|
|
431
436
|
const normalized = {};
|
|
432
437
|
for (const [baseUrl, models] of Object.entries(value)) {
|
|
@@ -491,7 +496,7 @@ var createSdkStore = async ({
|
|
|
491
496
|
const normalized = updates.map((entry) => ({
|
|
492
497
|
...entry,
|
|
493
498
|
baseUrl: normalizeBaseUrl(entry.baseUrl),
|
|
494
|
-
balance: typeof entry.balance === "number" ? entry.balance :
|
|
499
|
+
balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
|
|
495
500
|
lastUsed: entry.lastUsed ?? null
|
|
496
501
|
}));
|
|
497
502
|
void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
|
|
@@ -543,6 +548,10 @@ var createSdkStore = async ({
|
|
|
543
548
|
}));
|
|
544
549
|
void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
|
|
545
550
|
set({ cachedReceiveTokens: normalized });
|
|
551
|
+
},
|
|
552
|
+
setUsageTracking: (value) => {
|
|
553
|
+
void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
|
|
554
|
+
set({ usageTracking: value });
|
|
546
555
|
}
|
|
547
556
|
}));
|
|
548
557
|
};
|
|
@@ -590,7 +599,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
590
599
|
setToken: (baseUrl, token) => {
|
|
591
600
|
const normalized = normalizeBaseUrl(baseUrl);
|
|
592
601
|
const tokens = store.getState().cachedTokens;
|
|
593
|
-
const balance =
|
|
602
|
+
const balance = getCashuTokenBalance(token);
|
|
594
603
|
const existingIndex = tokens.findIndex(
|
|
595
604
|
(entry) => entry.baseUrl === normalized
|
|
596
605
|
);
|