@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.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { M as Model } from './types-BlHjmWRK.mjs';
2
2
  export { A as APIErrorVerdict, b as AnnotationData, C as CandidateProvider, F as FetchAIResponseParams, I as ImageData, a as Message, c as MessageContentType, d as MintDiscoveryResult, e as MintSelection, f as ModelArchitecture, g as ModelDiscoveryResult, h as ModelPricing, i as ModelSatsPricing, j as PendingTokenEntry, k as PerRequestLimits, P as ProviderInfo, R as RefundResult, S as SpendResult, l as StreamingResult, m as TopUpResult, T as TransactionHistory, U as UsageStats } from './types-BlHjmWRK.mjs';
3
- import { D as DiscoveryAdapter } from './interfaces-nanJOqdW.mjs';
3
+ import { D as DiscoveryAdapter } from './interfaces-DGdP8fQp.mjs';
4
4
  import { ModelManager } from './discovery/index.mjs';
5
5
  export { MintDiscovery, ModelManagerConfig } from './discovery/index.mjs';
6
6
  import { W as WalletAdapter, S as StorageAdapter, P as ProviderRegistry } from './interfaces-B85Wx7ni.mjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { M as Model } from './types-BlHjmWRK.js';
2
2
  export { A as APIErrorVerdict, b as AnnotationData, C as CandidateProvider, F as FetchAIResponseParams, I as ImageData, a as Message, c as MessageContentType, d as MintDiscoveryResult, e as MintSelection, f as ModelArchitecture, g as ModelDiscoveryResult, h as ModelPricing, i as ModelSatsPricing, j as PendingTokenEntry, k as PerRequestLimits, P as ProviderInfo, R as RefundResult, S as SpendResult, l as StreamingResult, m as TopUpResult, T as TransactionHistory, U as UsageStats } from './types-BlHjmWRK.js';
3
- import { D as DiscoveryAdapter } from './interfaces-Dnrvxr6N.js';
3
+ import { D as DiscoveryAdapter } from './interfaces-CC0LT9p9.js';
4
4
  import { ModelManager } from './discovery/index.js';
5
5
  export { MintDiscovery, ModelManagerConfig } from './discovery/index.js';
6
6
  import { W as WalletAdapter, S as StorageAdapter, P as ProviderRegistry } from './interfaces-BVNyAmKu.js';
package/dist/index.js CHANGED
@@ -142,6 +142,7 @@ var ModelManager = class _ModelManager {
142
142
  const lastUpdate = this.adapter.getBaseUrlsLastUpdate();
143
143
  const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;
144
144
  if (cacheValid) {
145
+ await this.fetchRoutstr21Models();
145
146
  return this.filterBaseUrlsForTor(cachedUrls, torMode);
146
147
  }
147
148
  }
@@ -452,9 +453,18 @@ var ModelManager = class _ModelManager {
452
453
  }
453
454
  /**
454
455
  * Fetch routstr21 models from Nostr network (kind 38423)
456
+ * Uses cache if available and not expired
455
457
  * @returns Array of model IDs or empty array if not found
456
458
  */
457
- async fetchRoutstr21Models() {
459
+ async fetchRoutstr21Models(forceRefresh = false) {
460
+ const cachedModels = this.adapter.getRoutstr21Models();
461
+ if (!forceRefresh && cachedModels.length > 0) {
462
+ const lastUpdate = this.adapter.getRoutstr21ModelsLastUpdate();
463
+ const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;
464
+ if (cacheValid) {
465
+ return cachedModels;
466
+ }
467
+ }
458
468
  const DEFAULT_RELAYS = [
459
469
  "wss://relay.primal.net",
460
470
  "wss://nos.lol",
@@ -468,7 +478,9 @@ var ModelManager = class _ModelManager {
468
478
  kinds: [38423],
469
479
  "#d": ["routstr-21-models"],
470
480
  limit: 1,
471
- authors: ["4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8"]
481
+ authors: [
482
+ "4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8"
483
+ ]
472
484
  }).pipe(
473
485
  applesauceRelay.onlyEvents(),
474
486
  rxjs.tap((event2) => {
@@ -485,20 +497,21 @@ var ModelManager = class _ModelManager {
485
497
  });
486
498
  const timeline = localEventStore.getTimeline({ kinds: [38423] });
487
499
  if (timeline.length === 0) {
488
- return [];
500
+ return cachedModels.length > 0 ? cachedModels : [];
489
501
  }
490
502
  const event = timeline[0];
491
503
  try {
492
504
  const content = JSON.parse(event.content);
493
505
  const models = Array.isArray(content?.models) ? content.models : [];
494
506
  this.adapter.setRoutstr21Models(models);
507
+ this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
495
508
  return models;
496
509
  } catch {
497
510
  console.warn(
498
511
  "[Routstr21Models] Failed to parse Nostr event content:",
499
512
  event.id
500
513
  );
501
- return [];
514
+ return cachedModels.length > 0 ? cachedModels : [];
502
515
  }
503
516
  }
504
517
  };
@@ -2736,12 +2749,19 @@ var RoutstrClient = class {
2736
2749
  response.token = token;
2737
2750
  if (!response.ok) {
2738
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
+ }
2739
2758
  return await this._handleErrorResponse(
2740
2759
  params,
2741
2760
  token,
2742
2761
  response.status,
2743
2762
  requestId,
2744
- 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
2745
2765
  );
2746
2766
  }
2747
2767
  return response;
@@ -2760,7 +2780,7 @@ var RoutstrClient = class {
2760
2780
  /**
2761
2781
  * Handle error responses with failover
2762
2782
  */
2763
- async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken) {
2783
+ async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken, responseBody) {
2764
2784
  const { path, method, body, selectedModel, baseUrl, mintUrl } = params;
2765
2785
  let tryNextProvider = false;
2766
2786
  this._log(
@@ -2830,7 +2850,7 @@ var RoutstrClient = class {
2830
2850
  );
2831
2851
  }
2832
2852
  }
2833
- 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")) {
2834
2854
  const topupResult = await this.balanceManager.topUp({
2835
2855
  mintUrl,
2836
2856
  baseUrl,
@@ -3614,6 +3634,7 @@ var SDK_STORAGE_KEYS = {
3614
3634
  API_KEYS: "api_keys",
3615
3635
  CHILD_KEYS: "child_keys",
3616
3636
  ROUTSTR21_MODELS: "routstr21Models",
3637
+ LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
3617
3638
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
3618
3639
  };
3619
3640
 
@@ -3648,6 +3669,7 @@ var createSdkStore = async ({
3648
3669
  rawApiKeys,
3649
3670
  rawChildKeys,
3650
3671
  rawRoutstr21Models,
3672
+ rawLastRoutstr21ModelsUpdate,
3651
3673
  rawCachedReceiveTokens
3652
3674
  ] = await Promise.all([
3653
3675
  driver.getItem(
@@ -3674,6 +3696,10 @@ var createSdkStore = async ({
3674
3696
  driver.getItem(SDK_STORAGE_KEYS.API_KEYS, []),
3675
3697
  driver.getItem(SDK_STORAGE_KEYS.CHILD_KEYS, []),
3676
3698
  driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
3699
+ driver.getItem(
3700
+ SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
3701
+ null
3702
+ ),
3677
3703
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
3678
3704
  ]);
3679
3705
  const modelsFromAllProviders = Object.fromEntries(
@@ -3725,7 +3751,8 @@ var createSdkStore = async ({
3725
3751
  createdAt: entry.createdAt ?? Date.now()
3726
3752
  }));
3727
3753
  const routstr21Models = rawRoutstr21Models;
3728
- const cachedReceiveTokens = rawCachedReceiveTokens.map((entry) => ({
3754
+ const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;
3755
+ const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({
3729
3756
  token: entry.token,
3730
3757
  amount: entry.amount,
3731
3758
  unit: entry.unit || "sat",
@@ -3744,6 +3771,7 @@ var createSdkStore = async ({
3744
3771
  apiKeys,
3745
3772
  childKeys,
3746
3773
  routstr21Models,
3774
+ lastRoutstr21ModelsUpdate,
3747
3775
  cachedReceiveTokens,
3748
3776
  setModelsFromAllProviders: (value) => {
3749
3777
  const normalized = {};
@@ -3848,6 +3876,10 @@ var createSdkStore = async ({
3848
3876
  void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
3849
3877
  set({ routstr21Models: value });
3850
3878
  },
3879
+ setRoutstr21ModelsLastUpdate: (value) => {
3880
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
3881
+ set({ lastRoutstr21ModelsUpdate: value });
3882
+ },
3851
3883
  setCachedReceiveTokens: (value) => {
3852
3884
  const normalized = value.map((entry) => ({
3853
3885
  token: entry.token,
@@ -3886,7 +3918,9 @@ var createDiscoveryAdapterFromStore = (store) => ({
3886
3918
  getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,
3887
3919
  setBaseUrlsLastUpdate: (timestamp) => store.getState().setBaseUrlsLastUpdate(timestamp),
3888
3920
  getRoutstr21Models: () => store.getState().routstr21Models,
3889
- setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models)
3921
+ setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),
3922
+ getRoutstr21ModelsLastUpdate: () => store.getState().lastRoutstr21ModelsUpdate,
3923
+ setRoutstr21ModelsLastUpdate: (timestamp) => store.getState().setRoutstr21ModelsLastUpdate(timestamp)
3890
3924
  });
3891
3925
  var createStorageAdapterFromStore = (store) => ({
3892
3926
  getToken: (baseUrl) => {