diff --git a/README.md b/README.md index 2df57dd..d9a0360 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ Want to get started? Check our examples folder. You can check the development st - [`.remove(cid, callback)`](#removecid-callback) - [`.support.add(multicodec, formatResolver, formatUtil)`](#supportaddmulticodec-formatresolver-formatutil) - [`.support.rm(multicodec)`](#supportrmmulticodec) + - [Properties](#properties) + - [`defaultOptions`](#defaultoptions) - [Packages](#packages) - [Contribute](#contribute) - [License](#license) @@ -115,6 +117,23 @@ const blockService = new IpfsBlockService(repo) const ipld = new Ipld({blockService: blockService}) ``` +##### `options.formats` + +| Type | Default | +|------|---------| +| Array of [IPLD Format](https://github.com/ipld/interface-ipld-format) implementations | `[require('ipld-dag-cbor'), require('ipld-dag-pb'), require('ipld-raw')]` | + +By default only the [dag-cbor](https://github.com/ipld/js-ipld-dag-cbor)), [dag-pb](https://github.com/ipld/js-ipld-dag-pb)) and [raw](https://github.com/ipld/js-ipld-raw)) IPLD Formats are supported. Other formats need to be added manually. Here is an example if you want to have support for [ipld-git](https://github.com/ipld/js-ipld-git) only: + +```js +const ipldGit = require('ipld-git') + +const ipld = new Ipld({ + formats: [ipldGit], + … +}) +``` + ### `.put(node, options, callback)` > Store the given node of a recognized IPLD Format. @@ -161,6 +180,12 @@ const ipld = new Ipld({blockService: blockService}) > Removes support of an IPLD Format +### Properties + +#### `defaultOptions` + +> Default options for IPLD. + ## Packages Listing of dependencies from the IPLD ecosystem. diff --git a/package.json b/package.json index 990001a..b57c3c1 100644 --- a/package.json +++ b/package.json @@ -34,14 +34,21 @@ "license": "MIT", "devDependencies": { "aegir": "^15.2.0", + "bitcoinjs-lib": "^4.0.2", "chai": "^4.1.2", "dirty-chai": "^2.0.1", "eth-hash-to-cid": "~0.1.1", "ethereumjs-block": "^2.0.1", + "ipld-bitcoin": "~0.1.7", + "ipld-ethereum": "^2.0.1", + "ipld-git": "~0.2.1", + "ipld-zcash": "~0.1.6", + "merkle-patricia-tree": "^2.3.2", "multihashes": "~0.4.14", "ncp": "^2.0.0", "rimraf": "^2.6.2", - "rlp": "^2.1.0" + "rlp": "^2.1.0", + "zcash-bitcore-lib": "~0.13.20-rc3" }, "dependencies": { "async": "^2.6.1", @@ -50,13 +57,10 @@ "ipfs-block": "~0.7.1", "ipfs-block-service": "~0.14.0", "ipfs-repo": "~0.24.0", - "ipld-bitcoin": "~0.1.7", "ipld-dag-cbor": "~0.13.0", "ipld-dag-pb": "~0.14.10", - "ipld-ethereum": "^2.0.1", - "ipld-git": "~0.2.1", "ipld-raw": "^2.0.1", - "ipld-zcash": "~0.1.6", + "merge-options": "^1.0.1", "pull-defer": "~0.2.3", "pull-stream": "^3.6.9", "pull-traverse": "^1.0.3" diff --git a/src/index.js b/src/index.js index 2119379..dc3a4f3 100644 --- a/src/index.js +++ b/src/index.js @@ -14,73 +14,26 @@ const map = require('async/map') const series = require('async/series') const waterfall = require('async/waterfall') const MemoryStore = require('interface-datastore').MemoryDatastore +const mergeOptions = require('merge-options') +const ipldDagCbor = require('ipld-dag-cbor') +const ipldDagPb = require('ipld-dag-pb') +const ipldRaw = require('ipld-raw') function noop () {} class IPLDResolver { - constructor (options) { + constructor (userOptions) { + const options = mergeOptions(IPLDResolver.defaultOptions, userOptions) + if (!options.blockService) { throw new Error('Missing blockservice') } - this.bs = options.blockService - // Support by default dag-pb, dag-cbor, git, and eth-* - this.resolvers = { - get 'dag-pb' () { - const format = require('ipld-dag-pb') - return { resolver: format.resolver, util: format.util } - }, - get 'dag-cbor' () { - const format = require('ipld-dag-cbor') - return { resolver: format.resolver, util: format.util } - }, - get 'git-raw' () { - const format = require('ipld-git') - return { resolver: format.resolver, util: format.util } - }, - get 'bitcoin-block' () { - const format = require('ipld-bitcoin') - return { resolver: format.resolver, util: format.util } - }, - get 'eth-account-snapshot' () { - const format = require('ipld-ethereum').ethAccountSnapshot - return { resolver: format.resolver, util: format.util } - }, - get 'eth-block' () { - const format = require('ipld-ethereum').ethBlock - return { resolver: format.resolver, util: format.util } - }, - get 'eth-block-list' () { - const format = require('ipld-ethereum').ethBlockList - return { resolver: format.resolver, util: format.util } - }, - get 'eth-state-trie' () { - const format = require('ipld-ethereum').ethStateTrie - return { resolver: format.resolver, util: format.util } - }, - get 'eth-storage-trie' () { - const format = require('ipld-ethereum').ethStorageTrie - return { resolver: format.resolver, util: format.util } - }, - get 'eth-tx' () { - const format = require('ipld-ethereum').ethTx - return { resolver: format.resolver, util: format.util } - }, - get 'eth-tx-trie' () { - const format = require('ipld-ethereum').ethTxTrie - return { resolver: format.resolver, util: format.util } - }, - get raw () { - const format = require('ipld-raw') - return { resolver: format.resolver, util: format.util } - }, - get 'zcash-block' () { - const format = require('ipld-zcash') - return { resolver: format.resolver, util: format.util } - } - } + // Object with current list of active resolvers + this.resolvers = {} + // API entry point this.support = {} // Adds support for an IPLD format @@ -100,6 +53,13 @@ class IPLDResolver { delete this.resolvers[multicodec] } } + + // Enable all supplied formats + for (const format of options.formats) { + const {resolver, util} = format + const multicodec = resolver.multicodec + this.support.add(multicodec, resolver, util) + } } get (cid, path, options, callback) { @@ -414,6 +374,13 @@ class IPLDResolver { } } +/** + * Default options for IPLD. + */ +IPLDResolver.defaultOptions = { + formats: [ipldDagCbor, ipldDagPb, ipldRaw] +} + /** * Create an IPLD resolver with an inmemory blockservice and * repo. diff --git a/test/ipld-bitcoin.js b/test/ipld-bitcoin.js index a2fc245..f3421f1 100644 --- a/test/ipld-bitcoin.js +++ b/test/ipld-bitcoin.js @@ -39,7 +39,10 @@ module.exports = (repo) => { before((done) => { const bs = new BlockService(repo) - resolver = new IPLDResolver({blockService: bs}) + resolver = new IPLDResolver({ + blockService: bs, + formats: [ipldBitcoin] + }) series([ (cb) => { diff --git a/test/ipld-eth-block.js b/test/ipld-eth-block.js index a32a393..bf86d16 100644 --- a/test/ipld-eth-block.js +++ b/test/ipld-eth-block.js @@ -28,7 +28,10 @@ module.exports = (repo) => { before((done) => { const bs = new BlockService(repo) - resolver = new IPLDResolver({blockService: bs}) + resolver = new IPLDResolver({ + blockService: bs, + formats: [ipldEthBlock] + }) series([ (cb) => { diff --git a/test/ipld-eth.js b/test/ipld-eth.js index 1324660..113fab8 100644 --- a/test/ipld-eth.js +++ b/test/ipld-eth.js @@ -7,6 +7,8 @@ const expect = chai.expect chai.use(dirtyChai) const rlp = require('rlp') const BlockService = require('ipfs-block-service') +const ipldEthBlock = require('ipld-ethereum').ethBlock +const ipldEthStateTrie = require('ipld-ethereum').ethStateTrie const loadFixture = require('aegir/fixtures') const async = require('async') const cidForHash = require('eth-hash-to-cid') @@ -24,7 +26,10 @@ module.exports = (repo) => { before(function (done) { this.timeout(10 * 1000) const bs = new BlockService(repo) - resolver = new IPLDResolver({blockService: bs}) + resolver = new IPLDResolver({ + blockService: bs, + formats: [ipldEthBlock, ipldEthStateTrie] + }) async.waterfall([ readFilesFixture, diff --git a/test/ipld-git.js b/test/ipld-git.js index fc0086e..f104aa3 100644 --- a/test/ipld-git.js +++ b/test/ipld-git.js @@ -33,7 +33,10 @@ module.exports = (repo) => { before((done) => { const bs = new BlockService(repo) - resolver = new IPLDResolver({blockService: bs}) + resolver = new IPLDResolver({ + blockService: bs, + formats: [ipldGit] + }) series([ (cb) => { diff --git a/test/ipld-zcash.js b/test/ipld-zcash.js index 5a1d18c..c8bba30 100644 --- a/test/ipld-zcash.js +++ b/test/ipld-zcash.js @@ -44,7 +44,10 @@ module.exports = (repo) => { before((done) => { const bs = new BlockService(repo) - resolver = new IPLDResolver({blockService: bs}) + resolver = new IPLDResolver({ + blockService: bs, + formats: [ipldZcash] + }) series([ (cb) => {