@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.
- package/dist/client/index.js +80 -25
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +80 -25
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +37 -3
- package/dist/discovery/index.d.ts +37 -3
- package/dist/discovery/index.js +231 -75
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +231 -75
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +592 -102
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +591 -103
- package/dist/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +27 -1
- package/dist/storage/index.d.ts +27 -1
- package/dist/storage/index.js +281 -2
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +280 -3
- package/dist/storage/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +4 -0
- package/dist/wallet/index.d.ts +4 -0
- package/dist/wallet/index.js +11 -4
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +11 -4
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/client/index.js
CHANGED
|
@@ -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:
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4542
|
-
|
|
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 ??
|
|
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
|
/**
|