@bsv/wallet-toolbox 1.5.9 → 1.5.11
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/CHANGELOG.md +4 -0
- package/docs/client.md +10 -0
- package/docs/services.md +10 -0
- package/docs/wallet.md +10 -0
- package/mobile/out/src/services/ServiceCollection.d.ts +5 -0
- package/mobile/out/src/services/ServiceCollection.d.ts.map +1 -1
- package/mobile/out/src/services/ServiceCollection.js +11 -0
- package/mobile/out/src/services/ServiceCollection.js.map +1 -1
- package/mobile/out/src/services/Services.d.ts.map +1 -1
- package/mobile/out/src/services/Services.js +4 -0
- package/mobile/out/src/services/Services.js.map +1 -1
- package/mobile/out/src/services/providers/ARC.d.ts.map +1 -1
- package/mobile/out/src/services/providers/ARC.js +2 -1
- package/mobile/out/src/services/providers/ARC.js.map +1 -1
- package/mobile/package-lock.json +6 -6
- package/mobile/package.json +2 -2
- package/out/src/services/ServiceCollection.d.ts +5 -0
- package/out/src/services/ServiceCollection.d.ts.map +1 -1
- package/out/src/services/ServiceCollection.js +11 -0
- package/out/src/services/ServiceCollection.js.map +1 -1
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +4 -0
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/__tests/ARC.timeout.man.test.d.ts +2 -0
- package/out/src/services/__tests/ARC.timeout.man.test.d.ts.map +1 -0
- package/out/src/services/__tests/ARC.timeout.man.test.js +74 -0
- package/out/src/services/__tests/ARC.timeout.man.test.js.map +1 -0
- package/out/src/services/__tests/postBeef.test.js +16 -0
- package/out/src/services/__tests/postBeef.test.js.map +1 -1
- package/out/src/services/providers/ARC.d.ts.map +1 -1
- package/out/src/services/providers/ARC.js +2 -1
- package/out/src/services/providers/ARC.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/services/ServiceCollection.ts +12 -0
- package/src/services/Services.ts +4 -0
- package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
- package/src/services/__tests/postBeef.test.ts +19 -1
- package/src/services/providers/ARC.ts +2 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/wallet-toolbox",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.11",
|
|
4
4
|
"description": "BRC100 conforming wallet, wallet storage and wallet signer components",
|
|
5
5
|
"main": "./out/src/index.js",
|
|
6
6
|
"types": "./out/src/index.d.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@bsv/auth-express-middleware": "^1.2.0",
|
|
34
34
|
"@bsv/payment-express-middleware": "^1.2.1",
|
|
35
|
-
"@bsv/sdk": "^1.6.
|
|
35
|
+
"@bsv/sdk": "^1.6.15",
|
|
36
36
|
"express": "^4.21.2",
|
|
37
37
|
"idb": "^8.0.2",
|
|
38
38
|
"knex": "^3.1.0",
|
|
@@ -59,6 +59,18 @@ export class ServiceCollection<T> {
|
|
|
59
59
|
return all
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Used to de-prioritize a service call by moving it to the end of the list.
|
|
64
|
+
* @param stc
|
|
65
|
+
*/
|
|
66
|
+
moveServiceToLast(stc: ServiceToCall<T>) {
|
|
67
|
+
const index = this.services.findIndex(s => s.name === stc.providerName)
|
|
68
|
+
if (index !== -1) {
|
|
69
|
+
const [service] = this.services.splice(index, 1)
|
|
70
|
+
this.services.push(service)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
62
74
|
get allServices() {
|
|
63
75
|
return this.services.map(x => x.service)
|
|
64
76
|
}
|
package/src/services/Services.ts
CHANGED
|
@@ -280,6 +280,10 @@ export class Services implements sdk.WalletServices {
|
|
|
280
280
|
const r = await callService(stc)
|
|
281
281
|
rs.push(r)
|
|
282
282
|
if (r.status === 'success') break
|
|
283
|
+
if (r.txidResults && r.txidResults.every(txr => txr.serviceError)) {
|
|
284
|
+
// move this service to the end of the list
|
|
285
|
+
this.postBeefServices.moveServiceToLast(stc)
|
|
286
|
+
}
|
|
283
287
|
}
|
|
284
288
|
}
|
|
285
289
|
break
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
|
|
2
|
+
import { defaultHttpClient, HttpClientRequestOptions } from '@bsv/sdk'
|
|
3
|
+
|
|
4
|
+
describe('ARC tests', () => {
|
|
5
|
+
jest.setTimeout(99999999)
|
|
6
|
+
|
|
7
|
+
const envMain = _tu.getEnv('main')
|
|
8
|
+
test('11 post to TAAL for timeout', async () => {
|
|
9
|
+
const httpClient = defaultHttpClient()
|
|
10
|
+
const url = `https://arc.taal.com/v1/tx`
|
|
11
|
+
|
|
12
|
+
const headers: Record<string, string> = {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'XDeployment-ID': 'wallet-toolbox-test11',
|
|
15
|
+
Authorization: `Bearer ${envMain.taalApiKey}`
|
|
16
|
+
}
|
|
17
|
+
const requestOptions: HttpClientRequestOptions = {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers,
|
|
20
|
+
data: { rawTx: beef905631 },
|
|
21
|
+
signal: AbortSignal.timeout(100)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const response = await httpClient.request(url, requestOptions)
|
|
26
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
27
|
+
} catch (error: any) {
|
|
28
|
+
console.log('Error posting to TAAL:', error.message)
|
|
29
|
+
expect(error.code).toBe('ABORT_ERR')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
requestOptions.signal = AbortSignal.timeout(30000) // 30 seconds timeout
|
|
34
|
+
const response = await httpClient.request(url, requestOptions)
|
|
35
|
+
expect(response.status).toBe(200)
|
|
36
|
+
} catch (error: any) {
|
|
37
|
+
console.log('Error posting to TAAL:', error.message)
|
|
38
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('12 post to GorillaPool for timeout', async () => {
|
|
43
|
+
const httpClient = defaultHttpClient()
|
|
44
|
+
const url = `https://arc.gorillapool.io/v1/tx`
|
|
45
|
+
|
|
46
|
+
const headers: Record<string, string> = {
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
'XDeployment-ID': 'wallet-toolbox-test11',
|
|
49
|
+
//Authorization: `Bearer ${envMain.gorillaPoolApiKey}`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const requestOptions: HttpClientRequestOptions = {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers,
|
|
55
|
+
data: { rawTx: beef905631 },
|
|
56
|
+
signal: AbortSignal.timeout(100)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const response = await httpClient.request(url, requestOptions)
|
|
61
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
62
|
+
} catch (error: any) {
|
|
63
|
+
console.log('Error posting to TAAL:', error.message)
|
|
64
|
+
expect(error.code).toBe('ABORT_ERR')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
requestOptions.signal = AbortSignal.timeout(30000) // 30 seconds timeout
|
|
69
|
+
const response = await httpClient.request(url, requestOptions)
|
|
70
|
+
expect(response.status).toBe(200)
|
|
71
|
+
} catch (error: any) {
|
|
72
|
+
console.log('Error posting to TAAL:', error.message)
|
|
73
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const beef905631 =
|
|
79
|
+
'0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BeefTx } from '@bsv/sdk'
|
|
1
|
+
import { Beef, BeefTx } from '@bsv/sdk'
|
|
2
2
|
import { Services } from '../../index.client'
|
|
3
3
|
import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
|
|
4
4
|
import { sdk, Setup } from '../../index.all'
|
|
@@ -17,8 +17,26 @@ describe('postBeef service tests', () => {
|
|
|
17
17
|
const services = createServices('test')
|
|
18
18
|
await postBeefTest(services)
|
|
19
19
|
})
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Test to verify deprioritization of a postBeef service that times out.
|
|
23
|
+
*/
|
|
24
|
+
test.skip('2 postBeef mainnet timeout', async () => {
|
|
25
|
+
if (Setup.noEnv('main')) return
|
|
26
|
+
const services = createServices('main')
|
|
27
|
+
const beef = Beef.fromString(beefTimeout)
|
|
28
|
+
const txid = beef.txs.slice(-1)[0].txid
|
|
29
|
+
const svcs0 = [...services.postBeefServices.services]
|
|
30
|
+
const r = await services.postBeef(beef, [txid])
|
|
31
|
+
const svcs1 = [...services.postBeefServices.services]
|
|
32
|
+
expect(svcs0[1].name).toBe('TaalArcBeef')
|
|
33
|
+
expect(svcs1.slice(-1)[0].name).toBe('TaalArcBeef')
|
|
34
|
+
})
|
|
20
35
|
})
|
|
21
36
|
|
|
37
|
+
const beefTimeout =
|
|
38
|
+
'0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
|
|
39
|
+
|
|
22
40
|
function createServices(chain: sdk.Chain): Services {
|
|
23
41
|
const env = _tu.getEnv(chain)
|
|
24
42
|
const options = Services.createDefaultOptions(chain)
|
|
@@ -135,7 +135,8 @@ export class ARC {
|
|
|
135
135
|
const requestOptions: HttpClientRequestOptions = {
|
|
136
136
|
method: 'POST',
|
|
137
137
|
headers: this.requestHeaders(),
|
|
138
|
-
data: { rawTx }
|
|
138
|
+
data: { rawTx },
|
|
139
|
+
signal: AbortSignal.timeout(1000 * 30) // 30 seconds timeout, error.code will be 'ABORT_ERR'
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
const r: sdk.PostTxResultForTxid = {
|