diff --git a/packages/ipfs/src/core/components/index.js b/packages/ipfs/src/core/components/index.js index dd223edcdd..41f7d971f3 100644 --- a/packages/ipfs/src/core/components/index.js +++ b/packages/ipfs/src/core/components/index.js @@ -25,6 +25,7 @@ exports.dag = { resolve: require('./dag/resolve'), tree: require('./dag/tree') } +exports.dht = require('./dht') exports.dns = require('./dns') exports.files = require('./files') exports.get = require('./get') diff --git a/packages/ipfs/src/core/components/libp2p.js b/packages/ipfs/src/core/components/libp2p.js index 22daa39b21..afc03865b4 100644 --- a/packages/ipfs/src/core/components/libp2p.js +++ b/packages/ipfs/src/core/components/libp2p.js @@ -9,7 +9,6 @@ module.exports = ({ options, peerInfo, repo, - print, config }) => { options = options || {} diff --git a/packages/ipfs/src/core/components/start.js b/packages/ipfs/src/core/components/start.js index f6d8a710ef..9385c2de1c 100644 --- a/packages/ipfs/src/core/components/start.js +++ b/packages/ipfs/src/core/components/start.js @@ -160,6 +160,20 @@ function createApi ({ dag.put = Components.dag.put({ ipld, pin, gcLock, preload }) const add = Components.add({ ipld, preload, pin, gcLock, options: constructorOptions }) const isOnline = Components.isOnline({ libp2p }) + + const dhtNotEnabled = async () => { // eslint-disable-line require-await + throw new NotEnabledError('dht not enabled') + } + + const dht = get(libp2p, '_config.dht.enabled', false) ? Components.dht({ libp2p, repo }) : { + get: dhtNotEnabled, + put: dhtNotEnabled, + findProvs: dhtNotEnabled, + findPeer: dhtNotEnabled, + provide: dhtNotEnabled, + query: dhtNotEnabled + } + const dns = Components.dns() const name = { pubsub: { @@ -209,6 +223,7 @@ function createApi ({ cat: Components.cat({ ipld, preload }), config: Components.config({ repo }), dag, + dht, dns, files, get: Components.get({ ipld, preload }), diff --git a/packages/ipfs/test/core/dht.spec.js b/packages/ipfs/test/core/dht.spec.js index aa636ba17c..7f71abb529 100644 --- a/packages/ipfs/test/core/dht.spec.js +++ b/packages/ipfs/test/core/dht.spec.js @@ -4,25 +4,41 @@ const { expect } = require('interface-ipfs-core/src/utils/mocha') const { isNode } = require('ipfs-utils/src/env') - const factory = require('../utils/factory') -// TODO: unskip when DHT is enabled: https://github.com/ipfs/js-ipfs/pull/1994 -describe.skip('dht', () => { - describe('enabled', () => { +describe('dht', () => { + describe('enabled by config', () => { const df = factory() let ipfsd, ipfs before(async function () { this.timeout(30 * 1000) - ipfsd = await df.spawn() + ipfsd = await df.spawn({ + ipfsOptions: { + libp2p: { + config: { + dht: { + enabled: true + } + } + } + } + }) ipfs = ipfsd.api }) after(() => df.clean()) - describe('findprovs', () => { + describe('put', () => { + it('should put a value when enabled', async () => { + await expect(ipfs.dht.put(Buffer.from('a'), Buffer.from('b'))) + .to.eventually.be.undefined() + }) + }) + + // TODO: unskip when DHT works: https://github.com/ipfs/js-ipfs/pull/1994 + describe.skip('findprovs', () => { it('should callback with error for invalid CID input', (done) => { ipfs.dht.findProvs('INVALID CID', (err) => { expect(err).to.exist() @@ -33,12 +49,44 @@ describe.skip('dht', () => { }) }) + describe('disabled by config', () => { + const df = factory() + let ipfsd, ipfs + + before(async function () { + this.timeout(30 * 1000) + + ipfsd = await df.spawn({ + ipfsOptions: { + libp2p: { + config: { + dht: { + enabled: false + } + } + } + } + }) + ipfs = ipfsd.api + }) + + after(() => df.clean()) + + describe('put', () => { + it('should error when DHT not available', async () => { + await expect(ipfs.dht.put(Buffer.from('a'), Buffer.from('b'))) + .to.eventually.be.rejected() + .and.to.have.property('code', 'ERR_NOT_ENABLED') + }) + }) + }) + describe('disabled in browser', () => { if (isNode) { return } const df = factory() let ipfsd, ipfs - before(async function (done) { + before(async function () { this.timeout(30 * 1000) ipfsd = await df.spawn() @@ -51,7 +99,7 @@ describe.skip('dht', () => { it('should error when DHT not available', async () => { await expect(ipfs.dht.put(Buffer.from('a'), Buffer.from('b'))) .to.eventually.be.rejected() - .and.to.have.property('code', 'ERR_DHT_DISABLED') + .and.to.have.property('code', 'ERR_NOT_ENABLED') }) }) })