@routstr/sdk 0.2.3 → 0.2.5

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.
Files changed (38) hide show
  1. package/README.md +9 -0
  2. package/dist/client/index.d.mts +21 -8
  3. package/dist/client/index.d.ts +21 -8
  4. package/dist/client/index.js +1406 -69
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/client/index.mjs +1406 -70
  7. package/dist/client/index.mjs.map +1 -1
  8. package/dist/discovery/index.d.mts +2 -2
  9. package/dist/discovery/index.d.ts +2 -2
  10. package/dist/discovery/index.js +1 -4
  11. package/dist/discovery/index.js.map +1 -1
  12. package/dist/discovery/index.mjs +1 -4
  13. package/dist/discovery/index.mjs.map +1 -1
  14. package/dist/index.d.mts +15 -19
  15. package/dist/index.d.ts +15 -19
  16. package/dist/index.js +2385 -1574
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +2380 -1575
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/{interfaces-DGdP8fQp.d.mts → interfaces-BWJJTCXO.d.mts} +1 -1
  21. package/dist/{interfaces-CC0LT9p9.d.ts → interfaces-BxDEka72.d.ts} +1 -1
  22. package/dist/{interfaces-B85Wx7ni.d.mts → interfaces-C6Dr6hKy.d.mts} +1 -1
  23. package/dist/{interfaces-BVNyAmKu.d.ts → interfaces-CluftN4z.d.ts} +1 -1
  24. package/dist/storage/index.d.mts +56 -34
  25. package/dist/storage/index.d.ts +56 -34
  26. package/dist/storage/index.js +500 -51
  27. package/dist/storage/index.js.map +1 -1
  28. package/dist/storage/index.mjs +497 -52
  29. package/dist/storage/index.mjs.map +1 -1
  30. package/dist/{types-BlHjmWRK.d.mts → types-BYj_8c5c.d.mts} +3 -0
  31. package/dist/{types-BlHjmWRK.d.ts → types-BYj_8c5c.d.ts} +3 -0
  32. package/dist/wallet/index.d.mts +9 -5
  33. package/dist/wallet/index.d.ts +9 -5
  34. package/dist/wallet/index.js +54 -22
  35. package/dist/wallet/index.js.map +1 -1
  36. package/dist/wallet/index.mjs +54 -22
  37. package/dist/wallet/index.mjs.map +1 -1
  38. package/package.json +1 -1
@@ -298,8 +298,439 @@ var SDK_STORAGE_KEYS = {
298
298
  CLIENT_IDS: "client_ids"
299
299
  };
300
300
 
301
- // storage/store.ts
301
+ // storage/usageTracking/indexedDB.ts
302
+ var DEFAULT_DB_NAME = "routstr-sdk";
303
+ var DEFAULT_STORE_NAME = "usage_tracking";
304
+ var MIGRATION_MARKER_KEY = "usage_tracking_migration_v1";
305
+ var isBrowser2 = typeof indexedDB !== "undefined";
302
306
  var normalizeBaseUrl = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
307
+ var openDatabase2 = (dbName, storeName) => {
308
+ if (!isBrowser2) {
309
+ return Promise.reject(new Error("IndexedDB is not available"));
310
+ }
311
+ return new Promise((resolve, reject) => {
312
+ const request = indexedDB.open(dbName, 1);
313
+ request.onupgradeneeded = () => {
314
+ const db = request.result;
315
+ if (!db.objectStoreNames.contains(storeName)) {
316
+ const store = db.createObjectStore(storeName, { keyPath: "id" });
317
+ store.createIndex("timestamp", "timestamp", { unique: false });
318
+ store.createIndex("modelId", "modelId", { unique: false });
319
+ store.createIndex("baseUrl", "baseUrl", { unique: false });
320
+ store.createIndex("sessionId", "sessionId", { unique: false });
321
+ store.createIndex("client", "client", { unique: false });
322
+ }
323
+ };
324
+ request.onsuccess = () => resolve(request.result);
325
+ request.onerror = () => reject(request.error);
326
+ });
327
+ };
328
+ var matchesFilters = (entry, options = {}) => {
329
+ if (typeof options.before === "number" && entry.timestamp >= options.before) {
330
+ return false;
331
+ }
332
+ if (typeof options.after === "number" && entry.timestamp <= options.after) {
333
+ return false;
334
+ }
335
+ if (options.modelId && entry.modelId !== options.modelId) {
336
+ return false;
337
+ }
338
+ if (options.baseUrl && normalizeBaseUrl(entry.baseUrl) !== normalizeBaseUrl(options.baseUrl)) {
339
+ return false;
340
+ }
341
+ if (options.sessionId && entry.sessionId !== options.sessionId) {
342
+ return false;
343
+ }
344
+ if (options.client && entry.client !== options.client) {
345
+ return false;
346
+ }
347
+ return true;
348
+ };
349
+ var createIndexedDBUsageTrackingDriver = (options = {}) => {
350
+ const dbName = options.dbName || DEFAULT_DB_NAME;
351
+ const storeName = options.storeName || DEFAULT_STORE_NAME;
352
+ const legacyStorageDriver = options.legacyStorageDriver;
353
+ let dbPromise = null;
354
+ let migrationPromise = null;
355
+ const getDb = () => {
356
+ if (!dbPromise) {
357
+ dbPromise = openDatabase2(dbName, storeName);
358
+ }
359
+ return dbPromise;
360
+ };
361
+ const putMany = async (entries) => {
362
+ if (entries.length === 0) return;
363
+ const db = await getDb();
364
+ await new Promise((resolve, reject) => {
365
+ const tx = db.transaction(storeName, "readwrite");
366
+ const store = tx.objectStore(storeName);
367
+ for (const entry of entries) {
368
+ store.put({ ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });
369
+ }
370
+ tx.oncomplete = () => resolve();
371
+ tx.onerror = () => reject(tx.error);
372
+ });
373
+ };
374
+ const ensureMigrated = async () => {
375
+ if (!legacyStorageDriver) return;
376
+ if (!migrationPromise) {
377
+ migrationPromise = (async () => {
378
+ const migrated = await legacyStorageDriver.getItem(
379
+ MIGRATION_MARKER_KEY,
380
+ false
381
+ );
382
+ if (migrated) return;
383
+ const legacyEntries = await legacyStorageDriver.getItem(
384
+ SDK_STORAGE_KEYS.USAGE_TRACKING,
385
+ []
386
+ );
387
+ if (legacyEntries.length > 0) {
388
+ await putMany(legacyEntries);
389
+ await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);
390
+ }
391
+ await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY, true);
392
+ })();
393
+ }
394
+ await migrationPromise;
395
+ };
396
+ return {
397
+ async migrate() {
398
+ await ensureMigrated();
399
+ },
400
+ async append(entry) {
401
+ await ensureMigrated();
402
+ await putMany([entry]);
403
+ },
404
+ async appendMany(entries) {
405
+ await ensureMigrated();
406
+ await putMany(entries);
407
+ },
408
+ async list(options2 = {}) {
409
+ await ensureMigrated();
410
+ const db = await getDb();
411
+ return new Promise((resolve, reject) => {
412
+ const tx = db.transaction(storeName, "readonly");
413
+ const store = tx.objectStore(storeName);
414
+ const index = store.index("timestamp");
415
+ const direction = "prev";
416
+ const request = index.openCursor(null, direction);
417
+ const results = [];
418
+ const limit = options2.limit;
419
+ request.onsuccess = () => {
420
+ const cursor = request.result;
421
+ if (!cursor) {
422
+ resolve(results);
423
+ return;
424
+ }
425
+ const value = cursor.value;
426
+ if (matchesFilters(value, options2)) {
427
+ results.push(value);
428
+ if (typeof limit === "number" && results.length >= limit) {
429
+ resolve(results);
430
+ return;
431
+ }
432
+ }
433
+ cursor.continue();
434
+ };
435
+ request.onerror = () => reject(request.error);
436
+ });
437
+ },
438
+ async count(options2 = {}) {
439
+ const results = await this.list(options2);
440
+ return results.length;
441
+ },
442
+ async deleteOlderThan(timestamp) {
443
+ await ensureMigrated();
444
+ const db = await getDb();
445
+ return new Promise((resolve, reject) => {
446
+ const tx = db.transaction(storeName, "readwrite");
447
+ const store = tx.objectStore(storeName);
448
+ const index = store.index("timestamp");
449
+ const range = IDBKeyRange.upperBound(timestamp, true);
450
+ const request = index.openCursor(range);
451
+ let deleted = 0;
452
+ request.onsuccess = () => {
453
+ const cursor = request.result;
454
+ if (!cursor) {
455
+ resolve(deleted);
456
+ return;
457
+ }
458
+ deleted += 1;
459
+ cursor.delete();
460
+ cursor.continue();
461
+ };
462
+ request.onerror = () => reject(request.error);
463
+ });
464
+ },
465
+ async clear() {
466
+ await ensureMigrated();
467
+ const db = await getDb();
468
+ await new Promise((resolve, reject) => {
469
+ const tx = db.transaction(storeName, "readwrite");
470
+ tx.objectStore(storeName).clear();
471
+ tx.oncomplete = () => resolve();
472
+ tx.onerror = () => reject(tx.error);
473
+ });
474
+ }
475
+ };
476
+ };
477
+
478
+ // storage/usageTracking/sqlite.ts
479
+ var MIGRATION_MARKER_KEY2 = "usage_tracking_migration_v1";
480
+ var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
481
+ var isBun2 = () => {
482
+ return typeof process.versions.bun !== "undefined";
483
+ };
484
+ var createDatabase2 = (dbPath) => {
485
+ if (isBun2()) {
486
+ throw new Error(
487
+ "SQLite driver not supported in Bun. Use createMemoryDriver() instead."
488
+ );
489
+ }
490
+ let Database = null;
491
+ try {
492
+ Database = __require("better-sqlite3");
493
+ } catch (error) {
494
+ throw new Error(
495
+ `better-sqlite3 is required for sqlite usage tracking. Install it to use sqlite storage. (${error})`
496
+ );
497
+ }
498
+ return new Database(dbPath);
499
+ };
500
+ var buildWhereClause = (options = {}) => {
501
+ const clauses = [];
502
+ const params = [];
503
+ if (typeof options.before === "number") {
504
+ clauses.push("timestamp < ?");
505
+ params.push(options.before);
506
+ }
507
+ if (typeof options.after === "number") {
508
+ clauses.push("timestamp > ?");
509
+ params.push(options.after);
510
+ }
511
+ if (options.modelId) {
512
+ clauses.push("model_id = ?");
513
+ params.push(options.modelId);
514
+ }
515
+ if (options.baseUrl) {
516
+ clauses.push("base_url = ?");
517
+ params.push(normalizeBaseUrl2(options.baseUrl));
518
+ }
519
+ if (options.sessionId) {
520
+ clauses.push("session_id = ?");
521
+ params.push(options.sessionId);
522
+ }
523
+ if (options.client) {
524
+ clauses.push("client = ?");
525
+ params.push(options.client);
526
+ }
527
+ return {
528
+ sql: clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "",
529
+ params
530
+ };
531
+ };
532
+ var createSqliteUsageTrackingDriver = (options = {}) => {
533
+ const dbPath = options.dbPath || "routstr.sqlite";
534
+ const tableName = options.tableName || "usage_tracking";
535
+ const db = createDatabase2(dbPath);
536
+ const legacyStorageDriver = options.legacyStorageDriver;
537
+ db.exec(`
538
+ CREATE TABLE IF NOT EXISTS ${tableName} (
539
+ id TEXT PRIMARY KEY,
540
+ timestamp INTEGER NOT NULL,
541
+ model_id TEXT NOT NULL,
542
+ base_url TEXT NOT NULL,
543
+ request_id TEXT NOT NULL,
544
+ cost REAL NOT NULL,
545
+ sats_cost REAL NOT NULL,
546
+ prompt_tokens INTEGER NOT NULL,
547
+ completion_tokens INTEGER NOT NULL,
548
+ total_tokens INTEGER NOT NULL,
549
+ client TEXT,
550
+ session_id TEXT,
551
+ tags TEXT
552
+ );
553
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp);
554
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id);
555
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url);
556
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_session_id ON ${tableName}(session_id);
557
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_client ON ${tableName}(client);
558
+ `);
559
+ const insertStmt = db.prepare(`
560
+ INSERT OR REPLACE INTO ${tableName} (
561
+ id, timestamp, model_id, base_url, request_id,
562
+ cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
563
+ client, session_id, tags
564
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
565
+ `);
566
+ let migrationComplete = false;
567
+ const appendOne = (entry) => {
568
+ insertStmt.run(
569
+ entry.id,
570
+ entry.timestamp,
571
+ entry.modelId,
572
+ normalizeBaseUrl2(entry.baseUrl),
573
+ entry.requestId,
574
+ entry.cost,
575
+ entry.satsCost,
576
+ entry.promptTokens,
577
+ entry.completionTokens,
578
+ entry.totalTokens,
579
+ entry.client ?? null,
580
+ entry.sessionId ?? null,
581
+ JSON.stringify(entry.tags ?? [])
582
+ );
583
+ };
584
+ const ensureMigrated = async () => {
585
+ if (!legacyStorageDriver || migrationComplete) return;
586
+ const migrated = await legacyStorageDriver.getItem(
587
+ MIGRATION_MARKER_KEY2,
588
+ false
589
+ );
590
+ if (migrated) {
591
+ migrationComplete = true;
592
+ return;
593
+ }
594
+ const legacyEntries = await legacyStorageDriver.getItem(
595
+ SDK_STORAGE_KEYS.USAGE_TRACKING,
596
+ []
597
+ );
598
+ for (const entry of legacyEntries) {
599
+ appendOne(entry);
600
+ }
601
+ if (legacyEntries.length > 0) {
602
+ await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);
603
+ }
604
+ await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY2, true);
605
+ migrationComplete = true;
606
+ };
607
+ const mapRow = (row) => ({
608
+ id: row.id,
609
+ timestamp: row.timestamp,
610
+ modelId: row.model_id,
611
+ baseUrl: row.base_url,
612
+ requestId: row.request_id,
613
+ cost: row.cost,
614
+ satsCost: row.sats_cost,
615
+ promptTokens: row.prompt_tokens,
616
+ completionTokens: row.completion_tokens,
617
+ totalTokens: row.total_tokens,
618
+ client: row.client ?? void 0,
619
+ sessionId: row.session_id ?? void 0,
620
+ tags: typeof row.tags === "string" ? JSON.parse(row.tags) : void 0
621
+ });
622
+ return {
623
+ async migrate() {
624
+ await ensureMigrated();
625
+ },
626
+ async append(entry) {
627
+ await ensureMigrated();
628
+ appendOne(entry);
629
+ },
630
+ async appendMany(entries) {
631
+ await ensureMigrated();
632
+ for (const entry of entries) {
633
+ appendOne(entry);
634
+ }
635
+ },
636
+ async list(options2 = {}) {
637
+ await ensureMigrated();
638
+ const { sql, params } = buildWhereClause(options2);
639
+ const limitSql = typeof options2.limit === "number" ? " LIMIT ?" : "";
640
+ const stmt = db.prepare(
641
+ `SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`
642
+ );
643
+ const rows = stmt.all(
644
+ ...typeof options2.limit === "number" ? [...params, options2.limit] : params
645
+ );
646
+ return rows.map(mapRow);
647
+ },
648
+ async count(options2 = {}) {
649
+ await ensureMigrated();
650
+ const { sql, params } = buildWhereClause(options2);
651
+ const stmt = db.prepare(`SELECT COUNT(*) as count FROM ${tableName} ${sql}`);
652
+ const row = stmt.get(...params);
653
+ return Number(row?.count ?? 0);
654
+ },
655
+ async deleteOlderThan(timestamp) {
656
+ await ensureMigrated();
657
+ const stmt = db.prepare(`DELETE FROM ${tableName} WHERE timestamp < ?`);
658
+ const result = stmt.run(timestamp);
659
+ return result.changes;
660
+ },
661
+ async clear() {
662
+ await ensureMigrated();
663
+ db.prepare(`DELETE FROM ${tableName}`).run();
664
+ }
665
+ };
666
+ };
667
+
668
+ // storage/usageTracking/memory.ts
669
+ var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
670
+ var matchesFilters2 = (entry, options = {}) => {
671
+ if (typeof options.before === "number" && entry.timestamp >= options.before) {
672
+ return false;
673
+ }
674
+ if (typeof options.after === "number" && entry.timestamp <= options.after) {
675
+ return false;
676
+ }
677
+ if (options.modelId && entry.modelId !== options.modelId) {
678
+ return false;
679
+ }
680
+ if (options.baseUrl && normalizeBaseUrl3(entry.baseUrl) !== normalizeBaseUrl3(options.baseUrl)) {
681
+ return false;
682
+ }
683
+ if (options.sessionId && entry.sessionId !== options.sessionId) {
684
+ return false;
685
+ }
686
+ if (options.client && entry.client !== options.client) {
687
+ return false;
688
+ }
689
+ return true;
690
+ };
691
+ var createMemoryUsageTrackingDriver = (seed = []) => {
692
+ const store = /* @__PURE__ */ new Map();
693
+ for (const entry of seed) {
694
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
695
+ }
696
+ return {
697
+ async migrate() {
698
+ return;
699
+ },
700
+ async append(entry) {
701
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
702
+ },
703
+ async appendMany(entries) {
704
+ for (const entry of entries) {
705
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
706
+ }
707
+ },
708
+ async list(options = {}) {
709
+ const entries = [...store.values()].filter((entry) => matchesFilters2(entry, options)).sort((a, b) => b.timestamp - a.timestamp);
710
+ if (typeof options.limit === "number") {
711
+ return entries.slice(0, options.limit);
712
+ }
713
+ return entries;
714
+ },
715
+ async count(options = {}) {
716
+ return (await this.list(options)).length;
717
+ },
718
+ async deleteOlderThan(timestamp) {
719
+ let deleted = 0;
720
+ for (const [id, entry] of store.entries()) {
721
+ if (entry.timestamp < timestamp) {
722
+ store.delete(id);
723
+ deleted += 1;
724
+ }
725
+ }
726
+ return deleted;
727
+ },
728
+ async clear() {
729
+ store.clear();
730
+ }
731
+ };
732
+ };
733
+ var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
303
734
  var getCashuTokenBalance = (token) => {
304
735
  try {
305
736
  const decoded = getDecodedToken(token);
@@ -328,12 +759,11 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
328
759
  routstr21Models: [],
329
760
  lastRoutstr21ModelsUpdate: null,
330
761
  cachedReceiveTokens: [],
331
- usageTracking: [],
332
762
  clientIds: [],
333
763
  setModelsFromAllProviders: (value) => {
334
764
  const normalized = {};
335
765
  for (const [baseUrl, models] of Object.entries(value)) {
336
- normalized[normalizeBaseUrl(baseUrl)] = models;
766
+ normalized[normalizeBaseUrl4(baseUrl)] = models;
337
767
  }
338
768
  void driver.setItem(
339
769
  SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
@@ -346,7 +776,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
346
776
  set({ lastUsedModel: value });
347
777
  },
348
778
  setBaseUrlsList: (value) => {
349
- const normalized = value.map((url) => normalizeBaseUrl(url));
779
+ const normalized = value.map((url) => normalizeBaseUrl4(url));
350
780
  void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
351
781
  set({ baseUrlsList: normalized });
352
782
  },
@@ -355,14 +785,14 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
355
785
  set({ lastBaseUrlsUpdate: value });
356
786
  },
357
787
  setDisabledProviders: (value) => {
358
- const normalized = value.map((url) => normalizeBaseUrl(url));
788
+ const normalized = value.map((url) => normalizeBaseUrl4(url));
359
789
  void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
360
790
  set({ disabledProviders: normalized });
361
791
  },
362
792
  setMintsFromAllProviders: (value) => {
363
793
  const normalized = {};
364
794
  for (const [baseUrl, mints] of Object.entries(value)) {
365
- normalized[normalizeBaseUrl(baseUrl)] = mints.map(
795
+ normalized[normalizeBaseUrl4(baseUrl)] = mints.map(
366
796
  (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
367
797
  );
368
798
  }
@@ -375,7 +805,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
375
805
  setInfoFromAllProviders: (value) => {
376
806
  const normalized = {};
377
807
  for (const [baseUrl, info] of Object.entries(value)) {
378
- normalized[normalizeBaseUrl(baseUrl)] = info;
808
+ normalized[normalizeBaseUrl4(baseUrl)] = info;
379
809
  }
380
810
  void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
381
811
  set({ infoFromAllProviders: normalized });
@@ -383,7 +813,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
383
813
  setLastModelsUpdate: (value) => {
384
814
  const normalized = {};
385
815
  for (const [baseUrl, timestamp] of Object.entries(value)) {
386
- normalized[normalizeBaseUrl(baseUrl)] = timestamp;
816
+ normalized[normalizeBaseUrl4(baseUrl)] = timestamp;
387
817
  }
388
818
  void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
389
819
  set({ lastModelsUpdate: normalized });
@@ -393,7 +823,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
393
823
  const updates = typeof value === "function" ? value(state.cachedTokens) : value;
394
824
  const normalized = updates.map((entry) => ({
395
825
  ...entry,
396
- baseUrl: normalizeBaseUrl(entry.baseUrl),
826
+ baseUrl: normalizeBaseUrl4(entry.baseUrl),
397
827
  balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
398
828
  lastUsed: entry.lastUsed ?? null
399
829
  }));
@@ -406,7 +836,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
406
836
  const updates = typeof value === "function" ? value(state.apiKeys) : value;
407
837
  const normalized = updates.map((entry) => ({
408
838
  ...entry,
409
- baseUrl: normalizeBaseUrl(entry.baseUrl),
839
+ baseUrl: normalizeBaseUrl4(entry.baseUrl),
410
840
  balance: entry.balance ?? 0,
411
841
  lastUsed: entry.lastUsed ?? null
412
842
  }));
@@ -418,7 +848,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
418
848
  set((state) => {
419
849
  const updates = typeof value === "function" ? value(state.childKeys) : value;
420
850
  const normalized = updates.map((entry) => ({
421
- parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
851
+ parentBaseUrl: normalizeBaseUrl4(entry.parentBaseUrl),
422
852
  childKey: entry.childKey,
423
853
  balance: entry.balance ?? 0,
424
854
  balanceLimit: entry.balanceLimit,
@@ -447,10 +877,6 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
447
877
  void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
448
878
  set({ cachedReceiveTokens: normalized });
449
879
  },
450
- setUsageTracking: (value) => {
451
- void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
452
- set({ usageTracking: value });
453
- },
454
880
  setClientIds: (value) => {
455
881
  set((state) => {
456
882
  const updates = typeof value === "function" ? value(state.clientIds) : value;
@@ -480,7 +906,6 @@ var hydrateStoreFromDriver = async (store, driver) => {
480
906
  rawRoutstr21Models,
481
907
  rawLastRoutstr21ModelsUpdate,
482
908
  rawCachedReceiveTokens,
483
- rawUsageTracking,
484
909
  rawClientIds
485
910
  ] = await Promise.all([
486
911
  driver.getItem(
@@ -512,51 +937,50 @@ var hydrateStoreFromDriver = async (store, driver) => {
512
937
  null
513
938
  ),
514
939
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
515
- driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, []),
516
940
  driver.getItem(SDK_STORAGE_KEYS.CLIENT_IDS, [])
517
941
  ]);
518
942
  const modelsFromAllProviders = Object.fromEntries(
519
943
  Object.entries(rawModels).map(([baseUrl, models]) => [
520
- normalizeBaseUrl(baseUrl),
944
+ normalizeBaseUrl4(baseUrl),
521
945
  models
522
946
  ])
523
947
  );
524
- const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));
948
+ const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl4(url));
525
949
  const disabledProviders = rawDisabledProviders.map(
526
- (url) => normalizeBaseUrl(url)
950
+ (url) => normalizeBaseUrl4(url)
527
951
  );
528
952
  const mintsFromAllProviders = Object.fromEntries(
529
953
  Object.entries(rawMints).map(([baseUrl, mints]) => [
530
- normalizeBaseUrl(baseUrl),
954
+ normalizeBaseUrl4(baseUrl),
531
955
  mints.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
532
956
  ])
533
957
  );
534
958
  const infoFromAllProviders = Object.fromEntries(
535
959
  Object.entries(rawInfo).map(([baseUrl, info]) => [
536
- normalizeBaseUrl(baseUrl),
960
+ normalizeBaseUrl4(baseUrl),
537
961
  info
538
962
  ])
539
963
  );
540
964
  const lastModelsUpdate = Object.fromEntries(
541
965
  Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [
542
- normalizeBaseUrl(baseUrl),
966
+ normalizeBaseUrl4(baseUrl),
543
967
  timestamp
544
968
  ])
545
969
  );
546
970
  const cachedTokens = rawCachedTokens.map((entry) => ({
547
971
  ...entry,
548
- baseUrl: normalizeBaseUrl(entry.baseUrl),
972
+ baseUrl: normalizeBaseUrl4(entry.baseUrl),
549
973
  balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
550
974
  lastUsed: entry.lastUsed ?? null
551
975
  }));
552
976
  const apiKeys = rawApiKeys.map((entry) => ({
553
977
  ...entry,
554
- baseUrl: normalizeBaseUrl(entry.baseUrl),
978
+ baseUrl: normalizeBaseUrl4(entry.baseUrl),
555
979
  balance: entry.balance ?? 0,
556
980
  lastUsed: entry.lastUsed ?? null
557
981
  }));
558
982
  const childKeys = rawChildKeys.map((entry) => ({
559
- parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
983
+ parentBaseUrl: normalizeBaseUrl4(entry.parentBaseUrl),
560
984
  childKey: entry.childKey,
561
985
  balance: entry.balance ?? 0,
562
986
  balanceLimit: entry.balanceLimit,
@@ -571,7 +995,6 @@ var hydrateStoreFromDriver = async (store, driver) => {
571
995
  unit: entry.unit || "sat",
572
996
  createdAt: entry.createdAt ?? Date.now()
573
997
  }));
574
- const usageTracking = rawUsageTracking;
575
998
  const clientIds = rawClientIds.map((entry) => ({
576
999
  ...entry,
577
1000
  createdAt: entry.createdAt ?? Date.now(),
@@ -592,7 +1015,6 @@ var hydrateStoreFromDriver = async (store, driver) => {
592
1015
  routstr21Models,
593
1016
  lastRoutstr21ModelsUpdate,
594
1017
  cachedReceiveTokens,
595
- usageTracking,
596
1018
  clientIds
597
1019
  });
598
1020
  };
@@ -613,12 +1035,12 @@ var createDiscoveryAdapterFromStore = (store) => ({
613
1035
  getCachedProviderInfo: () => store.getState().infoFromAllProviders,
614
1036
  setCachedProviderInfo: (info) => store.getState().setInfoFromAllProviders(info),
615
1037
  getProviderLastUpdate: (baseUrl) => {
616
- const normalized = normalizeBaseUrl(baseUrl);
1038
+ const normalized = normalizeBaseUrl4(baseUrl);
617
1039
  const timestamps = store.getState().lastModelsUpdate;
618
1040
  return timestamps[normalized] || null;
619
1041
  },
620
1042
  setProviderLastUpdate: (baseUrl, timestamp) => {
621
- const normalized = normalizeBaseUrl(baseUrl);
1043
+ const normalized = normalizeBaseUrl4(baseUrl);
622
1044
  const timestamps = { ...store.getState().lastModelsUpdate };
623
1045
  timestamps[normalized] = timestamp;
624
1046
  store.getState().setLastModelsUpdate(timestamps);
@@ -637,7 +1059,7 @@ var createDiscoveryAdapterFromStore = (store) => ({
637
1059
  });
638
1060
  var createStorageAdapterFromStore = (store) => ({
639
1061
  getToken: (baseUrl) => {
640
- const normalized = normalizeBaseUrl(baseUrl);
1062
+ const normalized = normalizeBaseUrl4(baseUrl);
641
1063
  const entry = store.getState().cachedTokens.find((token) => token.baseUrl === normalized);
642
1064
  if (!entry) return null;
643
1065
  const next = store.getState().cachedTokens.map(
@@ -647,7 +1069,7 @@ var createStorageAdapterFromStore = (store) => ({
647
1069
  return entry.token;
648
1070
  },
649
1071
  setToken: (baseUrl, token) => {
650
- const normalized = normalizeBaseUrl(baseUrl);
1072
+ const normalized = normalizeBaseUrl4(baseUrl);
651
1073
  const tokens = store.getState().cachedTokens;
652
1074
  const balance = getCashuTokenBalance(token);
653
1075
  const existingIndex = tokens.findIndex(
@@ -666,12 +1088,12 @@ var createStorageAdapterFromStore = (store) => ({
666
1088
  store.getState().setCachedTokens(next);
667
1089
  },
668
1090
  removeToken: (baseUrl) => {
669
- const normalized = normalizeBaseUrl(baseUrl);
1091
+ const normalized = normalizeBaseUrl4(baseUrl);
670
1092
  const next = store.getState().cachedTokens.filter((entry) => entry.baseUrl !== normalized);
671
1093
  store.getState().setCachedTokens(next);
672
1094
  },
673
1095
  updateTokenBalance: (baseUrl, balance) => {
674
- const normalized = normalizeBaseUrl(baseUrl);
1096
+ const normalized = normalizeBaseUrl4(baseUrl);
675
1097
  const tokens = store.getState().cachedTokens;
676
1098
  const next = tokens.map(
677
1099
  (entry) => entry.baseUrl === normalized ? { ...entry, balance } : entry
@@ -701,18 +1123,18 @@ var createStorageAdapterFromStore = (store) => ({
701
1123
  return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
702
1124
  },
703
1125
  saveProviderInfo: (baseUrl, info) => {
704
- const normalized = normalizeBaseUrl(baseUrl);
1126
+ const normalized = normalizeBaseUrl4(baseUrl);
705
1127
  const next = { ...store.getState().infoFromAllProviders };
706
1128
  next[normalized] = info;
707
1129
  store.getState().setInfoFromAllProviders(next);
708
1130
  },
709
1131
  getProviderInfo: (baseUrl) => {
710
- const normalized = normalizeBaseUrl(baseUrl);
1132
+ const normalized = normalizeBaseUrl4(baseUrl);
711
1133
  return store.getState().infoFromAllProviders[normalized] || null;
712
1134
  },
713
1135
  // ========== API Keys (for apikeys mode) ==========
714
1136
  getApiKey: (baseUrl) => {
715
- const normalized = normalizeBaseUrl(baseUrl);
1137
+ const normalized = normalizeBaseUrl4(baseUrl);
716
1138
  const entry = store.getState().apiKeys.find((key) => key.baseUrl === normalized);
717
1139
  if (!entry) return null;
718
1140
  const next = store.getState().apiKeys.map(
@@ -722,7 +1144,7 @@ var createStorageAdapterFromStore = (store) => ({
722
1144
  return entry;
723
1145
  },
724
1146
  setApiKey: (baseUrl, key) => {
725
- const normalized = normalizeBaseUrl(baseUrl);
1147
+ const normalized = normalizeBaseUrl4(baseUrl);
726
1148
  const keys = store.getState().apiKeys;
727
1149
  const existingIndex = keys.findIndex(
728
1150
  (entry) => entry.baseUrl === normalized
@@ -740,7 +1162,7 @@ var createStorageAdapterFromStore = (store) => ({
740
1162
  store.getState().setApiKeys(next);
741
1163
  },
742
1164
  updateApiKeyBalance: (baseUrl, balance) => {
743
- const normalized = normalizeBaseUrl(baseUrl);
1165
+ const normalized = normalizeBaseUrl4(baseUrl);
744
1166
  const keys = store.getState().apiKeys;
745
1167
  const next = keys.map(
746
1168
  (entry) => entry.baseUrl === normalized ? { ...entry, balance } : entry
@@ -748,7 +1170,7 @@ var createStorageAdapterFromStore = (store) => ({
748
1170
  store.getState().setApiKeys(next);
749
1171
  },
750
1172
  removeApiKey: (baseUrl) => {
751
- const normalized = normalizeBaseUrl(baseUrl);
1173
+ const normalized = normalizeBaseUrl4(baseUrl);
752
1174
  const next = store.getState().apiKeys.filter((entry) => entry.baseUrl !== normalized);
753
1175
  store.getState().setApiKeys(next);
754
1176
  },
@@ -762,7 +1184,7 @@ var createStorageAdapterFromStore = (store) => ({
762
1184
  },
763
1185
  // ========== Child Keys ==========
764
1186
  getChildKey: (parentBaseUrl) => {
765
- const normalized = normalizeBaseUrl(parentBaseUrl);
1187
+ const normalized = normalizeBaseUrl4(parentBaseUrl);
766
1188
  const entry = store.getState().childKeys.find((key) => key.parentBaseUrl === normalized);
767
1189
  if (!entry) return null;
768
1190
  return {
@@ -775,7 +1197,7 @@ var createStorageAdapterFromStore = (store) => ({
775
1197
  };
776
1198
  },
777
1199
  setChildKey: (parentBaseUrl, childKey, balance, validityDate, balanceLimit) => {
778
- const normalized = normalizeBaseUrl(parentBaseUrl);
1200
+ const normalized = normalizeBaseUrl4(parentBaseUrl);
779
1201
  const keys = store.getState().childKeys;
780
1202
  const existingIndex = keys.findIndex(
781
1203
  (entry) => entry.parentBaseUrl === normalized
@@ -806,7 +1228,7 @@ var createStorageAdapterFromStore = (store) => ({
806
1228
  }
807
1229
  },
808
1230
  updateChildKeyBalance: (parentBaseUrl, balance) => {
809
- const normalized = normalizeBaseUrl(parentBaseUrl);
1231
+ const normalized = normalizeBaseUrl4(parentBaseUrl);
810
1232
  const keys = store.getState().childKeys;
811
1233
  const next = keys.map(
812
1234
  (entry) => entry.parentBaseUrl === normalized ? { ...entry, balance } : entry
@@ -814,7 +1236,7 @@ var createStorageAdapterFromStore = (store) => ({
814
1236
  store.getState().setChildKeys(next);
815
1237
  },
816
1238
  removeChildKey: (parentBaseUrl) => {
817
- const normalized = normalizeBaseUrl(parentBaseUrl);
1239
+ const normalized = normalizeBaseUrl4(parentBaseUrl);
818
1240
  const next = store.getState().childKeys.filter((entry) => entry.parentBaseUrl !== normalized);
819
1241
  store.getState().setChildKeys(next);
820
1242
  },
@@ -837,16 +1259,16 @@ var createStorageAdapterFromStore = (store) => ({
837
1259
  });
838
1260
  var createProviderRegistryFromStore = (store) => ({
839
1261
  getModelsForProvider: (baseUrl) => {
840
- const normalized = normalizeBaseUrl(baseUrl);
1262
+ const normalized = normalizeBaseUrl4(baseUrl);
841
1263
  return store.getState().modelsFromAllProviders[normalized] || [];
842
1264
  },
843
1265
  getDisabledProviders: () => store.getState().disabledProviders,
844
1266
  getProviderMints: (baseUrl) => {
845
- const normalized = normalizeBaseUrl(baseUrl);
1267
+ const normalized = normalizeBaseUrl4(baseUrl);
846
1268
  return store.getState().mintsFromAllProviders[normalized] || [];
847
1269
  },
848
1270
  getProviderInfo: async (baseUrl) => {
849
- const normalized = normalizeBaseUrl(baseUrl);
1271
+ const normalized = normalizeBaseUrl4(baseUrl);
850
1272
  const cached = store.getState().infoFromAllProviders[normalized];
851
1273
  if (cached) return cached;
852
1274
  try {
@@ -868,7 +1290,7 @@ var createProviderRegistryFromStore = (store) => ({
868
1290
  });
869
1291
 
870
1292
  // storage/index.ts
871
- var isBrowser2 = () => {
1293
+ var isBrowser3 = () => {
872
1294
  try {
873
1295
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
874
1296
  } catch {
@@ -883,16 +1305,16 @@ var isNode = () => {
883
1305
  }
884
1306
  };
885
1307
  var defaultDriver = null;
886
- var isBun2 = () => {
1308
+ var isBun3 = () => {
887
1309
  return typeof process.versions.bun !== "undefined";
888
1310
  };
889
1311
  var getDefaultSdkDriver = () => {
890
1312
  if (defaultDriver) return defaultDriver;
891
- if (isBrowser2()) {
1313
+ if (isBrowser3()) {
892
1314
  defaultDriver = localStorageDriver;
893
1315
  return defaultDriver;
894
1316
  }
895
- if (isBun2()) {
1317
+ if (isBun3()) {
896
1318
  defaultDriver = createMemoryDriver();
897
1319
  return defaultDriver;
898
1320
  }
@@ -904,16 +1326,39 @@ var getDefaultSdkDriver = () => {
904
1326
  return defaultDriver;
905
1327
  };
906
1328
  var defaultStore = null;
1329
+ var defaultUsageTrackingDriver = null;
907
1330
  var getDefaultSdkStore = () => {
908
1331
  if (!defaultStore) {
909
1332
  defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });
910
1333
  }
911
1334
  return defaultStore.hydrate.then(() => defaultStore.store);
912
1335
  };
1336
+ var getDefaultUsageTrackingDriver = () => {
1337
+ if (defaultUsageTrackingDriver) return defaultUsageTrackingDriver;
1338
+ const storageDriver = getDefaultSdkDriver();
1339
+ if (isBrowser3()) {
1340
+ defaultUsageTrackingDriver = createIndexedDBUsageTrackingDriver({
1341
+ legacyStorageDriver: storageDriver
1342
+ });
1343
+ return defaultUsageTrackingDriver;
1344
+ }
1345
+ if (isBun3()) {
1346
+ defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
1347
+ return defaultUsageTrackingDriver;
1348
+ }
1349
+ if (isNode()) {
1350
+ defaultUsageTrackingDriver = createSqliteUsageTrackingDriver({
1351
+ legacyStorageDriver: storageDriver
1352
+ });
1353
+ return defaultUsageTrackingDriver;
1354
+ }
1355
+ defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
1356
+ return defaultUsageTrackingDriver;
1357
+ };
913
1358
  var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
914
1359
  var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());
915
1360
  var getDefaultProviderRegistry = async () => createProviderRegistryFromStore(await getDefaultSdkStore());
916
1361
 
917
- export { SDK_STORAGE_KEYS, createDiscoveryAdapterFromStore, createIndexedDBDriver, createMemoryDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, localStorageDriver };
1362
+ export { SDK_STORAGE_KEYS, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver };
918
1363
  //# sourceMappingURL=index.mjs.map
919
1364
  //# sourceMappingURL=index.mjs.map