@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,311 +0,0 @@
|
|
|
1
|
-
import * as CarBufferWriter from '../lib/buffer-writer.js';
|
|
2
|
-
import { CarReader } from '../lib/reader-browser.js';
|
|
3
|
-
import { createHeader } from '../lib/encoder.js';
|
|
4
|
-
import { assert } from './common.js';
|
|
5
|
-
import {
|
|
6
|
-
CID,
|
|
7
|
-
varint
|
|
8
|
-
} from 'multiformats';
|
|
9
|
-
import * as CBOR from '@ipld/dag-cbor';
|
|
10
|
-
import {
|
|
11
|
-
sha256,
|
|
12
|
-
sha512
|
|
13
|
-
} from 'multiformats/hashes/sha2';
|
|
14
|
-
import { identity } from 'multiformats/hashes/identity';
|
|
15
|
-
import * as Raw from 'multiformats/codecs/raw';
|
|
16
|
-
import * as Block from 'multiformats/block';
|
|
17
|
-
describe('CarBufferWriter', () => {
|
|
18
|
-
const cid = CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu');
|
|
19
|
-
describe('calculateHeaderLength', async () => {
|
|
20
|
-
for (const count of [
|
|
21
|
-
0,
|
|
22
|
-
1,
|
|
23
|
-
10,
|
|
24
|
-
18,
|
|
25
|
-
24,
|
|
26
|
-
48,
|
|
27
|
-
124,
|
|
28
|
-
255,
|
|
29
|
-
258,
|
|
30
|
-
65536 - 1,
|
|
31
|
-
65536
|
|
32
|
-
]) {
|
|
33
|
-
it(`calculateHeaderLength(new Array(${ count }).fill(36))`, () => {
|
|
34
|
-
const roots = new Array(count).fill(cid);
|
|
35
|
-
const sizes = new Array(count).fill(cid.bytes.byteLength);
|
|
36
|
-
assert.deepEqual(CarBufferWriter.calculateHeaderLength(sizes), createHeader(roots).byteLength);
|
|
37
|
-
});
|
|
38
|
-
it(`calculateHeaderLength(new Array(${ count }).fill(36))`, () => {
|
|
39
|
-
const roots = new Array(count).fill(cid);
|
|
40
|
-
const rootLengths = roots.map(c => c.bytes.byteLength);
|
|
41
|
-
assert.deepEqual(CarBufferWriter.calculateHeaderLength(rootLengths), createHeader(roots).byteLength);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
it('estimate on large CIDs', () => {
|
|
45
|
-
const largeCID = CID.parse(`bafkqbbac${ 'a'.repeat(416) }`);
|
|
46
|
-
assert.equal(CarBufferWriter.calculateHeaderLength([
|
|
47
|
-
cid.bytes.byteLength,
|
|
48
|
-
largeCID.bytes.byteLength
|
|
49
|
-
]), createHeader([
|
|
50
|
-
cid,
|
|
51
|
-
largeCID
|
|
52
|
-
]).byteLength);
|
|
53
|
-
});
|
|
54
|
-
it('estimate on large CIDs 2', () => {
|
|
55
|
-
const largeCID = CID.createV1(Raw.code, identity.digest(new Uint8Array(512).fill(1)));
|
|
56
|
-
assert.equal(CarBufferWriter.calculateHeaderLength([
|
|
57
|
-
cid.bytes.byteLength,
|
|
58
|
-
largeCID.bytes.byteLength
|
|
59
|
-
]), createHeader([
|
|
60
|
-
cid,
|
|
61
|
-
largeCID
|
|
62
|
-
]).byteLength);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe('writer', () => {
|
|
66
|
-
it('estimate header and write blocks', async () => {
|
|
67
|
-
const headerSize = CarBufferWriter.estimateHeaderLength(1);
|
|
68
|
-
const dataSize = 256;
|
|
69
|
-
const buffer = new ArrayBuffer(headerSize + dataSize);
|
|
70
|
-
const writer = CarBufferWriter.createWriter(buffer, { headerSize });
|
|
71
|
-
const b1 = await Block.encode({
|
|
72
|
-
value: { hello: 'world' },
|
|
73
|
-
codec: CBOR,
|
|
74
|
-
hasher: sha256
|
|
75
|
-
});
|
|
76
|
-
writer.write(b1);
|
|
77
|
-
const b2 = await Block.encode({
|
|
78
|
-
value: { bye: 'world' },
|
|
79
|
-
codec: CBOR,
|
|
80
|
-
hasher: sha256
|
|
81
|
-
});
|
|
82
|
-
writer.write(b2);
|
|
83
|
-
writer.addRoot(b1.cid);
|
|
84
|
-
const bytes = writer.close();
|
|
85
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
86
|
-
assert.deepEqual(await reader.getRoots(), [b1.cid]);
|
|
87
|
-
assert.deepEqual(reader._blocks, [
|
|
88
|
-
{
|
|
89
|
-
cid: b1.cid,
|
|
90
|
-
bytes: b1.bytes
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
cid: b2.cid,
|
|
94
|
-
bytes: b2.bytes
|
|
95
|
-
}
|
|
96
|
-
]);
|
|
97
|
-
});
|
|
98
|
-
it('overestimate header', async () => {
|
|
99
|
-
const headerSize = CarBufferWriter.estimateHeaderLength(2);
|
|
100
|
-
const dataSize = 256;
|
|
101
|
-
const buffer = new ArrayBuffer(headerSize + dataSize);
|
|
102
|
-
const writer = CarBufferWriter.createWriter(buffer, { headerSize });
|
|
103
|
-
const b1 = await Block.encode({
|
|
104
|
-
value: { hello: 'world' },
|
|
105
|
-
codec: CBOR,
|
|
106
|
-
hasher: sha256
|
|
107
|
-
});
|
|
108
|
-
writer.write(b1);
|
|
109
|
-
const b2 = await Block.encode({
|
|
110
|
-
value: { bye: 'world' },
|
|
111
|
-
codec: CBOR,
|
|
112
|
-
hasher: sha256
|
|
113
|
-
});
|
|
114
|
-
writer.write(b2);
|
|
115
|
-
writer.addRoot(b1.cid);
|
|
116
|
-
assert.throws(() => writer.close(), /Header size was overestimate/);
|
|
117
|
-
const bytes = writer.close({ resize: true });
|
|
118
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
119
|
-
assert.deepEqual(await reader.getRoots(), [b1.cid]);
|
|
120
|
-
assert.deepEqual(reader._blocks, [
|
|
121
|
-
{
|
|
122
|
-
cid: b1.cid,
|
|
123
|
-
bytes: b1.bytes
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
cid: b2.cid,
|
|
127
|
-
bytes: b2.bytes
|
|
128
|
-
}
|
|
129
|
-
]);
|
|
130
|
-
});
|
|
131
|
-
it('underestimate header', async () => {
|
|
132
|
-
const headerSize = CarBufferWriter.estimateHeaderLength(2);
|
|
133
|
-
const dataSize = 300;
|
|
134
|
-
const buffer = new ArrayBuffer(headerSize + dataSize);
|
|
135
|
-
const writer = CarBufferWriter.createWriter(buffer, { headerSize });
|
|
136
|
-
const b1 = await Block.encode({
|
|
137
|
-
value: { hello: 'world' },
|
|
138
|
-
codec: CBOR,
|
|
139
|
-
hasher: sha256
|
|
140
|
-
});
|
|
141
|
-
writer.write(b1);
|
|
142
|
-
writer.addRoot(b1.cid);
|
|
143
|
-
const b2 = await Block.encode({
|
|
144
|
-
value: { bye: 'world' },
|
|
145
|
-
codec: CBOR,
|
|
146
|
-
hasher: sha512
|
|
147
|
-
});
|
|
148
|
-
writer.write(b2);
|
|
149
|
-
assert.throws(() => writer.addRoot(b2.cid), /has no capacity/);
|
|
150
|
-
writer.addRoot(b2.cid, { resize: true });
|
|
151
|
-
const bytes = writer.close();
|
|
152
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
153
|
-
assert.deepEqual(await reader.getRoots(), [
|
|
154
|
-
b1.cid,
|
|
155
|
-
b2.cid
|
|
156
|
-
]);
|
|
157
|
-
assert.deepEqual(reader._blocks, [
|
|
158
|
-
{
|
|
159
|
-
cid: b1.cid,
|
|
160
|
-
bytes: b1.bytes
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
cid: b2.cid,
|
|
164
|
-
bytes: b2.bytes
|
|
165
|
-
}
|
|
166
|
-
]);
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
it('has no space for the root', async () => {
|
|
170
|
-
const headerSize = CarBufferWriter.estimateHeaderLength(1);
|
|
171
|
-
const dataSize = 100;
|
|
172
|
-
const buffer = new ArrayBuffer(headerSize + dataSize);
|
|
173
|
-
const writer = CarBufferWriter.createWriter(buffer, { headerSize });
|
|
174
|
-
const b1 = await Block.encode({
|
|
175
|
-
value: { hello: 'world' },
|
|
176
|
-
codec: CBOR,
|
|
177
|
-
hasher: sha256
|
|
178
|
-
});
|
|
179
|
-
writer.write(b1);
|
|
180
|
-
writer.addRoot(b1.cid);
|
|
181
|
-
const b2 = await Block.encode({
|
|
182
|
-
value: { bye: 'world' },
|
|
183
|
-
codec: CBOR,
|
|
184
|
-
hasher: sha256
|
|
185
|
-
});
|
|
186
|
-
writer.write(b2);
|
|
187
|
-
assert.throws(() => writer.addRoot(b2.cid), /Buffer has no capacity for a new root/);
|
|
188
|
-
assert.throws(() => writer.addRoot(b2.cid, { resize: true }), /Buffer has no capacity for a new root/);
|
|
189
|
-
const bytes = writer.close();
|
|
190
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
191
|
-
assert.deepEqual(await reader.getRoots(), [b1.cid]);
|
|
192
|
-
assert.deepEqual(reader._blocks, [
|
|
193
|
-
{
|
|
194
|
-
cid: b1.cid,
|
|
195
|
-
bytes: b1.bytes
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
cid: b2.cid,
|
|
199
|
-
bytes: b2.bytes
|
|
200
|
-
}
|
|
201
|
-
]);
|
|
202
|
-
});
|
|
203
|
-
it('has no space for the block', async () => {
|
|
204
|
-
const headerSize = CarBufferWriter.estimateHeaderLength(1);
|
|
205
|
-
const dataSize = 58;
|
|
206
|
-
const buffer = new ArrayBuffer(headerSize + dataSize);
|
|
207
|
-
const writer = CarBufferWriter.createWriter(buffer, { headerSize });
|
|
208
|
-
const b1 = await Block.encode({
|
|
209
|
-
value: { hello: 'world' },
|
|
210
|
-
codec: CBOR,
|
|
211
|
-
hasher: sha256
|
|
212
|
-
});
|
|
213
|
-
writer.write(b1);
|
|
214
|
-
writer.addRoot(b1.cid);
|
|
215
|
-
const b2 = await Block.encode({
|
|
216
|
-
value: { bye: 'world' },
|
|
217
|
-
codec: CBOR,
|
|
218
|
-
hasher: sha256
|
|
219
|
-
});
|
|
220
|
-
assert.throws(() => writer.write(b2), /Buffer has no capacity for this block/);
|
|
221
|
-
const bytes = writer.close();
|
|
222
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
223
|
-
assert.deepEqual(await reader.getRoots(), [b1.cid]);
|
|
224
|
-
assert.deepEqual(reader._blocks, [{
|
|
225
|
-
cid: b1.cid,
|
|
226
|
-
bytes: b1.bytes
|
|
227
|
-
}]);
|
|
228
|
-
});
|
|
229
|
-
it('provide roots', async () => {
|
|
230
|
-
const b1 = await Block.encode({
|
|
231
|
-
value: { hello: 'world' },
|
|
232
|
-
codec: CBOR,
|
|
233
|
-
hasher: sha256
|
|
234
|
-
});
|
|
235
|
-
const b2 = await Block.encode({
|
|
236
|
-
value: { bye: 'world' },
|
|
237
|
-
codec: CBOR,
|
|
238
|
-
hasher: sha512
|
|
239
|
-
});
|
|
240
|
-
const buffer = new ArrayBuffer(300);
|
|
241
|
-
const writer = CarBufferWriter.createWriter(buffer, {
|
|
242
|
-
roots: [
|
|
243
|
-
b1.cid,
|
|
244
|
-
b2.cid
|
|
245
|
-
]
|
|
246
|
-
});
|
|
247
|
-
writer.write(b1);
|
|
248
|
-
writer.write(b2);
|
|
249
|
-
const bytes = writer.close();
|
|
250
|
-
const reader = await CarReader.fromBytes(bytes);
|
|
251
|
-
assert.deepEqual(await reader.getRoots(), [
|
|
252
|
-
b1.cid,
|
|
253
|
-
b2.cid
|
|
254
|
-
]);
|
|
255
|
-
assert.deepEqual(reader._blocks, [
|
|
256
|
-
{
|
|
257
|
-
cid: b1.cid,
|
|
258
|
-
bytes: b1.bytes
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
cid: b2.cid,
|
|
262
|
-
bytes: b2.bytes
|
|
263
|
-
}
|
|
264
|
-
]);
|
|
265
|
-
});
|
|
266
|
-
it('provide large CID root', async () => {
|
|
267
|
-
const bytes = new Uint8Array(512).fill(1);
|
|
268
|
-
const b1 = await Block.encode({
|
|
269
|
-
value: { hello: 'world' },
|
|
270
|
-
codec: CBOR,
|
|
271
|
-
hasher: sha256
|
|
272
|
-
});
|
|
273
|
-
const b2 = {
|
|
274
|
-
cid: CID.createV1(Raw.code, identity.digest(bytes)),
|
|
275
|
-
bytes
|
|
276
|
-
};
|
|
277
|
-
const headerSize = CBOR.encode({
|
|
278
|
-
version: 1,
|
|
279
|
-
roots: [
|
|
280
|
-
b1.cid,
|
|
281
|
-
b2.cid
|
|
282
|
-
]
|
|
283
|
-
}).byteLength;
|
|
284
|
-
const bodySize = CarBufferWriter.blockLength(b1) + CarBufferWriter.blockLength(b2);
|
|
285
|
-
const varintSize = varint.encodingLength(headerSize);
|
|
286
|
-
const writer = CarBufferWriter.createWriter(new ArrayBuffer(varintSize + headerSize + bodySize), {
|
|
287
|
-
roots: [
|
|
288
|
-
b1.cid,
|
|
289
|
-
b2.cid
|
|
290
|
-
]
|
|
291
|
-
});
|
|
292
|
-
writer.write(b1);
|
|
293
|
-
writer.write(b2);
|
|
294
|
-
const car = writer.close();
|
|
295
|
-
const reader = await CarReader.fromBytes(car);
|
|
296
|
-
assert.deepEqual(await reader.getRoots(), [
|
|
297
|
-
b1.cid,
|
|
298
|
-
b2.cid
|
|
299
|
-
]);
|
|
300
|
-
assert.deepEqual(reader._blocks, [
|
|
301
|
-
{
|
|
302
|
-
cid: b1.cid,
|
|
303
|
-
bytes: b1.bytes
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
cid: b2.cid,
|
|
307
|
-
bytes: b2.bytes
|
|
308
|
-
}
|
|
309
|
-
]);
|
|
310
|
-
});
|
|
311
|
-
});
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { bytes } from 'multiformats';
|
|
2
|
-
import { encode as cbEncode } from '@ipld/dag-cbor';
|
|
3
|
-
import { encode as vEncode } from 'varint';
|
|
4
|
-
import { CarReader } from '../lib/reader-browser.js';
|
|
5
|
-
import {
|
|
6
|
-
carBytes,
|
|
7
|
-
assert,
|
|
8
|
-
goCarV2Bytes
|
|
9
|
-
} from './common.js';
|
|
10
|
-
function makeHeader(block) {
|
|
11
|
-
const u = cbEncode(block);
|
|
12
|
-
const l = vEncode(u.length);
|
|
13
|
-
const u2 = new Uint8Array(u.length + l.length);
|
|
14
|
-
u2.set(l, 0);
|
|
15
|
-
u2.set(u, l.length);
|
|
16
|
-
return u2;
|
|
17
|
-
}
|
|
18
|
-
describe('Misc errors', () => {
|
|
19
|
-
const buf = carBytes.slice();
|
|
20
|
-
it('decode errors', async () => {
|
|
21
|
-
const buf2 = new Uint8Array(buf.length);
|
|
22
|
-
buf2.set(buf, 0);
|
|
23
|
-
buf2[101] = 0;
|
|
24
|
-
await assert.isRejected(CarReader.fromBytes(buf2), {
|
|
25
|
-
name: 'Error',
|
|
26
|
-
message: 'Unexpected CID version (0)'
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
it('bad version', async () => {
|
|
30
|
-
const buf2 = bytes.fromHex('0aa16776657273696f6e03');
|
|
31
|
-
assert.strictEqual(bytes.toHex(makeHeader({ version: 3 })), '0aa16776657273696f6e03');
|
|
32
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR version: 3');
|
|
33
|
-
});
|
|
34
|
-
describe('bad header', async () => {
|
|
35
|
-
it('sanity check', async () => {
|
|
36
|
-
const buf2 = makeHeader({
|
|
37
|
-
version: 1,
|
|
38
|
-
roots: []
|
|
39
|
-
});
|
|
40
|
-
await assert.isFulfilled(CarReader.fromBytes(buf2));
|
|
41
|
-
});
|
|
42
|
-
it('no \'version\' array', async () => {
|
|
43
|
-
const buf2 = makeHeader({ roots: [] });
|
|
44
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
45
|
-
});
|
|
46
|
-
it('bad \'version\' type', async () => {
|
|
47
|
-
const buf2 = makeHeader({
|
|
48
|
-
version: '1',
|
|
49
|
-
roots: []
|
|
50
|
-
});
|
|
51
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
52
|
-
});
|
|
53
|
-
it('no \'roots\' array', async () => {
|
|
54
|
-
const buf2 = makeHeader({ version: 1 });
|
|
55
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
56
|
-
});
|
|
57
|
-
it('bad \'roots\' type', async () => {
|
|
58
|
-
const buf2 = makeHeader({
|
|
59
|
-
version: 1,
|
|
60
|
-
roots: {}
|
|
61
|
-
});
|
|
62
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
63
|
-
});
|
|
64
|
-
it('extraneous properties', async () => {
|
|
65
|
-
const buf2 = makeHeader({
|
|
66
|
-
version: 1,
|
|
67
|
-
roots: [],
|
|
68
|
-
blip: true
|
|
69
|
-
});
|
|
70
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
71
|
-
});
|
|
72
|
-
it('not an object', async () => {
|
|
73
|
-
const buf2 = makeHeader([
|
|
74
|
-
1,
|
|
75
|
-
[]
|
|
76
|
-
]);
|
|
77
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
78
|
-
});
|
|
79
|
-
it('not an object', async () => {
|
|
80
|
-
const buf2 = makeHeader(null);
|
|
81
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
|
|
82
|
-
});
|
|
83
|
-
it('recursive v2 header', async () => {
|
|
84
|
-
const v2Header = goCarV2Bytes.slice(0, 51);
|
|
85
|
-
const buf2 = new Uint8Array(51 * 2);
|
|
86
|
-
buf2.set(v2Header, 0);
|
|
87
|
-
buf2.set(v2Header, 51);
|
|
88
|
-
await assert.isRejected(CarReader.fromBytes(buf2), Error, 'Invalid CAR version: 2 (expected 1)');
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
@@ -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-browser.js';
|
|
2
|
-
import {
|
|
3
|
-
CarReader,
|
|
4
|
-
__browser
|
|
5
|
-
} from '../lib/reader-browser.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-browser.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
|
-
}
|