@ipld/car 4.1.6 → 5.0.1
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.
- package/LICENSE +4 -0
- package/README.md +12 -4
- package/dist/index.min.js +5 -0
- package/{types → dist/src}/api.d.ts +19 -19
- package/dist/src/api.d.ts.map +1 -0
- package/{types/lib → dist/src}/buffer-writer.d.ts +10 -10
- package/{types/lib → dist/src}/buffer-writer.d.ts.map +1 -1
- package/dist/src/coding.d.ts +41 -0
- package/dist/src/coding.d.ts.map +1 -0
- package/{types/lib → dist/src}/decoder.d.ts +3 -3
- package/{types/lib → dist/src}/decoder.d.ts.map +1 -1
- package/{types/lib → dist/src}/encoder.d.ts +2 -2
- package/{types/lib → dist/src}/encoder.d.ts.map +1 -1
- package/{types/lib → dist/src}/header-validator.d.ts +0 -0
- package/dist/src/header-validator.d.ts.map +1 -0
- package/dist/src/index-browser.d.ts +8 -0
- package/dist/src/index-browser.d.ts.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{types/lib → dist/src}/indexed-reader-browser.d.ts +0 -0
- package/dist/src/indexed-reader-browser.d.ts.map +1 -0
- package/{types/lib → dist/src}/indexed-reader.d.ts +13 -13
- package/dist/src/indexed-reader.d.ts.map +1 -0
- package/{types/lib → dist/src}/indexer.d.ts +9 -9
- package/{types/lib → dist/src}/indexer.d.ts.map +1 -1
- package/{types/lib → dist/src}/iterator-channel.d.ts +0 -0
- package/{types/lib → dist/src}/iterator-channel.d.ts.map +1 -1
- package/{types/lib → dist/src}/iterator.d.ts +8 -8
- package/{types/lib → dist/src}/iterator.d.ts.map +1 -1
- package/{types/lib → dist/src}/reader-browser.d.ts +10 -10
- package/{types/lib → dist/src}/reader-browser.d.ts.map +1 -1
- package/{types/lib → dist/src}/reader.d.ts +5 -5
- package/{types/lib → dist/src}/reader.d.ts.map +1 -1
- package/{types/lib → dist/src}/writer-browser.d.ts +10 -10
- package/{types/lib → dist/src}/writer-browser.d.ts.map +1 -1
- package/{types/lib → dist/src}/writer.d.ts +4 -4
- package/{types/lib → dist/src}/writer.d.ts.map +1 -1
- package/package.json +102 -209
- package/{api.ts → src/api.ts} +14 -14
- package/{lib → src}/buffer-writer.js +5 -5
- package/src/coding.ts +56 -0
- package/{lib → src}/decoder.js +7 -7
- package/{lib → src}/encoder.js +1 -1
- package/src/header-validator.js +74 -0
- package/{lib → src}/header.ipldsch +0 -0
- package/src/index-browser.js +14 -0
- package/src/index.js +16 -0
- package/{lib → src}/indexed-reader-browser.js +0 -0
- package/{lib → src}/indexed-reader.js +9 -9
- package/{lib → src}/indexer.js +4 -4
- package/{lib → src}/iterator-channel.js +0 -0
- package/{lib → src}/iterator.js +4 -4
- package/{lib → src}/reader-browser.js +7 -7
- package/{lib → src}/reader.js +5 -5
- package/{lib → src}/writer-browser.js +7 -7
- package/{lib → src}/writer.js +3 -3
- package/LICENSE-APACHE +0 -13
- package/LICENSE-MIT +0 -7
- package/buffer-writer +0 -1
- package/car-browser.js +0 -14
- package/car.js +0 -16
- package/cjs/browser-test/common.js +0 -301
- package/cjs/browser-test/node-test-file-streams.js +0 -71
- package/cjs/browser-test/node-test-indexed-reader.js +0 -51
- package/cjs/browser-test/node-test-large.js +0 -135
- package/cjs/browser-test/node-test-raw.js +0 -68
- package/cjs/browser-test/node-test-updateroots.js +0 -78
- package/cjs/browser-test/test-buffer-writer.js +0 -330
- package/cjs/browser-test/test-errors.js +0 -90
- package/cjs/browser-test/test-indexer.js +0 -80
- package/cjs/browser-test/test-interface.js +0 -21
- package/cjs/browser-test/test-iterator.js +0 -83
- package/cjs/browser-test/test-reader.js +0 -278
- package/cjs/browser-test/test-writer.js +0 -286
- package/cjs/browser-test/verify-store-reader.js +0 -142
- package/cjs/car-browser.js +0 -18
- package/cjs/car.js +0 -20
- package/cjs/lib/buffer-writer.js +0 -164
- package/cjs/lib/decoder.js +0 -301
- package/cjs/lib/encoder.js +0 -44
- package/cjs/lib/header-validator.js +0 -29
- package/cjs/lib/indexed-reader-browser.js +0 -13
- package/cjs/lib/indexed-reader.js +0 -90
- package/cjs/lib/indexer.js +0 -41
- package/cjs/lib/iterator-channel.js +0 -77
- package/cjs/lib/iterator.js +0 -97
- package/cjs/lib/reader-browser.js +0 -62
- package/cjs/lib/reader.js +0 -38
- package/cjs/lib/writer-browser.js +0 -118
- package/cjs/lib/writer.js +0 -51
- package/cjs/node-test/common.js +0 -301
- package/cjs/node-test/node-test-file-streams.js +0 -71
- package/cjs/node-test/node-test-indexed-reader.js +0 -51
- package/cjs/node-test/node-test-large.js +0 -135
- package/cjs/node-test/node-test-raw.js +0 -68
- package/cjs/node-test/node-test-updateroots.js +0 -78
- package/cjs/node-test/test-buffer-writer.js +0 -330
- package/cjs/node-test/test-errors.js +0 -90
- package/cjs/node-test/test-indexer.js +0 -80
- package/cjs/node-test/test-interface.js +0 -21
- package/cjs/node-test/test-iterator.js +0 -83
- package/cjs/node-test/test-reader.js +0 -278
- package/cjs/node-test/test-writer.js +0 -286
- package/cjs/node-test/verify-store-reader.js +0 -142
- package/decoder +0 -1
- package/esm/browser-test/common.js +0 -274
- package/esm/browser-test/node-test-file-streams.js +0 -76
- package/esm/browser-test/node-test-indexed-reader.js +0 -53
- package/esm/browser-test/node-test-large.js +0 -109
- package/esm/browser-test/node-test-raw.js +0 -63
- package/esm/browser-test/node-test-updateroots.js +0 -76
- package/esm/browser-test/test-buffer-writer.js +0 -311
- package/esm/browser-test/test-errors.js +0 -91
- package/esm/browser-test/test-indexer.js +0 -85
- package/esm/browser-test/test-interface.js +0 -24
- package/esm/browser-test/test-iterator.js +0 -91
- package/esm/browser-test/test-reader.js +0 -270
- package/esm/browser-test/test-writer.js +0 -297
- package/esm/browser-test/verify-store-reader.js +0 -122
- package/esm/car-browser.js +0 -16
- package/esm/car.js +0 -18
- package/esm/lib/buffer-writer.js +0 -129
- package/esm/lib/decoder.js +0 -265
- package/esm/lib/encoder.js +0 -35
- package/esm/lib/header-validator.js +0 -23
- package/esm/lib/indexed-reader-browser.js +0 -6
- package/esm/lib/indexed-reader.js +0 -78
- package/esm/lib/indexer.js +0 -38
- package/esm/lib/iterator-channel.js +0 -71
- package/esm/lib/iterator.js +0 -92
- package/esm/lib/reader-browser.js +0 -57
- package/esm/lib/reader.js +0 -26
- package/esm/lib/writer-browser.js +0 -115
- package/esm/lib/writer.js +0 -42
- package/esm/node-test/common.js +0 -274
- package/esm/node-test/node-test-file-streams.js +0 -76
- package/esm/node-test/node-test-indexed-reader.js +0 -53
- package/esm/node-test/node-test-large.js +0 -109
- package/esm/node-test/node-test-raw.js +0 -63
- package/esm/node-test/node-test-updateroots.js +0 -76
- package/esm/node-test/test-buffer-writer.js +0 -311
- package/esm/node-test/test-errors.js +0 -91
- package/esm/node-test/test-indexer.js +0 -85
- package/esm/node-test/test-interface.js +0 -24
- package/esm/node-test/test-iterator.js +0 -91
- package/esm/node-test/test-reader.js +0 -270
- package/esm/node-test/test-writer.js +0 -297
- package/esm/node-test/verify-store-reader.js +0 -122
- package/esm/package.json +0 -9
- package/examples/car-to-fixture.js +0 -66
- package/examples/dump-car.js +0 -58
- package/examples/dump-index.js +0 -24
- package/examples/package.json +0 -27
- package/examples/round-trip.js +0 -45
- package/examples/test-examples.js +0 -115
- package/examples/verify-car.js +0 -87
- package/index.js +0 -1
- package/indexed-reader +0 -1
- package/indexer +0 -1
- package/iterator +0 -1
- package/lib/coding.ts +0 -56
- package/lib/header-validator.js +0 -33
- package/reader +0 -1
- package/test/_fixtures_to_js.mjs +0 -24
- package/test/common.js +0 -210
- package/test/go.car +0 -0
- package/test/go.carv2 +0 -0
- package/test/node-test-file-streams.js +0 -84
- package/test/node-test-indexed-reader.js +0 -45
- package/test/node-test-large.js +0 -112
- package/test/node-test-raw.js +0 -83
- package/test/node-test-updateroots.js +0 -89
- package/test/test-buffer-writer.js +0 -256
- package/test/test-errors.js +0 -98
- package/test/test-indexer.js +0 -87
- package/test/test-interface.js +0 -24
- package/test/test-iterator.js +0 -74
- package/test/test-reader.js +0 -245
- package/test/test-writer.js +0 -336
- package/test/verify-store-reader.js +0 -191
- package/tsconfig.json +0 -48
- package/types/api.d.ts.map +0 -1
- package/types/car-browser.d.ts +0 -8
- package/types/car-browser.d.ts.map +0 -1
- package/types/car.d.ts +0 -9
- package/types/car.d.ts.map +0 -1
- package/types/lib/coding.d.ts +0 -41
- package/types/lib/coding.d.ts.map +0 -1
- package/types/lib/header-validator.d.ts.map +0 -1
- package/types/lib/indexed-reader-browser.d.ts.map +0 -1
- package/types/lib/indexed-reader.d.ts.map +0 -1
- package/types/test/_fixtures_to_js.d.mts +0 -3
- package/types/test/_fixtures_to_js.d.mts.map +0 -1
- package/types/test/common.d.ts +0 -73
- package/types/test/common.d.ts.map +0 -1
- package/types/test/fixtures-expectations.d.ts +0 -63
- package/types/test/fixtures-expectations.d.ts.map +0 -1
- package/types/test/fixtures.d.ts +0 -3
- package/types/test/fixtures.d.ts.map +0 -1
- package/types/test/node-test-file-streams.d.ts +0 -3
- package/types/test/node-test-file-streams.d.ts.map +0 -1
- package/types/test/node-test-indexed-reader.d.ts +0 -2
- package/types/test/node-test-indexed-reader.d.ts.map +0 -1
- package/types/test/node-test-large.d.ts +0 -2
- package/types/test/node-test-large.d.ts.map +0 -1
- package/types/test/node-test-raw.d.ts +0 -2
- package/types/test/node-test-raw.d.ts.map +0 -1
- package/types/test/node-test-updateroots.d.ts +0 -2
- package/types/test/node-test-updateroots.d.ts.map +0 -1
- package/types/test/test-buffer-writer.d.ts +0 -2
- package/types/test/test-buffer-writer.d.ts.map +0 -1
- package/types/test/test-errors.d.ts +0 -2
- package/types/test/test-errors.d.ts.map +0 -1
- package/types/test/test-indexer.d.ts +0 -2
- package/types/test/test-indexer.d.ts.map +0 -1
- package/types/test/test-interface.d.ts +0 -2
- package/types/test/test-interface.d.ts.map +0 -1
- package/types/test/test-iterator.d.ts +0 -2
- package/types/test/test-iterator.d.ts.map +0 -1
- package/types/test/test-reader.d.ts +0 -2
- package/types/test/test-reader.d.ts.map +0 -1
- package/types/test/test-writer.d.ts +0 -2
- package/types/test/test-writer.d.ts.map +0 -1
- package/types/test/verify-store-reader.d.ts +0 -29
- package/types/test/verify-store-reader.d.ts.map +0 -1
- 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
|
-
})
|
package/examples/verify-car.js
DELETED
|
@@ -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
|
-
}
|
package/lib/header-validator.js
DELETED
|
@@ -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')
|
package/test/_fixtures_to_js.mjs
DELETED
|
@@ -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
|
-
})
|