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