@bsv/wallet-toolbox 1.6.10 → 1.6.13

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 (62) hide show
  1. package/docs/client.md +76 -4
  2. package/docs/services.md +76 -4
  3. package/docs/wallet.md +76 -4
  4. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +10 -0
  5. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
  6. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  7. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +7 -6
  8. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  9. package/mobile/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +4 -0
  10. package/mobile/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
  11. package/mobile/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +4 -0
  12. package/mobile/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
  13. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts +20 -2
  14. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  15. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.js +22 -4
  16. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  17. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts +32 -0
  18. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  19. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +32 -0
  20. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  21. package/mobile/package-lock.json +2 -2
  22. package/mobile/package.json +1 -1
  23. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +10 -0
  24. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
  25. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
  26. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +8 -0
  27. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
  28. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js +11 -0
  29. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js.map +1 -1
  30. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  31. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +7 -6
  32. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  33. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +4 -0
  34. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
  35. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +4 -0
  36. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
  37. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +4 -0
  38. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
  39. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +4 -0
  40. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
  41. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts +20 -2
  42. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  43. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js +22 -4
  44. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  45. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts +32 -0
  46. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  47. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +32 -0
  48. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  49. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
  50. package/out/src/storage/remoting/StorageServer.js +4 -0
  51. package/out/src/storage/remoting/StorageServer.js.map +1 -1
  52. package/out/tsconfig.all.tsbuildinfo +1 -1
  53. package/package.json +1 -1
  54. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +10 -0
  55. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +11 -1
  56. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +12 -0
  57. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +7 -6
  58. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +4 -0
  59. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +4 -0
  60. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +23 -5
  61. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +32 -0
  62. package/src/storage/remoting/StorageServer.ts +5 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsv/wallet-toolbox",
3
- "version": "1.6.10",
3
+ "version": "1.6.13",
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",
@@ -1,5 +1,15 @@
1
1
  import { HttpClient } from '@bsv/sdk'
2
2
 
3
+ /**
4
+ * Provides a simplified interface based on the @bsv/sdk `HttpClient` class
5
+ * with just the methods necesary for most Chaintracks operations.
6
+ *
7
+ * The primary purpose is to isolate and centralize external package dependency.
8
+ *
9
+ * Specific ingestors are free to use other means for access.
10
+ *
11
+ * The `ChaintracksFetch` class implements this interface.
12
+ */
3
13
  export interface ChaintracksFetchApi {
4
14
  httpClient: HttpClient
5
15
  download(url: string): Promise<Uint8Array>
@@ -1,7 +1,7 @@
1
1
  import { Chaintracks } from './Chaintracks'
2
2
 
3
3
  import { IncomingMessage, Server, ServerResponse } from 'http'
4
- import express from 'express'
4
+ import express, { Request, Response } from 'express'
5
5
  import bodyParser from 'body-parser'
6
6
  import { Chain } from '../../../sdk/types'
7
7
  import { createNoDbChaintracksOptions } from './createDefaultNoDbChaintracksOptions'
@@ -85,6 +85,16 @@ export class ChaintracksService {
85
85
  }
86
86
  })
87
87
 
88
+ app.get(`/robots.txt`, (req: Request, res: Response) => {
89
+ res.type('text/plain')
90
+ res.send(`User-agent: *\nDisallow: /`)
91
+ })
92
+
93
+ app.get(`/`, (req: Request, res: Response) => {
94
+ res.type('text/plain')
95
+ res.send(`Chaintracks ${this.chain}Net Block Header Service`)
96
+ })
97
+
88
98
  const handleErr = (err: any, res: any) => {
89
99
  res.status(500).json({
90
100
  status: 'error',
@@ -4,6 +4,7 @@ import { wait } from '../../../../utility/utilityHelpers'
4
4
  import { Chain } from '../../../../sdk'
5
5
  import { createNoDbChaintracksOptions } from '../createDefaultNoDbChaintracksOptions'
6
6
  import { ChaintracksFs } from '../util/ChaintracksFs'
7
+ import { LocalCdnServer } from './LocalCdnServer'
7
8
 
8
9
  const rootFolder = './src/services/chaintracker/chaintracks/__tests/data'
9
10
 
@@ -39,6 +40,17 @@ describe('Chaintracks tests', () => {
39
40
  await NoDbBody('test', true)
40
41
  })
41
42
 
43
+ test.skip('5 run local CDN on port 8300', async () => {
44
+ const fs = ChaintracksFs
45
+ const server = new LocalCdnServer(8300, fs.pathJoin(rootFolder, 'export'))
46
+ await server.start()
47
+ let done = false
48
+ for (; !done; ) {
49
+ await wait(10000)
50
+ }
51
+ await server.stop()
52
+ })
53
+
42
54
  async function NoDbBody(chain: Chain, exportHeaders?: boolean) {
43
55
  const o = createNoDbChaintracksOptions(chain)
44
56
  const c = new Chaintracks(o)
@@ -192,11 +192,8 @@ export class BulkFileDataManager {
192
192
  } else if (isBdfIncremental(vbf) && lbf && isBdfIncremental(lbf)) {
193
193
  await this.mergeIncremental(lbf, vbf, r)
194
194
  } else {
195
- const added = this.add(vbf)
195
+ const added = await this.add(vbf)
196
196
  r.inserted.push(added)
197
- if (this.storage) {
198
- vbf.fileId = await this.storage.insertBulkFile(added)
199
- }
200
197
  }
201
198
  }
202
199
  this.log(`BulkFileDataManager.merge:\n${this.toLogString(r)}\n`)
@@ -515,13 +512,17 @@ export class BulkFileDataManager {
515
512
  }
516
513
  }
517
514
 
518
- private add(bfd: BulkFileData): BulkHeaderFileInfo {
515
+ private async add(bfd: BulkFileData): Promise<BulkHeaderFileInfo> {
519
516
  this.validateBfdForAdd(bfd)
520
517
  const index = this.bfds.length
521
518
  this.bfds.push(bfd)
522
519
  this.fileHashToIndex[bfd.fileHash] = index
523
520
  this.ensureMaxRetained()
524
- return bfdToInfo(bfd, true)
521
+ const info = bfdToInfo(bfd, true)
522
+ if (this.storage) {
523
+ info.fileId = bfd.fileId = await this.storage.insertBulkFile(info)
524
+ }
525
+ return info
525
526
  }
526
527
 
527
528
  private replaceBfdAtIndex(index: number, update: BulkFileData): void {
@@ -1,6 +1,10 @@
1
1
  import { defaultHttpClient, HttpClient } from '@bsv/sdk'
2
2
  import { ChaintracksFetchApi } from '../Api/ChaintracksFetchApi'
3
3
 
4
+ /**
5
+ * This class implements the ChaintracksFetchApi
6
+ * using the @bsv/sdk `defaultHttpClient`.
7
+ */
4
8
  export class ChaintracksFetch implements ChaintracksFetchApi {
5
9
  httpClient: HttpClient = defaultHttpClient()
6
10
 
@@ -38,6 +38,10 @@ export abstract class ChaintracksFsStatics {
38
38
  }
39
39
  }
40
40
 
41
+ /**
42
+ * This object is an implementation of the `ChaintracksFsApi` interface
43
+ * using the `fs` package which may not be available in all environments.
44
+ */
41
45
  export const ChaintracksFs: ChaintracksFsApi = ChaintracksFsStatics
42
46
 
43
47
  export class ChaintracksReadableFile implements ChaintracksReadableFileApi {
@@ -10,16 +10,32 @@ export interface HeightRanges {
10
10
  live: HeightRange
11
11
  }
12
12
 
13
+ /**
14
+ * Represents a range of block heights.
15
+ *
16
+ * Operations support integrating contiguous batches of headers,
17
+ */
13
18
  export class HeightRange implements HeightRangeApi {
14
19
  constructor(
15
20
  public minHeight: number,
16
21
  public maxHeight: number
17
22
  ) {}
18
23
 
24
+ /**
25
+ * All ranges where maxHeight is less than minHeight are considered empty.
26
+ * The canonical empty range is (0, -1).
27
+ */
19
28
  static readonly empty = new HeightRange(0, -1)
20
29
 
21
30
  /**
22
- * @param headers
31
+ * @returns true iff minHeight is greater than maxHeight.
32
+ */
33
+ get isEmpty() {
34
+ return this.minHeight > this.maxHeight
35
+ }
36
+
37
+ /**
38
+ * @param headers an array of objects with a non-negative integer `height` property.
23
39
  * @returns range of height values from the given headers, or the empty range if there are no headers.
24
40
  */
25
41
  static from(headers: BlockHeader[]): HeightRange {
@@ -29,14 +45,16 @@ export class HeightRange implements HeightRangeApi {
29
45
  return new HeightRange(minHeight, maxHeight)
30
46
  }
31
47
 
48
+ /**
49
+ * @returns the number of heights in the range, or 0 if the range is empty.
50
+ */
32
51
  get length() {
33
52
  return Math.max(0, this.maxHeight - this.minHeight + 1)
34
53
  }
35
54
 
36
- get isEmpty() {
37
- return this.minHeight > this.maxHeight
38
- }
39
-
55
+ /**
56
+ * @returns an easy to read string representation of the height range.
57
+ */
40
58
  toString(): string {
41
59
  return this.isEmpty ? '<empty>' : `${this.minHeight}-${this.maxHeight}`
42
60
  }
@@ -1,5 +1,29 @@
1
1
  import { BulkHeaderFileInfo } from './BulkHeaderFile'
2
2
 
3
+ /**
4
+ * Compares meta data received for a bulk header file `vbf` to known
5
+ * valid bulk header files based on their `fileHash`.
6
+ *
7
+ * Short circuits both the retreival and validation of individual headers,
8
+ * only a single SHA256 hash of the aggregate data needs to be compared.
9
+ *
10
+ * The standard file size for historic block headers is 100,000 per file
11
+ * which results in a many orders of magnitude initialization speedup.
12
+ *
13
+ * The following properties must match:
14
+ * - `firstHeight`
15
+ * - `count`
16
+ * - `prevChainWork`
17
+ * - `prevHash`
18
+ * - `lastChainWork`
19
+ * - `lastHash`
20
+ * - `chain`
21
+ *
22
+ * @param vbf
23
+ * @returns true iff bulk file meta data (excluding its source) matches a known file.
24
+ *
25
+ * @publicbody
26
+ */
3
27
  export function isKnownValidBulkHeaderFile(vbf: BulkHeaderFileInfo): boolean {
4
28
  if (!vbf || !vbf.fileHash) return false
5
29
  const bf = validBulkHeaderFilesByFileHash()[vbf.fileHash]
@@ -20,6 +44,10 @@ export function isKnownValidBulkHeaderFile(vbf: BulkHeaderFileInfo): boolean {
20
44
 
21
45
  let _validBulkHeaderFilesByFileHash: Record<string, BulkHeaderFileInfo> | undefined
22
46
 
47
+ /**
48
+ * Hash map of known valid bulk header files by their `fileHash`.
49
+ * @returns object where keys are file hashes of known bulk header files.
50
+ */
23
51
  export function validBulkHeaderFilesByFileHash(): Record<string, BulkHeaderFileInfo> {
24
52
  if (!_validBulkHeaderFilesByFileHash) {
25
53
  _validBulkHeaderFilesByFileHash = {}
@@ -32,6 +60,10 @@ export function validBulkHeaderFilesByFileHash(): Record<string, BulkHeaderFileI
32
60
  return _validBulkHeaderFilesByFileHash
33
61
  }
34
62
 
63
+ /**
64
+ * Static array of known valid bulk header files.
65
+ * `sourceUrl` is included only as a reference to the original certifying authority.
66
+ */
35
67
  export const validBulkHeaderFiles: BulkHeaderFileInfo[] = [
36
68
  {
37
69
  sourceUrl: 'https://cdn.projectbabbage.com/blockheaders',
@@ -66,6 +66,11 @@ export class StorageServer {
66
66
  res.send(`User-agent: *\nDisallow: /`)
67
67
  })
68
68
 
69
+ this.app.get(`/`, (req: Request, res: Response) => {
70
+ res.type('text/plain')
71
+ res.send(`BRC-100 ${this.wallet.chain}Net Storage Provider.`)
72
+ })
73
+
69
74
  const options: AuthMiddlewareOptions = {
70
75
  wallet: this.wallet as WalletInterface
71
76
  }