@routstr/sdk 0.1.2 → 0.1.3

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/index.mjs CHANGED
@@ -140,6 +140,7 @@ var ModelManager = class _ModelManager {
140
140
  const lastUpdate = this.adapter.getBaseUrlsLastUpdate();
141
141
  const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;
142
142
  if (cacheValid) {
143
+ await this.fetchRoutstr21Models();
143
144
  return this.filterBaseUrlsForTor(cachedUrls, torMode);
144
145
  }
145
146
  }
@@ -450,9 +451,18 @@ var ModelManager = class _ModelManager {
450
451
  }
451
452
  /**
452
453
  * Fetch routstr21 models from Nostr network (kind 38423)
454
+ * Uses cache if available and not expired
453
455
  * @returns Array of model IDs or empty array if not found
454
456
  */
455
- async fetchRoutstr21Models() {
457
+ async fetchRoutstr21Models(forceRefresh = false) {
458
+ const cachedModels = this.adapter.getRoutstr21Models();
459
+ if (!forceRefresh && cachedModels.length > 0) {
460
+ const lastUpdate = this.adapter.getRoutstr21ModelsLastUpdate();
461
+ const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;
462
+ if (cacheValid) {
463
+ return cachedModels;
464
+ }
465
+ }
456
466
  const DEFAULT_RELAYS = [
457
467
  "wss://relay.primal.net",
458
468
  "wss://nos.lol",
@@ -466,7 +476,9 @@ var ModelManager = class _ModelManager {
466
476
  kinds: [38423],
467
477
  "#d": ["routstr-21-models"],
468
478
  limit: 1,
469
- authors: ["4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8"]
479
+ authors: [
480
+ "4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8"
481
+ ]
470
482
  }).pipe(
471
483
  onlyEvents(),
472
484
  tap((event2) => {
@@ -483,20 +495,21 @@ var ModelManager = class _ModelManager {
483
495
  });
484
496
  const timeline = localEventStore.getTimeline({ kinds: [38423] });
485
497
  if (timeline.length === 0) {
486
- return [];
498
+ return cachedModels.length > 0 ? cachedModels : [];
487
499
  }
488
500
  const event = timeline[0];
489
501
  try {
490
502
  const content = JSON.parse(event.content);
491
503
  const models = Array.isArray(content?.models) ? content.models : [];
492
504
  this.adapter.setRoutstr21Models(models);
505
+ this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
493
506
  return models;
494
507
  } catch {
495
508
  console.warn(
496
509
  "[Routstr21Models] Failed to parse Nostr event content:",
497
510
  event.id
498
511
  );
499
- return [];
512
+ return cachedModels.length > 0 ? cachedModels : [];
500
513
  }
501
514
  }
502
515
  };
@@ -2734,12 +2747,19 @@ var RoutstrClient = class {
2734
2747
  response.token = token;
2735
2748
  if (!response.ok) {
2736
2749
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
2750
+ let bodyText;
2751
+ try {
2752
+ bodyText = await response.text();
2753
+ } catch (e) {
2754
+ bodyText = void 0;
2755
+ }
2737
2756
  return await this._handleErrorResponse(
2738
2757
  params,
2739
2758
  token,
2740
2759
  response.status,
2741
2760
  requestId,
2742
- this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0
2761
+ this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0,
2762
+ bodyText
2743
2763
  );
2744
2764
  }
2745
2765
  return response;
@@ -2758,7 +2778,7 @@ var RoutstrClient = class {
2758
2778
  /**
2759
2779
  * Handle error responses with failover
2760
2780
  */
2761
- async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken) {
2781
+ async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken, responseBody) {
2762
2782
  const { path, method, body, selectedModel, baseUrl, mintUrl } = params;
2763
2783
  let tryNextProvider = false;
2764
2784
  this._log(
@@ -2828,7 +2848,7 @@ var RoutstrClient = class {
2828
2848
  );
2829
2849
  }
2830
2850
  }
2831
- if (status === 402 && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2851
+ if ((status === 402 || status === 413 && responseBody?.includes("Insufficient balance")) && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2832
2852
  const topupResult = await this.balanceManager.topUp({
2833
2853
  mintUrl,
2834
2854
  baseUrl,
@@ -3612,6 +3632,7 @@ var SDK_STORAGE_KEYS = {
3612
3632
  API_KEYS: "api_keys",
3613
3633
  CHILD_KEYS: "child_keys",
3614
3634
  ROUTSTR21_MODELS: "routstr21Models",
3635
+ LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
3615
3636
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
3616
3637
  };
3617
3638
 
@@ -3646,6 +3667,7 @@ var createSdkStore = async ({
3646
3667
  rawApiKeys,
3647
3668
  rawChildKeys,
3648
3669
  rawRoutstr21Models,
3670
+ rawLastRoutstr21ModelsUpdate,
3649
3671
  rawCachedReceiveTokens
3650
3672
  ] = await Promise.all([
3651
3673
  driver.getItem(
@@ -3672,6 +3694,10 @@ var createSdkStore = async ({
3672
3694
  driver.getItem(SDK_STORAGE_KEYS.API_KEYS, []),
3673
3695
  driver.getItem(SDK_STORAGE_KEYS.CHILD_KEYS, []),
3674
3696
  driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
3697
+ driver.getItem(
3698
+ SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
3699
+ null
3700
+ ),
3675
3701
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
3676
3702
  ]);
3677
3703
  const modelsFromAllProviders = Object.fromEntries(
@@ -3723,7 +3749,8 @@ var createSdkStore = async ({
3723
3749
  createdAt: entry.createdAt ?? Date.now()
3724
3750
  }));
3725
3751
  const routstr21Models = rawRoutstr21Models;
3726
- const cachedReceiveTokens = rawCachedReceiveTokens.map((entry) => ({
3752
+ const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;
3753
+ const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({
3727
3754
  token: entry.token,
3728
3755
  amount: entry.amount,
3729
3756
  unit: entry.unit || "sat",
@@ -3742,6 +3769,7 @@ var createSdkStore = async ({
3742
3769
  apiKeys,
3743
3770
  childKeys,
3744
3771
  routstr21Models,
3772
+ lastRoutstr21ModelsUpdate,
3745
3773
  cachedReceiveTokens,
3746
3774
  setModelsFromAllProviders: (value) => {
3747
3775
  const normalized = {};
@@ -3846,6 +3874,10 @@ var createSdkStore = async ({
3846
3874
  void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
3847
3875
  set({ routstr21Models: value });
3848
3876
  },
3877
+ setRoutstr21ModelsLastUpdate: (value) => {
3878
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
3879
+ set({ lastRoutstr21ModelsUpdate: value });
3880
+ },
3849
3881
  setCachedReceiveTokens: (value) => {
3850
3882
  const normalized = value.map((entry) => ({
3851
3883
  token: entry.token,
@@ -3884,7 +3916,9 @@ var createDiscoveryAdapterFromStore = (store) => ({
3884
3916
  getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,
3885
3917
  setBaseUrlsLastUpdate: (timestamp) => store.getState().setBaseUrlsLastUpdate(timestamp),
3886
3918
  getRoutstr21Models: () => store.getState().routstr21Models,
3887
- setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models)
3919
+ setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),
3920
+ getRoutstr21ModelsLastUpdate: () => store.getState().lastRoutstr21ModelsUpdate,
3921
+ setRoutstr21ModelsLastUpdate: (timestamp) => store.getState().setRoutstr21ModelsLastUpdate(timestamp)
3888
3922
  });
3889
3923
  var createStorageAdapterFromStore = (store) => ({
3890
3924
  getToken: (baseUrl) => {