@routstr/sdk 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 = () => {
@@ -290,7 +294,8 @@ var SDK_STORAGE_KEYS = {
290
294
  ROUTSTR21_MODELS: "routstr21Models",
291
295
  LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
292
296
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
293
- USAGE_TRACKING: "usage_tracking"
297
+ USAGE_TRACKING: "usage_tracking",
298
+ CLIENT_IDS: "client_ids"
294
299
  };
295
300
 
296
301
  // storage/store.ts
@@ -308,9 +313,159 @@ var getCashuTokenBalance = (token) => {
308
313
  return 0;
309
314
  }
310
315
  };
311
- var createSdkStore = async ({
312
- driver
313
- }) => {
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) => {
314
469
  const [
315
470
  rawModels,
316
471
  lastUsedModel,
@@ -326,7 +481,8 @@ var createSdkStore = async ({
326
481
  rawRoutstr21Models,
327
482
  rawLastRoutstr21ModelsUpdate,
328
483
  rawCachedReceiveTokens,
329
- rawUsageTracking
484
+ rawUsageTracking,
485
+ rawClientIds
330
486
  ] = await Promise.all([
331
487
  driver.getItem(
332
488
  SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
@@ -357,7 +513,8 @@ var createSdkStore = async ({
357
513
  null
358
514
  ),
359
515
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
360
- driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, [])
516
+ driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, []),
517
+ driver.getItem(SDK_STORAGE_KEYS.CLIENT_IDS, [])
361
518
  ]);
362
519
  const modelsFromAllProviders = Object.fromEntries(
363
520
  Object.entries(rawModels).map(([baseUrl, models]) => [
@@ -416,7 +573,13 @@ var createSdkStore = async ({
416
573
  createdAt: entry.createdAt ?? Date.now()
417
574
  }));
418
575
  const usageTracking = rawUsageTracking;
419
- return createStore((set, get) => ({
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({
420
583
  modelsFromAllProviders,
421
584
  lastUsedModel,
422
585
  baseUrlsList,
@@ -432,128 +595,17 @@ var createSdkStore = async ({
432
595
  lastRoutstr21ModelsUpdate,
433
596
  cachedReceiveTokens,
434
597
  usageTracking,
435
- setModelsFromAllProviders: (value) => {
436
- const normalized = {};
437
- for (const [baseUrl, models] of Object.entries(value)) {
438
- normalized[normalizeBaseUrl(baseUrl)] = models;
439
- }
440
- void driver.setItem(
441
- SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
442
- normalized
443
- );
444
- set({ modelsFromAllProviders: normalized });
445
- },
446
- setLastUsedModel: (value) => {
447
- void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
448
- set({ lastUsedModel: value });
449
- },
450
- setBaseUrlsList: (value) => {
451
- const normalized = value.map((url) => normalizeBaseUrl(url));
452
- void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
453
- set({ baseUrlsList: normalized });
454
- },
455
- setBaseUrlsLastUpdate: (value) => {
456
- void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
457
- set({ lastBaseUrlsUpdate: value });
458
- },
459
- setDisabledProviders: (value) => {
460
- const normalized = value.map((url) => normalizeBaseUrl(url));
461
- void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
462
- set({ disabledProviders: normalized });
463
- },
464
- setMintsFromAllProviders: (value) => {
465
- const normalized = {};
466
- for (const [baseUrl, mints] of Object.entries(value)) {
467
- normalized[normalizeBaseUrl(baseUrl)] = mints.map(
468
- (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
469
- );
470
- }
471
- void driver.setItem(
472
- SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
473
- normalized
474
- );
475
- set({ mintsFromAllProviders: normalized });
476
- },
477
- setInfoFromAllProviders: (value) => {
478
- const normalized = {};
479
- for (const [baseUrl, info] of Object.entries(value)) {
480
- normalized[normalizeBaseUrl(baseUrl)] = info;
481
- }
482
- void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
483
- set({ infoFromAllProviders: normalized });
484
- },
485
- setLastModelsUpdate: (value) => {
486
- const normalized = {};
487
- for (const [baseUrl, timestamp] of Object.entries(value)) {
488
- normalized[normalizeBaseUrl(baseUrl)] = timestamp;
489
- }
490
- void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
491
- set({ lastModelsUpdate: normalized });
492
- },
493
- setCachedTokens: (value) => {
494
- set((state) => {
495
- const updates = typeof value === "function" ? value(state.cachedTokens) : value;
496
- const normalized = updates.map((entry) => ({
497
- ...entry,
498
- baseUrl: normalizeBaseUrl(entry.baseUrl),
499
- balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
500
- lastUsed: entry.lastUsed ?? null
501
- }));
502
- void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
503
- return { cachedTokens: normalized };
504
- });
505
- },
506
- setApiKeys: (value) => {
507
- set((state) => {
508
- const updates = typeof value === "function" ? value(state.apiKeys) : value;
509
- const normalized = updates.map((entry) => ({
510
- ...entry,
511
- baseUrl: normalizeBaseUrl(entry.baseUrl),
512
- balance: entry.balance ?? 0,
513
- lastUsed: entry.lastUsed ?? null
514
- }));
515
- void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
516
- return { apiKeys: normalized };
517
- });
518
- },
519
- setChildKeys: (value) => {
520
- set((state) => {
521
- const updates = typeof value === "function" ? value(state.childKeys) : value;
522
- const normalized = updates.map((entry) => ({
523
- parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
524
- childKey: entry.childKey,
525
- balance: entry.balance ?? 0,
526
- balanceLimit: entry.balanceLimit,
527
- validityDate: entry.validityDate,
528
- createdAt: entry.createdAt ?? Date.now()
529
- }));
530
- void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
531
- return { childKeys: normalized };
532
- });
533
- },
534
- setRoutstr21Models: (value) => {
535
- void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
536
- set({ routstr21Models: value });
537
- },
538
- setRoutstr21ModelsLastUpdate: (value) => {
539
- void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
540
- set({ lastRoutstr21ModelsUpdate: value });
541
- },
542
- setCachedReceiveTokens: (value) => {
543
- const normalized = value.map((entry) => ({
544
- token: entry.token,
545
- amount: entry.amount,
546
- unit: entry.unit || "sat",
547
- createdAt: entry.createdAt ?? Date.now()
548
- }));
549
- void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
550
- set({ cachedReceiveTokens: normalized });
551
- },
552
- setUsageTracking: (value) => {
553
- void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
554
- set({ usageTracking: value });
555
- }
556
- }));
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
+ };
557
609
  };
558
610
  var createDiscoveryAdapterFromStore = (store) => ({
559
611
  getCachedModels: () => store.getState().modelsFromAllProviders,
@@ -818,7 +870,7 @@ var createProviderRegistryFromStore = (store) => ({
818
870
  });
819
871
 
820
872
  // storage/index.ts
821
- var isBrowser = () => {
873
+ var isBrowser2 = () => {
822
874
  try {
823
875
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
824
876
  } catch {
@@ -838,7 +890,7 @@ var isBun2 = () => {
838
890
  };
839
891
  var getDefaultSdkDriver = () => {
840
892
  if (defaultDriver) return defaultDriver;
841
- if (isBrowser()) {
893
+ if (isBrowser2()) {
842
894
  defaultDriver = localStorageDriver;
843
895
  return defaultDriver;
844
896
  }
@@ -853,12 +905,12 @@ var getDefaultSdkDriver = () => {
853
905
  defaultDriver = createMemoryDriver();
854
906
  return defaultDriver;
855
907
  };
856
- var defaultStorePromise = null;
908
+ var defaultStore = null;
857
909
  var getDefaultSdkStore = () => {
858
- if (!defaultStorePromise) {
859
- defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });
910
+ if (!defaultStore) {
911
+ defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });
860
912
  }
861
- return defaultStorePromise;
913
+ return defaultStore.hydrate.then(() => defaultStore.store);
862
914
  };
863
915
  var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
864
916
  var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());