@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,18 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var readerBrowser = require('./lib/reader-browser.js');
6
- var indexer = require('./lib/indexer.js');
7
- var iterator = require('./lib/iterator.js');
8
- var writerBrowser = require('./lib/writer-browser.js');
9
- var indexedReaderBrowser = require('./lib/indexed-reader-browser.js');
10
-
11
-
12
-
13
- exports.CarReader = readerBrowser.CarReader;
14
- exports.CarIndexer = indexer.CarIndexer;
15
- exports.CarBlockIterator = iterator.CarBlockIterator;
16
- exports.CarCIDIterator = iterator.CarCIDIterator;
17
- exports.CarWriter = writerBrowser.CarWriter;
18
- exports.CarIndexedReader = indexedReaderBrowser.CarIndexedReader;
package/cjs/car.js DELETED
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var reader = require('./lib/reader.js');
6
- var indexer = require('./lib/indexer.js');
7
- var iterator = require('./lib/iterator.js');
8
- var writer = require('./lib/writer.js');
9
- var indexedReader = require('./lib/indexed-reader.js');
10
- var bufferWriter = require('./lib/buffer-writer.js');
11
-
12
-
13
-
14
- exports.CarReader = reader.CarReader;
15
- exports.CarIndexer = indexer.CarIndexer;
16
- exports.CarBlockIterator = iterator.CarBlockIterator;
17
- exports.CarCIDIterator = iterator.CarCIDIterator;
18
- exports.CarWriter = writer.CarWriter;
19
- exports.CarIndexedReader = indexedReader.CarIndexedReader;
20
- exports.CarBufferWriter = bufferWriter;
@@ -1,164 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var varint = require('varint');
6
- var cborg = require('cborg');
7
- var length = require('cborg/length');
8
- var CBOR = require('@ipld/dag-cbor');
9
-
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
-
12
- function _interopNamespace(e) {
13
- if (e && e.__esModule) return e;
14
- var n = Object.create(null);
15
- if (e) {
16
- Object.keys(e).forEach(function (k) {
17
- if (k !== 'default') {
18
- var d = Object.getOwnPropertyDescriptor(e, k);
19
- Object.defineProperty(n, k, d.get ? d : {
20
- enumerable: true,
21
- get: function () { return e[k]; }
22
- });
23
- }
24
- });
25
- }
26
- n["default"] = e;
27
- return Object.freeze(n);
28
- }
29
-
30
- var varint__default = /*#__PURE__*/_interopDefaultLegacy(varint);
31
- var CBOR__namespace = /*#__PURE__*/_interopNamespace(CBOR);
32
-
33
- class CarBufferWriter {
34
- constructor(bytes, headerSize) {
35
- this.bytes = bytes;
36
- this.byteOffset = headerSize;
37
- this.roots = [];
38
- this.headerSize = headerSize;
39
- }
40
- addRoot(root, options) {
41
- addRoot(this, root, options);
42
- return this;
43
- }
44
- write(block) {
45
- addBlock(this, block);
46
- return this;
47
- }
48
- close(options) {
49
- return close(this, options);
50
- }
51
- }
52
- const addRoot = (writer, root, options = {}) => {
53
- const {
54
- resize = false
55
- } = options;
56
- const {bytes, headerSize, byteOffset, roots} = writer;
57
- writer.roots.push(root);
58
- const size = headerLength(writer);
59
- if (size > headerSize) {
60
- if (size - headerSize + byteOffset < bytes.byteLength) {
61
- if (resize) {
62
- resizeHeader(writer, size);
63
- } else {
64
- roots.pop();
65
- throw new RangeError(`Header of size ${ headerSize } has no capacity for new root ${ root }.
66
- However there is a space in the buffer and you could call addRoot(root, { resize: root }) to resize header to make a space for this root.`);
67
- }
68
- } else {
69
- roots.pop();
70
- throw new RangeError(`Buffer has no capacity for a new root ${ root }`);
71
- }
72
- }
73
- };
74
- const blockLength = ({cid, bytes}) => {
75
- const size = cid.bytes.byteLength + bytes.byteLength;
76
- return varint__default["default"].encodingLength(size) + size;
77
- };
78
- const addBlock = (writer, {cid, bytes}) => {
79
- const byteLength = cid.bytes.byteLength + bytes.byteLength;
80
- const size = varint__default["default"].encode(byteLength);
81
- if (writer.byteOffset + size.length + byteLength > writer.bytes.byteLength) {
82
- throw new RangeError('Buffer has no capacity for this block');
83
- } else {
84
- writeBytes(writer, size);
85
- writeBytes(writer, cid.bytes);
86
- writeBytes(writer, bytes);
87
- }
88
- };
89
- const close = (writer, options = {}) => {
90
- const {
91
- resize = false
92
- } = options;
93
- const {roots, bytes, byteOffset, headerSize} = writer;
94
- const headerBytes = CBOR__namespace.encode({
95
- version: 1,
96
- roots
97
- });
98
- const varintBytes = varint__default["default"].encode(headerBytes.length);
99
- const size = varintBytes.length + headerBytes.byteLength;
100
- const offset = headerSize - size;
101
- if (offset === 0) {
102
- writeHeader(writer, varintBytes, headerBytes);
103
- return bytes.subarray(0, byteOffset);
104
- } else if (resize) {
105
- resizeHeader(writer, size);
106
- writeHeader(writer, varintBytes, headerBytes);
107
- return bytes.subarray(0, writer.byteOffset);
108
- } else {
109
- throw new RangeError(`Header size was overestimated.
110
- You can use close({ resize: true }) to resize header`);
111
- }
112
- };
113
- const resizeHeader = (writer, byteLength) => {
114
- const {bytes, headerSize} = writer;
115
- bytes.set(bytes.subarray(headerSize, writer.byteOffset), byteLength);
116
- writer.byteOffset += byteLength - headerSize;
117
- writer.headerSize = byteLength;
118
- };
119
- const writeBytes = (writer, bytes) => {
120
- writer.bytes.set(bytes, writer.byteOffset);
121
- writer.byteOffset += bytes.length;
122
- };
123
- const writeHeader = ({bytes}, varint, header) => {
124
- bytes.set(varint);
125
- bytes.set(header, varint.length);
126
- };
127
- const headerPreludeTokens = [
128
- new cborg.Token(cborg.Type.map, 2),
129
- new cborg.Token(cborg.Type.string, 'version'),
130
- new cborg.Token(cborg.Type.uint, 1),
131
- new cborg.Token(cborg.Type.string, 'roots')
132
- ];
133
- const CID_TAG = new cborg.Token(cborg.Type.tag, 42);
134
- const calculateHeaderLength = rootLengths => {
135
- const tokens = [...headerPreludeTokens];
136
- tokens.push(new cborg.Token(cborg.Type.array, rootLengths.length));
137
- for (const rootLength of rootLengths) {
138
- tokens.push(CID_TAG);
139
- tokens.push(new cborg.Token(cborg.Type.bytes, { length: rootLength + 1 }));
140
- }
141
- const length$1 = length.tokensToLength(tokens);
142
- return varint__default["default"].encodingLength(length$1) + length$1;
143
- };
144
- const headerLength = ({roots}) => calculateHeaderLength(roots.map(cid => cid.bytes.byteLength));
145
- const estimateHeaderLength = (rootCount, rootByteLength = 36) => calculateHeaderLength(new Array(rootCount).fill(rootByteLength));
146
- const createWriter = (buffer, options = {}) => {
147
- const {roots = [], byteOffset = 0, byteLength = buffer.byteLength, headerSize = headerLength({ roots })} = options;
148
- const bytes = new Uint8Array(buffer, byteOffset, byteLength);
149
- const writer = new CarBufferWriter(bytes, headerSize);
150
- for (const root of roots) {
151
- writer.addRoot(root);
152
- }
153
- return writer;
154
- };
155
-
156
- exports.addBlock = addBlock;
157
- exports.addRoot = addRoot;
158
- exports.blockLength = blockLength;
159
- exports.calculateHeaderLength = calculateHeaderLength;
160
- exports.close = close;
161
- exports.createWriter = createWriter;
162
- exports.estimateHeaderLength = estimateHeaderLength;
163
- exports.headerLength = headerLength;
164
- exports.resizeHeader = resizeHeader;
@@ -1,301 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var varint = require('varint');
6
- var cid = require('multiformats/cid');
7
- var Digest = require('multiformats/hashes/digest');
8
- var CBOR = require('@ipld/dag-cbor');
9
- var headerValidator = require('./header-validator.js');
10
-
11
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
-
13
- function _interopNamespace(e) {
14
- if (e && e.__esModule) return e;
15
- var n = Object.create(null);
16
- if (e) {
17
- Object.keys(e).forEach(function (k) {
18
- if (k !== 'default') {
19
- var d = Object.getOwnPropertyDescriptor(e, k);
20
- Object.defineProperty(n, k, d.get ? d : {
21
- enumerable: true,
22
- get: function () { return e[k]; }
23
- });
24
- }
25
- });
26
- }
27
- n["default"] = e;
28
- return Object.freeze(n);
29
- }
30
-
31
- var varint__default = /*#__PURE__*/_interopDefaultLegacy(varint);
32
- var Digest__namespace = /*#__PURE__*/_interopNamespace(Digest);
33
-
34
- const CIDV0_BYTES = {
35
- SHA2_256: 18,
36
- LENGTH: 32,
37
- DAG_PB: 112
38
- };
39
- const V2_HEADER_LENGTH = 16 + 8 + 8 + 8;
40
- async function readVarint(reader) {
41
- const bytes = await reader.upTo(8);
42
- if (!bytes.length) {
43
- throw new Error('Unexpected end of data');
44
- }
45
- const i = varint__default["default"].decode(bytes);
46
- reader.seek(varint__default["default"].decode.bytes);
47
- return i;
48
- }
49
- async function readV2Header(reader) {
50
- const bytes = await reader.exactly(V2_HEADER_LENGTH);
51
- const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
52
- let offset = 0;
53
- const header = {
54
- version: 2,
55
- characteristics: [
56
- dv.getBigUint64(offset, true),
57
- dv.getBigUint64(offset += 8, true)
58
- ],
59
- dataOffset: Number(dv.getBigUint64(offset += 8, true)),
60
- dataSize: Number(dv.getBigUint64(offset += 8, true)),
61
- indexOffset: Number(dv.getBigUint64(offset += 8, true))
62
- };
63
- reader.seek(V2_HEADER_LENGTH);
64
- return header;
65
- }
66
- async function readHeader(reader, strictVersion) {
67
- const length = await readVarint(reader);
68
- if (length === 0) {
69
- throw new Error('Invalid CAR header (zero length)');
70
- }
71
- const header = await reader.exactly(length);
72
- reader.seek(length);
73
- const block = CBOR.decode(header);
74
- if (!headerValidator.CarHeader(block)) {
75
- throw new Error('Invalid CAR header format');
76
- }
77
- if (block.version !== 1 && block.version !== 2 || strictVersion !== undefined && block.version !== strictVersion) {
78
- throw new Error(`Invalid CAR version: ${ block.version }${ strictVersion !== undefined ? ` (expected ${ strictVersion })` : '' }`);
79
- }
80
- const hasRoots = Array.isArray(block.roots);
81
- if (block.version === 1 && !hasRoots || block.version === 2 && hasRoots) {
82
- throw new Error('Invalid CAR header format');
83
- }
84
- if (block.version === 1) {
85
- return block;
86
- }
87
- const v2Header = await readV2Header(reader);
88
- reader.seek(v2Header.dataOffset - reader.pos);
89
- const v1Header = await readHeader(reader, 1);
90
- return Object.assign(v1Header, v2Header);
91
- }
92
- async function readMultihash(reader) {
93
- const bytes = await reader.upTo(8);
94
- varint__default["default"].decode(bytes);
95
- const codeLength = varint__default["default"].decode.bytes;
96
- const length = varint__default["default"].decode(bytes.subarray(varint__default["default"].decode.bytes));
97
- const lengthLength = varint__default["default"].decode.bytes;
98
- const mhLength = codeLength + lengthLength + length;
99
- const multihash = await reader.exactly(mhLength);
100
- reader.seek(mhLength);
101
- return multihash;
102
- }
103
- async function readCid(reader) {
104
- const first = await reader.exactly(2);
105
- if (first[0] === CIDV0_BYTES.SHA2_256 && first[1] === CIDV0_BYTES.LENGTH) {
106
- const bytes = await reader.exactly(34);
107
- reader.seek(34);
108
- const multihash = Digest__namespace.decode(bytes);
109
- return cid.CID.create(0, CIDV0_BYTES.DAG_PB, multihash);
110
- }
111
- const version = await readVarint(reader);
112
- if (version !== 1) {
113
- throw new Error(`Unexpected CID version (${ version })`);
114
- }
115
- const codec = await readVarint(reader);
116
- const bytes = await readMultihash(reader);
117
- const multihash = Digest__namespace.decode(bytes);
118
- return cid.CID.create(version, codec, multihash);
119
- }
120
- async function readBlockHead(reader) {
121
- const start = reader.pos;
122
- let length = await readVarint(reader);
123
- if (length === 0) {
124
- throw new Error('Invalid CAR section (zero length)');
125
- }
126
- length += reader.pos - start;
127
- const cid = await readCid(reader);
128
- const blockLength = length - Number(reader.pos - start);
129
- return {
130
- cid,
131
- length,
132
- blockLength
133
- };
134
- }
135
- async function readBlock(reader) {
136
- const {cid, blockLength} = await readBlockHead(reader);
137
- const bytes = await reader.exactly(blockLength);
138
- reader.seek(blockLength);
139
- return {
140
- bytes,
141
- cid
142
- };
143
- }
144
- async function readBlockIndex(reader) {
145
- const offset = reader.pos;
146
- const {cid, length, blockLength} = await readBlockHead(reader);
147
- const index = {
148
- cid,
149
- length,
150
- blockLength,
151
- offset,
152
- blockOffset: reader.pos
153
- };
154
- reader.seek(index.blockLength);
155
- return index;
156
- }
157
- function createDecoder(reader) {
158
- const headerPromise = (async () => {
159
- const header = await readHeader(reader);
160
- if (header.version === 2) {
161
- const v1length = reader.pos - header.dataOffset;
162
- reader = limitReader(reader, header.dataSize - v1length);
163
- }
164
- return header;
165
- })();
166
- return {
167
- header: () => headerPromise,
168
- async *blocks() {
169
- await headerPromise;
170
- while ((await reader.upTo(8)).length > 0) {
171
- yield await readBlock(reader);
172
- }
173
- },
174
- async *blocksIndex() {
175
- await headerPromise;
176
- while ((await reader.upTo(8)).length > 0) {
177
- yield await readBlockIndex(reader);
178
- }
179
- }
180
- };
181
- }
182
- function bytesReader(bytes) {
183
- let pos = 0;
184
- return {
185
- async upTo(length) {
186
- return bytes.subarray(pos, pos + Math.min(length, bytes.length - pos));
187
- },
188
- async exactly(length) {
189
- if (length > bytes.length - pos) {
190
- throw new Error('Unexpected end of data');
191
- }
192
- return bytes.subarray(pos, pos + length);
193
- },
194
- seek(length) {
195
- pos += length;
196
- },
197
- get pos() {
198
- return pos;
199
- }
200
- };
201
- }
202
- function chunkReader(readChunk) {
203
- let pos = 0;
204
- let have = 0;
205
- let offset = 0;
206
- let currentChunk = new Uint8Array(0);
207
- const read = async length => {
208
- have = currentChunk.length - offset;
209
- const bufa = [currentChunk.subarray(offset)];
210
- while (have < length) {
211
- const chunk = await readChunk();
212
- if (chunk == null) {
213
- break;
214
- }
215
- if (have < 0) {
216
- if (chunk.length > have) {
217
- bufa.push(chunk.subarray(-have));
218
- }
219
- } else {
220
- bufa.push(chunk);
221
- }
222
- have += chunk.length;
223
- }
224
- currentChunk = new Uint8Array(bufa.reduce((p, c) => p + c.length, 0));
225
- let off = 0;
226
- for (const b of bufa) {
227
- currentChunk.set(b, off);
228
- off += b.length;
229
- }
230
- offset = 0;
231
- };
232
- return {
233
- async upTo(length) {
234
- if (currentChunk.length - offset < length) {
235
- await read(length);
236
- }
237
- return currentChunk.subarray(offset, offset + Math.min(currentChunk.length - offset, length));
238
- },
239
- async exactly(length) {
240
- if (currentChunk.length - offset < length) {
241
- await read(length);
242
- }
243
- if (currentChunk.length - offset < length) {
244
- throw new Error('Unexpected end of data');
245
- }
246
- return currentChunk.subarray(offset, offset + length);
247
- },
248
- seek(length) {
249
- pos += length;
250
- offset += length;
251
- },
252
- get pos() {
253
- return pos;
254
- }
255
- };
256
- }
257
- function asyncIterableReader(asyncIterable) {
258
- const iterator = asyncIterable[Symbol.asyncIterator]();
259
- async function readChunk() {
260
- const next = await iterator.next();
261
- if (next.done) {
262
- return null;
263
- }
264
- return next.value;
265
- }
266
- return chunkReader(readChunk);
267
- }
268
- function limitReader(reader, byteLimit) {
269
- let bytesRead = 0;
270
- return {
271
- async upTo(length) {
272
- let bytes = await reader.upTo(length);
273
- if (bytes.length + bytesRead > byteLimit) {
274
- bytes = bytes.subarray(0, byteLimit - bytesRead);
275
- }
276
- return bytes;
277
- },
278
- async exactly(length) {
279
- const bytes = await reader.exactly(length);
280
- if (bytes.length + bytesRead > byteLimit) {
281
- throw new Error('Unexpected end of data');
282
- }
283
- return bytes;
284
- },
285
- seek(length) {
286
- bytesRead += length;
287
- reader.seek(length);
288
- },
289
- get pos() {
290
- return reader.pos;
291
- }
292
- };
293
- }
294
-
295
- exports.asyncIterableReader = asyncIterableReader;
296
- exports.bytesReader = bytesReader;
297
- exports.chunkReader = chunkReader;
298
- exports.createDecoder = createDecoder;
299
- exports.limitReader = limitReader;
300
- exports.readBlockHead = readBlockHead;
301
- exports.readHeader = readHeader;
@@ -1,44 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var varint = require('varint');
6
- var CBOR = require('@ipld/dag-cbor');
7
-
8
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
-
10
- var varint__default = /*#__PURE__*/_interopDefaultLegacy(varint);
11
-
12
- function createHeader(roots) {
13
- const headerBytes = CBOR.encode({
14
- version: 1,
15
- roots
16
- });
17
- const varintBytes = varint__default["default"].encode(headerBytes.length);
18
- const header = new Uint8Array(varintBytes.length + headerBytes.length);
19
- header.set(varintBytes, 0);
20
- header.set(headerBytes, varintBytes.length);
21
- return header;
22
- }
23
- function createEncoder(writer) {
24
- return {
25
- async setRoots(roots) {
26
- const bytes = createHeader(roots);
27
- await writer.write(bytes);
28
- },
29
- async writeBlock(block) {
30
- const {cid, bytes} = block;
31
- await writer.write(new Uint8Array(varint__default["default"].encode(cid.bytes.length + bytes.length)));
32
- await writer.write(cid.bytes);
33
- if (bytes.length) {
34
- await writer.write(bytes);
35
- }
36
- },
37
- async close() {
38
- await writer.end();
39
- }
40
- };
41
- }
42
-
43
- exports.createEncoder = createEncoder;
44
- exports.createHeader = createHeader;
@@ -1,29 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- const Kinds = {
6
- Null: obj => obj === null,
7
- Int: obj => Number.isInteger(obj),
8
- Float: obj => typeof obj === 'number' && Number.isFinite(obj),
9
- String: obj => typeof obj === 'string',
10
- Bool: obj => typeof obj === 'boolean',
11
- Bytes: obj => obj instanceof Uint8Array,
12
- Link: obj => !Kinds.Null(obj) && typeof obj === 'object' && obj.asCID === obj,
13
- List: obj => Array.isArray(obj),
14
- Map: obj => !Kinds.Null(obj) && typeof obj === 'object' && obj.asCID !== obj && !Kinds.List(obj) && !Kinds.Bytes(obj)
15
- };
16
- const Types = {
17
- Int: Kinds.Int,
18
- 'CarHeader > version': obj => Types.Int(obj),
19
- 'CarHeader > roots (anon) > valueType (anon)': Kinds.Link,
20
- 'CarHeader > roots (anon)': obj => Kinds.List(obj) && Array.prototype.every.call(obj, Types['CarHeader > roots (anon) > valueType (anon)']),
21
- 'CarHeader > roots': obj => Types['CarHeader > roots (anon)'](obj),
22
- CarHeader: obj => {
23
- const keys = obj && Object.keys(obj);
24
- return Kinds.Map(obj) && ['version'].every(k => keys.includes(k)) && Object.entries(obj).every(([name, value]) => Types['CarHeader > ' + name] && Types['CarHeader > ' + name](value));
25
- }
26
- };
27
- const CarHeader = Types.CarHeader;
28
-
29
- exports.CarHeader = CarHeader;
@@ -1,13 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- class CarIndexedReader {
6
- static async fromFile() {
7
- throw new Error('Unsupported in this environment');
8
- }
9
- }
10
- const __browser = true;
11
-
12
- exports.CarIndexedReader = CarIndexedReader;
13
- exports.__browser = __browser;
@@ -1,90 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var fs = require('fs');
6
- var stream = require('stream');
7
- var cid = require('multiformats/cid');
8
- var indexer = require('./indexer.js');
9
- var reader = require('./reader.js');
10
-
11
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
-
13
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
14
-
15
- class CarIndexedReader {
16
- constructor(version, path, roots, index, order) {
17
- this._version = version;
18
- this._path = path;
19
- this._roots = roots;
20
- this._index = index;
21
- this._order = order;
22
- this._fd = null;
23
- }
24
- get version() {
25
- return this._version;
26
- }
27
- async getRoots() {
28
- return this._roots;
29
- }
30
- async has(key) {
31
- return this._index.has(key.toString());
32
- }
33
- async get(key) {
34
- const blockIndex = this._index.get(key.toString());
35
- if (!blockIndex) {
36
- return undefined;
37
- }
38
- if (!this._fd) {
39
- this._fd = await fs__default["default"].promises.open(this._path, 'r');
40
- }
41
- const readIndex = {
42
- cid: key,
43
- length: 0,
44
- offset: 0,
45
- blockLength: blockIndex.blockLength,
46
- blockOffset: blockIndex.blockOffset
47
- };
48
- return reader.CarReader.readRaw(this._fd, readIndex);
49
- }
50
- async *blocks() {
51
- for (const cidStr of this._order) {
52
- const block = await this.get(cid.CID.parse(cidStr));
53
- if (!block) {
54
- throw new Error('Unexpected internal error');
55
- }
56
- yield block;
57
- }
58
- }
59
- async *cids() {
60
- for (const cidStr of this._order) {
61
- yield cid.CID.parse(cidStr);
62
- }
63
- }
64
- async close() {
65
- if (this._fd) {
66
- return this._fd.close();
67
- }
68
- }
69
- static async fromFile(path) {
70
- if (typeof path !== 'string') {
71
- throw new TypeError('fromFile() requires a file path string');
72
- }
73
- const iterable = await indexer.CarIndexer.fromIterable(stream.Readable.from(fs__default["default"].createReadStream(path)));
74
- const index = new Map();
75
- const order = [];
76
- for await (const {cid, blockLength, blockOffset} of iterable) {
77
- const cidStr = cid.toString();
78
- index.set(cidStr, {
79
- blockLength,
80
- blockOffset
81
- });
82
- order.push(cidStr);
83
- }
84
- return new CarIndexedReader(iterable.version, path, await iterable.getRoots(), index, order);
85
- }
86
- }
87
- const __browser = false;
88
-
89
- exports.CarIndexedReader = CarIndexedReader;
90
- exports.__browser = __browser;