@fireproof/vendor 1.0.4 → 1.1.0-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -97
- package/src/@web3-storage/pail/dist/src/batch/index.d.ts +1 -53
- package/src/@web3-storage/pail/dist/src/batch/index.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/batch/shard.d.ts +1 -1
- package/src/@web3-storage/pail/dist/src/batch/shard.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/block.d.ts +2 -2
- package/src/@web3-storage/pail/dist/src/block.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/clock/index.d.ts +2 -2
- package/src/@web3-storage/pail/dist/src/clock/index.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/crdt/batch/index.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/crdt/index.d.ts +2 -2
- package/src/@web3-storage/pail/dist/src/crdt/index.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/diff.d.ts +3 -3
- package/src/@web3-storage/pail/dist/src/diff.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/index.d.ts +1 -1
- package/src/@web3-storage/pail/dist/src/index.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/merge.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/src/shard.d.ts +4 -4
- package/src/@web3-storage/pail/dist/src/shard.d.ts.map +1 -1
- package/src/@web3-storage/pail/dist/tsconfig.tsbuildinfo +1 -1
- package/src/@web3-storage/pail/src/api.ts +1 -1
- package/src/@web3-storage/pail/src/clock/index.js +1 -1
- package/src/@web3-storage/pail/src/shard.js +1 -1
- package/src/@ipld/car/LICENSE +0 -4
- package/src/@ipld/car/README.md +0 -1132
- package/src/@ipld/car/dist/index.min.js +0 -5
- package/src/@ipld/car/dist/src/api.d.ts +0 -72
- package/src/@ipld/car/dist/src/api.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/buffer-decoder.d.ts +0 -67
- package/src/@ipld/car/dist/src/buffer-decoder.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/buffer-reader-browser.d.ts +0 -116
- package/src/@ipld/car/dist/src/buffer-reader-browser.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/buffer-reader.d.ts +0 -31
- package/src/@ipld/car/dist/src/buffer-reader.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/buffer-writer.d.ts +0 -86
- package/src/@ipld/car/dist/src/buffer-writer.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/coding.d.ts +0 -49
- package/src/@ipld/car/dist/src/coding.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/decoder-common.d.ts +0 -43
- package/src/@ipld/car/dist/src/decoder-common.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/decoder.d.ts +0 -87
- package/src/@ipld/car/dist/src/decoder.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/encoder.d.ts +0 -17
- package/src/@ipld/car/dist/src/encoder.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/header-validator.d.ts +0 -5
- package/src/@ipld/car/dist/src/header-validator.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/index-browser.d.ts +0 -10
- package/src/@ipld/car/dist/src/index-browser.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/index.d.ts +0 -11
- package/src/@ipld/car/dist/src/index.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/indexed-reader-browser.d.ts +0 -5
- package/src/@ipld/car/dist/src/indexed-reader-browser.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/indexed-reader.d.ts +0 -152
- package/src/@ipld/car/dist/src/indexed-reader.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/indexer.d.ts +0 -95
- package/src/@ipld/car/dist/src/indexer.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/iterator-channel.d.ts +0 -7
- package/src/@ipld/car/dist/src/iterator-channel.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/iterator.d.ts +0 -174
- package/src/@ipld/car/dist/src/iterator.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/promise-fs-opts.d.ts +0 -30
- package/src/@ipld/car/dist/src/promise-fs-opts.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/reader-browser.d.ts +0 -151
- package/src/@ipld/car/dist/src/reader-browser.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/reader.d.ts +0 -39
- package/src/@ipld/car/dist/src/reader.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/writer-browser.d.ts +0 -155
- package/src/@ipld/car/dist/src/writer-browser.d.ts.map +0 -1
- package/src/@ipld/car/dist/src/writer.d.ts +0 -44
- package/src/@ipld/car/dist/src/writer.d.ts.map +0 -1
- package/src/@ipld/car/src/api.ts +0 -90
- package/src/@ipld/car/src/buffer-decoder.js +0 -213
- package/src/@ipld/car/src/buffer-reader-browser.js +0 -144
- package/src/@ipld/car/src/buffer-reader.js +0 -51
- package/src/@ipld/car/src/buffer-writer.js +0 -286
- package/src/@ipld/car/src/coding.ts +0 -68
- package/src/@ipld/car/src/decoder-common.js +0 -82
- package/src/@ipld/car/src/decoder.js +0 -347
- package/src/@ipld/car/src/encoder.js +0 -76
- package/src/@ipld/car/src/header-validator.js +0 -214
- package/src/@ipld/car/src/header.ipldsch +0 -18
- package/src/@ipld/car/src/index-browser.js +0 -18
- package/src/@ipld/car/src/index.js +0 -21
- package/src/@ipld/car/src/indexed-reader-browser.js +0 -7
- package/src/@ipld/car/src/indexed-reader.js +0 -211
- package/src/@ipld/car/src/indexer.js +0 -130
- package/src/@ipld/car/src/iterator-channel.js +0 -91
- package/src/@ipld/car/src/iterator.js +0 -267
- package/src/@ipld/car/src/promise-fs-opts.js +0 -42
- package/src/@ipld/car/src/reader-browser.js +0 -194
- package/src/@ipld/car/src/reader.js +0 -53
- package/src/@ipld/car/src/writer-browser.js +0 -250
- package/src/@ipld/car/src/writer.js +0 -80
- package/src/@ipld/dag-cbor/LICENSE +0 -4
- package/src/@ipld/dag-cbor/README.md +0 -80
- package/src/@ipld/dag-cbor/dist/index.min.js +0 -3
- package/src/@ipld/dag-cbor/dist/src/index.d.ts +0 -67
- package/src/@ipld/dag-cbor/dist/src/index.d.ts.map +0 -1
- package/src/@ipld/dag-cbor/src/index.js +0 -147
- package/src/@ipld/dag-json/LICENSE +0 -4
- package/src/@ipld/dag-json/README.md +0 -58
- package/src/@ipld/dag-json/dist/index.min.js +0 -3
- package/src/@ipld/dag-json/dist/src/index.d.ts +0 -12
- package/src/@ipld/dag-json/dist/src/index.d.ts.map +0 -1
- package/src/@ipld/dag-json/src/index.js +0 -291
- package/src/cborg/.github/dependabot.yml +0 -16
- package/src/cborg/.github/workflows/test-and-release.yml +0 -52
- package/src/cborg/CHANGELOG.md +0 -513
- package/src/cborg/LICENSE +0 -13
- package/src/cborg/README.md +0 -515
- package/src/cborg/bench/bench.js +0 -117
- package/src/cborg/bench/json.js +0 -124
- package/src/cborg/bench/package.json +0 -8
- package/src/cborg/cborg/bin.js +0 -189
- package/src/cborg/cborg/common.js +0 -28
- package/src/cborg/cborg/decode.js +0 -211
- package/src/cborg/cborg/diagnostic.js +0 -158
- package/src/cborg/cborg/diagnostic_test.js +0 -117
- package/src/cborg/cborg/encode.js +0 -466
- package/src/cborg/cborg/index.js +0 -33
- package/src/cborg/cborg/is.js +0 -106
- package/src/cborg/cborg/length.js +0 -62
- package/src/cborg/example-bytestrings.js +0 -180
- package/src/cborg/example-json.js +0 -6
- package/src/cborg/example.js +0 -5
- package/src/cborg/interface.ts +0 -59
- package/src/cborg/json/decode.js +0 -462
- package/src/cborg/json/encode.js +0 -302
- package/src/cborg/json/json.js +0 -4
- package/src/cborg/taglib.js +0 -75
- package/src/cborg/test/appendix_a.js +0 -647
- package/src/cborg/test/common.js +0 -18
- package/src/cborg/test/node-test-bin.js +0 -402
- package/src/cborg/test/noop-bin-test.js +0 -3
- package/src/cborg/test/test-0uint.js +0 -103
- package/src/cborg/test/test-1negint.js +0 -96
- package/src/cborg/test/test-2bytes.js +0 -198
- package/src/cborg/test/test-3string.js +0 -136
- package/src/cborg/test/test-4array.js +0 -93
- package/src/cborg/test/test-5map.js +0 -284
- package/src/cborg/test/test-6tag.js +0 -84
- package/src/cborg/test/test-7float.js +0 -131
- package/src/cborg/test/test-bl.js +0 -37
- package/src/cborg/test/test-cbor-vectors.js +0 -107
- package/src/cborg/test/test-decode-errors.js +0 -65
- package/src/cborg/test/test-fuzz.js +0 -42
- package/src/cborg/test/test-json.js +0 -219
- package/src/cborg/test/test-length.js +0 -65
- package/src/cborg/test/test-partial.js +0 -111
- package/src/cborg/tsconfig.json +0 -48
- package/src/cborg/types/cborg/decode.d.ts +0 -43
- package/src/cborg/types/cborg/decode.d.ts.map +0 -1
- package/src/cborg/types/cborg/encode.d.ts +0 -51
- package/src/cborg/types/cborg/encode.d.ts.map +0 -1
- package/src/cborg/types/cborg/index.d.ts +0 -26
- package/src/cborg/types/cborg/index.d.ts.map +0 -1
- package/src/cborg/types/cborg/is.d.ts +0 -6
- package/src/cborg/types/cborg/is.d.ts.map +0 -1
- package/src/cborg/types/example.d.ts +0 -2
- package/src/cborg/types/example.d.ts.map +0 -1
- package/src/cborg/types/interface.d.ts +0 -49
- package/src/cborg/types/interface.d.ts.map +0 -1
- package/src/cborg/types/json/decode.d.ts +0 -67
- package/src/cborg/types/json/decode.d.ts.map +0 -1
- package/src/cborg/types/json/encode.d.ts +0 -11
- package/src/cborg/types/json/encode.d.ts.map +0 -1
- package/src/cborg/types/json/json.d.ts +0 -6
- package/src/cborg/types/json/json.d.ts.map +0 -1
- package/src/cborg/types/taglib.d.ts +0 -18
- package/src/cborg/types/taglib.d.ts.map +0 -1
- package/src/cborg/types/tsconfig.tsbuildinfo +0 -1
- package/src/cborg/types/utils/0uint.d.ts +0 -102
- package/src/cborg/types/utils/0uint.d.ts.map +0 -1
- package/src/cborg/types/utils/1negint.d.ts +0 -59
- package/src/cborg/types/utils/1negint.d.ts.map +0 -1
- package/src/cborg/types/utils/2bytes.d.ts +0 -69
- package/src/cborg/types/utils/2bytes.d.ts.map +0 -1
- package/src/cborg/types/utils/3string.d.ts +0 -46
- package/src/cborg/types/utils/3string.d.ts.map +0 -1
- package/src/cborg/types/utils/4array.d.ts +0 -66
- package/src/cborg/types/utils/4array.d.ts.map +0 -1
- package/src/cborg/types/utils/5map.d.ts +0 -66
- package/src/cborg/types/utils/5map.d.ts.map +0 -1
- package/src/cborg/types/utils/6tag.d.ts +0 -62
- package/src/cborg/types/utils/6tag.d.ts.map +0 -1
- package/src/cborg/types/utils/7float.d.ts +0 -60
- package/src/cborg/types/utils/7float.d.ts.map +0 -1
- package/src/cborg/types/utils/bl.d.ts +0 -26
- package/src/cborg/types/utils/bl.d.ts.map +0 -1
- package/src/cborg/types/utils/byte-utils.d.ts +0 -53
- package/src/cborg/types/utils/byte-utils.d.ts.map +0 -1
- package/src/cborg/types/utils/common.d.ts +0 -8
- package/src/cborg/types/utils/common.d.ts.map +0 -1
- package/src/cborg/types/utils/index.d.ts +0 -13
- package/src/cborg/types/utils/index.d.ts.map +0 -1
- package/src/cborg/types/utils/jump.d.ts +0 -16
- package/src/cborg/types/utils/jump.d.ts.map +0 -1
- package/src/cborg/types/utils/token.d.ts +0 -59
- package/src/cborg/types/utils/token.d.ts.map +0 -1
- package/src/cborg/utils/0uint.js +0 -229
- package/src/cborg/utils/1negint.js +0 -111
- package/src/cborg/utils/2bytes.js +0 -135
- package/src/cborg/utils/3string.js +0 -90
- package/src/cborg/utils/4array.js +0 -114
- package/src/cborg/utils/5map.js +0 -113
- package/src/cborg/utils/6tag.js +0 -81
- package/src/cborg/utils/7float.js +0 -310
- package/src/cborg/utils/bl.js +0 -124
- package/src/cborg/utils/byte-utils.js +0 -417
- package/src/cborg/utils/common.js +0 -11
- package/src/cborg/utils/index.js +0 -12
- package/src/cborg/utils/jump.js +0 -222
- package/src/cborg/utils/token.js +0 -76
- package/src/ipfs-unixfs-exporter/LICENSE +0 -4
- package/src/ipfs-unixfs-exporter/README.md +0 -105
- package/src/ipfs-unixfs-exporter/dist/index.min.js +0 -3
- package/src/ipfs-unixfs-exporter/dist/src/errors.d.ts +0 -57
- package/src/ipfs-unixfs-exporter/dist/src/errors.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/errors.js +0 -73
- package/src/ipfs-unixfs-exporter/dist/src/errors.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/index.d.ts +0 -355
- package/src/ipfs-unixfs-exporter/dist/src/index.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/index.js +0 -197
- package/src/ipfs-unixfs-exporter/dist/src/index.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-cbor.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-cbor.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-cbor.js +0 -9
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-cbor.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-json.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-json.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-json.js +0 -9
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/dag-json.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/identity.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/identity.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/identity.js +0 -38
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/identity.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/index.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/index.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/index.js +0 -30
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/index.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/json.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/json.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/json.js +0 -9
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/json.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/raw.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/raw.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/raw.js +0 -37
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/raw.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/directory.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/directory.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/directory.js +0 -29
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/directory.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/file.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/file.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/file.js +0 -153
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/file.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/hamt-sharded-directory.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/hamt-sharded-directory.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/hamt-sharded-directory.js +0 -59
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/hamt-sharded-directory.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/raw.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/raw.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/raw.js +0 -25
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/content/raw.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/index.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/index.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/index.js +0 -104
- package/src/ipfs-unixfs-exporter/dist/src/resolvers/unixfs-v1/index.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/extract-data-from-block.d.ts +0 -3
- package/src/ipfs-unixfs-exporter/dist/src/utils/extract-data-from-block.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/extract-data-from-block.js +0 -20
- package/src/ipfs-unixfs-exporter/dist/src/utils/extract-data-from-block.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/find-cid-in-shard.d.ts +0 -6
- package/src/ipfs-unixfs-exporter/dist/src/utils/find-cid-in-shard.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/find-cid-in-shard.js +0 -116
- package/src/ipfs-unixfs-exporter/dist/src/utils/find-cid-in-shard.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/resolve-object-path.d.ts +0 -4
- package/src/ipfs-unixfs-exporter/dist/src/utils/resolve-object-path.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/resolve-object-path.js +0 -57
- package/src/ipfs-unixfs-exporter/dist/src/utils/resolve-object-path.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/validate-offset-and-length.d.ts +0 -6
- package/src/ipfs-unixfs-exporter/dist/src/utils/validate-offset-and-length.d.ts.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/src/utils/validate-offset-and-length.js +0 -30
- package/src/ipfs-unixfs-exporter/dist/src/utils/validate-offset-and-length.js.map +0 -1
- package/src/ipfs-unixfs-exporter/dist/typedoc-urls.json +0 -58
- package/src/ipfs-unixfs-exporter/src/errors.ts +0 -87
- package/src/ipfs-unixfs-exporter/src/index.ts +0 -498
- package/src/ipfs-unixfs-exporter/src/resolvers/dag-cbor.ts +0 -12
- package/src/ipfs-unixfs-exporter/src/resolvers/dag-json.ts +0 -12
- package/src/ipfs-unixfs-exporter/src/resolvers/identity.ts +0 -49
- package/src/ipfs-unixfs-exporter/src/resolvers/index.ts +0 -35
- package/src/ipfs-unixfs-exporter/src/resolvers/json.ts +0 -12
- package/src/ipfs-unixfs-exporter/src/resolvers/raw.ts +0 -49
- package/src/ipfs-unixfs-exporter/src/resolvers/unixfs-v1/content/directory.ts +0 -39
- package/src/ipfs-unixfs-exporter/src/resolvers/unixfs-v1/content/file.ts +0 -198
- package/src/ipfs-unixfs-exporter/src/resolvers/unixfs-v1/content/hamt-sharded-directory.ts +0 -76
- package/src/ipfs-unixfs-exporter/src/resolvers/unixfs-v1/content/raw.ts +0 -37
- package/src/ipfs-unixfs-exporter/src/resolvers/unixfs-v1/index.ts +0 -121
- package/src/ipfs-unixfs-exporter/src/utils/extract-data-from-block.ts +0 -24
- package/src/ipfs-unixfs-exporter/src/utils/find-cid-in-shard.ts +0 -149
- package/src/ipfs-unixfs-exporter/src/utils/resolve-object-path.ts +0 -62
- package/src/ipfs-unixfs-exporter/src/utils/validate-offset-and-length.ts +0 -38
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import type { Block, BlockIndex } from './api.js'
|
|
2
|
-
import type { CID } from 'multiformats/cid'
|
|
3
|
-
|
|
4
|
-
export interface CarEncoder {
|
|
5
|
-
setRoots(roots: CID[]): Promise<void>
|
|
6
|
-
|
|
7
|
-
writeBlock(block: Block): Promise<void>
|
|
8
|
-
|
|
9
|
-
close(): Promise<void>
|
|
10
|
-
|
|
11
|
-
version(): number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface IteratorChannel_Writer<T> {
|
|
15
|
-
write(chunk: T): Promise<void>
|
|
16
|
-
end(): Promise<void>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface IteratorChannel<T> {
|
|
20
|
-
writer: IteratorChannel_Writer<T>
|
|
21
|
-
|
|
22
|
-
iterator: AsyncIterator<T>
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface CarHeader {
|
|
26
|
-
version: 1
|
|
27
|
-
roots: CID[]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface CarV2FixedHeader {
|
|
31
|
-
characteristics: [bigint, bigint]
|
|
32
|
-
dataOffset: number
|
|
33
|
-
dataSize: number
|
|
34
|
-
indexOffset: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface CarV2Header extends CarV2FixedHeader {
|
|
38
|
-
version: 2
|
|
39
|
-
roots: CID[]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface CarDecoder {
|
|
43
|
-
header(): Promise<CarHeader | CarV2Header>
|
|
44
|
-
|
|
45
|
-
blocks(): AsyncGenerator<Block>
|
|
46
|
-
|
|
47
|
-
blocksIndex(): AsyncGenerator<BlockIndex>
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface Seekable {
|
|
51
|
-
seek(length: number): void
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface BytesReader extends Seekable {
|
|
55
|
-
upTo(length: number): Promise<Uint8Array>
|
|
56
|
-
|
|
57
|
-
exactly(length: number, seek?: boolean): Promise<Uint8Array>
|
|
58
|
-
|
|
59
|
-
pos: number
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface BytesBufferReader extends Seekable {
|
|
63
|
-
upTo(length: number): Uint8Array
|
|
64
|
-
|
|
65
|
-
exactly(length: number, seek?: boolean): Uint8Array
|
|
66
|
-
|
|
67
|
-
pos: number
|
|
68
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import varint from 'varint'
|
|
2
|
-
|
|
3
|
-
export const CIDV0_BYTES = {
|
|
4
|
-
SHA2_256: 0x12,
|
|
5
|
-
LENGTH: 0x20,
|
|
6
|
-
DAG_PB: 0x70
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const V2_HEADER_LENGTH = /* characteristics */ 16 /* v1 offset */ + 8 /* v1 size */ + 8 /* index offset */ + 8
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Decodes varint and seeks the buffer
|
|
13
|
-
*
|
|
14
|
-
* ```js
|
|
15
|
-
* // needs bytes to be read first
|
|
16
|
-
* const bytes = reader.upTo(8) // maybe async
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param {Uint8Array} bytes
|
|
20
|
-
* @param {import('./coding').Seekable} seeker
|
|
21
|
-
* @returns {number}
|
|
22
|
-
*/
|
|
23
|
-
export function decodeVarint (bytes, seeker) {
|
|
24
|
-
if (!bytes.length) {
|
|
25
|
-
throw new Error('Unexpected end of data')
|
|
26
|
-
}
|
|
27
|
-
const i = varint.decode(bytes)
|
|
28
|
-
seeker.seek(/** @type {number} */(varint.decode.bytes))
|
|
29
|
-
return i
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Decode v2 header
|
|
34
|
-
*
|
|
35
|
-
* ```js
|
|
36
|
-
* // needs bytes to be read first
|
|
37
|
-
* const bytes = reader.exactly(V2_HEADER_LENGTH, true) // maybe async
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @param {Uint8Array} bytes
|
|
41
|
-
* @returns {import('./coding').CarV2FixedHeader}
|
|
42
|
-
*/
|
|
43
|
-
export function decodeV2Header (bytes) {
|
|
44
|
-
const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)
|
|
45
|
-
let offset = 0
|
|
46
|
-
const header = {
|
|
47
|
-
version: 2,
|
|
48
|
-
/** @type {[bigint, bigint]} */
|
|
49
|
-
characteristics: [
|
|
50
|
-
dv.getBigUint64(offset, true),
|
|
51
|
-
dv.getBigUint64(offset += 8, true)
|
|
52
|
-
],
|
|
53
|
-
dataOffset: Number(dv.getBigUint64(offset += 8, true)),
|
|
54
|
-
dataSize: Number(dv.getBigUint64(offset += 8, true)),
|
|
55
|
-
indexOffset: Number(dv.getBigUint64(offset += 8, true))
|
|
56
|
-
}
|
|
57
|
-
return header
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Checks the length of the multihash to be read afterwards
|
|
62
|
-
*
|
|
63
|
-
* ```js
|
|
64
|
-
* // needs bytes to be read first
|
|
65
|
-
* const bytes = reader.upTo(8) // maybe async
|
|
66
|
-
* ```
|
|
67
|
-
*
|
|
68
|
-
* @param {Uint8Array} bytes
|
|
69
|
-
*/
|
|
70
|
-
export function getMultihashLength (bytes) {
|
|
71
|
-
// | code | length | .... |
|
|
72
|
-
// where both code and length are varints, so we have to decode
|
|
73
|
-
// them first before we can know total length
|
|
74
|
-
|
|
75
|
-
varint.decode(bytes) // code
|
|
76
|
-
const codeLength = /** @type {number} */(varint.decode.bytes)
|
|
77
|
-
const length = varint.decode(bytes.subarray(varint.decode.bytes))
|
|
78
|
-
const lengthLength = /** @type {number} */(varint.decode.bytes)
|
|
79
|
-
const mhLength = codeLength + lengthLength + length
|
|
80
|
-
|
|
81
|
-
return mhLength
|
|
82
|
-
}
|
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import { decode as decodeDagCbor } from "@fireproof/vendor/@ipld/dag-cbor"
|
|
2
|
-
import { CID } from 'multiformats/cid'
|
|
3
|
-
import * as Digest from 'multiformats/hashes/digest'
|
|
4
|
-
import { CIDV0_BYTES, decodeV2Header, decodeVarint, getMultihashLength, V2_HEADER_LENGTH } from './decoder-common.js'
|
|
5
|
-
import { CarV1HeaderOrV2Pragma } from './header-validator.js'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @typedef {import('./api').Block} Block
|
|
9
|
-
* @typedef {import('./api').BlockHeader} BlockHeader
|
|
10
|
-
* @typedef {import('./api').BlockIndex} BlockIndex
|
|
11
|
-
* @typedef {import('./coding').BytesReader} BytesReader
|
|
12
|
-
* @typedef {import('./coding').CarHeader} CarHeader
|
|
13
|
-
* @typedef {import('./coding').CarV2Header} CarV2Header
|
|
14
|
-
* @typedef {import('./coding').CarV2FixedHeader} CarV2FixedHeader
|
|
15
|
-
* @typedef {import('./coding').CarDecoder} CarDecoder
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Reads header data from a `BytesReader`. The header may either be in the form
|
|
20
|
-
* of a `CarHeader` or `CarV2Header` depending on the CAR being read.
|
|
21
|
-
*
|
|
22
|
-
* @name async decoder.readHeader(reader)
|
|
23
|
-
* @param {BytesReader} reader
|
|
24
|
-
* @param {number} [strictVersion]
|
|
25
|
-
* @returns {Promise<CarHeader|CarV2Header>}
|
|
26
|
-
*/
|
|
27
|
-
export async function readHeader (reader, strictVersion) {
|
|
28
|
-
const length = decodeVarint(await reader.upTo(8), reader)
|
|
29
|
-
if (length === 0) {
|
|
30
|
-
throw new Error('Invalid CAR header (zero length)')
|
|
31
|
-
}
|
|
32
|
-
const header = await reader.exactly(length, true)
|
|
33
|
-
const block = decodeDagCbor(header)
|
|
34
|
-
if (CarV1HeaderOrV2Pragma.toTyped(block) === undefined) {
|
|
35
|
-
throw new Error('Invalid CAR header format')
|
|
36
|
-
}
|
|
37
|
-
if ((block.version !== 1 && block.version !== 2) || (strictVersion !== undefined && block.version !== strictVersion)) {
|
|
38
|
-
throw new Error(`Invalid CAR version: ${block.version}${strictVersion !== undefined ? ` (expected ${strictVersion})` : ''}`)
|
|
39
|
-
}
|
|
40
|
-
if (block.version === 1) {
|
|
41
|
-
// CarV1HeaderOrV2Pragma makes roots optional, let's make it mandatory
|
|
42
|
-
if (!Array.isArray(block.roots)) {
|
|
43
|
-
throw new Error('Invalid CAR header format')
|
|
44
|
-
}
|
|
45
|
-
return block
|
|
46
|
-
}
|
|
47
|
-
// version 2
|
|
48
|
-
if (block.roots !== undefined) {
|
|
49
|
-
throw new Error('Invalid CAR header format')
|
|
50
|
-
}
|
|
51
|
-
const v2Header = decodeV2Header(await reader.exactly(V2_HEADER_LENGTH, true))
|
|
52
|
-
reader.seek(v2Header.dataOffset - reader.pos)
|
|
53
|
-
const v1Header = await readHeader(reader, 1)
|
|
54
|
-
return Object.assign(v1Header, v2Header)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @param {BytesReader} reader
|
|
59
|
-
* @returns {Promise<CID>}
|
|
60
|
-
*/
|
|
61
|
-
async function readCid (reader) {
|
|
62
|
-
const first = await reader.exactly(2, false)
|
|
63
|
-
if (first[0] === CIDV0_BYTES.SHA2_256 && first[1] === CIDV0_BYTES.LENGTH) {
|
|
64
|
-
// cidv0 32-byte sha2-256
|
|
65
|
-
const bytes = await reader.exactly(34, true)
|
|
66
|
-
const multihash = Digest.decode(bytes)
|
|
67
|
-
return CID.create(0, CIDV0_BYTES.DAG_PB, multihash)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const version = decodeVarint(await reader.upTo(8), reader)
|
|
71
|
-
if (version !== 1) {
|
|
72
|
-
throw new Error(`Unexpected CID version (${version})`)
|
|
73
|
-
}
|
|
74
|
-
const codec = decodeVarint(await reader.upTo(8), reader)
|
|
75
|
-
const bytes = await reader.exactly(getMultihashLength(await reader.upTo(8)), true)
|
|
76
|
-
const multihash = Digest.decode(bytes)
|
|
77
|
-
return CID.create(version, codec, multihash)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Reads the leading data of an individual block from CAR data from a
|
|
82
|
-
* `BytesReader`. Returns a `BlockHeader` object which contains
|
|
83
|
-
* `{ cid, length, blockLength }` which can be used to either index the block
|
|
84
|
-
* or read the block binary data.
|
|
85
|
-
*
|
|
86
|
-
* @name async decoder.readBlockHead(reader)
|
|
87
|
-
* @param {BytesReader} reader
|
|
88
|
-
* @returns {Promise<BlockHeader>}
|
|
89
|
-
*/
|
|
90
|
-
export async function readBlockHead (reader) {
|
|
91
|
-
// length includes a CID + Binary, where CID has a variable length
|
|
92
|
-
// we have to deal with
|
|
93
|
-
const start = reader.pos
|
|
94
|
-
let length = decodeVarint(await reader.upTo(8), reader)
|
|
95
|
-
if (length === 0) {
|
|
96
|
-
throw new Error('Invalid CAR section (zero length)')
|
|
97
|
-
}
|
|
98
|
-
length += (reader.pos - start)
|
|
99
|
-
const cid = await readCid(reader)
|
|
100
|
-
const blockLength = length - Number(reader.pos - start) // subtract CID length
|
|
101
|
-
|
|
102
|
-
return { cid, length, blockLength }
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @param {BytesReader} reader
|
|
107
|
-
* @returns {Promise<Block>}
|
|
108
|
-
*/
|
|
109
|
-
async function readBlock (reader) {
|
|
110
|
-
const { cid, blockLength } = await readBlockHead(reader)
|
|
111
|
-
const bytes = await reader.exactly(blockLength, true)
|
|
112
|
-
return { bytes, cid }
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* @param {BytesReader} reader
|
|
117
|
-
* @returns {Promise<BlockIndex>}
|
|
118
|
-
*/
|
|
119
|
-
async function readBlockIndex (reader) {
|
|
120
|
-
const offset = reader.pos
|
|
121
|
-
const { cid, length, blockLength } = await readBlockHead(reader)
|
|
122
|
-
const index = { cid, length, blockLength, offset, blockOffset: reader.pos }
|
|
123
|
-
reader.seek(index.blockLength)
|
|
124
|
-
return index
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Creates a `CarDecoder` from a `BytesReader`. The `CarDecoder` is as async
|
|
129
|
-
* interface that will consume the bytes from the `BytesReader` to yield a
|
|
130
|
-
* `header()` and either `blocks()` or `blocksIndex()` data.
|
|
131
|
-
*
|
|
132
|
-
* @name decoder.createDecoder(reader)
|
|
133
|
-
* @param {BytesReader} reader
|
|
134
|
-
* @returns {CarDecoder}
|
|
135
|
-
*/
|
|
136
|
-
export function createDecoder (reader) {
|
|
137
|
-
const headerPromise = (async () => {
|
|
138
|
-
const header = await readHeader(reader)
|
|
139
|
-
if (header.version === 2) {
|
|
140
|
-
const v1length = reader.pos - header.dataOffset
|
|
141
|
-
reader = limitReader(reader, header.dataSize - v1length)
|
|
142
|
-
}
|
|
143
|
-
return header
|
|
144
|
-
})()
|
|
145
|
-
|
|
146
|
-
return {
|
|
147
|
-
header: () => headerPromise,
|
|
148
|
-
|
|
149
|
-
async * blocks () {
|
|
150
|
-
await headerPromise
|
|
151
|
-
while ((await reader.upTo(8)).length > 0) {
|
|
152
|
-
yield await readBlock(reader)
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
async * blocksIndex () {
|
|
157
|
-
await headerPromise
|
|
158
|
-
while ((await reader.upTo(8)).length > 0) {
|
|
159
|
-
yield await readBlockIndex(reader)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Creates a `BytesReader` from a `Uint8Array`.
|
|
167
|
-
*
|
|
168
|
-
* @name decoder.bytesReader(bytes)
|
|
169
|
-
* @param {Uint8Array} bytes
|
|
170
|
-
* @returns {BytesReader}
|
|
171
|
-
*/
|
|
172
|
-
export function bytesReader (bytes) {
|
|
173
|
-
let pos = 0
|
|
174
|
-
|
|
175
|
-
/** @type {BytesReader} */
|
|
176
|
-
return {
|
|
177
|
-
async upTo (length) {
|
|
178
|
-
const out = bytes.subarray(pos, pos + Math.min(length, bytes.length - pos))
|
|
179
|
-
return out
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
async exactly (length, seek = false) {
|
|
183
|
-
if (length > bytes.length - pos) {
|
|
184
|
-
throw new Error('Unexpected end of data')
|
|
185
|
-
}
|
|
186
|
-
const out = bytes.subarray(pos, pos + length)
|
|
187
|
-
if (seek) {
|
|
188
|
-
pos += length
|
|
189
|
-
}
|
|
190
|
-
return out
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
seek (length) {
|
|
194
|
-
pos += length
|
|
195
|
-
},
|
|
196
|
-
|
|
197
|
-
get pos () {
|
|
198
|
-
return pos
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* @ignore
|
|
205
|
-
* reusable reader for streams and files, we just need a way to read an
|
|
206
|
-
* additional chunk (of some undetermined size) and a way to close the
|
|
207
|
-
* reader when finished
|
|
208
|
-
* @param {() => Promise<Uint8Array|null>} readChunk
|
|
209
|
-
* @returns {BytesReader}
|
|
210
|
-
*/
|
|
211
|
-
export function chunkReader (readChunk /*, closer */) {
|
|
212
|
-
let pos = 0
|
|
213
|
-
let have = 0
|
|
214
|
-
let offset = 0
|
|
215
|
-
let currentChunk = new Uint8Array(0)
|
|
216
|
-
|
|
217
|
-
const read = async (/** @type {number} */ length) => {
|
|
218
|
-
have = currentChunk.length - offset
|
|
219
|
-
const bufa = [currentChunk.subarray(offset)]
|
|
220
|
-
while (have < length) {
|
|
221
|
-
const chunk = await readChunk()
|
|
222
|
-
if (chunk == null) {
|
|
223
|
-
break
|
|
224
|
-
}
|
|
225
|
-
/* c8 ignore next 8 */
|
|
226
|
-
// undo this ignore ^ when we have a fd implementation that can seek()
|
|
227
|
-
if (have < 0) { // because of a seek()
|
|
228
|
-
/* c8 ignore next 4 */
|
|
229
|
-
// toohard to test the else
|
|
230
|
-
if (chunk.length > have) {
|
|
231
|
-
bufa.push(chunk.subarray(-have))
|
|
232
|
-
} // else discard
|
|
233
|
-
} else {
|
|
234
|
-
bufa.push(chunk)
|
|
235
|
-
}
|
|
236
|
-
have += chunk.length
|
|
237
|
-
}
|
|
238
|
-
currentChunk = new Uint8Array(bufa.reduce((p, c) => p + c.length, 0))
|
|
239
|
-
let off = 0
|
|
240
|
-
for (const b of bufa) {
|
|
241
|
-
currentChunk.set(b, off)
|
|
242
|
-
off += b.length
|
|
243
|
-
}
|
|
244
|
-
offset = 0
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/** @type {BytesReader} */
|
|
248
|
-
return {
|
|
249
|
-
async upTo (length) {
|
|
250
|
-
if (currentChunk.length - offset < length) {
|
|
251
|
-
await read(length)
|
|
252
|
-
}
|
|
253
|
-
return currentChunk.subarray(offset, offset + Math.min(currentChunk.length - offset, length))
|
|
254
|
-
},
|
|
255
|
-
|
|
256
|
-
async exactly (length, seek = false) {
|
|
257
|
-
if (currentChunk.length - offset < length) {
|
|
258
|
-
await read(length)
|
|
259
|
-
}
|
|
260
|
-
if (currentChunk.length - offset < length) {
|
|
261
|
-
throw new Error('Unexpected end of data')
|
|
262
|
-
}
|
|
263
|
-
const out = currentChunk.subarray(offset, offset + length)
|
|
264
|
-
if (seek) {
|
|
265
|
-
pos += length
|
|
266
|
-
offset += length
|
|
267
|
-
}
|
|
268
|
-
return out
|
|
269
|
-
},
|
|
270
|
-
|
|
271
|
-
seek (length) {
|
|
272
|
-
pos += length
|
|
273
|
-
offset += length
|
|
274
|
-
},
|
|
275
|
-
|
|
276
|
-
get pos () {
|
|
277
|
-
return pos
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Creates a `BytesReader` from an `AsyncIterable<Uint8Array>`, which allows for
|
|
284
|
-
* consumption of CAR data from a streaming source.
|
|
285
|
-
*
|
|
286
|
-
* @name decoder.asyncIterableReader(asyncIterable)
|
|
287
|
-
* @param {AsyncIterable<Uint8Array>} asyncIterable
|
|
288
|
-
* @returns {BytesReader}
|
|
289
|
-
*/
|
|
290
|
-
export function asyncIterableReader (asyncIterable) {
|
|
291
|
-
const iterator = asyncIterable[Symbol.asyncIterator]()
|
|
292
|
-
|
|
293
|
-
async function readChunk () {
|
|
294
|
-
const next = await iterator.next()
|
|
295
|
-
if (next.done) {
|
|
296
|
-
return null
|
|
297
|
-
}
|
|
298
|
-
return next.value
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
return chunkReader(readChunk)
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Wraps a `BytesReader` in a limiting `BytesReader` which limits maximum read
|
|
306
|
-
* to `byteLimit` bytes. It _does not_ update `pos` of the original
|
|
307
|
-
* `BytesReader`.
|
|
308
|
-
*
|
|
309
|
-
* @name decoder.limitReader(reader, byteLimit)
|
|
310
|
-
* @param {BytesReader} reader
|
|
311
|
-
* @param {number} byteLimit
|
|
312
|
-
* @returns {BytesReader}
|
|
313
|
-
*/
|
|
314
|
-
export function limitReader (reader, byteLimit) {
|
|
315
|
-
let bytesRead = 0
|
|
316
|
-
|
|
317
|
-
/** @type {BytesReader} */
|
|
318
|
-
return {
|
|
319
|
-
async upTo (length) {
|
|
320
|
-
let bytes = await reader.upTo(length)
|
|
321
|
-
if (bytes.length + bytesRead > byteLimit) {
|
|
322
|
-
bytes = bytes.subarray(0, byteLimit - bytesRead)
|
|
323
|
-
}
|
|
324
|
-
return bytes
|
|
325
|
-
},
|
|
326
|
-
|
|
327
|
-
async exactly (length, seek = false) {
|
|
328
|
-
const bytes = await reader.exactly(length, seek)
|
|
329
|
-
if (bytes.length + bytesRead > byteLimit) {
|
|
330
|
-
throw new Error('Unexpected end of data')
|
|
331
|
-
}
|
|
332
|
-
if (seek) {
|
|
333
|
-
bytesRead += length
|
|
334
|
-
}
|
|
335
|
-
return bytes
|
|
336
|
-
},
|
|
337
|
-
|
|
338
|
-
seek (length) {
|
|
339
|
-
bytesRead += length
|
|
340
|
-
reader.seek(length)
|
|
341
|
-
},
|
|
342
|
-
|
|
343
|
-
get pos () {
|
|
344
|
-
return reader.pos
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { encode as dagCborEncode } from "@fireproof/vendor/@ipld/dag-cbor"
|
|
2
|
-
import varint from 'varint'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @typedef {import('multiformats').CID} CID
|
|
6
|
-
* @typedef {import('./api').Block} Block
|
|
7
|
-
* @typedef {import('./coding').CarEncoder} CarEncoder
|
|
8
|
-
* @typedef {import('./coding').IteratorChannel_Writer<Uint8Array>} IteratorChannel_Writer
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const CAR_V1_VERSION = 1
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Create a header from an array of roots.
|
|
15
|
-
*
|
|
16
|
-
* @param {CID[]} roots
|
|
17
|
-
* @returns {Uint8Array}
|
|
18
|
-
*/
|
|
19
|
-
export function createHeader (roots) {
|
|
20
|
-
const headerBytes = dagCborEncode({ version: CAR_V1_VERSION, roots })
|
|
21
|
-
const varintBytes = varint.encode(headerBytes.length)
|
|
22
|
-
const header = new Uint8Array(varintBytes.length + headerBytes.length)
|
|
23
|
-
header.set(varintBytes, 0)
|
|
24
|
-
header.set(headerBytes, varintBytes.length)
|
|
25
|
-
return header
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @param {IteratorChannel_Writer} writer
|
|
30
|
-
* @returns {CarEncoder}
|
|
31
|
-
*/
|
|
32
|
-
function createEncoder (writer) {
|
|
33
|
-
// none of this is wrapped in a mutex, that needs to happen above this to
|
|
34
|
-
// avoid overwrites
|
|
35
|
-
|
|
36
|
-
return {
|
|
37
|
-
/**
|
|
38
|
-
* @param {CID[]} roots
|
|
39
|
-
* @returns {Promise<void>}
|
|
40
|
-
*/
|
|
41
|
-
async setRoots (roots) {
|
|
42
|
-
const bytes = createHeader(roots)
|
|
43
|
-
await writer.write(bytes)
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* @param {Block} block
|
|
48
|
-
* @returns {Promise<void>}
|
|
49
|
-
*/
|
|
50
|
-
async writeBlock (block) {
|
|
51
|
-
const { cid, bytes } = block
|
|
52
|
-
await writer.write(new Uint8Array(varint.encode(cid.bytes.length + bytes.length)))
|
|
53
|
-
await writer.write(cid.bytes)
|
|
54
|
-
if (bytes.length) {
|
|
55
|
-
// zero-length blocks are valid, but it'd be safer if we didn't write them
|
|
56
|
-
await writer.write(bytes)
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* @returns {Promise<void>}
|
|
62
|
-
*/
|
|
63
|
-
async close () {
|
|
64
|
-
await writer.end()
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* @returns {number}
|
|
69
|
-
*/
|
|
70
|
-
version () {
|
|
71
|
-
return CAR_V1_VERSION
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export { createEncoder }
|