@bsv/wallet-toolbox 1.5.9 → 1.5.10

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 -0
  14. package/mobile/out/src/services/providers/ARC.js.map +1 -1
  15. package/mobile/package-lock.json +2 -2
  16. package/mobile/package.json +1 -1
  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 +33 -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 -0
  32. package/out/src/services/providers/ARC.js.map +1 -1
  33. package/out/tsconfig.all.tsbuildinfo +1 -1
  34. package/package.json +1 -1
  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 +36 -0
  38. package/src/services/__tests/postBeef.test.ts +19 -1
  39. package/src/services/providers/ARC.ts +2 -0
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.10",
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",
@@ -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,36 @@
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
+ }
22
+
23
+ requestOptions['signal'] = AbortSignal.timeout(5000)
24
+
25
+ try {
26
+ const response = await httpClient.request(url, requestOptions)
27
+ expect(response.status).toBe(200)
28
+ } catch (error: any) {
29
+ console.log('Error posting to TAAL:', error.message)
30
+ expect(error.code).toBe('ABORT_ERR')
31
+ }
32
+ })
33
+ })
34
+
35
+ const beef905631 =
36
+ '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)
@@ -143,6 +143,8 @@ export class ARC {
143
143
  status: 'success',
144
144
  notes: []
145
145
  }
146
+ // Set a timeout on the request
147
+ requestOptions['signal'] = AbortSignal.timeout(1000 * 30) // 30 seconds timeout, error.code will be 'ABORT_ERR'
146
148
 
147
149
  const url = `${this.URL}/v1/tx`
148
150
  const nn = () => ({ name: this.name, when: new Date().toISOString() })