@routstr/sdk 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -185,7 +185,11 @@ var createSqliteDriver = (options = {}) => {
185
185
  };
186
186
 
187
187
  // storage/drivers/indexedDB.ts
188
+ var isBrowser = typeof indexedDB !== "undefined";
188
189
  var openDatabase = (dbName, storeName) => {
190
+ if (!isBrowser) {
191
+ return Promise.reject(new Error("IndexedDB is not available"));
192
+ }
189
193
  return new Promise((resolve, reject) => {
190
194
  const request = indexedDB.open(dbName, 1);
191
195
  request.onupgradeneeded = () => {
@@ -289,7 +293,9 @@ var SDK_STORAGE_KEYS = {
289
293
  CHILD_KEYS: "child_keys",
290
294
  ROUTSTR21_MODELS: "routstr21Models",
291
295
  LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
292
- CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
296
+ CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
297
+ USAGE_TRACKING: "usage_tracking",
298
+ CLIENT_IDS: "client_ids"
293
299
  };
294
300
 
295
301
  // storage/store.ts
@@ -307,9 +313,159 @@ var getCashuTokenBalance = (token) => {
307
313
  return 0;
308
314
  }
309
315
  };
310
- var createSdkStore = async ({
311
- driver
312
- }) => {
316
+ var createEmptyStore = (driver) => createStore((set, get) => ({
317
+ modelsFromAllProviders: {},
318
+ lastUsedModel: null,
319
+ baseUrlsList: [],
320
+ lastBaseUrlsUpdate: null,
321
+ disabledProviders: [],
322
+ mintsFromAllProviders: {},
323
+ infoFromAllProviders: {},
324
+ lastModelsUpdate: {},
325
+ cachedTokens: [],
326
+ apiKeys: [],
327
+ childKeys: [],
328
+ routstr21Models: [],
329
+ lastRoutstr21ModelsUpdate: null,
330
+ cachedReceiveTokens: [],
331
+ usageTracking: [],
332
+ clientIds: [],
333
+ setModelsFromAllProviders: (value) => {
334
+ const normalized = {};
335
+ for (const [baseUrl, models] of Object.entries(value)) {
336
+ normalized[normalizeBaseUrl(baseUrl)] = models;
337
+ }
338
+ void driver.setItem(
339
+ SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
340
+ normalized
341
+ );
342
+ set({ modelsFromAllProviders: normalized });
343
+ },
344
+ setLastUsedModel: (value) => {
345
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
346
+ set({ lastUsedModel: value });
347
+ },
348
+ setBaseUrlsList: (value) => {
349
+ const normalized = value.map((url) => normalizeBaseUrl(url));
350
+ void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
351
+ set({ baseUrlsList: normalized });
352
+ },
353
+ setBaseUrlsLastUpdate: (value) => {
354
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
355
+ set({ lastBaseUrlsUpdate: value });
356
+ },
357
+ setDisabledProviders: (value) => {
358
+ const normalized = value.map((url) => normalizeBaseUrl(url));
359
+ void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
360
+ set({ disabledProviders: normalized });
361
+ },
362
+ setMintsFromAllProviders: (value) => {
363
+ const normalized = {};
364
+ for (const [baseUrl, mints] of Object.entries(value)) {
365
+ normalized[normalizeBaseUrl(baseUrl)] = mints.map(
366
+ (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
367
+ );
368
+ }
369
+ void driver.setItem(
370
+ SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
371
+ normalized
372
+ );
373
+ set({ mintsFromAllProviders: normalized });
374
+ },
375
+ setInfoFromAllProviders: (value) => {
376
+ const normalized = {};
377
+ for (const [baseUrl, info] of Object.entries(value)) {
378
+ normalized[normalizeBaseUrl(baseUrl)] = info;
379
+ }
380
+ void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
381
+ set({ infoFromAllProviders: normalized });
382
+ },
383
+ setLastModelsUpdate: (value) => {
384
+ const normalized = {};
385
+ for (const [baseUrl, timestamp] of Object.entries(value)) {
386
+ normalized[normalizeBaseUrl(baseUrl)] = timestamp;
387
+ }
388
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
389
+ set({ lastModelsUpdate: normalized });
390
+ },
391
+ setCachedTokens: (value) => {
392
+ set((state) => {
393
+ const updates = typeof value === "function" ? value(state.cachedTokens) : value;
394
+ const normalized = updates.map((entry) => ({
395
+ ...entry,
396
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
397
+ balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
398
+ lastUsed: entry.lastUsed ?? null
399
+ }));
400
+ void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
401
+ return { cachedTokens: normalized };
402
+ });
403
+ },
404
+ setApiKeys: (value) => {
405
+ set((state) => {
406
+ const updates = typeof value === "function" ? value(state.apiKeys) : value;
407
+ const normalized = updates.map((entry) => ({
408
+ ...entry,
409
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
410
+ balance: entry.balance ?? 0,
411
+ lastUsed: entry.lastUsed ?? null
412
+ }));
413
+ void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
414
+ return { apiKeys: normalized };
415
+ });
416
+ },
417
+ setChildKeys: (value) => {
418
+ set((state) => {
419
+ const updates = typeof value === "function" ? value(state.childKeys) : value;
420
+ const normalized = updates.map((entry) => ({
421
+ parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
422
+ childKey: entry.childKey,
423
+ balance: entry.balance ?? 0,
424
+ balanceLimit: entry.balanceLimit,
425
+ validityDate: entry.validityDate,
426
+ createdAt: entry.createdAt ?? Date.now()
427
+ }));
428
+ void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
429
+ return { childKeys: normalized };
430
+ });
431
+ },
432
+ setRoutstr21Models: (value) => {
433
+ void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
434
+ set({ routstr21Models: value });
435
+ },
436
+ setRoutstr21ModelsLastUpdate: (value) => {
437
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
438
+ set({ lastRoutstr21ModelsUpdate: value });
439
+ },
440
+ setCachedReceiveTokens: (value) => {
441
+ const normalized = value.map((entry) => ({
442
+ token: entry.token,
443
+ amount: entry.amount,
444
+ unit: entry.unit || "sat",
445
+ createdAt: entry.createdAt ?? Date.now()
446
+ }));
447
+ void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
448
+ set({ cachedReceiveTokens: normalized });
449
+ },
450
+ setUsageTracking: (value) => {
451
+ void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
452
+ set({ usageTracking: value });
453
+ },
454
+ setClientIds: (value) => {
455
+ set((state) => {
456
+ const updates = typeof value === "function" ? value(state.clientIds) : value;
457
+ const normalized = updates.map((entry) => ({
458
+ ...entry,
459
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
460
+ createdAt: entry.createdAt ?? Date.now(),
461
+ lastUsed: entry.lastUsed ?? null
462
+ }));
463
+ void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);
464
+ return { clientIds: normalized };
465
+ });
466
+ }
467
+ }));
468
+ var hydrateStoreFromDriver = async (store, driver) => {
313
469
  const [
314
470
  rawModels,
315
471
  lastUsedModel,
@@ -324,7 +480,9 @@ var createSdkStore = async ({
324
480
  rawChildKeys,
325
481
  rawRoutstr21Models,
326
482
  rawLastRoutstr21ModelsUpdate,
327
- rawCachedReceiveTokens
483
+ rawCachedReceiveTokens,
484
+ rawUsageTracking,
485
+ rawClientIds
328
486
  ] = await Promise.all([
329
487
  driver.getItem(
330
488
  SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
@@ -354,7 +512,9 @@ var createSdkStore = async ({
354
512
  SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
355
513
  null
356
514
  ),
357
- driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
515
+ driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
516
+ driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, []),
517
+ driver.getItem(SDK_STORAGE_KEYS.CLIENT_IDS, [])
358
518
  ]);
359
519
  const modelsFromAllProviders = Object.fromEntries(
360
520
  Object.entries(rawModels).map(([baseUrl, models]) => [
@@ -412,7 +572,14 @@ var createSdkStore = async ({
412
572
  unit: entry.unit || "sat",
413
573
  createdAt: entry.createdAt ?? Date.now()
414
574
  }));
415
- return createStore((set, get) => ({
575
+ const usageTracking = rawUsageTracking;
576
+ const clientIds = rawClientIds.map((entry) => ({
577
+ ...entry,
578
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
579
+ createdAt: entry.createdAt ?? Date.now(),
580
+ lastUsed: entry.lastUsed ?? null
581
+ }));
582
+ store.setState({
416
583
  modelsFromAllProviders,
417
584
  lastUsedModel,
418
585
  baseUrlsList,
@@ -427,124 +594,18 @@ var createSdkStore = async ({
427
594
  routstr21Models,
428
595
  lastRoutstr21ModelsUpdate,
429
596
  cachedReceiveTokens,
430
- setModelsFromAllProviders: (value) => {
431
- const normalized = {};
432
- for (const [baseUrl, models] of Object.entries(value)) {
433
- normalized[normalizeBaseUrl(baseUrl)] = models;
434
- }
435
- void driver.setItem(
436
- SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
437
- normalized
438
- );
439
- set({ modelsFromAllProviders: normalized });
440
- },
441
- setLastUsedModel: (value) => {
442
- void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
443
- set({ lastUsedModel: value });
444
- },
445
- setBaseUrlsList: (value) => {
446
- const normalized = value.map((url) => normalizeBaseUrl(url));
447
- void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
448
- set({ baseUrlsList: normalized });
449
- },
450
- setBaseUrlsLastUpdate: (value) => {
451
- void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
452
- set({ lastBaseUrlsUpdate: value });
453
- },
454
- setDisabledProviders: (value) => {
455
- const normalized = value.map((url) => normalizeBaseUrl(url));
456
- void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
457
- set({ disabledProviders: normalized });
458
- },
459
- setMintsFromAllProviders: (value) => {
460
- const normalized = {};
461
- for (const [baseUrl, mints] of Object.entries(value)) {
462
- normalized[normalizeBaseUrl(baseUrl)] = mints.map(
463
- (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
464
- );
465
- }
466
- void driver.setItem(
467
- SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
468
- normalized
469
- );
470
- set({ mintsFromAllProviders: normalized });
471
- },
472
- setInfoFromAllProviders: (value) => {
473
- const normalized = {};
474
- for (const [baseUrl, info] of Object.entries(value)) {
475
- normalized[normalizeBaseUrl(baseUrl)] = info;
476
- }
477
- void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
478
- set({ infoFromAllProviders: normalized });
479
- },
480
- setLastModelsUpdate: (value) => {
481
- const normalized = {};
482
- for (const [baseUrl, timestamp] of Object.entries(value)) {
483
- normalized[normalizeBaseUrl(baseUrl)] = timestamp;
484
- }
485
- void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
486
- set({ lastModelsUpdate: normalized });
487
- },
488
- setCachedTokens: (value) => {
489
- set((state) => {
490
- const updates = typeof value === "function" ? value(state.cachedTokens) : value;
491
- const normalized = updates.map((entry) => ({
492
- ...entry,
493
- baseUrl: normalizeBaseUrl(entry.baseUrl),
494
- balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
495
- lastUsed: entry.lastUsed ?? null
496
- }));
497
- void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
498
- return { cachedTokens: normalized };
499
- });
500
- },
501
- setApiKeys: (value) => {
502
- set((state) => {
503
- const updates = typeof value === "function" ? value(state.apiKeys) : value;
504
- const normalized = updates.map((entry) => ({
505
- ...entry,
506
- baseUrl: normalizeBaseUrl(entry.baseUrl),
507
- balance: entry.balance ?? 0,
508
- lastUsed: entry.lastUsed ?? null
509
- }));
510
- void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
511
- return { apiKeys: normalized };
512
- });
513
- },
514
- setChildKeys: (value) => {
515
- set((state) => {
516
- const updates = typeof value === "function" ? value(state.childKeys) : value;
517
- const normalized = updates.map((entry) => ({
518
- parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
519
- childKey: entry.childKey,
520
- balance: entry.balance ?? 0,
521
- balanceLimit: entry.balanceLimit,
522
- validityDate: entry.validityDate,
523
- createdAt: entry.createdAt ?? Date.now()
524
- }));
525
- void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
526
- return { childKeys: normalized };
527
- });
528
- },
529
- setRoutstr21Models: (value) => {
530
- void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
531
- set({ routstr21Models: value });
532
- },
533
- setRoutstr21ModelsLastUpdate: (value) => {
534
- void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
535
- set({ lastRoutstr21ModelsUpdate: value });
536
- },
537
- setCachedReceiveTokens: (value) => {
538
- const normalized = value.map((entry) => ({
539
- token: entry.token,
540
- amount: entry.amount,
541
- unit: entry.unit || "sat",
542
- createdAt: entry.createdAt ?? Date.now()
543
- }));
544
- void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
545
- set({ cachedReceiveTokens: normalized });
546
- }
547
- }));
597
+ usageTracking,
598
+ clientIds
599
+ });
600
+ };
601
+ var createSdkStore = ({
602
+ driver
603
+ }) => {
604
+ const store = createEmptyStore(driver);
605
+ return {
606
+ store,
607
+ hydrate: hydrateStoreFromDriver(store, driver)
608
+ };
548
609
  };
549
610
  var createDiscoveryAdapterFromStore = (store) => ({
550
611
  getCachedModels: () => store.getState().modelsFromAllProviders,
@@ -809,7 +870,7 @@ var createProviderRegistryFromStore = (store) => ({
809
870
  });
810
871
 
811
872
  // storage/index.ts
812
- var isBrowser = () => {
873
+ var isBrowser2 = () => {
813
874
  try {
814
875
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
815
876
  } catch {
@@ -829,7 +890,7 @@ var isBun2 = () => {
829
890
  };
830
891
  var getDefaultSdkDriver = () => {
831
892
  if (defaultDriver) return defaultDriver;
832
- if (isBrowser()) {
893
+ if (isBrowser2()) {
833
894
  defaultDriver = localStorageDriver;
834
895
  return defaultDriver;
835
896
  }
@@ -844,12 +905,12 @@ var getDefaultSdkDriver = () => {
844
905
  defaultDriver = createMemoryDriver();
845
906
  return defaultDriver;
846
907
  };
847
- var defaultStorePromise = null;
908
+ var defaultStore = null;
848
909
  var getDefaultSdkStore = () => {
849
- if (!defaultStorePromise) {
850
- defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });
910
+ if (!defaultStore) {
911
+ defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });
851
912
  }
852
- return defaultStorePromise;
913
+ return defaultStore.hydrate.then(() => defaultStore.store);
853
914
  };
854
915
  var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
855
916
  var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());