@ipld/car 4.1.5 → 5.0.0

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 (226) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +12 -4
  3. package/dist/index.min.js +5 -0
  4. package/{types → dist/src}/api.d.ts +19 -19
  5. package/dist/src/api.d.ts.map +1 -0
  6. package/{types/lib → dist/src}/buffer-writer.d.ts +10 -10
  7. package/{types/lib → dist/src}/buffer-writer.d.ts.map +1 -1
  8. package/dist/src/coding.d.ts +41 -0
  9. package/dist/src/coding.d.ts.map +1 -0
  10. package/{types/lib → dist/src}/decoder.d.ts +3 -3
  11. package/{types/lib → dist/src}/decoder.d.ts.map +1 -1
  12. package/{types/lib → dist/src}/encoder.d.ts +2 -2
  13. package/{types/lib → dist/src}/encoder.d.ts.map +1 -1
  14. package/{types/lib → dist/src}/header-validator.d.ts +0 -0
  15. package/dist/src/header-validator.d.ts.map +1 -0
  16. package/dist/src/index-browser.d.ts +8 -0
  17. package/dist/src/index-browser.d.ts.map +1 -0
  18. package/dist/src/index.d.ts +9 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/{types/lib → dist/src}/indexed-reader-browser.d.ts +0 -0
  21. package/dist/src/indexed-reader-browser.d.ts.map +1 -0
  22. package/{types/lib → dist/src}/indexed-reader.d.ts +13 -13
  23. package/dist/src/indexed-reader.d.ts.map +1 -0
  24. package/{types/lib → dist/src}/indexer.d.ts +9 -9
  25. package/{types/lib → dist/src}/indexer.d.ts.map +1 -1
  26. package/{types/lib → dist/src}/iterator-channel.d.ts +0 -0
  27. package/{types/lib → dist/src}/iterator-channel.d.ts.map +1 -1
  28. package/{types/lib → dist/src}/iterator.d.ts +8 -8
  29. package/{types/lib → dist/src}/iterator.d.ts.map +1 -1
  30. package/{types/lib → dist/src}/reader-browser.d.ts +10 -10
  31. package/{types/lib → dist/src}/reader-browser.d.ts.map +1 -1
  32. package/{types/lib → dist/src}/reader.d.ts +5 -5
  33. package/{types/lib → dist/src}/reader.d.ts.map +1 -1
  34. package/{types/lib → dist/src}/writer-browser.d.ts +10 -10
  35. package/{types/lib → dist/src}/writer-browser.d.ts.map +1 -1
  36. package/{types/lib → dist/src}/writer.d.ts +4 -4
  37. package/{types/lib → dist/src}/writer.d.ts.map +1 -1
  38. package/package.json +102 -209
  39. package/{api.ts → src/api.ts} +14 -14
  40. package/{lib → src}/buffer-writer.js +5 -5
  41. package/src/coding.ts +56 -0
  42. package/{lib → src}/decoder.js +4 -4
  43. package/{lib → src}/encoder.js +1 -1
  44. package/src/header-validator.js +74 -0
  45. package/{lib → src}/header.ipldsch +0 -0
  46. package/src/index-browser.js +14 -0
  47. package/src/index.js +16 -0
  48. package/{lib → src}/indexed-reader-browser.js +0 -0
  49. package/{lib → src}/indexed-reader.js +9 -9
  50. package/{lib → src}/indexer.js +4 -4
  51. package/{lib → src}/iterator-channel.js +0 -0
  52. package/{lib → src}/iterator.js +4 -4
  53. package/{lib → src}/reader-browser.js +7 -7
  54. package/{lib → src}/reader.js +5 -5
  55. package/{lib → src}/writer-browser.js +7 -7
  56. package/{lib → src}/writer.js +3 -3
  57. package/LICENSE-APACHE +0 -13
  58. package/LICENSE-MIT +0 -7
  59. package/buffer-writer +0 -1
  60. package/car-browser.js +0 -14
  61. package/car.js +0 -16
  62. package/cjs/browser-test/common.js +0 -301
  63. package/cjs/browser-test/node-test-file-streams.js +0 -71
  64. package/cjs/browser-test/node-test-indexed-reader.js +0 -51
  65. package/cjs/browser-test/node-test-large.js +0 -135
  66. package/cjs/browser-test/node-test-raw.js +0 -68
  67. package/cjs/browser-test/node-test-updateroots.js +0 -78
  68. package/cjs/browser-test/test-buffer-writer.js +0 -330
  69. package/cjs/browser-test/test-errors.js +0 -90
  70. package/cjs/browser-test/test-indexer.js +0 -80
  71. package/cjs/browser-test/test-interface.js +0 -21
  72. package/cjs/browser-test/test-iterator.js +0 -83
  73. package/cjs/browser-test/test-reader.js +0 -278
  74. package/cjs/browser-test/test-writer.js +0 -286
  75. package/cjs/browser-test/verify-store-reader.js +0 -142
  76. package/cjs/car-browser.js +0 -18
  77. package/cjs/car.js +0 -20
  78. package/cjs/lib/buffer-writer.js +0 -164
  79. package/cjs/lib/decoder.js +0 -301
  80. package/cjs/lib/encoder.js +0 -44
  81. package/cjs/lib/header-validator.js +0 -29
  82. package/cjs/lib/indexed-reader-browser.js +0 -13
  83. package/cjs/lib/indexed-reader.js +0 -90
  84. package/cjs/lib/indexer.js +0 -41
  85. package/cjs/lib/iterator-channel.js +0 -77
  86. package/cjs/lib/iterator.js +0 -97
  87. package/cjs/lib/reader-browser.js +0 -62
  88. package/cjs/lib/reader.js +0 -38
  89. package/cjs/lib/writer-browser.js +0 -118
  90. package/cjs/lib/writer.js +0 -51
  91. package/cjs/node-test/common.js +0 -301
  92. package/cjs/node-test/node-test-file-streams.js +0 -71
  93. package/cjs/node-test/node-test-indexed-reader.js +0 -51
  94. package/cjs/node-test/node-test-large.js +0 -135
  95. package/cjs/node-test/node-test-raw.js +0 -68
  96. package/cjs/node-test/node-test-updateroots.js +0 -78
  97. package/cjs/node-test/test-buffer-writer.js +0 -330
  98. package/cjs/node-test/test-errors.js +0 -90
  99. package/cjs/node-test/test-indexer.js +0 -80
  100. package/cjs/node-test/test-interface.js +0 -21
  101. package/cjs/node-test/test-iterator.js +0 -83
  102. package/cjs/node-test/test-reader.js +0 -278
  103. package/cjs/node-test/test-writer.js +0 -286
  104. package/cjs/node-test/verify-store-reader.js +0 -142
  105. package/decoder +0 -1
  106. package/esm/browser-test/common.js +0 -274
  107. package/esm/browser-test/node-test-file-streams.js +0 -76
  108. package/esm/browser-test/node-test-indexed-reader.js +0 -53
  109. package/esm/browser-test/node-test-large.js +0 -109
  110. package/esm/browser-test/node-test-raw.js +0 -63
  111. package/esm/browser-test/node-test-updateroots.js +0 -76
  112. package/esm/browser-test/test-buffer-writer.js +0 -311
  113. package/esm/browser-test/test-errors.js +0 -91
  114. package/esm/browser-test/test-indexer.js +0 -85
  115. package/esm/browser-test/test-interface.js +0 -24
  116. package/esm/browser-test/test-iterator.js +0 -91
  117. package/esm/browser-test/test-reader.js +0 -270
  118. package/esm/browser-test/test-writer.js +0 -297
  119. package/esm/browser-test/verify-store-reader.js +0 -122
  120. package/esm/car-browser.js +0 -16
  121. package/esm/car.js +0 -18
  122. package/esm/lib/buffer-writer.js +0 -129
  123. package/esm/lib/decoder.js +0 -265
  124. package/esm/lib/encoder.js +0 -35
  125. package/esm/lib/header-validator.js +0 -23
  126. package/esm/lib/indexed-reader-browser.js +0 -6
  127. package/esm/lib/indexed-reader.js +0 -78
  128. package/esm/lib/indexer.js +0 -38
  129. package/esm/lib/iterator-channel.js +0 -71
  130. package/esm/lib/iterator.js +0 -92
  131. package/esm/lib/reader-browser.js +0 -57
  132. package/esm/lib/reader.js +0 -26
  133. package/esm/lib/writer-browser.js +0 -115
  134. package/esm/lib/writer.js +0 -42
  135. package/esm/node-test/common.js +0 -274
  136. package/esm/node-test/node-test-file-streams.js +0 -76
  137. package/esm/node-test/node-test-indexed-reader.js +0 -53
  138. package/esm/node-test/node-test-large.js +0 -109
  139. package/esm/node-test/node-test-raw.js +0 -63
  140. package/esm/node-test/node-test-updateroots.js +0 -76
  141. package/esm/node-test/test-buffer-writer.js +0 -311
  142. package/esm/node-test/test-errors.js +0 -91
  143. package/esm/node-test/test-indexer.js +0 -85
  144. package/esm/node-test/test-interface.js +0 -24
  145. package/esm/node-test/test-iterator.js +0 -91
  146. package/esm/node-test/test-reader.js +0 -270
  147. package/esm/node-test/test-writer.js +0 -297
  148. package/esm/node-test/verify-store-reader.js +0 -122
  149. package/esm/package.json +0 -9
  150. package/examples/car-to-fixture.js +0 -66
  151. package/examples/dump-car.js +0 -58
  152. package/examples/dump-index.js +0 -24
  153. package/examples/package.json +0 -27
  154. package/examples/round-trip.js +0 -45
  155. package/examples/test-examples.js +0 -115
  156. package/examples/verify-car.js +0 -87
  157. package/index.js +0 -1
  158. package/indexed-reader +0 -1
  159. package/indexer +0 -1
  160. package/iterator +0 -1
  161. package/lib/coding.ts +0 -56
  162. package/lib/header-validator.js +0 -33
  163. package/reader +0 -1
  164. package/test/_fixtures_to_js.mjs +0 -24
  165. package/test/common.js +0 -210
  166. package/test/go.car +0 -0
  167. package/test/go.carv2 +0 -0
  168. package/test/node-test-file-streams.js +0 -84
  169. package/test/node-test-indexed-reader.js +0 -45
  170. package/test/node-test-large.js +0 -112
  171. package/test/node-test-raw.js +0 -83
  172. package/test/node-test-updateroots.js +0 -89
  173. package/test/test-buffer-writer.js +0 -256
  174. package/test/test-errors.js +0 -98
  175. package/test/test-indexer.js +0 -87
  176. package/test/test-interface.js +0 -24
  177. package/test/test-iterator.js +0 -74
  178. package/test/test-reader.js +0 -245
  179. package/test/test-writer.js +0 -336
  180. package/test/verify-store-reader.js +0 -191
  181. package/tsconfig.json +0 -48
  182. package/types/api.d.ts.map +0 -1
  183. package/types/car-browser.d.ts +0 -8
  184. package/types/car-browser.d.ts.map +0 -1
  185. package/types/car.d.ts +0 -9
  186. package/types/car.d.ts.map +0 -1
  187. package/types/lib/coding.d.ts +0 -41
  188. package/types/lib/coding.d.ts.map +0 -1
  189. package/types/lib/header-validator.d.ts.map +0 -1
  190. package/types/lib/indexed-reader-browser.d.ts.map +0 -1
  191. package/types/lib/indexed-reader.d.ts.map +0 -1
  192. package/types/test/_fixtures_to_js.d.mts +0 -3
  193. package/types/test/_fixtures_to_js.d.mts.map +0 -1
  194. package/types/test/common.d.ts +0 -73
  195. package/types/test/common.d.ts.map +0 -1
  196. package/types/test/fixtures-expectations.d.ts +0 -63
  197. package/types/test/fixtures-expectations.d.ts.map +0 -1
  198. package/types/test/fixtures.d.ts +0 -3
  199. package/types/test/fixtures.d.ts.map +0 -1
  200. package/types/test/node-test-file-streams.d.ts +0 -3
  201. package/types/test/node-test-file-streams.d.ts.map +0 -1
  202. package/types/test/node-test-indexed-reader.d.ts +0 -2
  203. package/types/test/node-test-indexed-reader.d.ts.map +0 -1
  204. package/types/test/node-test-large.d.ts +0 -2
  205. package/types/test/node-test-large.d.ts.map +0 -1
  206. package/types/test/node-test-raw.d.ts +0 -2
  207. package/types/test/node-test-raw.d.ts.map +0 -1
  208. package/types/test/node-test-updateroots.d.ts +0 -2
  209. package/types/test/node-test-updateroots.d.ts.map +0 -1
  210. package/types/test/test-buffer-writer.d.ts +0 -2
  211. package/types/test/test-buffer-writer.d.ts.map +0 -1
  212. package/types/test/test-errors.d.ts +0 -2
  213. package/types/test/test-errors.d.ts.map +0 -1
  214. package/types/test/test-indexer.d.ts +0 -2
  215. package/types/test/test-indexer.d.ts.map +0 -1
  216. package/types/test/test-interface.d.ts +0 -2
  217. package/types/test/test-interface.d.ts.map +0 -1
  218. package/types/test/test-iterator.d.ts +0 -2
  219. package/types/test/test-iterator.d.ts.map +0 -1
  220. package/types/test/test-reader.d.ts +0 -2
  221. package/types/test/test-reader.d.ts.map +0 -1
  222. package/types/test/test-writer.d.ts +0 -2
  223. package/types/test/test-writer.d.ts.map +0 -1
  224. package/types/test/verify-store-reader.d.ts +0 -29
  225. package/types/test/verify-store-reader.d.ts.map +0 -1
  226. package/writer +0 -1
@@ -1,115 +0,0 @@
1
- import assert from 'assert'
2
- import { promisify } from 'util'
3
- import { execFile } from 'child_process'
4
- import { promises as fsPromises } from 'fs'
5
-
6
- const { unlink, stat } = fsPromises
7
-
8
- const goCarCids = [
9
- 'bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq',
10
- 'bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4',
11
- 'bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke',
12
- 'bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm',
13
- 'bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm',
14
- 'QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT',
15
- 'QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d',
16
- 'QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys']
17
-
18
- async function cleanGoCarDump () {
19
- return Promise.all(goCarCids.map((c) => unlink(c)))
20
- }
21
-
22
- async function runExample (name, args = []) {
23
- return promisify(execFile)(process.execPath, [`${name}.js`].concat(args))
24
- }
25
-
26
- runExample('round-trip').then(({ stdout, stderr }) => {
27
- assert.strictEqual(stderr, '')
28
- assert.strictEqual(stdout, 'Retrieved [random meaningless bytes] from example.car with CID [bafkreihwkf6mtnjobdqrkiksr7qhp6tiiqywux64aylunbvmfhzeql2coa]\n')
29
- console.log('\u001b[32m✔\u001b[39m [example] round-trip')
30
- }).then(async () => {
31
- await runExample('verify-car', ['example.car']).then(({ stdout, stderr }) => {
32
- assert.strictEqual(stderr, '')
33
- assert.strictEqual(stdout, 'Verified 1 block(s) in example.car\n')
34
- console.log('\u001b[32m✔\u001b[39m [example] verify-car example.car')
35
- })
36
- }).then(async () => {
37
- await runExample('verify-car', ['../test/go.car']).then(({ stdout, stderr }) => {
38
- assert.strictEqual(stderr, '')
39
- assert.strictEqual(stdout, 'Verified 8 block(s) in ../test/go.car\n')
40
- console.log('\u001b[32m✔\u001b[39m [example] verify-car ../test/go.car')
41
- })
42
- }).then(async () => {
43
- try {
44
- await cleanGoCarDump()
45
- } catch (err) {} // failure is expected, this is just a prep
46
- await runExample('dump-car', ['../test/go.car']).then(async ({ stdout, stderr }) => {
47
- assert.strictEqual(stderr, '')
48
- assert.strictEqual(stdout,
49
- `Version: 1
50
- Roots: [bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm, bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm]
51
- Blocks:
52
- #1 bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm [dag-cbor]
53
- '{"link":{"/":"QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d"},"name":"blip"}'
54
- #2 QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d [dag-pb]
55
- '{"Links":[{"Hash":{"/":"bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke"},"Name":"bear","Tsize":4},{"Hash":{"/":"QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys"},"Name":"second","Tsize":149}]}'
56
- #3 bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke [raw]
57
- '{"/":{"bytes":"Y2NjYw"}}'
58
- #4 QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys [dag-pb]
59
- '{"Links":[{"Hash":{"/":"bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4"},"Name":"dog","Tsize":4},{"Hash":{"/":"QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT"},"Name":"first","Tsize":51}]}'
60
- #5 bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4 [raw]
61
- '{"/":{"bytes":"YmJiYg"}}'
62
- #6 QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT [dag-pb]
63
- '{"Links":[{"Hash":{"/":"bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq"},"Name":"cat","Tsize":4}]}'
64
- #7 bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq [raw]
65
- '{"/":{"bytes":"YWFhYQ"}}'
66
- #8 bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm [dag-cbor]
67
- '{"link":null,"name":"limbo"}'
68
- `)
69
- assert.strictEqual((await Promise.all(goCarCids.map((c) => stat(c)))).map((s) => s.isFile()).filter(Boolean).length, goCarCids.length)
70
- await cleanGoCarDump()
71
- console.log('\u001b[32m✔\u001b[39m [example] dump-car ../test/go.car')
72
- })
73
- }).then(async () => {
74
- await runExample('car-to-fixture', ['../test/go.car']).then(({ stdout, stderr }) => {
75
- assert.strictEqual(stderr, '')
76
- assert.strictEqual(stdout, '{"blocks":[{"blockLength":55,"blockOffset":137,"cid":{"/":"bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm"},"content":{"link":{"/":"QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d"},"name":"blip"},"length":92,"offset":100},{"blockLength":97,"blockOffset":228,"cid":{"/":"QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d"},"content":{"Links":[{"Hash":{"/":"bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke"},"Name":"bear","Tsize":4},{"Hash":{"/":"QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys"},"Name":"second","Tsize":149}]},"length":133,"offset":192},{"blockLength":4,"blockOffset":362,"cid":{"/":"bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke"},"content":{"/":{"bytes":"Y2NjYw"}},"length":41,"offset":325},{"blockLength":94,"blockOffset":402,"cid":{"/":"QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys"},"content":{"Links":[{"Hash":{"/":"bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4"},"Name":"dog","Tsize":4},{"Hash":{"/":"QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT"},"Name":"first","Tsize":51}]},"length":130,"offset":366},{"blockLength":4,"blockOffset":533,"cid":{"/":"bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4"},"content":{"/":{"bytes":"YmJiYg"}},"length":41,"offset":496},{"blockLength":47,"blockOffset":572,"cid":{"/":"QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT"},"content":{"Links":[{"Hash":{"/":"bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq"},"Name":"cat","Tsize":4}]},"length":82,"offset":537},{"blockLength":4,"blockOffset":656,"cid":{"/":"bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq"},"content":{"/":{"bytes":"YWFhYQ"}},"length":41,"offset":619},{"blockLength":18,"blockOffset":697,"cid":{"/":"bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm"},"content":{"link":null,"name":"limbo"},"length":55,"offset":660}],"header":{"roots":[{"/":"bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm"},{"/":"bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm"}],"version":1}}\n')
77
- console.log('\u001b[32m✔\u001b[39m [example] car-to-fixture ../test/go.car')
78
- })
79
- }).then(async () => {
80
- await runExample('dump-index', ['example.car']).then(({ stdout, stderr }) => {
81
- assert.strictEqual(stderr, '')
82
- assert.strictEqual(stdout, '{"blockLength":24,"blockOffset":96,"cid":{"/":"bafkreihwkf6mtnjobdqrkiksr7qhp6tiiqywux64aylunbvmfhzeql2coa"},"length":61,"offset":59}\n')
83
- console.log('\u001b[32m✔\u001b[39m [example] dump-index example.car')
84
- })
85
- }).then(async () => {
86
- await runExample('dump-index', ['../test/go.car']).then(({ stdout, stderr }) => {
87
- assert.strictEqual(stderr, '')
88
- assert.strictEqual(stdout,
89
- `{"blockLength":55,"blockOffset":137,"cid":{"/":"bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm"},"length":92,"offset":100}
90
- {"blockLength":97,"blockOffset":228,"cid":{"/":"QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d"},"length":133,"offset":192}
91
- {"blockLength":4,"blockOffset":362,"cid":{"/":"bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke"},"length":41,"offset":325}
92
- {"blockLength":94,"blockOffset":402,"cid":{"/":"QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys"},"length":130,"offset":366}
93
- {"blockLength":4,"blockOffset":533,"cid":{"/":"bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4"},"length":41,"offset":496}
94
- {"blockLength":47,"blockOffset":572,"cid":{"/":"QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT"},"length":82,"offset":537}
95
- {"blockLength":4,"blockOffset":656,"cid":{"/":"bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq"},"length":41,"offset":619}
96
- {"blockLength":18,"blockOffset":697,"cid":{"/":"bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm"},"length":55,"offset":660}
97
- `)
98
- console.log('\u001b[32m✔\u001b[39m [example] dump-index ../test/go.carv2')
99
- })
100
- }).then(async () => {
101
- await runExample('dump-index', ['../test/go.carv2']).then(({ stdout, stderr }) => {
102
- assert.strictEqual(stderr, '')
103
- assert.strictEqual(stdout,
104
- `{"blockLength":47,"blockOffset":143,"cid":{"/":"QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z"},"length":82,"offset":108}
105
- {"blockLength":99,"blockOffset":226,"cid":{"/":"QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM"},"length":135,"offset":190}
106
- {"blockLength":54,"blockOffset":360,"cid":{"/":"Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE"},"length":89,"offset":325}
107
- {"blockLength":4,"blockOffset":451,"cid":{"/":"bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu"},"length":41,"offset":414}
108
- {"blockLength":7,"blockOffset":492,"cid":{"/":"bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju"},"length":44,"offset":455}
109
- `)
110
- console.log('\u001b[32m✔\u001b[39m [example] dump-index ../test/go.carv2')
111
- })
112
- }).catch((err) => {
113
- console.error(err.stack)
114
- process.exit(1)
115
- })
@@ -1,87 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // Example: verify a car file's block bytes match the reported CIDs and that
4
- // they have round-tripishness.
5
- // This example is overly verbose but illustrates some concepts involved in CAR
6
- // files.
7
-
8
- import fs from 'fs'
9
- import { bytes, CID } from 'multiformats'
10
- import { CarBlockIterator } from '@ipld/car/iterator'
11
- import * as dagCbor from '@ipld/dag-cbor'
12
- import * as dagPb from '@ipld/dag-pb'
13
- import * as dagJson from '@ipld/dag-json'
14
- import * as raw from 'multiformats/codecs/raw'
15
- import * as json from 'multiformats/codecs/json'
16
- import { sha256 } from 'multiformats/hashes/sha2'
17
- import { from as hasher } from 'multiformats/hashes/hasher'
18
- import { blake2b256 } from '@multiformats/blake2/blake2b'
19
-
20
- const { toHex } = bytes
21
-
22
- if (!process.argv[2]) {
23
- console.log('Usage: verify-car.js <path/to/car>')
24
- process.exit(1)
25
- }
26
-
27
- const codecs = {
28
- [dagCbor.code]: dagCbor,
29
- [dagPb.code]: dagPb,
30
- [dagJson.code]: dagJson,
31
- [raw.code]: raw,
32
- [json.code]: json
33
- }
34
-
35
- const hashes = {
36
- [sha256.code]: sha256,
37
- [blake2b256.code]: hasher(blake2b256)
38
- }
39
-
40
- async function run () {
41
- const inStream = fs.createReadStream(process.argv[2])
42
- const reader = await CarBlockIterator.fromIterable(inStream)
43
- let count = 0
44
-
45
- for await (const { bytes, cid } of reader) {
46
- // Verify step 1: is this a CID we know how to deal with?
47
- if (!codecs[cid.code]) {
48
- console.log(`Unexpected codec: 0x${cid.code.toString(16)}`)
49
- process.exit(1)
50
- }
51
- if (!hashes[cid.multihash.code]) {
52
- console.log(`Unexpected multihash code: 0x${cid.multihash.code.toString(16)}`)
53
- process.exit(1)
54
- }
55
-
56
- // Verify step 2: if we hash the bytes, do we get the same digest as reported by the CID?
57
- // Note that this step is sufficient if you just want to safely verify the CAR's reported CIDs
58
- const hash = await hashes[cid.multihash.code].digest(bytes)
59
- if (toHex(hash.digest) !== toHex(cid.multihash.digest)) {
60
- console.log(`\nMismatch: digest of bytes (${toHex(hash)}) does not match digest in CID (${toHex(cid.multihash.digest)})`)
61
- }
62
-
63
- // Verify step 3: Can we round-trip the object and get the same CID for the re-encoded bytes?
64
- // Note that this step is rarely useful and may be over-kill in most cases of "verification"
65
- const obj = codecs[cid.code].decode(bytes)
66
- const reenc = codecs[cid.code].encode(obj)
67
- const rehash = await hashes[cid.multihash.code].digest(reenc)
68
- const recid = CID.create(cid.version, cid.code, rehash)
69
- if (!recid.equals(cid)) {
70
- console.log(`\nMismatch: ${cid} <> ${recid}`)
71
- console.log(`Orig:\n${toHex(bytes)}\nRe-encode:\n${toHex(reenc)}`)
72
- }
73
-
74
- if (++count % 100 === 0) {
75
- process.stdout.write('.')
76
- }
77
- }
78
- if (count > 100) {
79
- console.log()
80
- }
81
- console.log(`Verified ${count} block(s) in ${process.argv[2]}`)
82
- }
83
-
84
- run().catch((err) => {
85
- console.error(err)
86
- process.exit(1)
87
- })
package/index.js DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./cjs/car.js')
package/indexed-reader DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./cjs/lib/indexed-reader.js')
package/indexer DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./cjs/lib/indexer.js')
package/iterator DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./cjs/lib/iterator.js')
package/lib/coding.ts DELETED
@@ -1,56 +0,0 @@
1
- import { CID } from 'multiformats/cid'
2
- import { Block, BlockIndex } from '../api'
3
-
4
- export interface CarEncoder {
5
- setRoots(roots: CID[]): Promise<void>
6
-
7
- writeBlock(block: Block): Promise<void>
8
-
9
- close(): Promise<void>
10
- }
11
-
12
- export interface IteratorChannel_Writer<T> {
13
- write(chunk: T): Promise<void>
14
- end(): Promise<void>
15
- }
16
-
17
- export interface IteratorChannel<T> {
18
- writer: IteratorChannel_Writer<T>
19
-
20
- iterator: AsyncIterator<T>
21
- }
22
-
23
- export interface CarHeader {
24
- version: 1,
25
- roots: CID[]
26
- }
27
-
28
- export interface CarV2FixedHeader {
29
- characteristics: [bigint, bigint],
30
- dataOffset: number,
31
- dataSize: number,
32
- indexOffset: number
33
- }
34
-
35
- export interface CarV2Header extends CarV2FixedHeader {
36
- version: 2,
37
- roots: CID[],
38
- }
39
-
40
- export interface CarDecoder {
41
- header(): Promise<CarHeader|CarV2Header>
42
-
43
- blocks(): AsyncGenerator<Block>
44
-
45
- blocksIndex(): AsyncGenerator<BlockIndex>
46
- }
47
-
48
- export interface BytesReader {
49
- upTo(length: number): Promise<Uint8Array>
50
-
51
- exactly(length: number): Promise<Uint8Array>
52
-
53
- seek(length: number): void
54
-
55
- pos: number
56
- }
@@ -1,33 +0,0 @@
1
- /** Auto-generated with ipld-schema-validator@0.0.0-dev at Thu Jun 17 2021 from IPLD Schema:
2
- *
3
- * type CarHeader struct {
4
- * version Int
5
- * roots optional [&Any]
6
- * # roots is _not_ optional for CarV1 but we defer that check within code to
7
- * # gracefully handle the >V1 case where it's just {version:X}
8
- * }
9
- *
10
- */
11
-
12
- const Kinds = {
13
- Null: /** @returns {boolean} */ (/** @type {any} */ obj) => obj === null,
14
- Int: /** @returns {boolean} */ (/** @type {any} */ obj) => Number.isInteger(obj),
15
- Float: /** @returns {boolean} */ (/** @type {any} */ obj) => typeof obj === 'number' && Number.isFinite(obj),
16
- String: /** @returns {boolean} */ (/** @type {any} */ obj) => typeof obj === 'string',
17
- Bool: /** @returns {boolean} */ (/** @type {any} */ obj) => typeof obj === 'boolean',
18
- Bytes: /** @returns {boolean} */ (/** @type {any} */ obj) => obj instanceof Uint8Array,
19
- Link: /** @returns {boolean} */ (/** @type {any} */ obj) => !Kinds.Null(obj) && typeof obj === 'object' && obj.asCID === obj,
20
- List: /** @returns {boolean} */ (/** @type {any} */ obj) => Array.isArray(obj),
21
- Map: /** @returns {boolean} */ (/** @type {any} */ obj) => !Kinds.Null(obj) && typeof obj === 'object' && obj.asCID !== obj && !Kinds.List(obj) && !Kinds.Bytes(obj)
22
- }
23
- /** @type {{ [k in string]: (obj:any)=>boolean}} */
24
- const Types = {
25
- Int: Kinds.Int,
26
- 'CarHeader > version': /** @returns {boolean} */ (/** @type {any} */ obj) => Types.Int(obj),
27
- 'CarHeader > roots (anon) > valueType (anon)': Kinds.Link,
28
- 'CarHeader > roots (anon)': /** @returns {boolean} */ (/** @type {any} */ obj) => Kinds.List(obj) && Array.prototype.every.call(obj, Types['CarHeader > roots (anon) > valueType (anon)']),
29
- 'CarHeader > roots': /** @returns {boolean} */ (/** @type {any} */ obj) => Types['CarHeader > roots (anon)'](obj),
30
- CarHeader: /** @returns {boolean} */ (/** @type {any} */ obj) => { const keys = obj && Object.keys(obj); return Kinds.Map(obj) && ['version'].every((k) => keys.includes(k)) && Object.entries(obj).every(([name, value]) => Types['CarHeader > ' + name] && Types['CarHeader > ' + name](value)) }
31
- }
32
-
33
- export const CarHeader = Types.CarHeader
package/reader DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./cjs/lib/reader.js')
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { readdir, readFile, writeFile } from 'fs/promises'
4
- import { dirname, join } from 'path'
5
-
6
- async function main () {
7
- const thisdir = dirname(new URL(import.meta.url).pathname)
8
- const outfile = join(thisdir, 'fixtures.js')
9
- const fixturesdir = join(thisdir, 'fixtures')
10
- const files = await readdir(fixturesdir)
11
- let content = '/** @type {Record<string, string>} */\nexport const data = {\n'
12
- for (const f of files) {
13
- content += ` '${f}': '`
14
- content += (await readFile(join(fixturesdir, f))).toString('base64')
15
- content += '\',\n'
16
- }
17
- content += ' _: \'\'\n}\n'
18
- await writeFile(join(outfile), content, 'utf8')
19
- }
20
-
21
- main().catch((err) => {
22
- console.error(err)
23
- process.exit(1)
24
- })
package/test/common.js DELETED
@@ -1,210 +0,0 @@
1
- import { bytes, CID } from 'multiformats'
2
- import { sha256 } from 'multiformats/hashes/sha2'
3
- import * as raw from 'multiformats/codecs/raw'
4
- import * as dagCbor from '@ipld/dag-cbor'
5
- import * as dagPb from '@ipld/dag-pb'
6
-
7
- import chai from 'chai'
8
- import chaiAsPromised from 'chai-as-promised'
9
-
10
- /**
11
- * @typedef {import('../api').Block} Block
12
- * @typedef {import('@ipld/dag-pb').PBNode} PBNode
13
- */
14
-
15
- /**
16
- * @extends {Block}
17
- */
18
- class TestBlock {
19
- /**
20
- * @param {Uint8Array} bytes
21
- * @param {CID} cid
22
- * @param {any} object
23
- */
24
- constructor (bytes, cid, object) {
25
- this.bytes = bytes
26
- this.cid = cid
27
- this.object = object
28
- }
29
- }
30
-
31
- chai.use(chaiAsPromised)
32
- const { assert } = chai
33
-
34
- /** @type {TestBlock[]} */
35
- let rawBlocks
36
- /** @type {TestBlock[]} */
37
- const pbBlocks = []
38
- /** @type {TestBlock[]} */
39
- const cborBlocks = []
40
- /** @type {[string, TestBlock[]][]} */
41
- let allBlocks
42
- /** @type {TestBlock[]} */
43
- let allBlocksFlattened
44
-
45
- const rndCid = CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm')
46
-
47
- /**
48
- * @param {any} object
49
- * @param {{code: number, encode: (obj: any) => Uint8Array}} codec
50
- * @param {import('multiformats/cid').CIDVersion} version
51
- * @returns {Promise<TestBlock & { object: any }>}
52
- */
53
- async function toBlock (object, codec, version = 1) {
54
- const bytes = codec.encode(object)
55
- const hash = await sha256.digest(bytes)
56
- const cid = CID.create(version, codec.code, hash)
57
- return new TestBlock(bytes, cid, object)
58
- }
59
-
60
- async function makeData () {
61
- if (!rawBlocks) {
62
- rawBlocks = await Promise.all('aaaa bbbb cccc zzzz'.split(' ').map((s) => {
63
- return toBlock(new TextEncoder().encode(s), raw)
64
- }))
65
-
66
- /**
67
- * @param {string} name
68
- * @param {TestBlock} block
69
- */
70
- const toPbLink = (name, block) => {
71
- let size = block.bytes.length
72
- if (block.cid.code === 0x70) {
73
- // special cumulative size handling for linking to dag-pb blocks
74
- /** @type {PBNode} */
75
- const node = block.object
76
- size = node.Links.reduce((p, c) => p + (c.Tsize || 0), size)
77
- }
78
- return {
79
- Name: name,
80
- Tsize: size,
81
- Hash: block.cid
82
- }
83
- }
84
-
85
- pbBlocks.push(await toBlock({ Links: [toPbLink('cat', rawBlocks[0])] }, dagPb, 0))
86
- pbBlocks.push(await toBlock({
87
- Links: [toPbLink('dog', rawBlocks[1]), toPbLink('first', pbBlocks[0])]
88
- }, dagPb, 0))
89
- pbBlocks.push(await toBlock({
90
- Links: [toPbLink('bear', rawBlocks[2]), toPbLink('second', pbBlocks[1])]
91
- }, dagPb, 0))
92
-
93
- const cbstructs = [['blip', pbBlocks[2].cid], ['limbo', null]]
94
- for (const b of cbstructs) {
95
- cborBlocks.push(await toBlock({ name: b[0], link: b[1] }, dagCbor))
96
- }
97
-
98
- allBlocks = [['raw', rawBlocks.slice(0, 3)], ['pb', pbBlocks], ['cbor', cborBlocks]]
99
- allBlocksFlattened = allBlocks.reduce((/** @type {TestBlock[]} */ p, c) => p.concat(c[1]), /** @type {TestBlock[]} */ [])
100
- }
101
-
102
- return {
103
- rawBlocks,
104
- pbBlocks,
105
- cborBlocks,
106
- allBlocks,
107
- allBlocksFlattened
108
- }
109
- }
110
-
111
- /**
112
- * @param {Uint8Array} data
113
- * @param {number} chunkSize
114
- * @returns {AsyncIterable<Uint8Array>}
115
- */
116
- function makeIterable (data, chunkSize) {
117
- let pos = 0
118
- return {
119
- [Symbol.asyncIterator] () {
120
- return {
121
- async next () {
122
- await new Promise((resolve) => setTimeout(resolve, 5))
123
- if (pos >= data.length) {
124
- return { done: true, value: undefined }
125
- }
126
- const value = data.slice(pos, pos += chunkSize)
127
- return { done: false, value }
128
- }
129
- }
130
- }
131
- }
132
- }
133
-
134
- const carBytes = bytes.fromHex('63a265726f6f747382d82a58250001711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8bd82a5825000171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365b6776657273696f6e01280155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b461616161280155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e646877626262622801551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a2745163636363511220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0122d0a240155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b4120363617418048001122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a122d0a240155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e6468771203646f671804122d0a221220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d01205666972737418338301122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de122e0a2401551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a274511204626561721804122f0a22122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a12067365636f6e641895015b01711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8ba2646c696e6bd82a582300122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de646e616d6564626c6970360171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365ba2646c696e6bf6646e616d65656c696d626f')
135
-
136
- // go.car is written as a graph, not by the allBlocks ordering here, so ordering is slightly out
137
- const goCarBytes = bytes.fromHex('63a265726f6f747382d82a58250001711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8bd82a5825000171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365b6776657273696f6e015b01711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8ba2646c696e6bd82a582300122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de646e616d6564626c69708301122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de122e0a2401551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a274511204626561721804122f0a22122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a12067365636f6e641895012801551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a27451636363638001122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a122d0a240155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e6468771203646f671804122d0a221220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0120566697273741833280155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e64687762626262511220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0122d0a240155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b412036361741804280155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b461616161360171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365ba2646c696e6bf6646e616d65656c696d626f')
138
- const goCarRoots = [
139
- CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm'),
140
- CID.parse('bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm')
141
- ]
142
- const goCarIndex = [
143
- { cid: CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm'), offset: 100, length: 92, blockOffset: 137, blockLength: 55 },
144
- { cid: CID.parse('QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d'), offset: 192, length: 133, blockOffset: 228, blockLength: 97 },
145
- { cid: CID.parse('bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke'), offset: 325, length: 41, blockOffset: 362, blockLength: 4 },
146
- { cid: CID.parse('QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys'), offset: 366, length: 130, blockOffset: 402, blockLength: 94 },
147
- { cid: CID.parse('bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4'), offset: 496, length: 41, blockOffset: 533, blockLength: 4 },
148
- { cid: CID.parse('QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT'), offset: 537, length: 82, blockOffset: 572, blockLength: 47 },
149
- { cid: CID.parse('bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq'), offset: 619, length: 41, blockOffset: 656, blockLength: 4 },
150
- { cid: CID.parse('bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm'), offset: 660, length: 55, blockOffset: 697, blockLength: 18 }
151
- ]
152
-
153
- const goCarV2Bytes = bytes.fromHex('0aa16776657273696f6e02000000000000000000000000000000003300000000000000c001000000000000f30100000000000038a265726f6f747381d82a5823001220fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f86776657273696f6e01511220fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f8122d0a221220d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f6261204f09f8da418a40185011220d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f62612310a221220d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f1120962617272656c657965183a122e0a2401551220a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d1204f09f90a11807581220d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f112340a2401551220b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d120a666973686d6f6e67657218042801551220b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d666973682b01551220a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d6c6f62737465720100000028000000c800000000000000a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d9401000000000000b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d6b01000000000000d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f11201000000000000d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f6268b00000000000000fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f83900000000000000')
154
- const goCarV2Roots = [CID.parse('QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z')]
155
- const goCarV2Index = [
156
- { blockLength: 47, blockOffset: 143, cid: CID.parse('QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z'), length: 82, offset: 108 },
157
- { blockLength: 99, blockOffset: 226, cid: CID.parse('QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM'), length: 135, offset: 190 },
158
- { blockLength: 54, blockOffset: 360, cid: CID.parse('Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE'), length: 89, offset: 325 },
159
- { blockLength: 4, blockOffset: 451, cid: CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu'), length: 41, offset: 414 },
160
- { blockLength: 7, blockOffset: 492, cid: CID.parse('bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju'), length: 44, offset: 455 }
161
- ]
162
- /** @type {{[k in string]: any}} */
163
- const goCarV2Contents = {
164
- QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z: {
165
- Links: [{
166
- Hash: CID.parse('QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM'),
167
- Name: '🍤',
168
- Tsize: 164
169
- }]
170
- },
171
- QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM: {
172
- Links: [
173
- {
174
- Hash: CID.parse('Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE'),
175
- Name: 'barreleye',
176
- Tsize: 58
177
- },
178
- {
179
- Hash: CID.parse('bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju'),
180
- Name: '🐡',
181
- Tsize: 7
182
- }
183
- ]
184
- },
185
- Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE: {
186
- Links: [{
187
- Hash: CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu'),
188
- Name: 'fishmonger',
189
- Tsize: 4
190
- }]
191
- },
192
- bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu: 'fish',
193
- bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju: 'lobster'
194
- }
195
-
196
- export {
197
- toBlock,
198
- assert,
199
- makeData,
200
- makeIterable,
201
- rndCid,
202
- carBytes,
203
- goCarBytes,
204
- goCarRoots,
205
- goCarIndex,
206
- goCarV2Bytes,
207
- goCarV2Roots,
208
- goCarV2Index,
209
- goCarV2Contents
210
- }
package/test/go.car DELETED
Binary file
package/test/go.carv2 DELETED
Binary file
@@ -1,84 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- // this test is not intended to run in the browser
4
-
5
- import path from 'path'
6
- import { fileURLToPath } from 'url'
7
- import fs from 'fs'
8
- import { Readable, pipeline } from 'stream'
9
- import { promisify } from 'util'
10
- import { CarReader, CarWriter } from '@ipld/car'
11
- import { makeData, assert } from './common.js'
12
- import {
13
- verifyRoots,
14
- verifyHas,
15
- verifyGet,
16
- verifyBlocks,
17
- verifyCids
18
- } from './verify-store-reader.js'
19
-
20
- /** @typedef {import('multiformats').CID} CID */
21
- /** @typedef {import('../api').Block} Block */
22
-
23
- const __filename = fileURLToPath(import.meta.url)
24
- const __dirname = path.dirname(__filename)
25
-
26
- const tmpCarPath = path.join(__dirname, 'tmp.car')
27
-
28
- describe('Node Streams CarReader.fromIterable()', () => {
29
- /** @type {Block[]} */
30
- let allBlocksFlattened
31
- /** @type {CID[]} */
32
- let roots
33
-
34
- before(async () => {
35
- const data = await makeData()
36
- const cborBlocks = data.cborBlocks
37
- allBlocksFlattened = data.allBlocksFlattened
38
- roots = [cborBlocks[0].cid, cborBlocks[1].cid]
39
- try {
40
- await fs.promises.unlink(tmpCarPath)
41
- } catch (e) {}
42
- })
43
-
44
- it('from fixture file', async () => {
45
- const inStream = fs.createReadStream(path.join(__dirname, './go.car'))
46
- const reader = await CarReader.fromIterable(inStream)
47
- await verifyRoots(reader)
48
- await verifyHas(reader)
49
- await verifyGet(reader)
50
- await verifyBlocks(reader.blocks(), true)
51
- await verifyCids(reader.cids(), true)
52
- })
53
-
54
- it('complete', async () => {
55
- const { writer, out } = CarWriter.create(roots)
56
-
57
- const pipe = promisify(pipeline)(
58
- Readable.from(out),
59
- fs.createWriteStream(tmpCarPath)
60
- )
61
-
62
- for (const block of allBlocksFlattened) {
63
- await writer.put(block)
64
- }
65
- await writer.close()
66
- await pipe
67
-
68
- const sizes = await Promise.all(['go.car', 'tmp.car'].map(async (car) => {
69
- return (await fs.promises.stat(path.join(__dirname, car))).size
70
- }))
71
-
72
- assert.strictEqual(sizes[0], sizes[1])
73
-
74
- const inStream = fs.createReadStream(tmpCarPath)
75
- const reader = await CarReader.fromIterable(inStream)
76
- await verifyRoots(reader)
77
- await verifyHas(reader)
78
- await verifyGet(reader)
79
- await verifyBlocks(reader.blocks(), true)
80
- await verifyCids(reader.cids(), true)
81
-
82
- await fs.promises.unlink(tmpCarPath)
83
- })
84
- })