@ipld/car 4.1.6 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +12 -4
  3. package/dist/index.min.js +5 -0
  4. package/{types → dist/src}/api.d.ts +19 -19
  5. package/dist/src/api.d.ts.map +1 -0
  6. package/{types/lib → dist/src}/buffer-writer.d.ts +10 -10
  7. package/{types/lib → dist/src}/buffer-writer.d.ts.map +1 -1
  8. package/dist/src/coding.d.ts +41 -0
  9. package/dist/src/coding.d.ts.map +1 -0
  10. package/{types/lib → dist/src}/decoder.d.ts +3 -3
  11. package/{types/lib → dist/src}/decoder.d.ts.map +1 -1
  12. package/{types/lib → dist/src}/encoder.d.ts +2 -2
  13. package/{types/lib → dist/src}/encoder.d.ts.map +1 -1
  14. package/{types/lib → dist/src}/header-validator.d.ts +0 -0
  15. package/dist/src/header-validator.d.ts.map +1 -0
  16. package/dist/src/index-browser.d.ts +8 -0
  17. package/dist/src/index-browser.d.ts.map +1 -0
  18. package/dist/src/index.d.ts +9 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/{types/lib → dist/src}/indexed-reader-browser.d.ts +0 -0
  21. package/dist/src/indexed-reader-browser.d.ts.map +1 -0
  22. package/{types/lib → dist/src}/indexed-reader.d.ts +13 -13
  23. package/dist/src/indexed-reader.d.ts.map +1 -0
  24. package/{types/lib → dist/src}/indexer.d.ts +9 -9
  25. package/{types/lib → dist/src}/indexer.d.ts.map +1 -1
  26. package/{types/lib → dist/src}/iterator-channel.d.ts +0 -0
  27. package/{types/lib → dist/src}/iterator-channel.d.ts.map +1 -1
  28. package/{types/lib → dist/src}/iterator.d.ts +8 -8
  29. package/{types/lib → dist/src}/iterator.d.ts.map +1 -1
  30. package/{types/lib → dist/src}/reader-browser.d.ts +10 -10
  31. package/{types/lib → dist/src}/reader-browser.d.ts.map +1 -1
  32. package/{types/lib → dist/src}/reader.d.ts +5 -5
  33. package/{types/lib → dist/src}/reader.d.ts.map +1 -1
  34. package/{types/lib → dist/src}/writer-browser.d.ts +10 -10
  35. package/{types/lib → dist/src}/writer-browser.d.ts.map +1 -1
  36. package/{types/lib → dist/src}/writer.d.ts +4 -4
  37. package/{types/lib → dist/src}/writer.d.ts.map +1 -1
  38. package/package.json +102 -209
  39. package/{api.ts → src/api.ts} +14 -14
  40. package/{lib → src}/buffer-writer.js +5 -5
  41. package/src/coding.ts +56 -0
  42. package/{lib → src}/decoder.js +4 -4
  43. package/{lib → src}/encoder.js +1 -1
  44. package/src/header-validator.js +74 -0
  45. package/{lib → src}/header.ipldsch +0 -0
  46. package/src/index-browser.js +14 -0
  47. package/src/index.js +16 -0
  48. package/{lib → src}/indexed-reader-browser.js +0 -0
  49. package/{lib → src}/indexed-reader.js +9 -9
  50. package/{lib → src}/indexer.js +4 -4
  51. package/{lib → src}/iterator-channel.js +0 -0
  52. package/{lib → src}/iterator.js +4 -4
  53. package/{lib → src}/reader-browser.js +7 -7
  54. package/{lib → src}/reader.js +5 -5
  55. package/{lib → src}/writer-browser.js +7 -7
  56. package/{lib → src}/writer.js +3 -3
  57. package/LICENSE-APACHE +0 -13
  58. package/LICENSE-MIT +0 -7
  59. package/buffer-writer +0 -1
  60. package/car-browser.js +0 -14
  61. package/car.js +0 -16
  62. package/cjs/browser-test/common.js +0 -301
  63. package/cjs/browser-test/node-test-file-streams.js +0 -71
  64. package/cjs/browser-test/node-test-indexed-reader.js +0 -51
  65. package/cjs/browser-test/node-test-large.js +0 -135
  66. package/cjs/browser-test/node-test-raw.js +0 -68
  67. package/cjs/browser-test/node-test-updateroots.js +0 -78
  68. package/cjs/browser-test/test-buffer-writer.js +0 -330
  69. package/cjs/browser-test/test-errors.js +0 -90
  70. package/cjs/browser-test/test-indexer.js +0 -80
  71. package/cjs/browser-test/test-interface.js +0 -21
  72. package/cjs/browser-test/test-iterator.js +0 -83
  73. package/cjs/browser-test/test-reader.js +0 -278
  74. package/cjs/browser-test/test-writer.js +0 -286
  75. package/cjs/browser-test/verify-store-reader.js +0 -142
  76. package/cjs/car-browser.js +0 -18
  77. package/cjs/car.js +0 -20
  78. package/cjs/lib/buffer-writer.js +0 -164
  79. package/cjs/lib/decoder.js +0 -301
  80. package/cjs/lib/encoder.js +0 -44
  81. package/cjs/lib/header-validator.js +0 -29
  82. package/cjs/lib/indexed-reader-browser.js +0 -13
  83. package/cjs/lib/indexed-reader.js +0 -90
  84. package/cjs/lib/indexer.js +0 -41
  85. package/cjs/lib/iterator-channel.js +0 -77
  86. package/cjs/lib/iterator.js +0 -97
  87. package/cjs/lib/reader-browser.js +0 -62
  88. package/cjs/lib/reader.js +0 -38
  89. package/cjs/lib/writer-browser.js +0 -118
  90. package/cjs/lib/writer.js +0 -51
  91. package/cjs/node-test/common.js +0 -301
  92. package/cjs/node-test/node-test-file-streams.js +0 -71
  93. package/cjs/node-test/node-test-indexed-reader.js +0 -51
  94. package/cjs/node-test/node-test-large.js +0 -135
  95. package/cjs/node-test/node-test-raw.js +0 -68
  96. package/cjs/node-test/node-test-updateroots.js +0 -78
  97. package/cjs/node-test/test-buffer-writer.js +0 -330
  98. package/cjs/node-test/test-errors.js +0 -90
  99. package/cjs/node-test/test-indexer.js +0 -80
  100. package/cjs/node-test/test-interface.js +0 -21
  101. package/cjs/node-test/test-iterator.js +0 -83
  102. package/cjs/node-test/test-reader.js +0 -278
  103. package/cjs/node-test/test-writer.js +0 -286
  104. package/cjs/node-test/verify-store-reader.js +0 -142
  105. package/decoder +0 -1
  106. package/esm/browser-test/common.js +0 -274
  107. package/esm/browser-test/node-test-file-streams.js +0 -76
  108. package/esm/browser-test/node-test-indexed-reader.js +0 -53
  109. package/esm/browser-test/node-test-large.js +0 -109
  110. package/esm/browser-test/node-test-raw.js +0 -63
  111. package/esm/browser-test/node-test-updateroots.js +0 -76
  112. package/esm/browser-test/test-buffer-writer.js +0 -311
  113. package/esm/browser-test/test-errors.js +0 -91
  114. package/esm/browser-test/test-indexer.js +0 -85
  115. package/esm/browser-test/test-interface.js +0 -24
  116. package/esm/browser-test/test-iterator.js +0 -91
  117. package/esm/browser-test/test-reader.js +0 -270
  118. package/esm/browser-test/test-writer.js +0 -297
  119. package/esm/browser-test/verify-store-reader.js +0 -122
  120. package/esm/car-browser.js +0 -16
  121. package/esm/car.js +0 -18
  122. package/esm/lib/buffer-writer.js +0 -129
  123. package/esm/lib/decoder.js +0 -265
  124. package/esm/lib/encoder.js +0 -35
  125. package/esm/lib/header-validator.js +0 -23
  126. package/esm/lib/indexed-reader-browser.js +0 -6
  127. package/esm/lib/indexed-reader.js +0 -78
  128. package/esm/lib/indexer.js +0 -38
  129. package/esm/lib/iterator-channel.js +0 -71
  130. package/esm/lib/iterator.js +0 -92
  131. package/esm/lib/reader-browser.js +0 -57
  132. package/esm/lib/reader.js +0 -26
  133. package/esm/lib/writer-browser.js +0 -115
  134. package/esm/lib/writer.js +0 -42
  135. package/esm/node-test/common.js +0 -274
  136. package/esm/node-test/node-test-file-streams.js +0 -76
  137. package/esm/node-test/node-test-indexed-reader.js +0 -53
  138. package/esm/node-test/node-test-large.js +0 -109
  139. package/esm/node-test/node-test-raw.js +0 -63
  140. package/esm/node-test/node-test-updateroots.js +0 -76
  141. package/esm/node-test/test-buffer-writer.js +0 -311
  142. package/esm/node-test/test-errors.js +0 -91
  143. package/esm/node-test/test-indexer.js +0 -85
  144. package/esm/node-test/test-interface.js +0 -24
  145. package/esm/node-test/test-iterator.js +0 -91
  146. package/esm/node-test/test-reader.js +0 -270
  147. package/esm/node-test/test-writer.js +0 -297
  148. package/esm/node-test/verify-store-reader.js +0 -122
  149. package/esm/package.json +0 -9
  150. package/examples/car-to-fixture.js +0 -66
  151. package/examples/dump-car.js +0 -58
  152. package/examples/dump-index.js +0 -24
  153. package/examples/package.json +0 -27
  154. package/examples/round-trip.js +0 -45
  155. package/examples/test-examples.js +0 -115
  156. package/examples/verify-car.js +0 -87
  157. package/index.js +0 -1
  158. package/indexed-reader +0 -1
  159. package/indexer +0 -1
  160. package/iterator +0 -1
  161. package/lib/coding.ts +0 -56
  162. package/lib/header-validator.js +0 -33
  163. package/reader +0 -1
  164. package/test/_fixtures_to_js.mjs +0 -24
  165. package/test/common.js +0 -210
  166. package/test/go.car +0 -0
  167. package/test/go.carv2 +0 -0
  168. package/test/node-test-file-streams.js +0 -84
  169. package/test/node-test-indexed-reader.js +0 -45
  170. package/test/node-test-large.js +0 -112
  171. package/test/node-test-raw.js +0 -83
  172. package/test/node-test-updateroots.js +0 -89
  173. package/test/test-buffer-writer.js +0 -256
  174. package/test/test-errors.js +0 -98
  175. package/test/test-indexer.js +0 -87
  176. package/test/test-interface.js +0 -24
  177. package/test/test-iterator.js +0 -74
  178. package/test/test-reader.js +0 -245
  179. package/test/test-writer.js +0 -336
  180. package/test/verify-store-reader.js +0 -191
  181. package/tsconfig.json +0 -48
  182. package/types/api.d.ts.map +0 -1
  183. package/types/car-browser.d.ts +0 -8
  184. package/types/car-browser.d.ts.map +0 -1
  185. package/types/car.d.ts +0 -9
  186. package/types/car.d.ts.map +0 -1
  187. package/types/lib/coding.d.ts +0 -41
  188. package/types/lib/coding.d.ts.map +0 -1
  189. package/types/lib/header-validator.d.ts.map +0 -1
  190. package/types/lib/indexed-reader-browser.d.ts.map +0 -1
  191. package/types/lib/indexed-reader.d.ts.map +0 -1
  192. package/types/test/_fixtures_to_js.d.mts +0 -3
  193. package/types/test/_fixtures_to_js.d.mts.map +0 -1
  194. package/types/test/common.d.ts +0 -73
  195. package/types/test/common.d.ts.map +0 -1
  196. package/types/test/fixtures-expectations.d.ts +0 -63
  197. package/types/test/fixtures-expectations.d.ts.map +0 -1
  198. package/types/test/fixtures.d.ts +0 -3
  199. package/types/test/fixtures.d.ts.map +0 -1
  200. package/types/test/node-test-file-streams.d.ts +0 -3
  201. package/types/test/node-test-file-streams.d.ts.map +0 -1
  202. package/types/test/node-test-indexed-reader.d.ts +0 -2
  203. package/types/test/node-test-indexed-reader.d.ts.map +0 -1
  204. package/types/test/node-test-large.d.ts +0 -2
  205. package/types/test/node-test-large.d.ts.map +0 -1
  206. package/types/test/node-test-raw.d.ts +0 -2
  207. package/types/test/node-test-raw.d.ts.map +0 -1
  208. package/types/test/node-test-updateroots.d.ts +0 -2
  209. package/types/test/node-test-updateroots.d.ts.map +0 -1
  210. package/types/test/test-buffer-writer.d.ts +0 -2
  211. package/types/test/test-buffer-writer.d.ts.map +0 -1
  212. package/types/test/test-errors.d.ts +0 -2
  213. package/types/test/test-errors.d.ts.map +0 -1
  214. package/types/test/test-indexer.d.ts +0 -2
  215. package/types/test/test-indexer.d.ts.map +0 -1
  216. package/types/test/test-interface.d.ts +0 -2
  217. package/types/test/test-interface.d.ts.map +0 -1
  218. package/types/test/test-iterator.d.ts +0 -2
  219. package/types/test/test-iterator.d.ts.map +0 -1
  220. package/types/test/test-reader.d.ts +0 -2
  221. package/types/test/test-reader.d.ts.map +0 -1
  222. package/types/test/test-writer.d.ts +0 -2
  223. package/types/test/test-writer.d.ts.map +0 -1
  224. package/types/test/verify-store-reader.d.ts +0 -29
  225. package/types/test/verify-store-reader.d.ts.map +0 -1
  226. package/writer +0 -1
@@ -1,78 +0,0 @@
1
- 'use strict';
2
-
3
- var path = require('path');
4
- var url = require('url');
5
- var fs = require('fs');
6
- var util = require('util');
7
- var cid = require('multiformats/cid');
8
- var readerBrowser = require('../lib/reader-browser.js');
9
- var writerBrowser = require('../lib/writer-browser.js');
10
- var verifyStoreReader = require('./verify-store-reader.js');
11
- var common = require('./common.js');
12
-
13
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
-
15
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
16
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
17
-
18
- const fsopen = util.promisify(fs__default["default"].open);
19
- const fsclose = util.promisify(fs__default["default"].close);
20
- const __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('browser-test/node-test-updateroots.js', document.baseURI).href)));
21
- const __dirname$1 = path__default["default"].dirname(__filename$1);
22
- const goCarPath = path__default["default"].join(__dirname$1, 'go.car');
23
- const tmpCarPath = path__default["default"].join(__dirname$1, 'tmp.car');
24
- const newRoots = [
25
- cid.CID.parse('bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq'),
26
- cid.CID.parse('bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4')
27
- ];
28
- async function verify() {
29
- const reader = await readerBrowser.CarReader.fromIterable(fs__default["default"].createReadStream(tmpCarPath));
30
- await common.assert.isRejected(verifyStoreReader.verifyRoots(reader));
31
- common.assert.deepEqual(await reader.getRoots(), newRoots);
32
- await verifyStoreReader.verifyHas(reader);
33
- await verifyStoreReader.verifyGet(reader);
34
- await verifyStoreReader.verifyBlocks(reader.blocks(), true);
35
- await verifyStoreReader.verifyCids(reader.cids(), true);
36
- }
37
- describe('Node CarWriter.updateHeader()', () => {
38
- before(async () => {
39
- try {
40
- await fs__default["default"].promises.unlink(tmpCarPath);
41
- } catch (e) {
42
- }
43
- });
44
- beforeEach(async () => {
45
- await fs__default["default"].promises.copyFile(goCarPath, tmpCarPath);
46
- });
47
- afterEach(async () => {
48
- await fs__default["default"].promises.unlink(tmpCarPath);
49
- });
50
- it('update roots (fd)', async () => {
51
- const fd = await fsopen(tmpCarPath, 'r+');
52
- await writerBrowser.CarWriter.updateRootsInFile(fd, newRoots);
53
- await fsclose(fd);
54
- await verify();
55
- });
56
- it('update roots (FileHandle)', async () => {
57
- const fd = await fs__default["default"].promises.open(tmpCarPath, 'r+');
58
- await writerBrowser.CarWriter.updateRootsInFile(fd, newRoots);
59
- await fd.close();
60
- await verify();
61
- });
62
- it('error: bad fd', async () => {
63
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInFile(true, newRoots), {
64
- name: 'TypeError',
65
- message: 'Bad fd'
66
- });
67
- });
68
- it('error: wrong header size', async () => {
69
- const fd = await fs__default["default"].promises.open(tmpCarPath, 'r+');
70
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInFile(fd, [
71
- ...newRoots,
72
- newRoots[0]
73
- ]), /can only overwrite a header of the same length/);
74
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInFile(fd, [newRoots[0]]), /can only overwrite a header of the same length/);
75
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInFile(fd, []), /can only overwrite a header of the same length/);
76
- await fd.close();
77
- });
78
- });
@@ -1,330 +0,0 @@
1
- 'use strict';
2
-
3
- var bufferWriter = require('../lib/buffer-writer.js');
4
- var readerBrowser = require('../lib/reader-browser.js');
5
- var encoder = require('../lib/encoder.js');
6
- var common = require('./common.js');
7
- var multiformats = require('multiformats');
8
- var CBOR = require('@ipld/dag-cbor');
9
- var sha2 = require('multiformats/hashes/sha2');
10
- var identity = require('multiformats/hashes/identity');
11
- var raw = require('multiformats/codecs/raw');
12
- var Block = require('multiformats/block');
13
-
14
- function _interopNamespace(e) {
15
- if (e && e.__esModule) return e;
16
- var n = Object.create(null);
17
- if (e) {
18
- Object.keys(e).forEach(function (k) {
19
- if (k !== 'default') {
20
- var d = Object.getOwnPropertyDescriptor(e, k);
21
- Object.defineProperty(n, k, d.get ? d : {
22
- enumerable: true,
23
- get: function () { return e[k]; }
24
- });
25
- }
26
- });
27
- }
28
- n["default"] = e;
29
- return Object.freeze(n);
30
- }
31
-
32
- var CBOR__namespace = /*#__PURE__*/_interopNamespace(CBOR);
33
- var raw__namespace = /*#__PURE__*/_interopNamespace(raw);
34
- var Block__namespace = /*#__PURE__*/_interopNamespace(Block);
35
-
36
- describe('CarBufferWriter', () => {
37
- const cid = multiformats.CID.parse('bafkreifuosuzujyf4i6psbneqtwg2fhplc2wxptc5euspa2gn3bwhnihfu');
38
- describe('calculateHeaderLength', async () => {
39
- for (const count of [
40
- 0,
41
- 1,
42
- 10,
43
- 18,
44
- 24,
45
- 48,
46
- 124,
47
- 255,
48
- 258,
49
- 65536 - 1,
50
- 65536
51
- ]) {
52
- it(`calculateHeaderLength(new Array(${ count }).fill(36))`, () => {
53
- const roots = new Array(count).fill(cid);
54
- const sizes = new Array(count).fill(cid.bytes.byteLength);
55
- common.assert.deepEqual(bufferWriter.calculateHeaderLength(sizes), encoder.createHeader(roots).byteLength);
56
- });
57
- it(`calculateHeaderLength(new Array(${ count }).fill(36))`, () => {
58
- const roots = new Array(count).fill(cid);
59
- const rootLengths = roots.map(c => c.bytes.byteLength);
60
- common.assert.deepEqual(bufferWriter.calculateHeaderLength(rootLengths), encoder.createHeader(roots).byteLength);
61
- });
62
- }
63
- it('estimate on large CIDs', () => {
64
- const largeCID = multiformats.CID.parse(`bafkqbbac${ 'a'.repeat(416) }`);
65
- common.assert.equal(bufferWriter.calculateHeaderLength([
66
- cid.bytes.byteLength,
67
- largeCID.bytes.byteLength
68
- ]), encoder.createHeader([
69
- cid,
70
- largeCID
71
- ]).byteLength);
72
- });
73
- it('estimate on large CIDs 2', () => {
74
- const largeCID = multiformats.CID.createV1(raw__namespace.code, identity.identity.digest(new Uint8Array(512).fill(1)));
75
- common.assert.equal(bufferWriter.calculateHeaderLength([
76
- cid.bytes.byteLength,
77
- largeCID.bytes.byteLength
78
- ]), encoder.createHeader([
79
- cid,
80
- largeCID
81
- ]).byteLength);
82
- });
83
- });
84
- describe('writer', () => {
85
- it('estimate header and write blocks', async () => {
86
- const headerSize = bufferWriter.estimateHeaderLength(1);
87
- const dataSize = 256;
88
- const buffer = new ArrayBuffer(headerSize + dataSize);
89
- const writer = bufferWriter.createWriter(buffer, { headerSize });
90
- const b1 = await Block__namespace.encode({
91
- value: { hello: 'world' },
92
- codec: CBOR__namespace,
93
- hasher: sha2.sha256
94
- });
95
- writer.write(b1);
96
- const b2 = await Block__namespace.encode({
97
- value: { bye: 'world' },
98
- codec: CBOR__namespace,
99
- hasher: sha2.sha256
100
- });
101
- writer.write(b2);
102
- writer.addRoot(b1.cid);
103
- const bytes = writer.close();
104
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
105
- common.assert.deepEqual(await reader.getRoots(), [b1.cid]);
106
- common.assert.deepEqual(reader._blocks, [
107
- {
108
- cid: b1.cid,
109
- bytes: b1.bytes
110
- },
111
- {
112
- cid: b2.cid,
113
- bytes: b2.bytes
114
- }
115
- ]);
116
- });
117
- it('overestimate header', async () => {
118
- const headerSize = bufferWriter.estimateHeaderLength(2);
119
- const dataSize = 256;
120
- const buffer = new ArrayBuffer(headerSize + dataSize);
121
- const writer = bufferWriter.createWriter(buffer, { headerSize });
122
- const b1 = await Block__namespace.encode({
123
- value: { hello: 'world' },
124
- codec: CBOR__namespace,
125
- hasher: sha2.sha256
126
- });
127
- writer.write(b1);
128
- const b2 = await Block__namespace.encode({
129
- value: { bye: 'world' },
130
- codec: CBOR__namespace,
131
- hasher: sha2.sha256
132
- });
133
- writer.write(b2);
134
- writer.addRoot(b1.cid);
135
- common.assert.throws(() => writer.close(), /Header size was overestimate/);
136
- const bytes = writer.close({ resize: true });
137
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
138
- common.assert.deepEqual(await reader.getRoots(), [b1.cid]);
139
- common.assert.deepEqual(reader._blocks, [
140
- {
141
- cid: b1.cid,
142
- bytes: b1.bytes
143
- },
144
- {
145
- cid: b2.cid,
146
- bytes: b2.bytes
147
- }
148
- ]);
149
- });
150
- it('underestimate header', async () => {
151
- const headerSize = bufferWriter.estimateHeaderLength(2);
152
- const dataSize = 300;
153
- const buffer = new ArrayBuffer(headerSize + dataSize);
154
- const writer = bufferWriter.createWriter(buffer, { headerSize });
155
- const b1 = await Block__namespace.encode({
156
- value: { hello: 'world' },
157
- codec: CBOR__namespace,
158
- hasher: sha2.sha256
159
- });
160
- writer.write(b1);
161
- writer.addRoot(b1.cid);
162
- const b2 = await Block__namespace.encode({
163
- value: { bye: 'world' },
164
- codec: CBOR__namespace,
165
- hasher: sha2.sha512
166
- });
167
- writer.write(b2);
168
- common.assert.throws(() => writer.addRoot(b2.cid), /has no capacity/);
169
- writer.addRoot(b2.cid, { resize: true });
170
- const bytes = writer.close();
171
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
172
- common.assert.deepEqual(await reader.getRoots(), [
173
- b1.cid,
174
- b2.cid
175
- ]);
176
- common.assert.deepEqual(reader._blocks, [
177
- {
178
- cid: b1.cid,
179
- bytes: b1.bytes
180
- },
181
- {
182
- cid: b2.cid,
183
- bytes: b2.bytes
184
- }
185
- ]);
186
- });
187
- });
188
- it('has no space for the root', async () => {
189
- const headerSize = bufferWriter.estimateHeaderLength(1);
190
- const dataSize = 100;
191
- const buffer = new ArrayBuffer(headerSize + dataSize);
192
- const writer = bufferWriter.createWriter(buffer, { headerSize });
193
- const b1 = await Block__namespace.encode({
194
- value: { hello: 'world' },
195
- codec: CBOR__namespace,
196
- hasher: sha2.sha256
197
- });
198
- writer.write(b1);
199
- writer.addRoot(b1.cid);
200
- const b2 = await Block__namespace.encode({
201
- value: { bye: 'world' },
202
- codec: CBOR__namespace,
203
- hasher: sha2.sha256
204
- });
205
- writer.write(b2);
206
- common.assert.throws(() => writer.addRoot(b2.cid), /Buffer has no capacity for a new root/);
207
- common.assert.throws(() => writer.addRoot(b2.cid, { resize: true }), /Buffer has no capacity for a new root/);
208
- const bytes = writer.close();
209
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
210
- common.assert.deepEqual(await reader.getRoots(), [b1.cid]);
211
- common.assert.deepEqual(reader._blocks, [
212
- {
213
- cid: b1.cid,
214
- bytes: b1.bytes
215
- },
216
- {
217
- cid: b2.cid,
218
- bytes: b2.bytes
219
- }
220
- ]);
221
- });
222
- it('has no space for the block', async () => {
223
- const headerSize = bufferWriter.estimateHeaderLength(1);
224
- const dataSize = 58;
225
- const buffer = new ArrayBuffer(headerSize + dataSize);
226
- const writer = bufferWriter.createWriter(buffer, { headerSize });
227
- const b1 = await Block__namespace.encode({
228
- value: { hello: 'world' },
229
- codec: CBOR__namespace,
230
- hasher: sha2.sha256
231
- });
232
- writer.write(b1);
233
- writer.addRoot(b1.cid);
234
- const b2 = await Block__namespace.encode({
235
- value: { bye: 'world' },
236
- codec: CBOR__namespace,
237
- hasher: sha2.sha256
238
- });
239
- common.assert.throws(() => writer.write(b2), /Buffer has no capacity for this block/);
240
- const bytes = writer.close();
241
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
242
- common.assert.deepEqual(await reader.getRoots(), [b1.cid]);
243
- common.assert.deepEqual(reader._blocks, [{
244
- cid: b1.cid,
245
- bytes: b1.bytes
246
- }]);
247
- });
248
- it('provide roots', async () => {
249
- const b1 = await Block__namespace.encode({
250
- value: { hello: 'world' },
251
- codec: CBOR__namespace,
252
- hasher: sha2.sha256
253
- });
254
- const b2 = await Block__namespace.encode({
255
- value: { bye: 'world' },
256
- codec: CBOR__namespace,
257
- hasher: sha2.sha512
258
- });
259
- const buffer = new ArrayBuffer(300);
260
- const writer = bufferWriter.createWriter(buffer, {
261
- roots: [
262
- b1.cid,
263
- b2.cid
264
- ]
265
- });
266
- writer.write(b1);
267
- writer.write(b2);
268
- const bytes = writer.close();
269
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
270
- common.assert.deepEqual(await reader.getRoots(), [
271
- b1.cid,
272
- b2.cid
273
- ]);
274
- common.assert.deepEqual(reader._blocks, [
275
- {
276
- cid: b1.cid,
277
- bytes: b1.bytes
278
- },
279
- {
280
- cid: b2.cid,
281
- bytes: b2.bytes
282
- }
283
- ]);
284
- });
285
- it('provide large CID root', async () => {
286
- const bytes = new Uint8Array(512).fill(1);
287
- const b1 = await Block__namespace.encode({
288
- value: { hello: 'world' },
289
- codec: CBOR__namespace,
290
- hasher: sha2.sha256
291
- });
292
- const b2 = {
293
- cid: multiformats.CID.createV1(raw__namespace.code, identity.identity.digest(bytes)),
294
- bytes
295
- };
296
- const headerSize = CBOR__namespace.encode({
297
- version: 1,
298
- roots: [
299
- b1.cid,
300
- b2.cid
301
- ]
302
- }).byteLength;
303
- const bodySize = bufferWriter.blockLength(b1) + bufferWriter.blockLength(b2);
304
- const varintSize = multiformats.varint.encodingLength(headerSize);
305
- const writer = bufferWriter.createWriter(new ArrayBuffer(varintSize + headerSize + bodySize), {
306
- roots: [
307
- b1.cid,
308
- b2.cid
309
- ]
310
- });
311
- writer.write(b1);
312
- writer.write(b2);
313
- const car = writer.close();
314
- const reader = await readerBrowser.CarReader.fromBytes(car);
315
- common.assert.deepEqual(await reader.getRoots(), [
316
- b1.cid,
317
- b2.cid
318
- ]);
319
- common.assert.deepEqual(reader._blocks, [
320
- {
321
- cid: b1.cid,
322
- bytes: b1.bytes
323
- },
324
- {
325
- cid: b2.cid,
326
- bytes: b2.bytes
327
- }
328
- ]);
329
- });
330
- });
@@ -1,90 +0,0 @@
1
- 'use strict';
2
-
3
- var multiformats = require('multiformats');
4
- var CBOR = require('@ipld/dag-cbor');
5
- var varint = require('varint');
6
- var readerBrowser = require('../lib/reader-browser.js');
7
- var common = require('./common.js');
8
-
9
- function makeHeader(block) {
10
- const u = CBOR.encode(block);
11
- const l = varint.encode(u.length);
12
- const u2 = new Uint8Array(u.length + l.length);
13
- u2.set(l, 0);
14
- u2.set(u, l.length);
15
- return u2;
16
- }
17
- describe('Misc errors', () => {
18
- const buf = common.carBytes.slice();
19
- it('decode errors', async () => {
20
- const buf2 = new Uint8Array(buf.length);
21
- buf2.set(buf, 0);
22
- buf2[101] = 0;
23
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), {
24
- name: 'Error',
25
- message: 'Unexpected CID version (0)'
26
- });
27
- });
28
- it('bad version', async () => {
29
- const buf2 = multiformats.bytes.fromHex('0aa16776657273696f6e03');
30
- common.assert.strictEqual(multiformats.bytes.toHex(makeHeader({ version: 3 })), '0aa16776657273696f6e03');
31
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR version: 3');
32
- });
33
- describe('bad header', async () => {
34
- it('sanity check', async () => {
35
- const buf2 = makeHeader({
36
- version: 1,
37
- roots: []
38
- });
39
- await common.assert.isFulfilled(readerBrowser.CarReader.fromBytes(buf2));
40
- });
41
- it('no \'version\' array', async () => {
42
- const buf2 = makeHeader({ roots: [] });
43
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
44
- });
45
- it('bad \'version\' type', async () => {
46
- const buf2 = makeHeader({
47
- version: '1',
48
- roots: []
49
- });
50
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
51
- });
52
- it('no \'roots\' array', async () => {
53
- const buf2 = makeHeader({ version: 1 });
54
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
55
- });
56
- it('bad \'roots\' type', async () => {
57
- const buf2 = makeHeader({
58
- version: 1,
59
- roots: {}
60
- });
61
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
62
- });
63
- it('extraneous properties', async () => {
64
- const buf2 = makeHeader({
65
- version: 1,
66
- roots: [],
67
- blip: true
68
- });
69
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
70
- });
71
- it('not an object', async () => {
72
- const buf2 = makeHeader([
73
- 1,
74
- []
75
- ]);
76
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
77
- });
78
- it('not an object', async () => {
79
- const buf2 = makeHeader(null);
80
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR header format');
81
- });
82
- it('recursive v2 header', async () => {
83
- const v2Header = common.goCarV2Bytes.slice(0, 51);
84
- const buf2 = new Uint8Array(51 * 2);
85
- buf2.set(v2Header, 0);
86
- buf2.set(v2Header, 51);
87
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(buf2), Error, 'Invalid CAR version: 2 (expected 1)');
88
- });
89
- });
90
- });
@@ -1,80 +0,0 @@
1
- 'use strict';
2
-
3
- var indexer = require('../lib/indexer.js');
4
- var common = require('./common.js');
5
- var verifyStoreReader = require('./verify-store-reader.js');
6
-
7
- describe('CarIndexer fromBytes()', () => {
8
- it('complete', async () => {
9
- const indexer$1 = await indexer.CarIndexer.fromBytes(common.goCarBytes);
10
- await verifyStoreReader.verifyRoots(indexer$1);
11
- common.assert.strictEqual(indexer$1.version, 1);
12
- const indexData = [];
13
- for await (const index of indexer$1) {
14
- indexData.push(index);
15
- }
16
- common.assert.deepStrictEqual(indexData, common.goCarIndex);
17
- });
18
- it('v2 complete', async () => {
19
- const indexer$1 = await indexer.CarIndexer.fromBytes(common.goCarV2Bytes);
20
- const roots = await indexer$1.getRoots();
21
- common.assert.strictEqual(roots.length, 1);
22
- common.assert.ok(common.goCarV2Roots[0].equals(roots[0]));
23
- common.assert.strictEqual(indexer$1.version, 2);
24
- const indexData = [];
25
- for await (const index of indexer$1) {
26
- indexData.push(index);
27
- }
28
- common.assert.deepStrictEqual(indexData, common.goCarV2Index);
29
- });
30
- it('bad argument', async () => {
31
- for (const arg of [
32
- true,
33
- false,
34
- null,
35
- undefined,
36
- 'string',
37
- 100,
38
- { obj: 'nope' }
39
- ]) {
40
- await common.assert.isRejected(indexer.CarIndexer.fromBytes(arg));
41
- }
42
- });
43
- });
44
- describe('CarIndexer fromIterable()', () => {
45
- async function verifyIndexer(indexer) {
46
- await verifyStoreReader.verifyRoots(indexer);
47
- common.assert.strictEqual(indexer.version, 1);
48
- const indexData = [];
49
- for await (const index of indexer) {
50
- indexData.push(index);
51
- }
52
- common.assert.deepStrictEqual(indexData, common.goCarIndex);
53
- }
54
- it('complete (single chunk)', async () => {
55
- const indexer$1 = await indexer.CarIndexer.fromIterable(common.makeIterable(common.goCarBytes, common.goCarBytes.length));
56
- return verifyIndexer(indexer$1);
57
- });
58
- it('complete (101-byte chunks)', async () => {
59
- const indexer$1 = await indexer.CarIndexer.fromIterable(common.makeIterable(common.goCarBytes, 101));
60
- return verifyIndexer(indexer$1);
61
- });
62
- it('complete (32-byte chunks)', async () => {
63
- const indexer$1 = await indexer.CarIndexer.fromIterable(common.makeIterable(common.goCarBytes, 32));
64
- return verifyIndexer(indexer$1);
65
- });
66
- it('bad argument', async () => {
67
- for (const arg of [
68
- new Uint8Array(0),
69
- true,
70
- false,
71
- null,
72
- undefined,
73
- 'string',
74
- 100,
75
- { obj: 'nope' }
76
- ]) {
77
- await common.assert.isRejected(indexer.CarIndexer.fromIterable(arg));
78
- }
79
- });
80
- });
@@ -1,21 +0,0 @@
1
- 'use strict';
2
-
3
- require('../car-browser.js');
4
- var readerBrowser = require('../lib/reader-browser.js');
5
- var indexer = require('../lib/indexer.js');
6
- var iterator = require('../lib/iterator.js');
7
- var writerBrowser = require('../lib/writer-browser.js');
8
- var common = require('./common.js');
9
-
10
- describe('Interface', () => {
11
- it('exports match', () => {
12
- common.assert.strictEqual(readerBrowser.CarReader, readerBrowser.CarReader);
13
- common.assert.strictEqual(indexer.CarIndexer, indexer.CarIndexer);
14
- common.assert.strictEqual(iterator.CarBlockIterator, iterator.CarBlockIterator);
15
- common.assert.strictEqual(iterator.CarCIDIterator, iterator.CarCIDIterator);
16
- common.assert.strictEqual(writerBrowser.CarWriter, writerBrowser.CarWriter);
17
- });
18
- it('browser exports', () => {
19
- common.assert.strictEqual(readerBrowser.__browser, globalThis.process === undefined);
20
- });
21
- });
@@ -1,83 +0,0 @@
1
- 'use strict';
2
-
3
- var iterator = require('../lib/iterator.js');
4
- var common = require('./common.js');
5
- var verifyStoreReader = require('./verify-store-reader.js');
6
-
7
- async function verifyBlockIterator(iter) {
8
- await verifyStoreReader.verifyRoots(iter);
9
- await verifyStoreReader.verifyBlocks(iter);
10
- common.assert.strictEqual(iter.version, 1);
11
- return iter;
12
- }
13
- async function verifyCIDIterator(iter) {
14
- await verifyStoreReader.verifyRoots(iter);
15
- await verifyStoreReader.verifyCids(iter);
16
- common.assert.strictEqual(iter.version, 1);
17
- return iter;
18
- }
19
- for (const type of [
20
- 'Block',
21
- 'CID'
22
- ]) {
23
- describe(`Car${ type }Iterator`, () => {
24
- it('fromBytes()', async () => {
25
- if (type === 'Block') {
26
- await verifyBlockIterator(await iterator.CarBlockIterator.fromBytes(common.carBytes));
27
- } else {
28
- await verifyCIDIterator(await iterator.CarCIDIterator.fromBytes(common.carBytes));
29
- }
30
- });
31
- it('fromBytes() bad double read', async () => {
32
- if (type === 'Block') {
33
- const iter = await verifyBlockIterator(await iterator.CarBlockIterator.fromBytes(common.carBytes));
34
- await common.assert.isRejected(verifyStoreReader.verifyBlocks(iter), /more than once/i);
35
- } else {
36
- const iter = await verifyCIDIterator(await iterator.CarCIDIterator.fromBytes(common.carBytes));
37
- await common.assert.isRejected(verifyStoreReader.verifyCids(iter), /more than once/i);
38
- }
39
- });
40
- it('fromBytes() bad argument', async () => {
41
- for (const arg of [
42
- true,
43
- false,
44
- null,
45
- undefined,
46
- 'string',
47
- 100,
48
- { obj: 'nope' }
49
- ]) {
50
- await common.assert.isRejected((type === 'Block' ? iterator.CarBlockIterator : iterator.CarCIDIterator).fromBytes(arg));
51
- }
52
- });
53
- it('fromIterable() bad argument', async () => {
54
- for (const arg of [
55
- new Uint8Array(0),
56
- true,
57
- false,
58
- null,
59
- undefined,
60
- 'string',
61
- 100,
62
- { obj: 'nope' }
63
- ]) {
64
- await common.assert.isRejected((type === 'Block' ? iterator.CarBlockIterator : iterator.CarCIDIterator).fromIterable(arg));
65
- }
66
- });
67
- for (const chunkSize of [
68
- common.carBytes.length,
69
- 100,
70
- 64,
71
- 32
72
- ]) {
73
- const chunkDesc = chunkSize === common.carBytes.length ? 'single chunk' : `${ chunkSize } bytes`;
74
- it(`fromIterable() blocks (${ chunkDesc })`, async () => {
75
- if (type === 'Block') {
76
- await verifyBlockIterator(await iterator.CarBlockIterator.fromIterable(common.makeIterable(common.carBytes, chunkSize)));
77
- } else {
78
- await verifyCIDIterator(await iterator.CarCIDIterator.fromIterable(common.makeIterable(common.carBytes, chunkSize)));
79
- }
80
- });
81
- }
82
- });
83
- }