@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.
- 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 +4 -4
- 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,274 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
bytes,
|
|
3
|
-
CID
|
|
4
|
-
} from 'multiformats';
|
|
5
|
-
import { sha256 } from 'multiformats/hashes/sha2';
|
|
6
|
-
import * as raw from 'multiformats/codecs/raw';
|
|
7
|
-
import * as dagCbor from '@ipld/dag-cbor';
|
|
8
|
-
import * as dagPb from '@ipld/dag-pb';
|
|
9
|
-
import chai from 'chai';
|
|
10
|
-
import chaiAsPromised from 'chai-as-promised';
|
|
11
|
-
class TestBlock {
|
|
12
|
-
constructor(bytes, cid, object) {
|
|
13
|
-
this.bytes = bytes;
|
|
14
|
-
this.cid = cid;
|
|
15
|
-
this.object = object;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
chai.use(chaiAsPromised);
|
|
19
|
-
const {assert} = chai;
|
|
20
|
-
let rawBlocks;
|
|
21
|
-
const pbBlocks = [];
|
|
22
|
-
const cborBlocks = [];
|
|
23
|
-
let allBlocks;
|
|
24
|
-
let allBlocksFlattened;
|
|
25
|
-
const rndCid = CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm');
|
|
26
|
-
async function toBlock(object, codec, version = 1) {
|
|
27
|
-
const bytes = codec.encode(object);
|
|
28
|
-
const hash = await sha256.digest(bytes);
|
|
29
|
-
const cid = CID.create(version, codec.code, hash);
|
|
30
|
-
return new TestBlock(bytes, cid, object);
|
|
31
|
-
}
|
|
32
|
-
async function makeData() {
|
|
33
|
-
if (!rawBlocks) {
|
|
34
|
-
rawBlocks = await Promise.all('aaaa bbbb cccc zzzz'.split(' ').map(s => {
|
|
35
|
-
return toBlock(new TextEncoder().encode(s), raw);
|
|
36
|
-
}));
|
|
37
|
-
const toPbLink = (name, block) => {
|
|
38
|
-
let size = block.bytes.length;
|
|
39
|
-
if (block.cid.code === 112) {
|
|
40
|
-
const node = block.object;
|
|
41
|
-
size = node.Links.reduce((p, c) => p + (c.Tsize || 0), size);
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
Name: name,
|
|
45
|
-
Tsize: size,
|
|
46
|
-
Hash: block.cid
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
pbBlocks.push(await toBlock({ Links: [toPbLink('cat', rawBlocks[0])] }, dagPb, 0));
|
|
50
|
-
pbBlocks.push(await toBlock({
|
|
51
|
-
Links: [
|
|
52
|
-
toPbLink('dog', rawBlocks[1]),
|
|
53
|
-
toPbLink('first', pbBlocks[0])
|
|
54
|
-
]
|
|
55
|
-
}, dagPb, 0));
|
|
56
|
-
pbBlocks.push(await toBlock({
|
|
57
|
-
Links: [
|
|
58
|
-
toPbLink('bear', rawBlocks[2]),
|
|
59
|
-
toPbLink('second', pbBlocks[1])
|
|
60
|
-
]
|
|
61
|
-
}, dagPb, 0));
|
|
62
|
-
const cbstructs = [
|
|
63
|
-
[
|
|
64
|
-
'blip',
|
|
65
|
-
pbBlocks[2].cid
|
|
66
|
-
],
|
|
67
|
-
[
|
|
68
|
-
'limbo',
|
|
69
|
-
null
|
|
70
|
-
]
|
|
71
|
-
];
|
|
72
|
-
for (const b of cbstructs) {
|
|
73
|
-
cborBlocks.push(await toBlock({
|
|
74
|
-
name: b[0],
|
|
75
|
-
link: b[1]
|
|
76
|
-
}, dagCbor));
|
|
77
|
-
}
|
|
78
|
-
allBlocks = [
|
|
79
|
-
[
|
|
80
|
-
'raw',
|
|
81
|
-
rawBlocks.slice(0, 3)
|
|
82
|
-
],
|
|
83
|
-
[
|
|
84
|
-
'pb',
|
|
85
|
-
pbBlocks
|
|
86
|
-
],
|
|
87
|
-
[
|
|
88
|
-
'cbor',
|
|
89
|
-
cborBlocks
|
|
90
|
-
]
|
|
91
|
-
];
|
|
92
|
-
allBlocksFlattened = allBlocks.reduce((p, c) => p.concat(c[1]), []);
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
rawBlocks,
|
|
96
|
-
pbBlocks,
|
|
97
|
-
cborBlocks,
|
|
98
|
-
allBlocks,
|
|
99
|
-
allBlocksFlattened
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function makeIterable(data, chunkSize) {
|
|
103
|
-
let pos = 0;
|
|
104
|
-
return {
|
|
105
|
-
[Symbol.asyncIterator]() {
|
|
106
|
-
return {
|
|
107
|
-
async next() {
|
|
108
|
-
await new Promise(resolve => setTimeout(resolve, 5));
|
|
109
|
-
if (pos >= data.length) {
|
|
110
|
-
return {
|
|
111
|
-
done: true,
|
|
112
|
-
value: undefined
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
const value = data.slice(pos, pos += chunkSize);
|
|
116
|
-
return {
|
|
117
|
-
done: false,
|
|
118
|
-
value
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
const carBytes = bytes.fromHex('63a265726f6f747382d82a58250001711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8bd82a5825000171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365b6776657273696f6e01280155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b461616161280155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e646877626262622801551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a2745163636363511220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0122d0a240155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b4120363617418048001122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a122d0a240155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e6468771203646f671804122d0a221220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d01205666972737418338301122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de122e0a2401551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a274511204626561721804122f0a22122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a12067365636f6e641895015b01711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8ba2646c696e6bd82a582300122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de646e616d6564626c6970360171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365ba2646c696e6bf6646e616d65656c696d626f');
|
|
126
|
-
const goCarBytes = bytes.fromHex('63a265726f6f747382d82a58250001711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8bd82a5825000171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365b6776657273696f6e015b01711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8ba2646c696e6bd82a582300122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de646e616d6564626c69708301122002acecc5de2438ea4126a3010ecb1f8a599c8eff22fff1a1dcffe999b27fd3de122e0a2401551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a274511204626561721804122f0a22122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a12067365636f6e641895012801551220b6fbd675f98e2abd22d4ed29fdc83150fedc48597e92dd1a7a24381d44a27451636363638001122079a982de3c9907953d4d323cee1d0fb1ed8f45f8ef02870c0cb9e09246bd530a122d0a240155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e6468771203646f671804122d0a221220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0120566697273741833280155122081cc5b17018674b401b42f35ba07bb79e211239c23bffe658da1577e3e64687762626262511220e7dc486e97e6ebe5cdabab3e392bdad128b6e09acc94bb4e2aa2af7b986d24d0122d0a240155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b412036361741804280155122061be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b461616161360171122069ea0740f9807a28f4d932c62e7c1c83be055e55072c90266ab3e79df63a365ba2646c696e6bf6646e616d65656c696d626f');
|
|
127
|
-
const goCarRoots = [
|
|
128
|
-
CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm'),
|
|
129
|
-
CID.parse('bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm')
|
|
130
|
-
];
|
|
131
|
-
const goCarIndex = [
|
|
132
|
-
{
|
|
133
|
-
cid: CID.parse('bafyreihyrpefhacm6kkp4ql6j6udakdit7g3dmkzfriqfykhjw6cad5lrm'),
|
|
134
|
-
offset: 100,
|
|
135
|
-
length: 92,
|
|
136
|
-
blockOffset: 137,
|
|
137
|
-
blockLength: 55
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
cid: CID.parse('QmNX6Tffavsya4xgBi2VJQnSuqy9GsxongxZZ9uZBqp16d'),
|
|
141
|
-
offset: 192,
|
|
142
|
-
length: 133,
|
|
143
|
-
blockOffset: 228,
|
|
144
|
-
blockLength: 97
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
cid: CID.parse('bafkreifw7plhl6mofk6sfvhnfh64qmkq73oeqwl6sloru6rehaoujituke'),
|
|
148
|
-
offset: 325,
|
|
149
|
-
length: 41,
|
|
150
|
-
blockOffset: 362,
|
|
151
|
-
blockLength: 4
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
cid: CID.parse('QmWXZxVQ9yZfhQxLD35eDR8LiMRsYtHxYqTFCBbJoiJVys'),
|
|
155
|
-
offset: 366,
|
|
156
|
-
length: 130,
|
|
157
|
-
blockOffset: 402,
|
|
158
|
-
blockLength: 94
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
cid: CID.parse('bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4'),
|
|
162
|
-
offset: 496,
|
|
163
|
-
length: 41,
|
|
164
|
-
blockOffset: 533,
|
|
165
|
-
blockLength: 4
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
cid: CID.parse('QmdwjhxpxzcMsR3qUuj7vUL8pbA7MgR3GAxWi2GLHjsKCT'),
|
|
169
|
-
offset: 537,
|
|
170
|
-
length: 82,
|
|
171
|
-
blockOffset: 572,
|
|
172
|
-
blockLength: 47
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
cid: CID.parse('bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq'),
|
|
176
|
-
offset: 619,
|
|
177
|
-
length: 41,
|
|
178
|
-
blockOffset: 656,
|
|
179
|
-
blockLength: 4
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
cid: CID.parse('bafyreidj5idub6mapiupjwjsyyxhyhedxycv4vihfsicm2vt46o7morwlm'),
|
|
183
|
-
offset: 660,
|
|
184
|
-
length: 55,
|
|
185
|
-
blockOffset: 697,
|
|
186
|
-
blockLength: 18
|
|
187
|
-
}
|
|
188
|
-
];
|
|
189
|
-
const goCarV2Bytes = bytes.fromHex('0aa16776657273696f6e02000000000000000000000000000000003300000000000000c001000000000000f30100000000000038a265726f6f747381d82a5823001220fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f86776657273696f6e01511220fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f8122d0a221220d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f6261204f09f8da418a40185011220d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f62612310a221220d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f1120962617272656c657965183a122e0a2401551220a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d1204f09f90a11807581220d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f112340a2401551220b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d120a666973686d6f6e67657218042801551220b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d666973682b01551220a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d6c6f62737465720100000028000000c800000000000000a2e1c40da1ae335d4dffe729eb4d5ca23b74b9e51fc535f4a804a261080c294d9401000000000000b474a99a2705e23cf905a484ec6d14ef58b56bbe62e9292783466ec363b5072d6b01000000000000d745b7757f5b4593eeab7820306c7bc64eb496a7410a0d07df7a34ffec4b97f11201000000000000d9c0d5376d26f1931f7ad52d7acc00fc1090d2edb0808bf61eeb0a152826f6268b00000000000000fb16f5083412ef1371d031ed4aa239903d84efdadf1ba3cd678e6475b1a232f83900000000000000');
|
|
190
|
-
const goCarV2Roots = [CID.parse('QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z')];
|
|
191
|
-
const goCarV2Index = [
|
|
192
|
-
{
|
|
193
|
-
blockLength: 47,
|
|
194
|
-
blockOffset: 143,
|
|
195
|
-
cid: CID.parse('QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z'),
|
|
196
|
-
length: 82,
|
|
197
|
-
offset: 108
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
blockLength: 99,
|
|
201
|
-
blockOffset: 226,
|
|
202
|
-
cid: CID.parse('QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM'),
|
|
203
|
-
length: 135,
|
|
204
|
-
offset: 190
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
blockLength: 54,
|
|
208
|
-
blockOffset: 360,
|
|
209
|
-
cid: CID.parse('Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE'),
|
|
210
|
-
length: 89,
|
|
211
|
-
offset: 325
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
blockLength: 4,
|
|
215
|
-
blockOffset: 451,
|
|
216
|
-
cid: CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu'),
|
|
217
|
-
length: 41,
|
|
218
|
-
offset: 414
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
blockLength: 7,
|
|
222
|
-
blockOffset: 492,
|
|
223
|
-
cid: CID.parse('bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju'),
|
|
224
|
-
length: 44,
|
|
225
|
-
offset: 455
|
|
226
|
-
}
|
|
227
|
-
];
|
|
228
|
-
const goCarV2Contents = {
|
|
229
|
-
QmfEoLyB5NndqeKieExd1rtJzTduQUPEV8TwAYcUiy3H5Z: {
|
|
230
|
-
Links: [{
|
|
231
|
-
Hash: CID.parse('QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM'),
|
|
232
|
-
Name: '\uD83C\uDF64',
|
|
233
|
-
Tsize: 164
|
|
234
|
-
}]
|
|
235
|
-
},
|
|
236
|
-
QmczfirA7VEH7YVvKPTPoU69XM3qY4DC39nnTsWd4K3SkM: {
|
|
237
|
-
Links: [
|
|
238
|
-
{
|
|
239
|
-
Hash: CID.parse('Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE'),
|
|
240
|
-
Name: 'barreleye',
|
|
241
|
-
Tsize: 58
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
Hash: CID.parse('bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju'),
|
|
245
|
-
Name: '\uD83D\uDC21',
|
|
246
|
-
Tsize: 7
|
|
247
|
-
}
|
|
248
|
-
]
|
|
249
|
-
},
|
|
250
|
-
Qmcpz2FHJD7VAhg1fxFXdYJKePtkx1BsHuCrAgWVnaHMTE: {
|
|
251
|
-
Links: [{
|
|
252
|
-
Hash: CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu'),
|
|
253
|
-
Name: 'fishmonger',
|
|
254
|
-
Tsize: 4
|
|
255
|
-
}]
|
|
256
|
-
},
|
|
257
|
-
bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu: 'fish',
|
|
258
|
-
bafkreifc4hca3inognou377hfhvu2xfchn2ltzi7yu27jkaeujqqqdbjju: 'lobster'
|
|
259
|
-
};
|
|
260
|
-
export {
|
|
261
|
-
toBlock,
|
|
262
|
-
assert,
|
|
263
|
-
makeData,
|
|
264
|
-
makeIterable,
|
|
265
|
-
rndCid,
|
|
266
|
-
carBytes,
|
|
267
|
-
goCarBytes,
|
|
268
|
-
goCarRoots,
|
|
269
|
-
goCarIndex,
|
|
270
|
-
goCarV2Bytes,
|
|
271
|
-
goCarV2Roots,
|
|
272
|
-
goCarV2Index,
|
|
273
|
-
goCarV2Contents
|
|
274
|
-
};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import {
|
|
5
|
-
Readable,
|
|
6
|
-
pipeline
|
|
7
|
-
} from 'stream';
|
|
8
|
-
import { promisify } from 'util';
|
|
9
|
-
import {
|
|
10
|
-
CarReader,
|
|
11
|
-
CarWriter
|
|
12
|
-
} from '../car-browser.js';
|
|
13
|
-
import {
|
|
14
|
-
makeData,
|
|
15
|
-
assert
|
|
16
|
-
} from './common.js';
|
|
17
|
-
import {
|
|
18
|
-
verifyRoots,
|
|
19
|
-
verifyHas,
|
|
20
|
-
verifyGet,
|
|
21
|
-
verifyBlocks,
|
|
22
|
-
verifyCids
|
|
23
|
-
} from './verify-store-reader.js';
|
|
24
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
25
|
-
const __dirname = path.dirname(__filename);
|
|
26
|
-
const tmpCarPath = path.join(__dirname, 'tmp.car');
|
|
27
|
-
describe('Node Streams CarReader.fromIterable()', () => {
|
|
28
|
-
let allBlocksFlattened;
|
|
29
|
-
let roots;
|
|
30
|
-
before(async () => {
|
|
31
|
-
const data = await makeData();
|
|
32
|
-
const cborBlocks = data.cborBlocks;
|
|
33
|
-
allBlocksFlattened = data.allBlocksFlattened;
|
|
34
|
-
roots = [
|
|
35
|
-
cborBlocks[0].cid,
|
|
36
|
-
cborBlocks[1].cid
|
|
37
|
-
];
|
|
38
|
-
try {
|
|
39
|
-
await fs.promises.unlink(tmpCarPath);
|
|
40
|
-
} catch (e) {
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
it('from fixture file', async () => {
|
|
44
|
-
const inStream = fs.createReadStream(path.join(__dirname, './go.car'));
|
|
45
|
-
const reader = await CarReader.fromIterable(inStream);
|
|
46
|
-
await verifyRoots(reader);
|
|
47
|
-
await verifyHas(reader);
|
|
48
|
-
await verifyGet(reader);
|
|
49
|
-
await verifyBlocks(reader.blocks(), true);
|
|
50
|
-
await verifyCids(reader.cids(), true);
|
|
51
|
-
});
|
|
52
|
-
it('complete', async () => {
|
|
53
|
-
const {writer, out} = CarWriter.create(roots);
|
|
54
|
-
const pipe = promisify(pipeline)(Readable.from(out), fs.createWriteStream(tmpCarPath));
|
|
55
|
-
for (const block of allBlocksFlattened) {
|
|
56
|
-
await writer.put(block);
|
|
57
|
-
}
|
|
58
|
-
await writer.close();
|
|
59
|
-
await pipe;
|
|
60
|
-
const sizes = await Promise.all([
|
|
61
|
-
'go.car',
|
|
62
|
-
'tmp.car'
|
|
63
|
-
].map(async car => {
|
|
64
|
-
return (await fs.promises.stat(path.join(__dirname, car))).size;
|
|
65
|
-
}));
|
|
66
|
-
assert.strictEqual(sizes[0], sizes[1]);
|
|
67
|
-
const inStream = fs.createReadStream(tmpCarPath);
|
|
68
|
-
const reader = await CarReader.fromIterable(inStream);
|
|
69
|
-
await verifyRoots(reader);
|
|
70
|
-
await verifyHas(reader);
|
|
71
|
-
await verifyGet(reader);
|
|
72
|
-
await verifyBlocks(reader.blocks(), true);
|
|
73
|
-
await verifyCids(reader.cids(), true);
|
|
74
|
-
await fs.promises.unlink(tmpCarPath);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import { CarIndexedReader } from '../lib/indexed-reader-browser.js';
|
|
4
|
-
import {
|
|
5
|
-
assert,
|
|
6
|
-
goCarIndex
|
|
7
|
-
} from './common.js';
|
|
8
|
-
import {
|
|
9
|
-
verifyRoots,
|
|
10
|
-
verifyHas,
|
|
11
|
-
verifyGet,
|
|
12
|
-
verifyBlocks,
|
|
13
|
-
verifyCids
|
|
14
|
-
} from './verify-store-reader.js';
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = path.dirname(__filename);
|
|
17
|
-
describe('CarIndexedReader fromFile()', () => {
|
|
18
|
-
it('complete', async () => {
|
|
19
|
-
const reader = await CarIndexedReader.fromFile(path.join(__dirname, 'go.car'));
|
|
20
|
-
await verifyRoots(reader);
|
|
21
|
-
await verifyHas(reader);
|
|
22
|
-
await verifyGet(reader);
|
|
23
|
-
await verifyBlocks(reader.blocks(), true);
|
|
24
|
-
await verifyCids(reader.cids(), true);
|
|
25
|
-
let i = 0;
|
|
26
|
-
for await (const block of reader.blocks()) {
|
|
27
|
-
assert.strictEqual(block.cid.toString(), goCarIndex[i++].cid.toString());
|
|
28
|
-
}
|
|
29
|
-
i = 0;
|
|
30
|
-
for await (const cid of reader.cids()) {
|
|
31
|
-
assert.strictEqual(cid.toString(), goCarIndex[i++].cid.toString());
|
|
32
|
-
}
|
|
33
|
-
assert.strictEqual(reader.version, 1);
|
|
34
|
-
await reader.close();
|
|
35
|
-
});
|
|
36
|
-
it('bad argument', async () => {
|
|
37
|
-
for (const arg of [
|
|
38
|
-
true,
|
|
39
|
-
false,
|
|
40
|
-
null,
|
|
41
|
-
undefined,
|
|
42
|
-
Uint8Array.from([
|
|
43
|
-
1,
|
|
44
|
-
2,
|
|
45
|
-
3
|
|
46
|
-
]),
|
|
47
|
-
100,
|
|
48
|
-
{ obj: 'nope' }
|
|
49
|
-
]) {
|
|
50
|
-
await assert.isRejected(CarIndexedReader.fromFile(arg));
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import { Readable } from 'stream';
|
|
3
|
-
import { garbage } from 'ipld-garbage';
|
|
4
|
-
import varint from 'varint';
|
|
5
|
-
import * as dagCbor from '@ipld/dag-cbor';
|
|
6
|
-
import { sha256 } from 'multiformats/hashes/sha2';
|
|
7
|
-
import { CID } from 'multiformats/cid';
|
|
8
|
-
import {
|
|
9
|
-
CarWriter,
|
|
10
|
-
CarIndexer,
|
|
11
|
-
CarReader,
|
|
12
|
-
CarIndexedReader
|
|
13
|
-
} from '../car-browser.js';
|
|
14
|
-
import { assert } from './common.js';
|
|
15
|
-
describe('Large CAR', () => {
|
|
16
|
-
const objects = [];
|
|
17
|
-
const cids = [];
|
|
18
|
-
const expectedIndex = [];
|
|
19
|
-
it('create, no roots', async () => {
|
|
20
|
-
const {writer, out} = CarWriter.create([]);
|
|
21
|
-
Readable.from(out).pipe(fs.createWriteStream('./test.car'));
|
|
22
|
-
let offset = dagCbor.encode({
|
|
23
|
-
version: 1,
|
|
24
|
-
roots: []
|
|
25
|
-
}).length;
|
|
26
|
-
offset += varint.encode(offset).length;
|
|
27
|
-
for (let i = 0; i < 500; i++) {
|
|
28
|
-
const obj = garbage(1000);
|
|
29
|
-
objects.push(obj);
|
|
30
|
-
const bytes = dagCbor.encode(obj);
|
|
31
|
-
const hash = await sha256.digest(bytes);
|
|
32
|
-
const cid = CID.create(1, dagCbor.code, hash);
|
|
33
|
-
cids.push(cid.toString());
|
|
34
|
-
const blockLength = bytes.length;
|
|
35
|
-
let length = cid.bytes.length + blockLength;
|
|
36
|
-
const lengthLength = varint.encode(length).length;
|
|
37
|
-
length += lengthLength;
|
|
38
|
-
const blockOffset = offset + lengthLength + cid.bytes.length;
|
|
39
|
-
expectedIndex.push({
|
|
40
|
-
cid,
|
|
41
|
-
offset,
|
|
42
|
-
length,
|
|
43
|
-
blockOffset,
|
|
44
|
-
blockLength
|
|
45
|
-
});
|
|
46
|
-
offset += length;
|
|
47
|
-
await writer.put({
|
|
48
|
-
cid,
|
|
49
|
-
bytes
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
await writer.close();
|
|
53
|
-
});
|
|
54
|
-
it('CarIndexer.fromIterable', async () => {
|
|
55
|
-
const indexer = await CarIndexer.fromIterable(fs.createReadStream('./test.car'));
|
|
56
|
-
assert.deepStrictEqual(await indexer.getRoots(), []);
|
|
57
|
-
let i = 0;
|
|
58
|
-
for await (const blockIndex of indexer) {
|
|
59
|
-
assert.deepStrictEqual(blockIndex, expectedIndex[i]);
|
|
60
|
-
i++;
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
it('CarIndexer.fromBytes', async () => {
|
|
64
|
-
const indexer = await CarIndexer.fromBytes(await fs.promises.readFile('./test.car'));
|
|
65
|
-
assert.deepStrictEqual(await indexer.getRoots(), []);
|
|
66
|
-
let i = 0;
|
|
67
|
-
for await (const blockIndex of indexer) {
|
|
68
|
-
assert.deepStrictEqual(blockIndex, expectedIndex[i]);
|
|
69
|
-
i++;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
it('CarReader.fromBytes', async () => {
|
|
73
|
-
const reader = await CarReader.fromBytes(await fs.promises.readFile('./test.car'));
|
|
74
|
-
assert.deepStrictEqual(await reader.getRoots(), []);
|
|
75
|
-
let i = 0;
|
|
76
|
-
for await (const {cid, bytes} of reader.blocks()) {
|
|
77
|
-
assert.strictEqual(cid.toString(), cids[i], `cid #${ i } ${ cid } <> ${ cids[i] }`);
|
|
78
|
-
const obj = dagCbor.decode(bytes);
|
|
79
|
-
assert.deepStrictEqual(obj, objects[i], `object #${ i }`);
|
|
80
|
-
i++;
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
it('CarReader.fromIterable', async () => {
|
|
84
|
-
const reader = await CarReader.fromIterable(fs.createReadStream('./test.car'));
|
|
85
|
-
assert.deepStrictEqual(await reader.getRoots(), []);
|
|
86
|
-
let i = 0;
|
|
87
|
-
for await (const {cid, bytes} of reader.blocks()) {
|
|
88
|
-
assert.strictEqual(cid.toString(), cids[i], `cid #${ i } ${ cid } <> ${ cids[i] }`);
|
|
89
|
-
const obj = dagCbor.decode(bytes);
|
|
90
|
-
assert.deepStrictEqual(obj, objects[i], `object #${ i }`);
|
|
91
|
-
i++;
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
it('CarIndexedReader.fromFile', async () => {
|
|
95
|
-
const reader = await CarIndexedReader.fromFile('./test.car');
|
|
96
|
-
assert.deepStrictEqual(await reader.getRoots(), []);
|
|
97
|
-
let i = 0;
|
|
98
|
-
for await (const {cid, bytes} of reader.blocks()) {
|
|
99
|
-
assert.strictEqual(cid.toString(), cids[i], `cid #${ i } ${ cid } <> ${ cids[i] }`);
|
|
100
|
-
const obj = dagCbor.decode(bytes);
|
|
101
|
-
assert.deepStrictEqual(obj, objects[i], `object #${ i }`);
|
|
102
|
-
i++;
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
after(async () => {
|
|
106
|
-
return fs.promises.unlink('./test.car').catch(() => {
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import { promisify } from 'util';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
import { bytes } from 'multiformats';
|
|
6
|
-
import { CarReader } from '../car-browser.js';
|
|
7
|
-
import {
|
|
8
|
-
assert,
|
|
9
|
-
makeData,
|
|
10
|
-
goCarIndex
|
|
11
|
-
} from './common.js';
|
|
12
|
-
const fsopen = promisify(fs.open);
|
|
13
|
-
const fsclose = promisify(fs.close);
|
|
14
|
-
const {toHex} = bytes;
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = path.dirname(__filename);
|
|
17
|
-
describe('CarReader.readRaw', () => {
|
|
18
|
-
let allBlocksFlattened;
|
|
19
|
-
before(async () => {
|
|
20
|
-
const data = await makeData();
|
|
21
|
-
allBlocksFlattened = data.allBlocksFlattened;
|
|
22
|
-
});
|
|
23
|
-
async function verifyRead(fd) {
|
|
24
|
-
const expectedBlocks = allBlocksFlattened.slice();
|
|
25
|
-
const expectedCids = [];
|
|
26
|
-
for (const {cid} of expectedBlocks) {
|
|
27
|
-
expectedCids.push(cid.toString());
|
|
28
|
-
}
|
|
29
|
-
for (const blockIndex of goCarIndex) {
|
|
30
|
-
const {cid, bytes} = await CarReader.readRaw(fd, blockIndex);
|
|
31
|
-
const index = expectedCids.indexOf(cid.toString());
|
|
32
|
-
assert.ok(index >= 0, 'got expected block');
|
|
33
|
-
assert.strictEqual(toHex(expectedBlocks[index].bytes), toHex(bytes), 'got expected block content');
|
|
34
|
-
expectedBlocks.splice(index, 1);
|
|
35
|
-
expectedCids.splice(index, 1);
|
|
36
|
-
}
|
|
37
|
-
assert.strictEqual(expectedBlocks.length, 0, 'got all expected blocks');
|
|
38
|
-
}
|
|
39
|
-
it('read raw using index (fd)', async () => {
|
|
40
|
-
const fd = await fsopen(path.join(__dirname, 'go.car'), 'r');
|
|
41
|
-
await verifyRead(fd);
|
|
42
|
-
await fsclose(fd);
|
|
43
|
-
});
|
|
44
|
-
it('read raw using index (FileHandle)', async () => {
|
|
45
|
-
const fd = await fs.promises.open(path.join(__dirname, 'go.car'), 'r');
|
|
46
|
-
await verifyRead(fd);
|
|
47
|
-
await fd.close();
|
|
48
|
-
});
|
|
49
|
-
it('errors', async () => {
|
|
50
|
-
await assert.isRejected(CarReader.readRaw(true, goCarIndex[0]), {
|
|
51
|
-
name: 'TypeError',
|
|
52
|
-
message: 'Bad fd'
|
|
53
|
-
});
|
|
54
|
-
const badBlock = Object.assign({}, goCarIndex[goCarIndex.length - 1]);
|
|
55
|
-
badBlock.blockLength += 10;
|
|
56
|
-
const fd = await fsopen(path.join(__dirname, 'go.car'), 'r');
|
|
57
|
-
await assert.isRejected(CarReader.readRaw(fd, badBlock), {
|
|
58
|
-
name: 'Error',
|
|
59
|
-
message: `Failed to read entire block (${ badBlock.blockLength - 10 } instead of ${ badBlock.blockLength })`
|
|
60
|
-
});
|
|
61
|
-
await fsclose(fd);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import { promisify } from 'util';
|
|
5
|
-
import { CID } from 'multiformats/cid';
|
|
6
|
-
import { CarReader } from '../lib/reader-browser.js';
|
|
7
|
-
import { CarWriter } from '../lib/writer-browser.js';
|
|
8
|
-
import {
|
|
9
|
-
verifyRoots,
|
|
10
|
-
verifyHas,
|
|
11
|
-
verifyGet,
|
|
12
|
-
verifyBlocks,
|
|
13
|
-
verifyCids
|
|
14
|
-
} from './verify-store-reader.js';
|
|
15
|
-
import { assert } from './common.js';
|
|
16
|
-
const fsopen = promisify(fs.open);
|
|
17
|
-
const fsclose = promisify(fs.close);
|
|
18
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
-
const __dirname = path.dirname(__filename);
|
|
20
|
-
const goCarPath = path.join(__dirname, 'go.car');
|
|
21
|
-
const tmpCarPath = path.join(__dirname, 'tmp.car');
|
|
22
|
-
const newRoots = [
|
|
23
|
-
CID.parse('bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq'),
|
|
24
|
-
CID.parse('bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4')
|
|
25
|
-
];
|
|
26
|
-
async function verify() {
|
|
27
|
-
const reader = await CarReader.fromIterable(fs.createReadStream(tmpCarPath));
|
|
28
|
-
await assert.isRejected(verifyRoots(reader));
|
|
29
|
-
assert.deepEqual(await reader.getRoots(), newRoots);
|
|
30
|
-
await verifyHas(reader);
|
|
31
|
-
await verifyGet(reader);
|
|
32
|
-
await verifyBlocks(reader.blocks(), true);
|
|
33
|
-
await verifyCids(reader.cids(), true);
|
|
34
|
-
}
|
|
35
|
-
describe('Node CarWriter.updateHeader()', () => {
|
|
36
|
-
before(async () => {
|
|
37
|
-
try {
|
|
38
|
-
await fs.promises.unlink(tmpCarPath);
|
|
39
|
-
} catch (e) {
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
beforeEach(async () => {
|
|
43
|
-
await fs.promises.copyFile(goCarPath, tmpCarPath);
|
|
44
|
-
});
|
|
45
|
-
afterEach(async () => {
|
|
46
|
-
await fs.promises.unlink(tmpCarPath);
|
|
47
|
-
});
|
|
48
|
-
it('update roots (fd)', async () => {
|
|
49
|
-
const fd = await fsopen(tmpCarPath, 'r+');
|
|
50
|
-
await CarWriter.updateRootsInFile(fd, newRoots);
|
|
51
|
-
await fsclose(fd);
|
|
52
|
-
await verify();
|
|
53
|
-
});
|
|
54
|
-
it('update roots (FileHandle)', async () => {
|
|
55
|
-
const fd = await fs.promises.open(tmpCarPath, 'r+');
|
|
56
|
-
await CarWriter.updateRootsInFile(fd, newRoots);
|
|
57
|
-
await fd.close();
|
|
58
|
-
await verify();
|
|
59
|
-
});
|
|
60
|
-
it('error: bad fd', async () => {
|
|
61
|
-
await assert.isRejected(CarWriter.updateRootsInFile(true, newRoots), {
|
|
62
|
-
name: 'TypeError',
|
|
63
|
-
message: 'Bad fd'
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
it('error: wrong header size', async () => {
|
|
67
|
-
const fd = await fs.promises.open(tmpCarPath, 'r+');
|
|
68
|
-
await assert.isRejected(CarWriter.updateRootsInFile(fd, [
|
|
69
|
-
...newRoots,
|
|
70
|
-
newRoots[0]
|
|
71
|
-
]), /can only overwrite a header of the same length/);
|
|
72
|
-
await assert.isRejected(CarWriter.updateRootsInFile(fd, [newRoots[0]]), /can only overwrite a header of the same length/);
|
|
73
|
-
await assert.isRejected(CarWriter.updateRootsInFile(fd, []), /can only overwrite a header of the same length/);
|
|
74
|
-
await fd.close();
|
|
75
|
-
});
|
|
76
|
-
});
|