@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.
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 +7 -7
  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,278 +0,0 @@
1
- 'use strict';
2
-
3
- var readerBrowser = require('../lib/reader-browser.js');
4
- var writerBrowser = require('../lib/writer-browser.js');
5
- var decoder = require('../lib/decoder.js');
6
- var Block = require('multiformats/block');
7
- var sha2 = require('multiformats/hashes/sha2');
8
- var raw = require('multiformats/codecs/raw');
9
- var base64 = require('multiformats/bases/base64');
10
- var dagPb = require('@ipld/dag-pb');
11
- var common = require('./common.js');
12
- var verifyStoreReader = require('./verify-store-reader.js');
13
- var fixtures = require('./fixtures.js');
14
- var fixturesExpectations = require('./fixtures-expectations.js');
15
-
16
- function _interopNamespace(e) {
17
- if (e && e.__esModule) return e;
18
- var n = Object.create(null);
19
- if (e) {
20
- Object.keys(e).forEach(function (k) {
21
- if (k !== 'default') {
22
- var d = Object.getOwnPropertyDescriptor(e, k);
23
- Object.defineProperty(n, k, d.get ? d : {
24
- enumerable: true,
25
- get: function () { return e[k]; }
26
- });
27
- }
28
- });
29
- }
30
- n["default"] = e;
31
- return Object.freeze(n);
32
- }
33
-
34
- var Block__namespace = /*#__PURE__*/_interopNamespace(Block);
35
- var raw__namespace = /*#__PURE__*/_interopNamespace(raw);
36
- var dagPb__namespace = /*#__PURE__*/_interopNamespace(dagPb);
37
-
38
- describe('CarReader fromBytes()', () => {
39
- it('complete', async () => {
40
- const reader = await readerBrowser.CarReader.fromBytes(common.carBytes);
41
- await verifyStoreReader.verifyRoots(reader);
42
- await verifyStoreReader.verifyHas(reader);
43
- await verifyStoreReader.verifyGet(reader);
44
- await verifyStoreReader.verifyBlocks(reader.blocks());
45
- await verifyStoreReader.verifyCids(reader.cids());
46
- common.assert.strictEqual(reader.version, 1);
47
- });
48
- it('complete (get before has) switch', async () => {
49
- const reader = await readerBrowser.CarReader.fromBytes(common.carBytes);
50
- await verifyStoreReader.verifyRoots(reader);
51
- await verifyStoreReader.verifyGet(reader);
52
- await verifyStoreReader.verifyHas(reader);
53
- await verifyStoreReader.verifyBlocks(reader.blocks());
54
- await verifyStoreReader.verifyCids(reader.cids());
55
- });
56
- it('bad argument', async () => {
57
- for (const arg of [
58
- true,
59
- false,
60
- null,
61
- undefined,
62
- 'string',
63
- 100,
64
- { obj: 'nope' }
65
- ]) {
66
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(arg));
67
- }
68
- });
69
- it('decode error - truncated', async () => {
70
- await common.assert.isRejected(readerBrowser.CarReader.fromBytes(common.carBytes.slice(0, common.carBytes.length - 10)), {
71
- name: 'Error',
72
- message: 'Unexpected end of data'
73
- });
74
- });
75
- it('v2 complete', async () => {
76
- const reader = await readerBrowser.CarReader.fromBytes(common.goCarV2Bytes);
77
- const roots = await reader.getRoots();
78
- common.assert.strictEqual(roots.length, 1);
79
- common.assert.ok(common.goCarV2Roots[0].equals(roots[0]));
80
- common.assert.strictEqual(reader.version, 2);
81
- for (const {cid} of common.goCarV2Index) {
82
- const block = await reader.get(cid);
83
- common.assert.isDefined(block);
84
- if (block) {
85
- common.assert.ok(cid.equals(block.cid));
86
- let content;
87
- if (cid.code === dagPb__namespace.code) {
88
- content = dagPb__namespace.decode(block.bytes);
89
- } else if (cid.code === 85) {
90
- content = new TextDecoder().decode(block.bytes);
91
- } else {
92
- common.assert.fail('Unexpected codec');
93
- }
94
- common.assert.deepStrictEqual(content, common.goCarV2Contents[cid.toString()]);
95
- }
96
- }
97
- });
98
- it('decode error - trailing null bytes', async () => {
99
- const bytes = new Uint8Array(common.carBytes.length + 5);
100
- bytes.set(common.carBytes);
101
- try {
102
- await readerBrowser.CarReader.fromBytes(bytes);
103
- } catch (err) {
104
- common.assert.strictEqual(err.message, 'Invalid CAR section (zero length)');
105
- return;
106
- }
107
- common.assert.fail('Did not throw');
108
- });
109
- it('decode error - bad first byte', async () => {
110
- const bytes = new Uint8Array(common.carBytes.length + 5);
111
- bytes.set(common.carBytes);
112
- bytes[0] = 0;
113
- try {
114
- await readerBrowser.CarReader.fromBytes(bytes);
115
- } catch (err) {
116
- common.assert.strictEqual(err.message, 'Invalid CAR header (zero length)');
117
- return;
118
- }
119
- common.assert.fail('Did not throw');
120
- });
121
- });
122
- describe('CarReader fromIterable()', () => {
123
- it('complete (single chunk)', async () => {
124
- const reader = await readerBrowser.CarReader.fromIterable(common.makeIterable(common.carBytes, common.carBytes.length));
125
- await verifyStoreReader.verifyRoots(reader);
126
- await verifyStoreReader.verifyHas(reader);
127
- await verifyStoreReader.verifyGet(reader);
128
- await verifyStoreReader.verifyBlocks(reader.blocks());
129
- await verifyStoreReader.verifyCids(reader.cids());
130
- });
131
- it('complete (101-byte chunks)', async () => {
132
- const reader = await readerBrowser.CarReader.fromIterable(common.makeIterable(common.carBytes, 101));
133
- await verifyStoreReader.verifyRoots(reader);
134
- await verifyStoreReader.verifyHas(reader);
135
- await verifyStoreReader.verifyGet(reader);
136
- await verifyStoreReader.verifyBlocks(reader.blocks());
137
- await verifyStoreReader.verifyCids(reader.cids());
138
- });
139
- it('complete (64-byte chunks)', async () => {
140
- const reader = await readerBrowser.CarReader.fromIterable(common.makeIterable(common.carBytes, 64));
141
- await verifyStoreReader.verifyRoots(reader);
142
- await verifyStoreReader.verifyHas(reader);
143
- await verifyStoreReader.verifyGet(reader);
144
- await verifyStoreReader.verifyBlocks(reader.blocks());
145
- await verifyStoreReader.verifyCids(reader.cids());
146
- });
147
- it('complete (32-byte chunks)', async () => {
148
- const reader = await readerBrowser.CarReader.fromIterable(common.makeIterable(common.carBytes, 32));
149
- await verifyStoreReader.verifyRoots(reader);
150
- await verifyStoreReader.verifyHas(reader);
151
- await verifyStoreReader.verifyGet(reader);
152
- await verifyStoreReader.verifyBlocks(reader.blocks());
153
- await verifyStoreReader.verifyCids(reader.cids());
154
- });
155
- it('handle zero-byte chunks', async () => {
156
- const {writer, out} = await writerBrowser.CarWriter.create([]);
157
- const b1 = await Block__namespace.encode({
158
- value: Uint8Array.from([
159
- 0,
160
- 1,
161
- 2
162
- ]),
163
- hasher: sha2.sha256,
164
- codec: raw__namespace
165
- });
166
- writer.put(b1);
167
- const b2 = await Block__namespace.encode({
168
- value: Uint8Array.from([]),
169
- hasher: sha2.sha256,
170
- codec: raw__namespace
171
- });
172
- writer.put(b2);
173
- const b3 = await Block__namespace.encode({
174
- value: Uint8Array.from([
175
- 3,
176
- 4,
177
- 5
178
- ]),
179
- hasher: sha2.sha256,
180
- codec: raw__namespace
181
- });
182
- writer.put(b3);
183
- const closePromise = writer.close();
184
- const reader = await readerBrowser.CarReader.fromIterable(out);
185
- const b1a = await reader.get(b1.cid);
186
- common.assert.isDefined(b1a);
187
- common.assert.deepStrictEqual(b1a && Array.from(b1a.bytes), [
188
- 0,
189
- 1,
190
- 2
191
- ]);
192
- const b2a = await reader.get(b2.cid);
193
- common.assert.isDefined(b2a);
194
- common.assert.deepStrictEqual(b2a && Array.from(b2a.bytes), []);
195
- const b3a = await reader.get(b3.cid);
196
- common.assert.isDefined(b3a);
197
- common.assert.deepStrictEqual(b3a && Array.from(b3a.bytes), [
198
- 3,
199
- 4,
200
- 5
201
- ]);
202
- await closePromise;
203
- });
204
- it('bad argument', async () => {
205
- for (const arg of [
206
- new Uint8Array(0),
207
- true,
208
- false,
209
- null,
210
- undefined,
211
- 'string',
212
- 100,
213
- { obj: 'nope' }
214
- ]) {
215
- await common.assert.isRejected(readerBrowser.CarReader.fromIterable(arg));
216
- }
217
- });
218
- it('decode error - truncated', async () => {
219
- await common.assert.isRejected(readerBrowser.CarReader.fromIterable(common.makeIterable(common.carBytes.slice(0, common.carBytes.length - 10), 64)), {
220
- name: 'Error',
221
- message: 'Unexpected end of data'
222
- });
223
- });
224
- it('v2 decode error - truncated', async () => {
225
- const bytes = common.goCarV2Bytes.slice();
226
- const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
227
- dv.setBigUint64(35, BigInt(448 - 10), true);
228
- await common.assert.isRejected(readerBrowser.CarReader.fromIterable(common.makeIterable(bytes, 64)), {
229
- name: 'Error',
230
- message: 'Unexpected end of data'
231
- });
232
- });
233
- });
234
- describe('Shared fixtures', () => {
235
- describe('Header', () => {
236
- for (const [name, {
237
- version: expectedVersion,
238
- err: expectedError
239
- }] of Object.entries(fixturesExpectations.expectations)) {
240
- it(name, async () => {
241
- const data = base64.base64.baseDecode(fixtures.data[name]);
242
- let header;
243
- try {
244
- header = await decoder.readHeader(decoder.bytesReader(data));
245
- } catch (err) {
246
- if (expectedError != null) {
247
- common.assert.equal(err.message, expectedError);
248
- return;
249
- }
250
- common.assert.ifError(err);
251
- }
252
- if (expectedError != null) {
253
- common.assert.fail(`Expected error: ${ expectedError }`);
254
- }
255
- common.assert.isDefined(header, 'did not decode header');
256
- if (expectedVersion != null && header != null) {
257
- common.assert.strictEqual(header.version, expectedVersion);
258
- }
259
- });
260
- }
261
- });
262
- describe('Contents', () => {
263
- for (const [name, {cids: expectedCids}] of Object.entries(fixturesExpectations.expectations)) {
264
- if (expectedCids == null) {
265
- continue;
266
- }
267
- it(name, async () => {
268
- const data = base64.base64.baseDecode(fixtures.data[name]);
269
- const reader = await readerBrowser.CarReader.fromBytes(data);
270
- let i = 0;
271
- for await (const cid of reader.cids()) {
272
- common.assert.strictEqual(cid.toString(), expectedCids[i++]);
273
- }
274
- common.assert.strictEqual(i, expectedCids.length);
275
- });
276
- }
277
- });
278
- });
@@ -1,286 +0,0 @@
1
- 'use strict';
2
-
3
- var writerBrowser = require('../lib/writer-browser.js');
4
- var readerBrowser = require('../lib/reader-browser.js');
5
- var multiformats = require('multiformats');
6
- var common = require('./common.js');
7
- var verifyStoreReader = require('./verify-store-reader.js');
8
-
9
- const {toHex} = multiformats.bytes;
10
- function concatBytes(chunks) {
11
- const length = chunks.reduce((p, c) => p + c.length, 0);
12
- const bytes = new Uint8Array(length);
13
- let off = 0;
14
- for (const chunk of chunks) {
15
- bytes.set(chunk, off);
16
- off += chunk.length;
17
- }
18
- return bytes;
19
- }
20
- function collector(iterable) {
21
- const chunks = [];
22
- const cfn = (async () => {
23
- for await (const chunk of iterable) {
24
- chunks.push(chunk);
25
- }
26
- return concatBytes(chunks);
27
- })();
28
- return cfn;
29
- }
30
- const newRoots = [
31
- multiformats.CID.parse('bafkreidbxzk2ryxwwtqxem4l3xyyjvw35yu4tcct4cqeqxwo47zhxgxqwq'),
32
- multiformats.CID.parse('bafkreiebzrnroamgos2adnbpgw5apo3z4iishhbdx77gldnbk57d4zdio4')
33
- ];
34
- async function verifyUpdateRoots(bytes) {
35
- const reader = await readerBrowser.CarReader.fromBytes(bytes);
36
- await common.assert.isRejected(verifyStoreReader.verifyRoots(reader));
37
- common.assert.deepEqual(await reader.getRoots(), newRoots);
38
- await verifyStoreReader.verifyHas(reader);
39
- await verifyStoreReader.verifyGet(reader);
40
- await verifyStoreReader.verifyBlocks(reader.blocks(), true);
41
- await verifyStoreReader.verifyCids(reader.cids(), true);
42
- }
43
- describe('CarWriter', () => {
44
- let cborBlocks;
45
- let allBlocks;
46
- let allBlocksFlattened;
47
- let roots;
48
- function assertCarData(actual) {
49
- common.assert.strictEqual(toHex(actual), toHex(common.carBytes), 'got expected bytes');
50
- }
51
- before(async () => {
52
- const data = await common.makeData();
53
- cborBlocks = data.cborBlocks;
54
- allBlocks = data.allBlocks;
55
- allBlocksFlattened = data.allBlocksFlattened;
56
- roots = [
57
- cborBlocks[0].cid,
58
- cborBlocks[1].cid
59
- ];
60
- });
61
- it('complete', async () => {
62
- const {writer, out} = writerBrowser.CarWriter.create(roots);
63
- common.assert.strictEqual(typeof out[Symbol.asyncIterator], 'function');
64
- const collection = collector(out);
65
- const writeQueue = [];
66
- for (const block of allBlocksFlattened) {
67
- writeQueue.push(writer.put(block));
68
- }
69
- writeQueue.push(writer.close());
70
- let collected = false;
71
- collection.then(bytes => {
72
- collected = true;
73
- assertCarData(bytes);
74
- });
75
- await Promise.all(writeQueue);
76
- common.assert.strictEqual(collected, true);
77
- });
78
- it('complete, deferred collection', async () => {
79
- const {writer, out} = writerBrowser.CarWriter.create(roots);
80
- const writeQueue = [];
81
- for (const block of allBlocksFlattened) {
82
- writeQueue.push(writer.put(block));
83
- }
84
- writeQueue.push(writer.close());
85
- let collected = false;
86
- collector(out).then(bytes => {
87
- collected = true;
88
- assertCarData(bytes);
89
- });
90
- await Promise.all(writeQueue);
91
- common.assert.strictEqual(collected, true);
92
- });
93
- it('complete, close after write', async () => {
94
- const {writer, out} = writerBrowser.CarWriter.create(roots);
95
- common.assert.strictEqual(typeof out[Symbol.asyncIterator], 'function');
96
- const collection = collector(out);
97
- const writeQueue = [];
98
- for (const block of allBlocksFlattened) {
99
- writeQueue.push(writer.put(block));
100
- }
101
- writeQueue.push(writer.close());
102
- let written = false;
103
- Promise.all(writeQueue).then(() => {
104
- written = true;
105
- });
106
- const bytes = await collection;
107
- common.assert.strictEqual(written, false);
108
- await Promise.resolve();
109
- assertCarData(bytes);
110
- });
111
- it('complete, no queue', async () => {
112
- const {writer, out} = writerBrowser.CarWriter.create(roots);
113
- const collection = collector(out);
114
- for (const block of allBlocksFlattened) {
115
- await writer.put(block);
116
- }
117
- await writer.close();
118
- const bytes = await collection;
119
- assertCarData(bytes);
120
- });
121
- it('complete, slow drip', async () => {
122
- const {writer, out} = writerBrowser.CarWriter.create(roots);
123
- common.assert.strictEqual(typeof out[Symbol.asyncIterator], 'function');
124
- const collection = collector(out);
125
- for (const block of allBlocksFlattened) {
126
- writer.put(block);
127
- await new Promise(resolve => setTimeout(resolve, 100));
128
- }
129
- await writer.close();
130
- await new Promise(resolve => setTimeout(resolve, 100));
131
- const bytes = await collection;
132
- assertCarData(bytes);
133
- });
134
- it('complete, no queue, deferred collection', async () => {
135
- const {writer, out} = writerBrowser.CarWriter.create(roots);
136
- for (const block of allBlocksFlattened) {
137
- writer.put(block);
138
- }
139
- writer.close();
140
- const collection = collector(out);
141
- const bytes = await collection;
142
- assertCarData(bytes);
143
- });
144
- it('single root', async () => {
145
- const {writer, out} = writerBrowser.CarWriter.create(roots[0]);
146
- const collection = collector(out);
147
- for (const block of allBlocksFlattened) {
148
- await writer.put(block);
149
- }
150
- await writer.close();
151
- const bytes = await collection;
152
- const expectedRootDef = 'a265726f6f747381d82a58250001711220f88bc853804cf294fe417e4fa83028689fcdb1b1592c5102e1474dbc200fab8b6776657273696f6e01';
153
- const expectedStart = (expectedRootDef.length / 2).toString(16) + expectedRootDef + '28';
154
- common.assert.strictEqual(toHex(bytes).substring(0, expectedStart.length), expectedStart);
155
- });
156
- it('no roots', async () => {
157
- const {writer, out} = writerBrowser.CarWriter.create();
158
- const collection = collector(out);
159
- for (const block of allBlocksFlattened) {
160
- await writer.put(block);
161
- }
162
- await writer.close();
163
- const bytes = await collection;
164
- const expectedRootDef = 'a265726f6f7473806776657273696f6e01';
165
- const expectedStart = (expectedRootDef.length / 2).toString(16) + expectedRootDef + '28';
166
- common.assert.strictEqual(toHex(bytes).substring(0, expectedStart.length), expectedStart);
167
- });
168
- it('appender', async () => {
169
- let writerOut = writerBrowser.CarWriter.create(roots);
170
- let collection = collector(writerOut.out);
171
- await writerOut.writer.close();
172
- const headerBytes = await collection;
173
- const append = async index => {
174
- writerOut = writerBrowser.CarWriter.createAppender();
175
- collection = collector(writerOut.out);
176
- for (const block of allBlocks[index][1]) {
177
- await writerOut.writer.put(block);
178
- }
179
- await writerOut.writer.close();
180
- return collection;
181
- };
182
- const rawBytes = await append(0);
183
- const pbBytes = await append(1);
184
- const cborBytes = await append(2);
185
- common.assert.ok(rawBytes.length > 0);
186
- common.assert.ok(pbBytes.length > 0);
187
- common.assert.ok(cborBytes.length > 0);
188
- const reassembled = concatBytes([
189
- headerBytes,
190
- rawBytes,
191
- pbBytes,
192
- cborBytes
193
- ]);
194
- common.assert.strictEqual(toHex(reassembled), toHex(common.carBytes));
195
- });
196
- it('bad argument for create()', () => {
197
- for (const arg of [
198
- new Uint8Array(0),
199
- true,
200
- false,
201
- null,
202
- 'string',
203
- 100,
204
- { obj: 'nope' },
205
- [false]
206
- ]) {
207
- common.assert.throws(() => writerBrowser.CarWriter.create(arg));
208
- }
209
- });
210
- it('bad argument for put()', async () => {
211
- const {writer} = writerBrowser.CarWriter.create();
212
- for (const arg of [
213
- new Uint8Array(0),
214
- true,
215
- false,
216
- null,
217
- 'string',
218
- 100,
219
- { obj: 'nope' },
220
- [false]
221
- ]) {
222
- await common.assert.isRejected(writer.put(arg));
223
- }
224
- for (const arg of [
225
- true,
226
- false,
227
- null,
228
- 'string',
229
- 100,
230
- { obj: 'nope' },
231
- [false]
232
- ]) {
233
- await common.assert.isRejected(writer.put({
234
- bytes: new Uint8Array(0),
235
- cid: arg
236
- }));
237
- }
238
- for (const arg of [
239
- true,
240
- false,
241
- null,
242
- 'string',
243
- 100,
244
- { obj: 'nope' },
245
- [false]
246
- ]) {
247
- await common.assert.isRejected(writer.put({
248
- cid: common.rndCid,
249
- bytes: arg
250
- }));
251
- }
252
- });
253
- it('bad write after closed', async () => {
254
- const {writer, out} = writerBrowser.CarWriter.create();
255
- const collection = collector(out);
256
- await writer.put(allBlocksFlattened[0]);
257
- await writer.close();
258
- await common.assert.isRejected(writer.put(allBlocksFlattened[1]), /closed/);
259
- await collection;
260
- });
261
- it('bad attempt to multiple iterate', async () => {
262
- const {out} = writerBrowser.CarWriter.create();
263
- collector(out);
264
- await common.assert.isRejected(collector(out), /multiple iterator/i);
265
- });
266
- it('bad attempt to multiple close', async () => {
267
- const {writer, out} = writerBrowser.CarWriter.create();
268
- collector(out);
269
- await writer.close();
270
- await common.assert.isRejected(writer.close(), /closed/i);
271
- });
272
- it('update roots (fd)', async () => {
273
- const bytes = common.carBytes.slice();
274
- await writerBrowser.CarWriter.updateRootsInBytes(bytes, newRoots);
275
- await verifyUpdateRoots(bytes);
276
- });
277
- it('update roots error: wrong header size', async () => {
278
- const bytes = common.carBytes.slice();
279
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInBytes(bytes, [
280
- ...newRoots,
281
- newRoots[0]
282
- ]), /can only overwrite a header of the same length/);
283
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInBytes(bytes, [newRoots[0]]), /can only overwrite a header of the same length/);
284
- await common.assert.isRejected(writerBrowser.CarWriter.updateRootsInBytes(bytes, []), /can only overwrite a header of the same length/);
285
- });
286
- });
@@ -1,142 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var multiformats = require('multiformats');
6
- var raw = require('multiformats/codecs/raw');
7
- var common = require('./common.js');
8
-
9
- function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n["default"] = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var raw__namespace = /*#__PURE__*/_interopNamespace(raw);
28
-
29
- function compareBlockData(actual, expected, id) {
30
- common.assert.strictEqual(multiformats.bytes.toHex(actual.bytes), multiformats.bytes.toHex(expected.bytes), `comparing block as hex ${ id || '' }`);
31
- }
32
- function compareCids(actual, expected) {
33
- common.assert.strictEqual(actual.toString(), expected.toString());
34
- }
35
- async function verifyRoots(reader) {
36
- const {cborBlocks} = await common.makeData();
37
- const expected = [
38
- cborBlocks[0].cid.toString(),
39
- cborBlocks[1].cid.toString()
40
- ];
41
- common.assert.deepStrictEqual((await reader.getRoots()).map(c => c.toString()), expected);
42
- }
43
- async function verifyHas(reader) {
44
- const {allBlocks} = await common.makeData();
45
- const verifyHas = async (cid, name) => {
46
- common.assert.ok(await reader.has(cid), `reader doesn't have expected key for ${ name }`);
47
- };
48
- const verifyHasnt = async (cid, name) => {
49
- common.assert.ok(!await reader.has(cid), `reader has unexpected key for ${ name }`);
50
- common.assert.strictEqual(await reader.get(cid), undefined);
51
- };
52
- for (const [type, blocks] of allBlocks) {
53
- for (let i = 0; i < blocks.length; i++) {
54
- await verifyHas(blocks[i].cid, `block #${ i } (${ type } / ${ blocks[i].cid })`);
55
- }
56
- }
57
- await verifyHasnt((await common.toBlock(new TextEncoder().encode('dddd'), raw__namespace)).cid, 'dddd');
58
- }
59
- async function verifyGet(reader) {
60
- const {allBlocks} = await common.makeData();
61
- const verifyBlock = async (expected, index, type) => {
62
- let actual;
63
- try {
64
- actual = await reader.get(expected.cid);
65
- common.assert.isDefined(actual);
66
- if (actual) {
67
- compareBlockData(actual, expected, `#${ index } (${ type })`);
68
- }
69
- } catch (err) {
70
- common.assert.ifError(err, `get block length #${ index } (${ type })`);
71
- }
72
- };
73
- for (const [type, blocks] of allBlocks) {
74
- for (let i = 0; i < blocks.length; i++) {
75
- await verifyBlock(blocks[i], i, type);
76
- }
77
- }
78
- }
79
- async function verifyBlocks(iterator, unordered) {
80
- const {allBlocksFlattened} = await common.makeData();
81
- if (!unordered) {
82
- const expected = allBlocksFlattened.slice();
83
- for await (const actual of iterator) {
84
- const next = expected.shift();
85
- common.assert.isDefined(next);
86
- if (next) {
87
- compareBlockData(actual, next);
88
- }
89
- }
90
- } else {
91
- const expected = {};
92
- for (const block of allBlocksFlattened) {
93
- expected[block.cid.toString()] = block;
94
- }
95
- for await (const actual of iterator) {
96
- const {cid} = actual;
97
- const exp = expected[cid.toString()];
98
- if (!exp) {
99
- throw new Error(`Unexpected block: ${ cid.toString() }`);
100
- }
101
- compareBlockData(actual, exp);
102
- delete expected[cid.toString()];
103
- }
104
- if (Object.keys(expected).length) {
105
- throw new Error('Did not find all expected blocks');
106
- }
107
- }
108
- }
109
- async function verifyCids(iterator, unordered) {
110
- const {allBlocksFlattened} = await common.makeData();
111
- if (!unordered) {
112
- const expected = allBlocksFlattened.slice();
113
- for await (const actual of iterator) {
114
- const next = expected.shift();
115
- common.assert.isDefined(next);
116
- if (next) {
117
- compareCids(actual, next.cid);
118
- }
119
- }
120
- } else {
121
- const expected = {};
122
- for (const block of allBlocksFlattened) {
123
- expected[block.cid.toString()] = block;
124
- }
125
- for await (const cid of iterator) {
126
- const exp = expected[cid.toString()];
127
- if (!exp) {
128
- throw new Error(`Unexpected cid: ${ cid.toString() }`);
129
- }
130
- delete expected[cid.toString()];
131
- }
132
- if (Object.keys(expected).length) {
133
- throw new Error('Did not find all expected cids');
134
- }
135
- }
136
- }
137
-
138
- exports.verifyBlocks = verifyBlocks;
139
- exports.verifyCids = verifyCids;
140
- exports.verifyGet = verifyGet;
141
- exports.verifyHas = verifyHas;
142
- exports.verifyRoots = verifyRoots;