@ipld/car 4.1.6 → 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,87 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- import { CarIndexer } from '@ipld/car/indexer'
4
- import {
5
- goCarBytes,
6
- goCarIndex,
7
- goCarV2Bytes,
8
- goCarV2Roots,
9
- goCarV2Index,
10
- makeIterable,
11
- assert
12
- } from './common.js'
13
- import { verifyRoots } from './verify-store-reader.js'
14
-
15
- describe('CarIndexer fromBytes()', () => {
16
- it('complete', async () => {
17
- const indexer = await CarIndexer.fromBytes(goCarBytes)
18
- await verifyRoots(indexer) // behaves like an Reader for roots
19
- assert.strictEqual(indexer.version, 1)
20
-
21
- const indexData = []
22
- for await (const index of indexer) {
23
- indexData.push(index)
24
- }
25
-
26
- assert.deepStrictEqual(indexData, goCarIndex)
27
- })
28
-
29
- it('v2 complete', async () => {
30
- const indexer = await CarIndexer.fromBytes(goCarV2Bytes)
31
- const roots = await indexer.getRoots()
32
- assert.strictEqual(roots.length, 1)
33
- assert.ok(goCarV2Roots[0].equals(roots[0]))
34
- assert.strictEqual(indexer.version, 2)
35
-
36
- const indexData = []
37
- for await (const index of indexer) {
38
- indexData.push(index)
39
- }
40
-
41
- assert.deepStrictEqual(indexData, goCarV2Index)
42
- })
43
-
44
- it('bad argument', async () => {
45
- for (const arg of [true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
46
- // @ts-ignore
47
- await assert.isRejected(CarIndexer.fromBytes(arg))
48
- }
49
- })
50
- })
51
-
52
- describe('CarIndexer fromIterable()', () => {
53
- /** @param {CarIndexer} indexer */
54
- async function verifyIndexer (indexer) {
55
- await verifyRoots(indexer) // behaves like an Reader for roots
56
- assert.strictEqual(indexer.version, 1)
57
-
58
- const indexData = []
59
- for await (const index of indexer) {
60
- indexData.push(index)
61
- }
62
-
63
- assert.deepStrictEqual(indexData, goCarIndex)
64
- }
65
-
66
- it('complete (single chunk)', async () => {
67
- const indexer = await CarIndexer.fromIterable(makeIterable(goCarBytes, goCarBytes.length))
68
- return verifyIndexer(indexer)
69
- })
70
-
71
- it('complete (101-byte chunks)', async () => {
72
- const indexer = await CarIndexer.fromIterable(makeIterable(goCarBytes, 101))
73
- return verifyIndexer(indexer)
74
- })
75
-
76
- it('complete (32-byte chunks)', async () => {
77
- const indexer = await CarIndexer.fromIterable(makeIterable(goCarBytes, 32))
78
- return verifyIndexer(indexer)
79
- })
80
-
81
- it('bad argument', async () => {
82
- for (const arg of [new Uint8Array(0), true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
83
- // @ts-ignore
84
- await assert.isRejected(CarIndexer.fromIterable(arg))
85
- }
86
- })
87
- })
@@ -1,24 +0,0 @@
1
- /* eslint-env mocha */
2
- import * as car from '@ipld/car'
3
- import { CarReader, __browser } from '@ipld/car/reader'
4
- import { CarIndexer } from '@ipld/car/indexer'
5
- import { CarBlockIterator, CarCIDIterator } from '@ipld/car/iterator'
6
- import { CarWriter } from '@ipld/car/writer'
7
-
8
- import { assert } from './common.js'
9
-
10
- // simple sanity check that our main exports match the direct exports
11
- describe('Interface', () => {
12
- it('exports match', () => {
13
- assert.strictEqual(car.CarReader, CarReader)
14
- assert.strictEqual(car.CarIndexer, CarIndexer)
15
- assert.strictEqual(car.CarBlockIterator, CarBlockIterator)
16
- assert.strictEqual(car.CarCIDIterator, CarCIDIterator)
17
- assert.strictEqual(car.CarWriter, CarWriter)
18
- })
19
-
20
- it('browser exports', () => {
21
- // @ts-ignore
22
- assert.strictEqual(__browser, globalThis.process === undefined)
23
- })
24
- })
@@ -1,74 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- import { CarBlockIterator, CarCIDIterator } from '@ipld/car/iterator'
4
- import { carBytes, makeIterable, assert } from './common.js'
5
- import { verifyRoots, verifyBlocks, verifyCids } from './verify-store-reader.js'
6
-
7
- /**
8
- * @param {CarBlockIterator} iter
9
- * @returns {Promise<CarBlockIterator>}
10
- */
11
- async function verifyBlockIterator (iter) {
12
- await verifyRoots(iter)
13
- await verifyBlocks(iter)
14
- assert.strictEqual(iter.version, 1)
15
- return iter
16
- }
17
-
18
- /**
19
- * @param {CarCIDIterator} iter
20
- * @returns {Promise<CarCIDIterator>}
21
- */
22
- async function verifyCIDIterator (iter) {
23
- await verifyRoots(iter)
24
- await verifyCids(iter)
25
- assert.strictEqual(iter.version, 1)
26
- return iter
27
- }
28
-
29
- for (const type of ['Block', 'CID']) {
30
- describe(`Car${type}Iterator`, () => {
31
- it('fromBytes()', async () => {
32
- if (type === 'Block') {
33
- await verifyBlockIterator(await CarBlockIterator.fromBytes(carBytes))
34
- } else {
35
- await verifyCIDIterator(await CarCIDIterator.fromBytes(carBytes))
36
- }
37
- })
38
-
39
- it('fromBytes() bad double read', async () => {
40
- if (type === 'Block') {
41
- const iter = await verifyBlockIterator(await CarBlockIterator.fromBytes(carBytes))
42
- await assert.isRejected(verifyBlocks(iter), /more than once/i)
43
- } else {
44
- const iter = await verifyCIDIterator(await CarCIDIterator.fromBytes(carBytes))
45
- await assert.isRejected(verifyCids(iter), /more than once/i)
46
- }
47
- })
48
-
49
- it('fromBytes() bad argument', async () => {
50
- for (const arg of [true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
51
- // @ts-ignore
52
- await assert.isRejected((type === 'Block' ? CarBlockIterator : CarCIDIterator).fromBytes(arg))
53
- }
54
- })
55
-
56
- it('fromIterable() bad argument', async () => {
57
- for (const arg of [new Uint8Array(0), true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
58
- // @ts-ignore
59
- await assert.isRejected((type === 'Block' ? CarBlockIterator : CarCIDIterator).fromIterable(arg))
60
- }
61
- })
62
-
63
- for (const chunkSize of [carBytes.length, 100, 64, 32]) {
64
- const chunkDesc = chunkSize === carBytes.length ? 'single chunk' : `${chunkSize} bytes`
65
- it(`fromIterable() blocks (${chunkDesc})`, async () => {
66
- if (type === 'Block') {
67
- await verifyBlockIterator(await CarBlockIterator.fromIterable(makeIterable(carBytes, chunkSize)))
68
- } else {
69
- await verifyCIDIterator(await CarCIDIterator.fromIterable(makeIterable(carBytes, chunkSize)))
70
- }
71
- })
72
- }
73
- })
74
- }
@@ -1,245 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- import { CarReader } from '@ipld/car/reader'
4
- import { CarWriter } from '@ipld/car/writer'
5
- import { bytesReader, readHeader } from '@ipld/car/decoder'
6
- import * as Block from 'multiformats/block'
7
- import { sha256 } from 'multiformats/hashes/sha2'
8
- import * as raw from 'multiformats/codecs/raw'
9
- import { base64 } from 'multiformats/bases/base64'
10
- import * as dagPb from '@ipld/dag-pb'
11
- import {
12
- carBytes,
13
- makeIterable,
14
- assert,
15
- goCarV2Bytes,
16
- goCarV2Roots,
17
- goCarV2Index,
18
- goCarV2Contents
19
- } from './common.js'
20
- import {
21
- verifyRoots,
22
- verifyHas,
23
- verifyGet,
24
- verifyBlocks,
25
- verifyCids
26
- } from './verify-store-reader.js'
27
- import { data as fixtures } from './fixtures.js'
28
- import { expectations as fixtureExpectations } from './fixtures-expectations.js'
29
-
30
- describe('CarReader fromBytes()', () => {
31
- it('complete', async () => {
32
- const reader = await CarReader.fromBytes(carBytes)
33
- await verifyRoots(reader)
34
- await verifyHas(reader)
35
- await verifyGet(reader)
36
- await verifyBlocks(reader.blocks())
37
- await verifyCids(reader.cids())
38
- assert.strictEqual(reader.version, 1)
39
- })
40
-
41
- it('complete (get before has) switch', async () => {
42
- const reader = await CarReader.fromBytes(carBytes)
43
- await verifyRoots(reader)
44
- await verifyGet(reader)
45
- await verifyHas(reader)
46
- await verifyBlocks(reader.blocks())
47
- await verifyCids(reader.cids())
48
- })
49
-
50
- it('bad argument', async () => {
51
- for (const arg of [true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
52
- // @ts-ignore
53
- await assert.isRejected(CarReader.fromBytes(arg))
54
- }
55
- })
56
-
57
- it('decode error - truncated', async () => {
58
- await assert.isRejected(CarReader.fromBytes(carBytes.slice(0, carBytes.length - 10)), {
59
- name: 'Error',
60
- message: 'Unexpected end of data'
61
- })
62
- })
63
-
64
- it('v2 complete', async () => {
65
- const reader = await CarReader.fromBytes(goCarV2Bytes)
66
- const roots = await reader.getRoots()
67
- assert.strictEqual(roots.length, 1)
68
- assert.ok(goCarV2Roots[0].equals(roots[0]))
69
- assert.strictEqual(reader.version, 2)
70
- for (const { cid } of goCarV2Index) {
71
- const block = await reader.get(cid)
72
- assert.isDefined(block)
73
- if (block) {
74
- assert.ok(cid.equals(block.cid))
75
- let content
76
- if (cid.code === dagPb.code) {
77
- content = dagPb.decode(block.bytes)
78
- } else if (cid.code === 85) { // raw
79
- content = new TextDecoder().decode(block.bytes)
80
- } else {
81
- assert.fail('Unexpected codec')
82
- }
83
- assert.deepStrictEqual(content, goCarV2Contents[cid.toString()])
84
- }
85
- }
86
- })
87
-
88
- it('decode error - trailing null bytes', async () => {
89
- const bytes = new Uint8Array(carBytes.length + 5)
90
- bytes.set(carBytes)
91
- try {
92
- await CarReader.fromBytes(bytes)
93
- } catch (err) {
94
- assert.strictEqual(err.message, 'Invalid CAR section (zero length)')
95
- return
96
- }
97
- assert.fail('Did not throw')
98
- })
99
-
100
- it('decode error - bad first byte', async () => {
101
- const bytes = new Uint8Array(carBytes.length + 5)
102
- bytes.set(carBytes)
103
- bytes[0] = 0
104
- try {
105
- await CarReader.fromBytes(bytes)
106
- } catch (err) {
107
- assert.strictEqual(err.message, 'Invalid CAR header (zero length)')
108
- return
109
- }
110
- assert.fail('Did not throw')
111
- })
112
- })
113
-
114
- describe('CarReader fromIterable()', () => {
115
- it('complete (single chunk)', async () => {
116
- const reader = await CarReader.fromIterable(makeIterable(carBytes, carBytes.length))
117
- await verifyRoots(reader)
118
- await verifyHas(reader)
119
- await verifyGet(reader)
120
- await verifyBlocks(reader.blocks())
121
- await verifyCids(reader.cids())
122
- })
123
-
124
- it('complete (101-byte chunks)', async () => {
125
- const reader = await CarReader.fromIterable(makeIterable(carBytes, 101))
126
- await verifyRoots(reader)
127
- await verifyHas(reader)
128
- await verifyGet(reader)
129
- await verifyBlocks(reader.blocks())
130
- await verifyCids(reader.cids())
131
- })
132
-
133
- it('complete (64-byte chunks)', async () => {
134
- const reader = await CarReader.fromIterable(makeIterable(carBytes, 64))
135
- await verifyRoots(reader)
136
- await verifyHas(reader)
137
- await verifyGet(reader)
138
- await verifyBlocks(reader.blocks())
139
- await verifyCids(reader.cids())
140
- })
141
-
142
- it('complete (32-byte chunks)', async () => {
143
- const reader = await CarReader.fromIterable(makeIterable(carBytes, 32))
144
- await verifyRoots(reader)
145
- await verifyHas(reader)
146
- await verifyGet(reader)
147
- await verifyBlocks(reader.blocks())
148
- await verifyCids(reader.cids())
149
- })
150
-
151
- it('handle zero-byte chunks', async () => {
152
- // write 3 blocks, the middle one has zero bytes - this is a valid dag-pb form
153
- // so it's important that we can handle it .. also we may just be dealing with
154
- // an asynciterator that provides zero-length chunks
155
- const { writer, out } = await CarWriter.create([])
156
- const b1 = await Block.encode({ value: Uint8Array.from([0, 1, 2]), hasher: sha256, codec: raw })
157
- writer.put(b1)
158
- const b2 = await Block.encode({ value: Uint8Array.from([]), hasher: sha256, codec: raw })
159
- writer.put(b2)
160
- const b3 = await Block.encode({ value: Uint8Array.from([3, 4, 5]), hasher: sha256, codec: raw })
161
- writer.put(b3)
162
- const closePromise = writer.close()
163
- const reader = await CarReader.fromIterable(out) // read from the writer
164
- const b1a = await reader.get(b1.cid)
165
- assert.isDefined(b1a)
166
- assert.deepStrictEqual(b1a && Array.from(b1a.bytes), [0, 1, 2])
167
- const b2a = await reader.get(b2.cid)
168
- assert.isDefined(b2a)
169
- assert.deepStrictEqual(b2a && Array.from(b2a.bytes), [])
170
- const b3a = await reader.get(b3.cid)
171
- assert.isDefined(b3a)
172
- assert.deepStrictEqual(b3a && Array.from(b3a.bytes), [3, 4, 5])
173
- await closePromise
174
- })
175
-
176
- it('bad argument', async () => {
177
- for (const arg of [new Uint8Array(0), true, false, null, undefined, 'string', 100, { obj: 'nope' }]) {
178
- // @ts-ignore
179
- await assert.isRejected(CarReader.fromIterable(arg))
180
- }
181
- })
182
-
183
- it('decode error - truncated', async () => {
184
- await assert.isRejected(CarReader.fromIterable(makeIterable(carBytes.slice(0, carBytes.length - 10), 64)), {
185
- name: 'Error',
186
- message: 'Unexpected end of data'
187
- })
188
- })
189
-
190
- it('v2 decode error - truncated', async () => {
191
- const bytes = goCarV2Bytes.slice()
192
- const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)
193
- // dataSize is an 64-bit uint at byte offset 35 from the begining, we're shortening it
194
- // by 10 to simulate a premature end of CARv1 content
195
- dv.setBigUint64(35, BigInt(448 - 10), true)
196
- await assert.isRejected(CarReader.fromIterable(makeIterable(bytes, 64)), {
197
- name: 'Error',
198
- message: 'Unexpected end of data'
199
- })
200
- })
201
- })
202
-
203
- describe('Shared fixtures', () => {
204
- describe('Header', () => {
205
- for (const [name, { version: expectedVersion, err: expectedError }] of Object.entries(fixtureExpectations)) {
206
- it(name, async () => {
207
- const data = base64.baseDecode(fixtures[name])
208
- let header
209
- try {
210
- header = await readHeader(bytesReader(data))
211
- } catch (err) {
212
- if (expectedError != null) {
213
- assert.equal(err.message, expectedError)
214
- return
215
- }
216
- assert.ifError(err)
217
- }
218
- if (expectedError != null) {
219
- assert.fail(`Expected error: ${expectedError}`)
220
- }
221
- assert.isDefined(header, 'did not decode header')
222
- if (expectedVersion != null && header != null) {
223
- assert.strictEqual(header.version, expectedVersion)
224
- }
225
- })
226
- }
227
- })
228
-
229
- describe('Contents', () => {
230
- for (const [name, { cids: expectedCids }] of Object.entries(fixtureExpectations)) {
231
- if (expectedCids == null) {
232
- continue
233
- }
234
- it(name, async () => {
235
- const data = base64.baseDecode(fixtures[name])
236
- const reader = await CarReader.fromBytes(data)
237
- let i = 0
238
- for await (const cid of reader.cids()) {
239
- assert.strictEqual(cid.toString(), expectedCids[i++])
240
- }
241
- assert.strictEqual(i, expectedCids.length)
242
- })
243
- }
244
- })
245
- })