@routstr/sdk 0.1.2 → 0.1.4

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
  };
@@ -2724,22 +2737,31 @@ var RoutstrClient = class {
2724
2737
  try {
2725
2738
  const url = `${baseUrl.replace(/\/$/, "")}${path}`;
2726
2739
  if (this.mode === "xcashu") this._log("DEBUG", "HEADERS,", headers);
2740
+ this._log("DEBUG", "HEADERS,", headers);
2727
2741
  const response = await fetch(url, {
2728
2742
  method,
2729
2743
  headers,
2730
2744
  body: body === void 0 || method === "GET" ? void 0 : JSON.stringify(body)
2731
2745
  });
2732
2746
  if (this.mode === "xcashu") this._log("DEBUG", "response,", response);
2747
+ this._log("DEBUG", "response,", response);
2733
2748
  response.baseUrl = baseUrl;
2734
2749
  response.token = token;
2735
2750
  if (!response.ok) {
2736
2751
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
2752
+ let bodyText;
2753
+ try {
2754
+ bodyText = await response.text();
2755
+ } catch (e) {
2756
+ bodyText = void 0;
2757
+ }
2737
2758
  return await this._handleErrorResponse(
2738
2759
  params,
2739
2760
  token,
2740
2761
  response.status,
2741
2762
  requestId,
2742
- this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0
2763
+ this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0,
2764
+ bodyText
2743
2765
  );
2744
2766
  }
2745
2767
  return response;
@@ -2758,7 +2780,7 @@ var RoutstrClient = class {
2758
2780
  /**
2759
2781
  * Handle error responses with failover
2760
2782
  */
2761
- async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken) {
2783
+ async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken, responseBody) {
2762
2784
  const { path, method, body, selectedModel, baseUrl, mintUrl } = params;
2763
2785
  let tryNextProvider = false;
2764
2786
  this._log(
@@ -2828,7 +2850,8 @@ var RoutstrClient = class {
2828
2850
  );
2829
2851
  }
2830
2852
  }
2831
- if (status === 402 && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2853
+ if ((status === 402 || status === 413 && responseBody?.includes("Insufficient balance")) && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2854
+ console.log("RESPONSFE ", responseBody);
2832
2855
  const topupResult = await this.balanceManager.topUp({
2833
2856
  mintUrl,
2834
2857
  baseUrl,
@@ -3612,6 +3635,7 @@ var SDK_STORAGE_KEYS = {
3612
3635
  API_KEYS: "api_keys",
3613
3636
  CHILD_KEYS: "child_keys",
3614
3637
  ROUTSTR21_MODELS: "routstr21Models",
3638
+ LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
3615
3639
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
3616
3640
  };
3617
3641
 
@@ -3646,6 +3670,7 @@ var createSdkStore = async ({
3646
3670
  rawApiKeys,
3647
3671
  rawChildKeys,
3648
3672
  rawRoutstr21Models,
3673
+ rawLastRoutstr21ModelsUpdate,
3649
3674
  rawCachedReceiveTokens
3650
3675
  ] = await Promise.all([
3651
3676
  driver.getItem(
@@ -3672,6 +3697,10 @@ var createSdkStore = async ({
3672
3697
  driver.getItem(SDK_STORAGE_KEYS.API_KEYS, []),
3673
3698
  driver.getItem(SDK_STORAGE_KEYS.CHILD_KEYS, []),
3674
3699
  driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
3700
+ driver.getItem(
3701
+ SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
3702
+ null
3703
+ ),
3675
3704
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
3676
3705
  ]);
3677
3706
  const modelsFromAllProviders = Object.fromEntries(
@@ -3723,7 +3752,8 @@ var createSdkStore = async ({
3723
3752
  createdAt: entry.createdAt ?? Date.now()
3724
3753
  }));
3725
3754
  const routstr21Models = rawRoutstr21Models;
3726
- const cachedReceiveTokens = rawCachedReceiveTokens.map((entry) => ({
3755
+ const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;
3756
+ const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({
3727
3757
  token: entry.token,
3728
3758
  amount: entry.amount,
3729
3759
  unit: entry.unit || "sat",
@@ -3742,6 +3772,7 @@ var createSdkStore = async ({
3742
3772
  apiKeys,
3743
3773
  childKeys,
3744
3774
  routstr21Models,
3775
+ lastRoutstr21ModelsUpdate,
3745
3776
  cachedReceiveTokens,
3746
3777
  setModelsFromAllProviders: (value) => {
3747
3778
  const normalized = {};
@@ -3846,6 +3877,10 @@ var createSdkStore = async ({
3846
3877
  void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
3847
3878
  set({ routstr21Models: value });
3848
3879
  },
3880
+ setRoutstr21ModelsLastUpdate: (value) => {
3881
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
3882
+ set({ lastRoutstr21ModelsUpdate: value });
3883
+ },
3849
3884
  setCachedReceiveTokens: (value) => {
3850
3885
  const normalized = value.map((entry) => ({
3851
3886
  token: entry.token,
@@ -3884,7 +3919,9 @@ var createDiscoveryAdapterFromStore = (store) => ({
3884
3919
  getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,
3885
3920
  setBaseUrlsLastUpdate: (timestamp) => store.getState().setBaseUrlsLastUpdate(timestamp),
3886
3921
  getRoutstr21Models: () => store.getState().routstr21Models,
3887
- setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models)
3922
+ setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),
3923
+ getRoutstr21ModelsLastUpdate: () => store.getState().lastRoutstr21ModelsUpdate,
3924
+ setRoutstr21ModelsLastUpdate: (timestamp) => store.getState().setRoutstr21ModelsLastUpdate(timestamp)
3888
3925
  });
3889
3926
  var createStorageAdapterFromStore = (store) => ({
3890
3927
  getToken: (baseUrl) => {
@@ -4179,7 +4216,8 @@ async function routeRequests(options) {
4179
4216
  includeProviderUrls = [],
4180
4217
  torMode = false,
4181
4218
  forceRefresh = false,
4182
- modelManager: providedModelManager
4219
+ modelManager: providedModelManager,
4220
+ debugLevel
4183
4221
  } = options;
4184
4222
  let modelManager;
4185
4223
  let providers;
@@ -4246,6 +4284,9 @@ async function routeRequests(options) {
4246
4284
  alertLevel,
4247
4285
  "apikeys"
4248
4286
  );
4287
+ if (debugLevel) {
4288
+ client.setDebugLevel(debugLevel);
4289
+ }
4249
4290
  const maxTokens = extractMaxTokens(requestBody);
4250
4291
  const stream = extractStream(requestBody);
4251
4292
  let response = null;