@routstr/sdk 0.3.8 → 0.3.9

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.
@@ -605,7 +605,7 @@ var CashuSpender = class {
605
605
  });
606
606
  continue;
607
607
  }
608
- if (balanceResult.amount >= 0) {
608
+ if (balanceResult.amount >= 0 && !balanceResult.balanceUnknown) {
609
609
  const balanceSat = balanceResult.unit === "msat" ? Math.floor(balanceResult.amount / 1e3) : balanceResult.amount;
610
610
  this.storageAdapter.updateApiKeyBalance(
611
611
  apiKeyEntry.baseUrl,
@@ -1354,17 +1354,24 @@ var BalanceManager = class _BalanceManager {
1354
1354
  this.logger.warn("getTokenBalance: FAILED", data);
1355
1355
  const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
1356
1356
  return {
1357
- amount: -1,
1357
+ amount: 0,
1358
1358
  reserved: data.reserved ?? 0,
1359
1359
  unit: "msat",
1360
1360
  apiKey: data.api_key,
1361
- isInvalidApiKey
1361
+ isInvalidApiKey,
1362
+ balanceUnknown: true
1362
1363
  };
1363
1364
  }
1364
1365
  } catch (error) {
1365
1366
  this.logger.error("getTokenBalance error", error);
1366
1367
  }
1367
- return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
1368
+ return {
1369
+ amount: 0,
1370
+ reserved: 0,
1371
+ unit: "sat",
1372
+ apiKey: "",
1373
+ balanceUnknown: true
1374
+ };
1368
1375
  }
1369
1376
  /**
1370
1377
  * Handle topup errors with specific error types
@@ -3836,6 +3843,8 @@ var RoutstrClient = class {
3836
3843
  baseUrl: prepared.baseUrlUsed,
3837
3844
  mintUrl: params.mintUrl,
3838
3845
  initialTokenBalance: prepared.tokenBalanceInSats,
3846
+ initialTokenBalanceUnknown: prepared.tokenBalanceUnknown,
3847
+ fallbackSatsSpent: usage?.satsCost,
3839
3848
  response: prepared.response,
3840
3849
  modelId: prepared.modelId,
3841
3850
  usage,
@@ -3900,7 +3909,7 @@ var RoutstrClient = class {
3900
3909
  );
3901
3910
  }
3902
3911
  }
3903
- const { token, tokenBalance, tokenBalanceUnit } = await this._spendToken({
3912
+ const { token, tokenBalance, tokenBalanceUnit, tokenBalanceUnknown } = await this._spendToken({
3904
3913
  mintUrl,
3905
3914
  amount: requiredSats,
3906
3915
  baseUrl
@@ -3926,9 +3935,20 @@ var RoutstrClient = class {
3926
3935
  baseHeaders,
3927
3936
  selectedModel
3928
3937
  });
3929
- const tokenBalanceInSats = tokenBalanceUnit === "msat" ? tokenBalance / 1e3 : tokenBalance;
3938
+ let tokenBalanceInSats = tokenBalanceUnit === "msat" ? tokenBalance / 1e3 : tokenBalance;
3939
+ let initialTokenBalanceUnknown = tokenBalanceUnknown;
3930
3940
  const baseUrlUsed = response.baseUrl || baseUrl;
3931
3941
  const tokenUsed = response.token || token;
3942
+ if (baseUrlUsed !== baseUrl || tokenUsed !== token) {
3943
+ if (typeof response.initialTokenBalanceInSats === "number") {
3944
+ tokenBalanceInSats = response.initialTokenBalanceInSats;
3945
+ initialTokenBalanceUnknown = Boolean(
3946
+ response.initialTokenBalanceUnknown
3947
+ );
3948
+ } else {
3949
+ initialTokenBalanceUnknown = true;
3950
+ }
3951
+ }
3932
3952
  const contentType = response.headers.get("content-type") || "";
3933
3953
  let processedResponse = response;
3934
3954
  let capturedUsage;
@@ -3961,6 +3981,7 @@ var RoutstrClient = class {
3961
3981
  tokenUsed,
3962
3982
  baseUrlUsed,
3963
3983
  tokenBalanceInSats,
3984
+ tokenBalanceUnknown: initialTokenBalanceUnknown,
3964
3985
  modelId,
3965
3986
  capturedUsage,
3966
3987
  capturedResponseId,
@@ -4010,7 +4031,8 @@ var RoutstrClient = class {
4010
4031
  let token = spendResult.token;
4011
4032
  let tokenBalance = spendResult.tokenBalance;
4012
4033
  let tokenBalanceUnit = spendResult.tokenBalanceUnit;
4013
- const tokenBalanceInSats = tokenBalanceUnit === "msat" ? tokenBalance / 1e3 : tokenBalance;
4034
+ let tokenBalanceInSats = tokenBalanceUnit === "msat" ? tokenBalance / 1e3 : tokenBalance;
4035
+ let initialTokenBalanceUnknown = spendResult.tokenBalanceUnknown;
4014
4036
  callbacks.onTokenCreated?.(this._getPendingCashuTokenAmount());
4015
4037
  const baseHeaders = this._buildBaseHeaders(headers);
4016
4038
  const requestHeaders = this._withAuthHeader(baseHeaders, token);
@@ -4053,6 +4075,18 @@ var RoutstrClient = class {
4053
4075
  }
4054
4076
  if (response.status === 200) {
4055
4077
  const baseUrlUsed = response.baseUrl || baseUrl;
4078
+ const responseToken = response.token || token;
4079
+ if (baseUrlUsed !== baseUrl || responseToken !== token) {
4080
+ token = responseToken;
4081
+ if (typeof response.initialTokenBalanceInSats === "number") {
4082
+ tokenBalanceInSats = response.initialTokenBalanceInSats;
4083
+ initialTokenBalanceUnknown = Boolean(
4084
+ response.initialTokenBalanceUnknown
4085
+ );
4086
+ } else {
4087
+ initialTokenBalanceUnknown = true;
4088
+ }
4089
+ }
4056
4090
  const streamingResult = await this.streamProcessor.process(
4057
4091
  response,
4058
4092
  {
@@ -4083,6 +4117,7 @@ var RoutstrClient = class {
4083
4117
  baseUrl: baseUrlUsed,
4084
4118
  mintUrl,
4085
4119
  initialTokenBalance: tokenBalanceInSats,
4120
+ initialTokenBalanceUnknown,
4086
4121
  fallbackSatsSpent: isApikeysEstimate ? this._getEstimatedCosts(selectedModel, streamingResult) : void 0,
4087
4122
  response,
4088
4123
  modelId: selectedModel.id,
@@ -4239,14 +4274,24 @@ var RoutstrClient = class {
4239
4274
  params.token,
4240
4275
  baseUrl
4241
4276
  );
4242
- const currentBalance = currentBalanceInfo.unit === "msat" ? currentBalanceInfo.amount / 1e3 : currentBalanceInfo.amount;
4243
- const reservedBalance = currentBalanceInfo.unit === "msat" ? (currentBalanceInfo.reserved ?? 0) / 1e3 : currentBalanceInfo.reserved ?? 0;
4244
- const shortfall = Math.max(0, params.requiredSats - currentBalance + reservedBalance);
4245
- topupAmount = shortfall > 0.21 * params.requiredSats ? shortfall : 0.21 * params.requiredSats;
4246
- this._log(
4247
- "DEBUG",
4248
- `The shortfall is: ${shortfall}. requiredSats: ${params.requiredSats}. Current Balance: ${currentBalance}. Reserved Balance: ${reservedBalance}. Available Balance: ${currentBalance - reservedBalance}`
4249
- );
4277
+ if (currentBalanceInfo.balanceUnknown) {
4278
+ this._log(
4279
+ "DEBUG",
4280
+ `[RoutstrClient] _handleErrorResponse: Current balance unknown for ${baseUrl}; using default topup amount=${topupAmount}`
4281
+ );
4282
+ } else {
4283
+ const currentBalance = currentBalanceInfo.unit === "msat" ? currentBalanceInfo.amount / 1e3 : currentBalanceInfo.amount;
4284
+ const reservedBalance = currentBalanceInfo.unit === "msat" ? (currentBalanceInfo.reserved ?? 0) / 1e3 : currentBalanceInfo.reserved ?? 0;
4285
+ const shortfall = Math.max(
4286
+ 0,
4287
+ params.requiredSats - currentBalance + reservedBalance
4288
+ );
4289
+ topupAmount = shortfall > 0.21 * params.requiredSats ? shortfall : 0.21 * params.requiredSats;
4290
+ this._log(
4291
+ "DEBUG",
4292
+ `The shortfall is: ${shortfall}. requiredSats: ${params.requiredSats}. Current Balance: ${currentBalance}. Reserved Balance: ${reservedBalance}. Available Balance: ${currentBalance - reservedBalance}`
4293
+ );
4294
+ }
4250
4295
  } catch (e) {
4251
4296
  this._log(
4252
4297
  "WARN",
@@ -4332,7 +4377,7 @@ var RoutstrClient = class {
4332
4377
  this.storageAdapter.removeApiKey(baseUrl);
4333
4378
  tryNextProvider = true;
4334
4379
  } else {
4335
- const latestTokenBalance = latestBalanceInfo.unit === "msat" ? latestBalanceInfo.amount / 1e3 : latestBalanceInfo.amount;
4380
+ const latestTokenBalance = latestBalanceInfo.balanceUnknown ? void 0 : latestBalanceInfo.unit === "msat" ? latestBalanceInfo.amount / 1e3 : latestBalanceInfo.amount;
4336
4381
  if (latestBalanceInfo.apiKey) {
4337
4382
  const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);
4338
4383
  if (storedApiKeyEntry?.key !== latestBalanceInfo.apiKey) {
@@ -4343,7 +4388,7 @@ var RoutstrClient = class {
4343
4388
  }
4344
4389
  retryToken = latestBalanceInfo.apiKey;
4345
4390
  }
4346
- if (latestTokenBalance >= 0) {
4391
+ if (latestTokenBalance !== void 0 && latestTokenBalance >= 0) {
4347
4392
  this.storageAdapter.updateApiKeyBalance(
4348
4393
  baseUrl,
4349
4394
  latestTokenBalance
@@ -4418,7 +4463,7 @@ var RoutstrClient = class {
4418
4463
  "DEBUG",
4419
4464
  `[RoutstrClient] _handleErrorResponse: API key refund result: success=${refundResult.success}, message=${refundResult.message}`
4420
4465
  );
4421
- if (!refundResult.success && latestBalanceInfo.amount > 0) {
4466
+ if (!refundResult.success && latestBalanceInfo.amount > 0 && !latestBalanceInfo.balanceUnknown) {
4422
4467
  throw new ProviderError(
4423
4468
  baseUrl,
4424
4469
  status,
@@ -4469,7 +4514,7 @@ var RoutstrClient = class {
4469
4514
  amount: newRequiredSats,
4470
4515
  baseUrl: nextProvider
4471
4516
  });
4472
- return this._makeRequest({
4517
+ const retryResponse = await this._makeRequest({
4473
4518
  ...params,
4474
4519
  path,
4475
4520
  method,
@@ -4481,6 +4526,9 @@ var RoutstrClient = class {
4481
4526
  headers: this._withAuthHeader(params.baseHeaders, spendResult.token),
4482
4527
  retryCount: 0
4483
4528
  });
4529
+ retryResponse.initialTokenBalanceInSats = spendResult.tokenBalanceUnit === "msat" ? spendResult.tokenBalance / 1e3 : spendResult.tokenBalance;
4530
+ retryResponse.initialTokenBalanceUnknown = spendResult.tokenBalanceUnknown;
4531
+ return retryResponse;
4484
4532
  }
4485
4533
  throw new FailoverError(
4486
4534
  baseUrl,
@@ -4496,6 +4544,7 @@ var RoutstrClient = class {
4496
4544
  baseUrl,
4497
4545
  mintUrl,
4498
4546
  initialTokenBalance,
4547
+ initialTokenBalanceUnknown,
4499
4548
  fallbackSatsSpent,
4500
4549
  response,
4501
4550
  modelId,
@@ -4532,17 +4581,19 @@ var RoutstrClient = class {
4532
4581
  latestBalanceInfo.apiKey,
4533
4582
  baseUrl
4534
4583
  );
4535
- const latestTokenBalance = latestBalanceInfo.unit === "msat" ? latestBalanceInfo.amount / 1e3 : latestBalanceInfo.amount;
4584
+ const latestTokenBalance = latestBalanceInfo.balanceUnknown ? void 0 : latestBalanceInfo.unit === "msat" ? latestBalanceInfo.amount / 1e3 : latestBalanceInfo.amount;
4536
4585
  const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);
4537
4586
  if (storedApiKeyEntry?.key.startsWith("cashu") && latestBalanceInfo.apiKey) {
4538
4587
  this.storageAdapter.removeApiKey(baseUrl);
4539
4588
  this.storageAdapter.setApiKey(baseUrl, latestBalanceInfo.apiKey);
4540
4589
  }
4541
- this.storageAdapter.updateApiKeyBalance(baseUrl, latestTokenBalance);
4542
- satsSpent = initialTokenBalance - latestTokenBalance;
4590
+ if (latestTokenBalance !== void 0) {
4591
+ this.storageAdapter.updateApiKeyBalance(baseUrl, latestTokenBalance);
4592
+ }
4593
+ satsSpent = latestTokenBalance !== void 0 && !initialTokenBalanceUnknown ? Math.max(0, initialTokenBalance - latestTokenBalance) : fallbackSatsSpent ?? usage?.satsCost ?? 0;
4543
4594
  } catch (e) {
4544
4595
  this._log("WARN", "Could not get updated API key balance:", e);
4545
- satsSpent = fallbackSatsSpent ?? initialTokenBalance;
4596
+ satsSpent = fallbackSatsSpent ?? usage?.satsCost ?? 0;
4546
4597
  }
4547
4598
  }
4548
4599
  await this._trackResponseUsage({
@@ -4792,6 +4843,7 @@ var RoutstrClient = class {
4792
4843
  }
4793
4844
  let tokenBalance = 0;
4794
4845
  let tokenBalanceUnit = "sat";
4846
+ let tokenBalanceUnknown = false;
4795
4847
  const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();
4796
4848
  const distributionForBaseUrl = apiKeyDistribution.find(
4797
4849
  (d) => d.baseUrl === baseUrl
@@ -4807,6 +4859,7 @@ var RoutstrClient = class {
4807
4859
  );
4808
4860
  tokenBalance = balanceInfo.amount;
4809
4861
  tokenBalanceUnit = balanceInfo.unit;
4862
+ tokenBalanceUnknown = Boolean(balanceInfo.balanceUnknown);
4810
4863
  } catch (e) {
4811
4864
  this._log("WARN", "Could not get initial API key balance:", e);
4812
4865
  }
@@ -4818,7 +4871,8 @@ var RoutstrClient = class {
4818
4871
  return {
4819
4872
  token: parentApiKey?.key ?? "",
4820
4873
  tokenBalance,
4821
- tokenBalanceUnit
4874
+ tokenBalanceUnit,
4875
+ tokenBalanceUnknown
4822
4876
  };
4823
4877
  }
4824
4878
  this._log(
@@ -4847,7 +4901,8 @@ var RoutstrClient = class {
4847
4901
  return {
4848
4902
  token: spendResult.token,
4849
4903
  tokenBalance: spendResult.balance,
4850
- tokenBalanceUnit: spendResult.unit ?? "sat"
4904
+ tokenBalanceUnit: spendResult.unit ?? "sat",
4905
+ tokenBalanceUnknown: false
4851
4906
  };
4852
4907
  }
4853
4908
  /**