@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.d.mts CHANGED
@@ -1,12 +1,13 @@
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';
7
7
  export { A as ApiKeyEntry, C as ChildKeyEntry, R as RoutstrClientOptions, a as StreamingCallbacks } from './interfaces-B85Wx7ni.mjs';
8
8
  export { BalanceManager, CashuSpender, CreateProviderTokenOptions, ProviderTokenResult, RefundApiKeyOptions, RefundOptions, SpendOptions, TopUpOptions } from './wallet/index.mjs';
9
- export { AlertLevel, DebugLevel, FetchOptions, ModelProviderPrice, ProviderManager, RouteRequestParams, RoutstrClient, RoutstrClientMode, StreamCallbacks, StreamProcessor } from './client/index.mjs';
9
+ import { DebugLevel } from './client/index.mjs';
10
+ export { AlertLevel, FetchOptions, ModelProviderPrice, ProviderManager, RouteRequestParams, RoutstrClient, RoutstrClientMode, StreamCallbacks, StreamProcessor } from './client/index.mjs';
10
11
  export { SDK_STORAGE_KEYS, SdkStore, StorageDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createMemoryDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, localStorageDriver } from './storage/index.mjs';
11
12
  import 'zustand/vanilla';
12
13
 
@@ -141,6 +142,8 @@ interface RouteRequestOptions {
141
142
  forceRefresh?: boolean;
142
143
  /** Optional: pre-initialized ModelManager (skips bootstrap if provided) */
143
144
  modelManager?: ModelManager;
145
+ /** Optional: set RoutstrClient debug level */
146
+ debugLevel?: DebugLevel;
144
147
  }
145
148
  /**
146
149
  * Result from routeRequests function
@@ -179,4 +182,4 @@ interface RouteRequestResult {
179
182
  */
180
183
  declare function routeRequests(options: RouteRequestOptions): Promise<Response>;
181
184
 
182
- export { DiscoveryAdapter, FailoverError, InsufficientBalanceError, MintDiscoveryError, MintUnreachableError, Model, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, type ProviderDirectoryEntry, ProviderError, ProviderRegistry, type RouteRequestOptions, type RouteRequestResult, StorageAdapter, StreamingError, TokenOperationError, WalletAdapter, filterBaseUrlsForTor, getProviderEndpoints, isOnionUrl, isTorContext, normalizeProviderUrl, routeRequests };
185
+ export { DebugLevel, DiscoveryAdapter, FailoverError, InsufficientBalanceError, MintDiscoveryError, MintUnreachableError, Model, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, type ProviderDirectoryEntry, ProviderError, ProviderRegistry, type RouteRequestOptions, type RouteRequestResult, StorageAdapter, StreamingError, TokenOperationError, WalletAdapter, filterBaseUrlsForTor, getProviderEndpoints, isOnionUrl, isTorContext, normalizeProviderUrl, routeRequests };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
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';
7
7
  export { A as ApiKeyEntry, C as ChildKeyEntry, R as RoutstrClientOptions, a as StreamingCallbacks } from './interfaces-BVNyAmKu.js';
8
8
  export { BalanceManager, CashuSpender, CreateProviderTokenOptions, ProviderTokenResult, RefundApiKeyOptions, RefundOptions, SpendOptions, TopUpOptions } from './wallet/index.js';
9
- export { AlertLevel, DebugLevel, FetchOptions, ModelProviderPrice, ProviderManager, RouteRequestParams, RoutstrClient, RoutstrClientMode, StreamCallbacks, StreamProcessor } from './client/index.js';
9
+ import { DebugLevel } from './client/index.js';
10
+ export { AlertLevel, FetchOptions, ModelProviderPrice, ProviderManager, RouteRequestParams, RoutstrClient, RoutstrClientMode, StreamCallbacks, StreamProcessor } from './client/index.js';
10
11
  export { SDK_STORAGE_KEYS, SdkStore, StorageDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createMemoryDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, localStorageDriver } from './storage/index.js';
11
12
  import 'zustand/vanilla';
12
13
 
@@ -141,6 +142,8 @@ interface RouteRequestOptions {
141
142
  forceRefresh?: boolean;
142
143
  /** Optional: pre-initialized ModelManager (skips bootstrap if provided) */
143
144
  modelManager?: ModelManager;
145
+ /** Optional: set RoutstrClient debug level */
146
+ debugLevel?: DebugLevel;
144
147
  }
145
148
  /**
146
149
  * Result from routeRequests function
@@ -179,4 +182,4 @@ interface RouteRequestResult {
179
182
  */
180
183
  declare function routeRequests(options: RouteRequestOptions): Promise<Response>;
181
184
 
182
- export { DiscoveryAdapter, FailoverError, InsufficientBalanceError, MintDiscoveryError, MintUnreachableError, Model, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, type ProviderDirectoryEntry, ProviderError, ProviderRegistry, type RouteRequestOptions, type RouteRequestResult, StorageAdapter, StreamingError, TokenOperationError, WalletAdapter, filterBaseUrlsForTor, getProviderEndpoints, isOnionUrl, isTorContext, normalizeProviderUrl, routeRequests };
185
+ export { DebugLevel, DiscoveryAdapter, FailoverError, InsufficientBalanceError, MintDiscoveryError, MintUnreachableError, Model, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, type ProviderDirectoryEntry, ProviderError, ProviderRegistry, type RouteRequestOptions, type RouteRequestResult, StorageAdapter, StreamingError, TokenOperationError, WalletAdapter, filterBaseUrlsForTor, getProviderEndpoints, isOnionUrl, isTorContext, normalizeProviderUrl, routeRequests };
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
  };
@@ -2726,22 +2739,31 @@ var RoutstrClient = class {
2726
2739
  try {
2727
2740
  const url = `${baseUrl.replace(/\/$/, "")}${path}`;
2728
2741
  if (this.mode === "xcashu") this._log("DEBUG", "HEADERS,", headers);
2742
+ this._log("DEBUG", "HEADERS,", headers);
2729
2743
  const response = await fetch(url, {
2730
2744
  method,
2731
2745
  headers,
2732
2746
  body: body === void 0 || method === "GET" ? void 0 : JSON.stringify(body)
2733
2747
  });
2734
2748
  if (this.mode === "xcashu") this._log("DEBUG", "response,", response);
2749
+ this._log("DEBUG", "response,", response);
2735
2750
  response.baseUrl = baseUrl;
2736
2751
  response.token = token;
2737
2752
  if (!response.ok) {
2738
2753
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
2754
+ let bodyText;
2755
+ try {
2756
+ bodyText = await response.text();
2757
+ } catch (e) {
2758
+ bodyText = void 0;
2759
+ }
2739
2760
  return await this._handleErrorResponse(
2740
2761
  params,
2741
2762
  token,
2742
2763
  response.status,
2743
2764
  requestId,
2744
- this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0
2765
+ this.mode === "xcashu" ? response.headers.get("x-cashu") ?? void 0 : void 0,
2766
+ bodyText
2745
2767
  );
2746
2768
  }
2747
2769
  return response;
@@ -2760,7 +2782,7 @@ var RoutstrClient = class {
2760
2782
  /**
2761
2783
  * Handle error responses with failover
2762
2784
  */
2763
- async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken) {
2785
+ async _handleErrorResponse(params, token, status, requestId, xCashuRefundToken, responseBody) {
2764
2786
  const { path, method, body, selectedModel, baseUrl, mintUrl } = params;
2765
2787
  let tryNextProvider = false;
2766
2788
  this._log(
@@ -2830,7 +2852,8 @@ var RoutstrClient = class {
2830
2852
  );
2831
2853
  }
2832
2854
  }
2833
- if (status === 402 && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2855
+ if ((status === 402 || status === 413 && responseBody?.includes("Insufficient balance")) && !tryNextProvider && (this.mode === "apikeys" || this.mode === "lazyrefund")) {
2856
+ console.log("RESPONSFE ", responseBody);
2834
2857
  const topupResult = await this.balanceManager.topUp({
2835
2858
  mintUrl,
2836
2859
  baseUrl,
@@ -3614,6 +3637,7 @@ var SDK_STORAGE_KEYS = {
3614
3637
  API_KEYS: "api_keys",
3615
3638
  CHILD_KEYS: "child_keys",
3616
3639
  ROUTSTR21_MODELS: "routstr21Models",
3640
+ LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
3617
3641
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens"
3618
3642
  };
3619
3643
 
@@ -3648,6 +3672,7 @@ var createSdkStore = async ({
3648
3672
  rawApiKeys,
3649
3673
  rawChildKeys,
3650
3674
  rawRoutstr21Models,
3675
+ rawLastRoutstr21ModelsUpdate,
3651
3676
  rawCachedReceiveTokens
3652
3677
  ] = await Promise.all([
3653
3678
  driver.getItem(
@@ -3674,6 +3699,10 @@ var createSdkStore = async ({
3674
3699
  driver.getItem(SDK_STORAGE_KEYS.API_KEYS, []),
3675
3700
  driver.getItem(SDK_STORAGE_KEYS.CHILD_KEYS, []),
3676
3701
  driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
3702
+ driver.getItem(
3703
+ SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
3704
+ null
3705
+ ),
3677
3706
  driver.getItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, [])
3678
3707
  ]);
3679
3708
  const modelsFromAllProviders = Object.fromEntries(
@@ -3725,7 +3754,8 @@ var createSdkStore = async ({
3725
3754
  createdAt: entry.createdAt ?? Date.now()
3726
3755
  }));
3727
3756
  const routstr21Models = rawRoutstr21Models;
3728
- const cachedReceiveTokens = rawCachedReceiveTokens.map((entry) => ({
3757
+ const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;
3758
+ const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({
3729
3759
  token: entry.token,
3730
3760
  amount: entry.amount,
3731
3761
  unit: entry.unit || "sat",
@@ -3744,6 +3774,7 @@ var createSdkStore = async ({
3744
3774
  apiKeys,
3745
3775
  childKeys,
3746
3776
  routstr21Models,
3777
+ lastRoutstr21ModelsUpdate,
3747
3778
  cachedReceiveTokens,
3748
3779
  setModelsFromAllProviders: (value) => {
3749
3780
  const normalized = {};
@@ -3848,6 +3879,10 @@ var createSdkStore = async ({
3848
3879
  void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
3849
3880
  set({ routstr21Models: value });
3850
3881
  },
3882
+ setRoutstr21ModelsLastUpdate: (value) => {
3883
+ void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);
3884
+ set({ lastRoutstr21ModelsUpdate: value });
3885
+ },
3851
3886
  setCachedReceiveTokens: (value) => {
3852
3887
  const normalized = value.map((entry) => ({
3853
3888
  token: entry.token,
@@ -3886,7 +3921,9 @@ var createDiscoveryAdapterFromStore = (store) => ({
3886
3921
  getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,
3887
3922
  setBaseUrlsLastUpdate: (timestamp) => store.getState().setBaseUrlsLastUpdate(timestamp),
3888
3923
  getRoutstr21Models: () => store.getState().routstr21Models,
3889
- setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models)
3924
+ setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),
3925
+ getRoutstr21ModelsLastUpdate: () => store.getState().lastRoutstr21ModelsUpdate,
3926
+ setRoutstr21ModelsLastUpdate: (timestamp) => store.getState().setRoutstr21ModelsLastUpdate(timestamp)
3890
3927
  });
3891
3928
  var createStorageAdapterFromStore = (store) => ({
3892
3929
  getToken: (baseUrl) => {
@@ -4181,7 +4218,8 @@ async function routeRequests(options) {
4181
4218
  includeProviderUrls = [],
4182
4219
  torMode = false,
4183
4220
  forceRefresh = false,
4184
- modelManager: providedModelManager
4221
+ modelManager: providedModelManager,
4222
+ debugLevel
4185
4223
  } = options;
4186
4224
  let modelManager;
4187
4225
  let providers;
@@ -4248,6 +4286,9 @@ async function routeRequests(options) {
4248
4286
  alertLevel,
4249
4287
  "apikeys"
4250
4288
  );
4289
+ if (debugLevel) {
4290
+ client.setDebugLevel(debugLevel);
4291
+ }
4251
4292
  const maxTokens = extractMaxTokens(requestBody);
4252
4293
  const stream = extractStream(requestBody);
4253
4294
  let response = null;