@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.
Files changed (39) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/docs/client.md +10 -0
  3. package/docs/services.md +10 -0
  4. package/docs/wallet.md +10 -0
  5. package/mobile/out/src/services/ServiceCollection.d.ts +5 -0
  6. package/mobile/out/src/services/ServiceCollection.d.ts.map +1 -1
  7. package/mobile/out/src/services/ServiceCollection.js +11 -0
  8. package/mobile/out/src/services/ServiceCollection.js.map +1 -1
  9. package/mobile/out/src/services/Services.d.ts.map +1 -1
  10. package/mobile/out/src/services/Services.js +4 -0
  11. package/mobile/out/src/services/Services.js.map +1 -1
  12. package/mobile/out/src/services/providers/ARC.d.ts.map +1 -1
  13. package/mobile/out/src/services/providers/ARC.js +2 -1
  14. package/mobile/out/src/services/providers/ARC.js.map +1 -1
  15. package/mobile/package-lock.json +6 -6
  16. package/mobile/package.json +2 -2
  17. package/out/src/services/ServiceCollection.d.ts +5 -0
  18. package/out/src/services/ServiceCollection.d.ts.map +1 -1
  19. package/out/src/services/ServiceCollection.js +11 -0
  20. package/out/src/services/ServiceCollection.js.map +1 -1
  21. package/out/src/services/Services.d.ts.map +1 -1
  22. package/out/src/services/Services.js +4 -0
  23. package/out/src/services/Services.js.map +1 -1
  24. package/out/src/services/__tests/ARC.timeout.man.test.d.ts +2 -0
  25. package/out/src/services/__tests/ARC.timeout.man.test.d.ts.map +1 -0
  26. package/out/src/services/__tests/ARC.timeout.man.test.js +74 -0
  27. package/out/src/services/__tests/ARC.timeout.man.test.js.map +1 -0
  28. package/out/src/services/__tests/postBeef.test.js +16 -0
  29. package/out/src/services/__tests/postBeef.test.js.map +1 -1
  30. package/out/src/services/providers/ARC.d.ts.map +1 -1
  31. package/out/src/services/providers/ARC.js +2 -1
  32. package/out/src/services/providers/ARC.js.map +1 -1
  33. package/out/tsconfig.all.tsbuildinfo +1 -1
  34. package/package.json +2 -2
  35. package/src/services/ServiceCollection.ts +12 -0
  36. package/src/services/Services.ts +4 -0
  37. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  38. package/src/services/__tests/postBeef.test.ts +19 -1
  39. 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.9",
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.12",
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
  }
@@ -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 = {