@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.
@@ -60,6 +60,14 @@ interface SdkStorageState {
60
60
  sessionId?: string;
61
61
  tags?: string[];
62
62
  }>;
63
+ clientIds: Array<{
64
+ clientId: string;
65
+ name: string;
66
+ apiKey: string;
67
+ baseUrl: string;
68
+ createdAt: number;
69
+ lastUsed?: number | null;
70
+ }>;
63
71
  }
64
72
 
65
73
  declare const localStorageDriver: StorageDriver;
@@ -133,10 +141,21 @@ interface SdkStorageStore extends SdkStorageState {
133
141
  sessionId?: string;
134
142
  tags?: string[];
135
143
  }>) => void;
144
+ setClientIds: (value: Array<{
145
+ clientId: string;
146
+ name: string;
147
+ apiKey: string;
148
+ baseUrl: string;
149
+ createdAt?: number;
150
+ lastUsed?: number | null;
151
+ }> | ((current: SdkStorageStore["clientIds"]) => SdkStorageStore["clientIds"])) => void;
136
152
  }
137
153
  /** Store type returned after async initialization */
138
154
  type SdkStore = StoreApi<SdkStorageStore>;
139
- declare const createSdkStore: ({ driver, }: SdkStoreOptions) => Promise<SdkStore>;
155
+ declare const createSdkStore: ({ driver, }: SdkStoreOptions) => {
156
+ store: SdkStore;
157
+ hydrate: Promise<void>;
158
+ };
140
159
  declare const createDiscoveryAdapterFromStore: (store: SdkStore) => DiscoveryAdapter;
141
160
  declare const createStorageAdapterFromStore: (store: SdkStore) => StorageAdapter;
142
161
  declare const createProviderRegistryFromStore: (store: SdkStore) => ProviderRegistry;
@@ -157,6 +176,7 @@ declare const SDK_STORAGE_KEYS: {
157
176
  readonly LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate";
158
177
  readonly CACHED_RECEIVE_TOKENS: "cached_receive_tokens";
159
178
  readonly USAGE_TRACKING: "usage_tracking";
179
+ readonly CLIENT_IDS: "client_ids";
160
180
  };
161
181
 
162
182
  declare const getDefaultSdkDriver: () => StorageDriver;
@@ -60,6 +60,14 @@ interface SdkStorageState {
60
60
  sessionId?: string;
61
61
  tags?: string[];
62
62
  }>;
63
+ clientIds: Array<{
64
+ clientId: string;
65
+ name: string;
66
+ apiKey: string;
67
+ baseUrl: string;
68
+ createdAt: number;
69
+ lastUsed?: number | null;
70
+ }>;
63
71
  }
64
72
 
65
73
  declare const localStorageDriver: StorageDriver;
@@ -133,10 +141,21 @@ interface SdkStorageStore extends SdkStorageState {
133
141
  sessionId?: string;
134
142
  tags?: string[];
135
143
  }>) => void;
144
+ setClientIds: (value: Array<{
145
+ clientId: string;
146
+ name: string;
147
+ apiKey: string;
148
+ baseUrl: string;
149
+ createdAt?: number;
150
+ lastUsed?: number | null;
151
+ }> | ((current: SdkStorageStore["clientIds"]) => SdkStorageStore["clientIds"])) => void;
136
152
  }
137
153
  /** Store type returned after async initialization */
138
154
  type SdkStore = StoreApi<SdkStorageStore>;
139
- declare const createSdkStore: ({ driver, }: SdkStoreOptions) => Promise<SdkStore>;
155
+ declare const createSdkStore: ({ driver, }: SdkStoreOptions) => {
156
+ store: SdkStore;
157
+ hydrate: Promise<void>;
158
+ };
140
159
  declare const createDiscoveryAdapterFromStore: (store: SdkStore) => DiscoveryAdapter;
141
160
  declare const createStorageAdapterFromStore: (store: SdkStore) => StorageAdapter;
142
161
  declare const createProviderRegistryFromStore: (store: SdkStore) => ProviderRegistry;
@@ -157,6 +176,7 @@ declare const SDK_STORAGE_KEYS: {
157
176
  readonly LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate";
158
177
  readonly CACHED_RECEIVE_TOKENS: "cached_receive_tokens";
159
178
  readonly USAGE_TRACKING: "usage_tracking";
179
+ readonly CLIENT_IDS: "client_ids";
160
180
  };
161
181
 
162
182
  declare const getDefaultSdkDriver: () => StorageDriver;
@@ -187,7 +187,11 @@ var createSqliteDriver = (options = {}) => {
187
187
  };
188
188
 
189
189
  // storage/drivers/indexedDB.ts
190
+ var isBrowser = typeof indexedDB !== "undefined";
190
191
  var openDatabase = (dbName, storeName) => {
192
+ if (!isBrowser) {
193
+ return Promise.reject(new Error("IndexedDB is not available"));
194
+ }
191
195
  return new Promise((resolve, reject) => {
192
196
  const request = indexedDB.open(dbName, 1);
193
197
  request.onupgradeneeded = () => {
@@ -292,7 +296,8 @@ var SDK_STORAGE_KEYS = {
292
296
  ROUTSTR21_MODELS: "routstr21Models",
293
297
  LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
294
298
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
295
- USAGE_TRACKING: "usage_tracking"
299
+ USAGE_TRACKING: "usage_tracking",
300
+ CLIENT_IDS: "client_ids"
296
301
  };
297
302
 
298
303
  // storage/store.ts
@@ -310,9 +315,159 @@ var getCashuTokenBalance = (token) => {
310
315
  return 0;
311
316
  }
312
317
  };
313
- var createSdkStore = async ({
314
- driver
315
- }) => {
318
+ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
319
+ modelsFromAllProviders: {},
320
+ lastUsedModel: null,
321
+ baseUrlsList: [],
322
+ lastBaseUrlsUpdate: null,
323
+ disabledProviders: [],
324
+ mintsFromAllProviders: {},
325
+ infoFromAllProviders: {},
326
+ lastModelsUpdate: {},
327
+ cachedTokens: [],
328
+ apiKeys: [],
329
+ childKeys: [],
330
+ routstr21Models: [],
331
+ lastRoutstr21ModelsUpdate: null,
332
+ cachedReceiveTokens: [],
333
+ usageTracking: [],
334
+ clientIds: [],
335
+ setModelsFromAllProviders: (value) => {
336
+ const normalized = {};
337
+ for (const [baseUrl, models] of Object.entries(value)) {
338
+ normalized[normalizeBaseUrl(baseUrl)] = models;
339
+ }
340
+ void driver.setItem(
341
+ SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
342
+ normalized
343
+ );
344
+ set({ modelsFromAllProviders: normalized });
345
+ },
346
+ setLastUsedModel: (value) => {
347
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
348
+ set({ lastUsedModel: value });
349
+ },
350
+ setBaseUrlsList: (value) => {
351
+ const normalized = value.map((url) => normalizeBaseUrl(url));
352
+ void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
353
+ set({ baseUrlsList: normalized });
354
+ },
355
+ setBaseUrlsLastUpdate: (value) => {
356
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
357
+ set({ lastBaseUrlsUpdate: value });
358
+ },
359
+ setDisabledProviders: (value) => {
360
+ const normalized = value.map((url) => normalizeBaseUrl(url));
361
+ void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
362
+ set({ disabledProviders: normalized });
363
+ },
364
+ setMintsFromAllProviders: (value) => {
365
+ const normalized = {};
366
+ for (const [baseUrl, mints] of Object.entries(value)) {
367
+ normalized[normalizeBaseUrl(baseUrl)] = mints.map(
368
+ (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
369
+ );
370
+ }
371
+ void driver.setItem(
372
+ SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
373
+ normalized
374
+ );
375
+ set({ mintsFromAllProviders: normalized });
376
+ },
377
+ setInfoFromAllProviders: (value) => {
378
+ const normalized = {};
379
+ for (const [baseUrl, info] of Object.entries(value)) {
380
+ normalized[normalizeBaseUrl(baseUrl)] = info;
381
+ }
382
+ void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
383
+ set({ infoFromAllProviders: normalized });
384
+ },
385
+ setLastModelsUpdate: (value) => {
386
+ const normalized = {};
387
+ for (const [baseUrl, timestamp] of Object.entries(value)) {
388
+ normalized[normalizeBaseUrl(baseUrl)] = timestamp;
389
+ }
390
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
391
+ set({ lastModelsUpdate: normalized });
392
+ },
393
+ setCachedTokens: (value) => {
394
+ set((state) => {
395
+ const updates = typeof value === "function" ? value(state.cachedTokens) : value;
396
+ const normalized = updates.map((entry) => ({
397
+ ...entry,
398
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
399
+ balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
400
+ lastUsed: entry.lastUsed ?? null
401
+ }));
402
+ void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
403
+ return { cachedTokens: normalized };
404
+ });
405
+ },
406
+ setApiKeys: (value) => {
407
+ set((state) => {
408
+ const updates = typeof value === "function" ? value(state.apiKeys) : value;
409
+ const normalized = updates.map((entry) => ({
410
+ ...entry,
411
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
412
+ balance: entry.balance ?? 0,
413
+ lastUsed: entry.lastUsed ?? null
414
+ }));
415
+ void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
416
+ return { apiKeys: normalized };
417
+ });
418
+ },
419
+ setChildKeys: (value) => {
420
+ set((state) => {
421
+ const updates = typeof value === "function" ? value(state.childKeys) : value;
422
+ const normalized = updates.map((entry) => ({
423
+ parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
424
+ childKey: entry.childKey,
425
+ balance: entry.balance ?? 0,
426
+ balanceLimit: entry.balanceLimit,
427
+ validityDate: entry.validityDate,
428
+ createdAt: entry.createdAt ?? Date.now()
429
+ }));
430
+ void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
431
+ return { childKeys: normalized };
432
+ });
433
+ },
434
+ setRoutstr21Models: (value) => {
435
+ void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
436
+ set({ routstr21Models: value });
437
+ },
438
+ setRoutstr21ModelsLastUpdate: (value) => {
439
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
440
+ set({ lastRoutstr21ModelsUpdate: value });
441
+ },
442
+ setCachedReceiveTokens: (value) => {
443
+ const normalized = value.map((entry) => ({
444
+ token: entry.token,
445
+ amount: entry.amount,
446
+ unit: entry.unit || "sat",
447
+ createdAt: entry.createdAt ?? Date.now()
448
+ }));
449
+ void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
450
+ set({ cachedReceiveTokens: normalized });
451
+ },
452
+ setUsageTracking: (value) => {
453
+ void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
454
+ set({ usageTracking: value });
455
+ },
456
+ setClientIds: (value) => {
457
+ set((state) => {
458
+ const updates = typeof value === "function" ? value(state.clientIds) : value;
459
+ const normalized = updates.map((entry) => ({
460
+ ...entry,
461
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
462
+ createdAt: entry.createdAt ?? Date.now(),
463
+ lastUsed: entry.lastUsed ?? null
464
+ }));
465
+ void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);
466
+ return { clientIds: normalized };
467
+ });
468
+ }
469
+ }));
470
+ var hydrateStoreFromDriver = async (store, driver) => {
316
471
  const [
317
472
  rawModels,
318
473
  lastUsedModel,
@@ -328,7 +483,8 @@ var createSdkStore = async ({
328
483
  rawRoutstr21Models,
329
484
  rawLastRoutstr21ModelsUpdate,
330
485
  rawCachedReceiveTokens,
331
- rawUsageTracking
486
+ rawUsageTracking,
487
+ rawClientIds
332
488
  ] = await Promise.all([
333
489
  driver.getItem(
334
490
  SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
@@ -359,7 +515,8 @@ var createSdkStore = async ({
359
515
  null
360
516
  ),
361
517
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),
362
- driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, [])
518
+ driver.getItem(SDK_STORAGE_KEYS.USAGE_TRACKING, []),
519
+ driver.getItem(SDK_STORAGE_KEYS.CLIENT_IDS, [])
363
520
  ]);
364
521
  const modelsFromAllProviders = Object.fromEntries(
365
522
  Object.entries(rawModels).map(([baseUrl, models]) => [
@@ -418,7 +575,13 @@ var createSdkStore = async ({
418
575
  createdAt: entry.createdAt ?? Date.now()
419
576
  }));
420
577
  const usageTracking = rawUsageTracking;
421
- return vanilla.createStore((set, get) => ({
578
+ const clientIds = rawClientIds.map((entry) => ({
579
+ ...entry,
580
+ baseUrl: normalizeBaseUrl(entry.baseUrl),
581
+ createdAt: entry.createdAt ?? Date.now(),
582
+ lastUsed: entry.lastUsed ?? null
583
+ }));
584
+ store.setState({
422
585
  modelsFromAllProviders,
423
586
  lastUsedModel,
424
587
  baseUrlsList,
@@ -434,128 +597,17 @@ var createSdkStore = async ({
434
597
  lastRoutstr21ModelsUpdate,
435
598
  cachedReceiveTokens,
436
599
  usageTracking,
437
- setModelsFromAllProviders: (value) => {
438
- const normalized = {};
439
- for (const [baseUrl, models] of Object.entries(value)) {
440
- normalized[normalizeBaseUrl(baseUrl)] = models;
441
- }
442
- void driver.setItem(
443
- SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
444
- normalized
445
- );
446
- set({ modelsFromAllProviders: normalized });
447
- },
448
- setLastUsedModel: (value) => {
449
- void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);
450
- set({ lastUsedModel: value });
451
- },
452
- setBaseUrlsList: (value) => {
453
- const normalized = value.map((url) => normalizeBaseUrl(url));
454
- void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
455
- set({ baseUrlsList: normalized });
456
- },
457
- setBaseUrlsLastUpdate: (value) => {
458
- void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);
459
- set({ lastBaseUrlsUpdate: value });
460
- },
461
- setDisabledProviders: (value) => {
462
- const normalized = value.map((url) => normalizeBaseUrl(url));
463
- void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
464
- set({ disabledProviders: normalized });
465
- },
466
- setMintsFromAllProviders: (value) => {
467
- const normalized = {};
468
- for (const [baseUrl, mints] of Object.entries(value)) {
469
- normalized[normalizeBaseUrl(baseUrl)] = mints.map(
470
- (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
471
- );
472
- }
473
- void driver.setItem(
474
- SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
475
- normalized
476
- );
477
- set({ mintsFromAllProviders: normalized });
478
- },
479
- setInfoFromAllProviders: (value) => {
480
- const normalized = {};
481
- for (const [baseUrl, info] of Object.entries(value)) {
482
- normalized[normalizeBaseUrl(baseUrl)] = info;
483
- }
484
- void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
485
- set({ infoFromAllProviders: normalized });
486
- },
487
- setLastModelsUpdate: (value) => {
488
- const normalized = {};
489
- for (const [baseUrl, timestamp] of Object.entries(value)) {
490
- normalized[normalizeBaseUrl(baseUrl)] = timestamp;
491
- }
492
- void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
493
- set({ lastModelsUpdate: normalized });
494
- },
495
- setCachedTokens: (value) => {
496
- set((state) => {
497
- const updates = typeof value === "function" ? value(state.cachedTokens) : value;
498
- const normalized = updates.map((entry) => ({
499
- ...entry,
500
- baseUrl: normalizeBaseUrl(entry.baseUrl),
501
- balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
502
- lastUsed: entry.lastUsed ?? null
503
- }));
504
- void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
505
- return { cachedTokens: normalized };
506
- });
507
- },
508
- setApiKeys: (value) => {
509
- set((state) => {
510
- const updates = typeof value === "function" ? value(state.apiKeys) : value;
511
- const normalized = updates.map((entry) => ({
512
- ...entry,
513
- baseUrl: normalizeBaseUrl(entry.baseUrl),
514
- balance: entry.balance ?? 0,
515
- lastUsed: entry.lastUsed ?? null
516
- }));
517
- void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);
518
- return { apiKeys: normalized };
519
- });
520
- },
521
- setChildKeys: (value) => {
522
- set((state) => {
523
- const updates = typeof value === "function" ? value(state.childKeys) : value;
524
- const normalized = updates.map((entry) => ({
525
- parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),
526
- childKey: entry.childKey,
527
- balance: entry.balance ?? 0,
528
- balanceLimit: entry.balanceLimit,
529
- validityDate: entry.validityDate,
530
- createdAt: entry.createdAt ?? Date.now()
531
- }));
532
- void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);
533
- return { childKeys: normalized };
534
- });
535
- },
536
- setRoutstr21Models: (value) => {
537
- void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
538
- set({ routstr21Models: value });
539
- },
540
- setRoutstr21ModelsLastUpdate: (value) => {
541
- void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
542
- set({ lastRoutstr21ModelsUpdate: value });
543
- },
544
- setCachedReceiveTokens: (value) => {
545
- const normalized = value.map((entry) => ({
546
- token: entry.token,
547
- amount: entry.amount,
548
- unit: entry.unit || "sat",
549
- createdAt: entry.createdAt ?? Date.now()
550
- }));
551
- void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);
552
- set({ cachedReceiveTokens: normalized });
553
- },
554
- setUsageTracking: (value) => {
555
- void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);
556
- set({ usageTracking: value });
557
- }
558
- }));
600
+ clientIds
601
+ });
602
+ };
603
+ var createSdkStore = ({
604
+ driver
605
+ }) => {
606
+ const store = createEmptyStore(driver);
607
+ return {
608
+ store,
609
+ hydrate: hydrateStoreFromDriver(store, driver)
610
+ };
559
611
  };
560
612
  var createDiscoveryAdapterFromStore = (store) => ({
561
613
  getCachedModels: () => store.getState().modelsFromAllProviders,
@@ -820,7 +872,7 @@ var createProviderRegistryFromStore = (store) => ({
820
872
  });
821
873
 
822
874
  // storage/index.ts
823
- var isBrowser = () => {
875
+ var isBrowser2 = () => {
824
876
  try {
825
877
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
826
878
  } catch {
@@ -840,7 +892,7 @@ var isBun2 = () => {
840
892
  };
841
893
  var getDefaultSdkDriver = () => {
842
894
  if (defaultDriver) return defaultDriver;
843
- if (isBrowser()) {
895
+ if (isBrowser2()) {
844
896
  defaultDriver = localStorageDriver;
845
897
  return defaultDriver;
846
898
  }
@@ -855,12 +907,12 @@ var getDefaultSdkDriver = () => {
855
907
  defaultDriver = createMemoryDriver();
856
908
  return defaultDriver;
857
909
  };
858
- var defaultStorePromise = null;
910
+ var defaultStore = null;
859
911
  var getDefaultSdkStore = () => {
860
- if (!defaultStorePromise) {
861
- defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });
912
+ if (!defaultStore) {
913
+ defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });
862
914
  }
863
- return defaultStorePromise;
915
+ return defaultStore.hydrate.then(() => defaultStore.store);
864
916
  };
865
917
  var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
866
918
  var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());