From 76b667046aa713892dcf14c0bd1494454d3c5f3a Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 1 Jul 2016 17:54:49 +0100 Subject: [PATCH 1/3] feat(config): make the config impl spec compliant --- package.json | 5 +- src/cli/commands/config.js | 4 +- src/cli/commands/config/edit.js | 2 +- src/cli/commands/config/show.js | 2 +- src/core/ipfs/config.js | 86 +++++++++++++++++++++++--- src/http-api/index.js | 2 +- src/http-api/resources/config.js | 6 +- test/core/both/test-bitswap.js | 2 +- test/core/both/test-config.js | 102 ++++--------------------------- test/http-api/test-config.js | 52 +++------------- 10 files changed, 112 insertions(+), 151 deletions(-) diff --git a/package.json b/package.json index 185ae71016..79cb4e60a9 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "interface-ipfs-core": "^0.6.0", "left-pad": "^1.1.1", "lodash": "^4.14.1", + "mocha": "^2.5.1", "ncp": "^2.0.0", "nexpect": "^0.5.0", "pre-commit": "^1.1.3", @@ -68,7 +69,7 @@ "glob": "^7.0.5", "hapi": "^14.0.0", "ipfs-bitswap": "^0.6.0", - "ipfs-api": "^6.0.3", + "ipfs-api": "ipfs/js-ipfs-api#91de5ac", "ipfs-block": "^0.3.0", "ipfs-block-service": "^0.4.0", "ipfs-merkle-dag": "^0.6.2", @@ -117,4 +118,4 @@ "kumavis ", "nginnever " ] -} \ No newline at end of file +} diff --git a/src/cli/commands/config.js b/src/cli/commands/config.js index 68d095f47b..8db0dbf4a5 100644 --- a/src/cli/commands/config.js +++ b/src/cli/commands/config.js @@ -46,7 +46,7 @@ module.exports = Command.extend({ }) } - ipfs.config.show((err, config) => { + ipfs.config.get((err, config) => { if (err) { log.error(err) throw new Error('failed to read the config') @@ -78,7 +78,7 @@ module.exports = Command.extend({ }) } - ipfs.config.show((err, originalConfig) => { + ipfs.config.get((err, originalConfig) => { if (err) { log.error(err) throw new Error('failed to read the config') diff --git a/src/cli/commands/config/edit.js b/src/cli/commands/config/edit.js index dfe9061199..a7dfc847af 100644 --- a/src/cli/commands/config/edit.js +++ b/src/cli/commands/config/edit.js @@ -25,7 +25,7 @@ module.exports = Command.extend({ } function getConfig (next) { - ipfs.config.show((err, config) => { + ipfs.config.get((err, config) => { if (err) { log.error(err) next(new Error('failed to get the config')) diff --git a/src/cli/commands/config/show.js b/src/cli/commands/config/show.js index 5a837bee6f..4da0e36c44 100644 --- a/src/cli/commands/config/show.js +++ b/src/cli/commands/config/show.js @@ -16,7 +16,7 @@ module.exports = Command.extend({ if (err) { throw err } - ipfs.config.show((err, config) => { + ipfs.config.get((err, config) => { if (err) { throw err } diff --git a/src/core/ipfs/config.js b/src/core/ipfs/config.js index 2029d8c7a8..3996a1bffb 100644 --- a/src/core/ipfs/config.js +++ b/src/core/ipfs/config.js @@ -1,14 +1,86 @@ 'use strict' +const promisify = require('promisify-es6') + module.exports = function config (self) { return { - // cli only feature built with show and replace - // edit: (callback) => {}, - replace: (config, callback) => { + get: promisify((key, callback) => { + if (typeof key === 'function') { + callback = key + key = undefined + } + + if (!key) { + return self._repo.config.get(callback) + } + + if (typeof key !== 'string') { + return callback(new Error('Invalid key type')) + } + + self._repo.config.get((err, config) => { + if (err) { + return callback(err) + } + const keys = key.split('.') + let finished = false + keys.forEach((key) => { + if (finished) { + return + } + if (config[key]) { + config = config[key] + } else { + finished = true + callback(new Error(('Key does not exist in config'))) + } + }) + if (!finished) { + callback(null, config) + } + }) + }), + set: promisify((key, value, callback) => { + if (!key || typeof key !== 'string') { + return callback(new Error('Invalid key type')) + } + + if (!value || Buffer.isBuffer(value)) { + return callback(new Error('Invalid value type')) + } + + self._repo.config.get((err, config) => { + const configBak = config + if (err) { + return callback(err) + } + const keys = key.split('.') + let finished = false + keys.forEach((key, index) => { + if (finished) { + return + } + if (config[key]) { + if (index === keys.length - 1) { + finished = true + config[key] = value + } + config = config[key] + } else { + if (index === keys.length - 1) { + finished = true + config[key] = value + } else { + config = config[key] = {} + } + } + }) + + self.config.replace(configBak, callback) + }) + }), + replace: promisify((config, callback) => { self._repo.config.set(config, callback) - }, - show: (callback) => { - self._repo.config.get(callback) - } + }) } } diff --git a/src/http-api/index.js b/src/http-api/index.js index b9b5c98b9a..e847577e6c 100644 --- a/src/http-api/index.js +++ b/src/http-api/index.js @@ -38,7 +38,7 @@ exports = module.exports = function HttpApi (repo) { fs.writeFileSync(apiPath, 'api is on by js-ipfs', {flag: 'w+'}) } - this.ipfs.config.show((err, config) => { + this.ipfs.config.get((err, config) => { if (err) { return callback(err) } diff --git a/src/http-api/resources/config.js b/src/http-api/resources/config.js index baecc4bfbf..c6dfca52f0 100644 --- a/src/http-api/resources/config.js +++ b/src/http-api/resources/config.js @@ -60,7 +60,7 @@ exports.getOrSet = { if (value === undefined) { // Get the value of a given key - return request.server.app.ipfs.config.show((err, config) => { + return request.server.app.ipfs.config.get((err, config) => { if (err) { log.error(err) return reply({ @@ -84,7 +84,7 @@ exports.getOrSet = { }) } else { // Set the new value of a given key - request.server.app.ipfs.config.show((err, originalConfig) => { + request.server.app.ipfs.config.get((err, originalConfig) => { if (err) { log.error(err) return reply({ @@ -114,7 +114,7 @@ exports.getOrSet = { } exports.show = (request, reply) => { - return request.server.app.ipfs.config.show((err, config) => { + return request.server.app.ipfs.config.get((err, config) => { if (err) { log.error(err) return reply({ diff --git a/test/core/both/test-bitswap.js b/test/core/both/test-bitswap.js index 6a69be55c2..d9fc88871d 100644 --- a/test/core/both/test-bitswap.js +++ b/test/core/both/test-bitswap.js @@ -26,7 +26,7 @@ describe('bitswap', () => { beforeEach((done) => { ipfs = new IPFS(require('../../utils/repo-path')) if (!isNode) { - ipfs.config.show((err, config) => { + ipfs.config.get((err, config) => { configBak = JSON.parse(JSON.stringify(config)) expect(err).to.not.exist config.Addresses.Swarm = [] diff --git a/test/core/both/test-config.js b/test/core/both/test-config.js index 649fbd2c6a..22ba7d6800 100644 --- a/test/core/both/test-config.js +++ b/test/core/both/test-config.js @@ -1,97 +1,19 @@ /* eslint-env mocha */ 'use strict' -const expect = require('chai').expect +const test = require('interface-ipfs-core') const IPFS = require('../../../src/core') -describe('config', () => { - var defaultConfig = { - Identity: { - PeerID: 'QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A', - PrivKey: 'CAASpgkwggSiAgEAAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAECggEAZtju/bcKvKFPz0mkHiaJcpycy9STKphorpCT83srBVQi59CdFU6Mj+aL/xt0kCPMVigJw8P3/YCEJ9J+rS8BsoWE+xWUEsJvtXoT7vzPHaAtM3ci1HZd302Mz1+GgS8Epdx+7F5p80XAFLDUnELzOzKftvWGZmWfSeDnslwVONkL/1VAzwKy7Ce6hk4SxRE7l2NE2OklSHOzCGU1f78ZzVYKSnS5Ag9YrGjOAmTOXDbKNKN/qIorAQ1bovzGoCwx3iGIatQKFOxyVCyO1PsJYT7JO+kZbhBWRRE+L7l+ppPER9bdLFxs1t5CrKc078h+wuUr05S1P1JjXk68pk3+kQKBgQDeK8AR11373Mzib6uzpjGzgNRMzdYNuExWjxyxAzz53NAR7zrPHvXvfIqjDScLJ4NcRO2TddhXAfZoOPVH5k4PJHKLBPKuXZpWlookCAyENY7+Pd55S8r+a+MusrMagYNljb5WbVTgN8cgdpim9lbbIFlpN6SZaVjLQL3J8TWH6wKBgQDSChzItkqWX11CNstJ9zJyUE20I7LrpyBJNgG1gtvz3ZMUQCn3PxxHtQzN9n1P0mSSYs+jBKPuoSyYLt1wwe10/lpgL4rkKWU3/m1Myt0tveJ9WcqHh6tzcAbb/fXpUFT/o4SWDimWkPkuCb+8j//2yiXk0a/T2f36zKMuZvujqQKBgC6B7BAQDG2H2B/ijofp12ejJU36nL98gAZyqOfpLJ+FeMz4TlBDQ+phIMhnHXA5UkdDapQ+zA3SrFk+6yGk9Vw4Hf46B+82SvOrSbmnMa+PYqKYIvUzR4gg34rL/7AhwnbEyD5hXq4dHwMNsIDq+l2elPjwm/U9V0gdAl2+r50HAoGALtsKqMvhv8HucAMBPrLikhXP/8um8mMKFMrzfqZ+otxfHzlhI0L08Bo3jQrb0Z7ByNY6M8epOmbCKADsbWcVre/AAY0ZkuSZK/CaOXNX/AhMKmKJh8qAOPRY02LIJRBCpfS4czEdnfUhYV/TYiFNnKRj57PPYZdTzUsxa/yVTmECgYBr7slQEjb5Onn5mZnGDh+72BxLNdgwBkhO0OCdpdISqk0F0Pxby22DFOKXZEpiyI9XYP1C8wPiJsShGm2yEwBPWXnrrZNWczaVuCbXHrZkWQogBDG3HGXNdU4MAWCyiYlyinIBpPpoAJZSzpGLmWbMWh28+RJS6AQX6KHrK1o2uw==' }, - Datastore: { Type: '', - Path: '', - StorageMax: '', - StorageGCWatermark: 0, - GCPeriod: '', - Params: null, - NoSync: false }, - Addresses: { Swarm: [ '/ip4/127.0.0.1/tcp/9999', '/ip4/127.0.0.1/tcp/9990/ws' ], - API: '/ip4/127.0.0.1/tcp/6001', - Gateway: '/ip4/127.0.0.1/tcp/0' }, - Mounts: { IPFS: '/ipfs', IPNS: '/ipns', FuseAllowOther: false }, - Version: { Current: '0.4.0-dev', - Check: 'error', - CheckDate: '0001-01-01T00:00:00Z', - CheckPeriod: '172800000000000', - AutoUpdate: 'minor' }, - Discovery: { MDNS: { Enabled: true, Interval: 10 } }, - Ipns: { RepublishPeriod: '', - RecordLifetime: '', - ResolveCacheSize: 128 }, - Bootstrap: [ '/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ', - '/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z', - '/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM', - '/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm', - '/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu', - '/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64', - '/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd', - '/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3', - '/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx' ], - Tour: { Last: '' }, - Gateway: { HTTPHeaders: null, RootRedirect: '', Writable: false }, - SupernodeRouting: { - Servers: [ - '/ip4/104.236.176.52/tcp/4002/ipfs/QmXdb7tWTxdFEQEFgWBqkuYSrZd3mXrC7HxkD4krGNYx2U', - '/ip4/104.236.179.241/tcp/4002/ipfs/QmVRqViDByUxjUMoPnjurjKvZhaEMFDtK35FJXHAM4Lkj6', - '/ip4/104.236.151.122/tcp/4002/ipfs/QmSZwGx8Tn8tmcM4PtDJaMeUQNRhNFdBLVGPzRiNaRJtFH', - '/ip4/162.243.248.213/tcp/4002/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP', - '/ip4/128.199.219.111/tcp/4002/ipfs/Qmb3brdCYmKG1ycwqCbo6LUwWxTuo3FisnJV2yir7oN92R', - '/ip4/104.236.76.40/tcp/4002/ipfs/QmdRBCV8Cz2dGhoKLkD3YjPwVFECmqADQkx5ZteF2c6Fy4', - '/ip4/178.62.158.247/tcp/4002/ipfs/QmUdiMPci7YoEUBkyFZAh2pAbjqcPr7LezyiPD2artLw3v', - '/ip4/178.62.61.185/tcp/4002/ipfs/QmVw6fGNqBixZE4bewRLT2VXX7fAHUHs8JyidDiJ1P7RUN' - ] - }, - API: { - HTTPHeaders: null - }, - Swarm: { - AddrFilters: null - }, - Log: { - MaxSizeMB: 250, - MaxBackups: 1, - MaxAgeDays: 0 - } - } - - var ipfs - - before((done) => { - ipfs = new IPFS(require('../../utils/repo-path')) - ipfs.load(done) - }) - - it('show', (done) => { - ipfs.config.show((err, config) => { - expect(err).to.not.exist - expect(config).to.deep.equal(defaultConfig) - done() +const common = { + setup: function (cb) { + const ipfs = new IPFS(require('../../utils/repo-path')) + ipfs.load(() => { + cb(null, ipfs) }) - }) + }, + teardown: function (cb) { + cb() + } +} - it('replace', (done) => { - ipfs = new IPFS(require('../../utils/repo-path')) - ipfs.config.replace({}, (err) => { - expect(err).to.not.exist - ipfs.config.show((err, config) => { - expect(err).to.not.exist - expect(config).to.deep.equal({}) - ipfs.config.replace(defaultConfig, (err) => { - expect(err).to.not.exist - done() - }) - }) - }) - }) -}) +test.config(common) diff --git a/test/http-api/test-config.js b/test/http-api/test-config.js index 31d678a3e5..7d91cc4f0f 100644 --- a/test/http-api/test-config.js +++ b/test/http-api/test-config.js @@ -223,14 +223,6 @@ module.exports = (httpAPI) => { }) describe('ipfs.config', () => { - it('returns error for request without arguments', (done) => { - ctl.config.get(null, (err, res) => { - expect(err).to.exist - - done() - }) - }) - it('returns error for request with invalid argument', (done) => { ctl.config.get('kittens', (err, res) => { expect(err).to.exist @@ -240,72 +232,46 @@ module.exports = (httpAPI) => { }) it('returns value for request with argument', (done) => { - ctl.config.get('API.HTTPHeaders', (err, res) => { + ctl.config.get('API.HTTPHeaders', (err, value) => { expect(err).not.to.exist - expect(res.Key).to.equal('API.HTTPHeaders') - expect(res.Value).to.equal(null) - + expect(value).to.equal(null) done() }) }) it('updates value for request with both args', (done) => { - ctl.config.set('Datastore.Path', 'kitten', (err, res) => { + ctl.config.set('Datastore.Path', 'kitten', (err) => { expect(err).not.to.exist - expect(res.Key).to.equal('Datastore.Path') - expect(res.Value).to.equal('kitten') - expect(updatedConfig().Datastore.Path).to.equal('kitten') - done() }) }) it('returns error for request with both args and JSON flag with invalid JSON argument', (done) => { - ctl.config.set('Datastore.Path', 'kitten', { json: true }, (err, res) => { + ctl.config.set('Datastore.Path', 'kitten', { json: true }, (err) => { expect(err).to.exist - - done() - }) - }) - - it('updates value for request with both args and JSON flag with valid JSON argument', (done) => { - ctl.config.set('Datastore.Path', JSON.stringify({ kitten: true }), { json: true }, (err, res) => { - expect(err).not.to.exist - expect(res.Key).to.equal('Datastore.Path') - expect(res.Value).to.deep.equal({ kitten: true }) - expect(updatedConfig().Datastore.Path).to.deep.equal({ kitten: true }) - done() }) }) it('updates value for request with both args and bool flag and true argument', (done) => { - ctl.config.set('Datastore.Path', true, { bool: true }, (err, res) => { + ctl.config.set('Datastore.Path', true, (err) => { expect(err).not.to.exist - expect(res.Key).to.equal('Datastore.Path') - expect(res.Value).to.deep.equal(true) - expect(updatedConfig().Datastore.Path).to.deep.equal(true) - done() }) }) it('updates value for request with both args and bool flag and false argument', (done) => { - ctl.config.set('Datastore.Path', false, { bool: true }, (err, res) => { + ctl.config.set('Datastore.Path', false, (err) => { expect(err).not.to.exist - expect(res.Key).to.equal('Datastore.Path') - expect(res.Value).to.deep.equal(false) - expect(updatedConfig().Datastore.Path).to.deep.equal(false) - done() }) }) }) - it('ipfs.config.show', (done) => { - ctl.config.show((err, res) => { + it('ipfs.config.get', (done) => { + ctl.config.get((err, config) => { expect(err).not.to.exist - expect(res).to.deep.equal(updatedConfig()) + expect(config).to.deep.equal(updatedConfig()) done() }) }) From 97af0489c448142e0d4a366796b378aa85dd5e7a Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 10 Aug 2016 15:37:48 +0100 Subject: [PATCH 2/3] fix(style): apply CR --- package.json | 9 ++++---- src/core/ipfs/config.js | 48 ++++++++--------------------------------- 2 files changed, 13 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 79cb4e60a9..74723fe14a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "interface-ipfs-core": "^0.6.0", "left-pad": "^1.1.1", "lodash": "^4.14.1", - "mocha": "^2.5.1", "ncp": "^2.0.0", "nexpect": "^0.5.0", "pre-commit": "^1.1.3", @@ -68,8 +67,8 @@ "fs-blob-store": "^5.2.1", "glob": "^7.0.5", "hapi": "^14.0.0", + "ipfs-api": "ipfs/js-ipfs-api#8cc853f", "ipfs-bitswap": "^0.6.0", - "ipfs-api": "ipfs/js-ipfs-api#91de5ac", "ipfs-block": "^0.3.0", "ipfs-block-service": "^0.4.0", "ipfs-merkle-dag": "^0.6.2", @@ -81,11 +80,11 @@ "joi": "^9.0.4", "libp2p-ipfs": "^0.12.1", "libp2p-ipfs-browser": "^0.12.1", - "lodash.get": "^4.4.0", - "lodash.set": "^4.3.0", + "lodash.get": "^4.4.1", + "lodash.set": "^4.3.1", "mafmt": "^2.1.1", - "multihashes": "^0.2.2", "multiaddr": "^2.0.2", + "multihashes": "^0.2.2", "path-exists": "^3.0.0", "peer-book": "^0.3.0", "peer-id": "^0.7.0", diff --git a/src/core/ipfs/config.js b/src/core/ipfs/config.js index 3996a1bffb..72942bb22e 100644 --- a/src/core/ipfs/config.js +++ b/src/core/ipfs/config.js @@ -1,6 +1,8 @@ 'use strict' const promisify = require('promisify-es6') +const _get = require('lodash.get') +const _set = require('lodash.set') module.exports = function config (self) { return { @@ -22,21 +24,11 @@ module.exports = function config (self) { if (err) { return callback(err) } - const keys = key.split('.') - let finished = false - keys.forEach((key) => { - if (finished) { - return - } - if (config[key]) { - config = config[key] - } else { - finished = true - callback(new Error(('Key does not exist in config'))) - } - }) - if (!finished) { - callback(null, config) + const value = _get(config, key, undefined) + if (!value) { + callback(new Error('Key does not exist in config')) + } else { + callback(null, value) } }) }), @@ -50,33 +42,11 @@ module.exports = function config (self) { } self._repo.config.get((err, config) => { - const configBak = config if (err) { return callback(err) } - const keys = key.split('.') - let finished = false - keys.forEach((key, index) => { - if (finished) { - return - } - if (config[key]) { - if (index === keys.length - 1) { - finished = true - config[key] = value - } - config = config[key] - } else { - if (index === keys.length - 1) { - finished = true - config[key] = value - } else { - config = config[key] = {} - } - } - }) - - self.config.replace(configBak, callback) + _set(config, key, value) + self.config.replace(config, callback) }) }), replace: promisify((config, callback) => { From cc0c8fd2f997c463ccabf3850fb22d2750fc8d70 Mon Sep 17 00:00:00 2001 From: David Dias Date: Sat, 20 Aug 2016 10:46:52 +0100 Subject: [PATCH 3/3] feat(bitswap tests, config, id): cope with the nuances of the config API (.replace) and make necessary changes to make it all work again --- package.json | 2 +- src/core/index.js | 1 + src/core/ipfs/id.js | 10 +-- src/http-api/resources/config.js | 2 +- src/http-api/resources/id.js | 13 ++- src/http-api/routes/bootstrap.js | 8 +- src/http-api/routes/config.js | 2 +- src/http-api/routes/id.js | 2 +- src/http-api/routes/repo.js | 2 +- src/http-api/routes/swarm.js | 12 +-- src/http-api/routes/version.js | 2 +- test/core/both/test-bitswap.js | 137 ++++++++++++++++-------------- test/core/both/test-id.js | 10 +-- test/core/node-only/test-swarm.js | 4 +- 14 files changed, 111 insertions(+), 96 deletions(-) diff --git a/package.json b/package.json index 74723fe14a..1163fb25f0 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "fs-blob-store": "^5.2.1", "glob": "^7.0.5", "hapi": "^14.0.0", - "ipfs-api": "ipfs/js-ipfs-api#8cc853f", + "ipfs-api": "^7.0.0", "ipfs-bitswap": "^0.6.0", "ipfs-block": "^0.3.0", "ipfs-block-service": "^0.4.0", diff --git a/src/core/index.js b/src/core/index.js index 4ac3b388d0..48a675908f 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -56,6 +56,7 @@ function IPFS (repoInstance) { this.block = block(this) this.object = object(this) this.libp2p = libp2p(this) + this.swarm = this.libp2p.swarm // for interface-ipfs-core sake this.files = files(this) this.cat = files(this).cat // Alias for js-ipfs-api cat this.bitswap = bitswap(this) diff --git a/src/core/ipfs/id.js b/src/core/ipfs/id.js index 99d442cd92..45c1a00169 100644 --- a/src/core/ipfs/id.js +++ b/src/core/ipfs/id.js @@ -14,11 +14,11 @@ module.exports = function id (self) { function ready () { callback(null, { - ID: self._peerInfo.id.toB58String(), - PublicKey: self._peerInfo.id.pubKey.bytes.toString('base64'), - Addresses: self._peerInfo.multiaddrs.map((ma) => { return ma.toString() }).sort(), - AgentVersion: 'js-ipfs', - ProtocolVersion: '9000' + id: self._peerInfo.id.toB58String(), + publicKey: self._peerInfo.id.pubKey.bytes.toString('base64'), + addresses: self._peerInfo.multiaddrs.map((ma) => { return ma.toString() }).sort(), + agentVersion: 'js-ipfs', + protocolVersion: '9000' }) } } diff --git a/src/http-api/resources/config.js b/src/http-api/resources/config.js index c6dfca52f0..869c2bfc80 100644 --- a/src/http-api/resources/config.js +++ b/src/http-api/resources/config.js @@ -113,7 +113,7 @@ exports.getOrSet = { } } -exports.show = (request, reply) => { +exports.get = (request, reply) => { return request.server.app.ipfs.config.get((err, config) => { if (err) { log.error(err) diff --git a/src/http-api/resources/id.js b/src/http-api/resources/id.js index 49e1893e8b..d05433b329 100644 --- a/src/http-api/resources/id.js +++ b/src/http-api/resources/id.js @@ -6,7 +6,16 @@ exports = module.exports exports.get = (request, reply) => { request.server.app.ipfs.id((err, id) => { - if (err) { return reply(boom.badRequest(err)) } - return reply(id) + if (err) { + return reply(boom.badRequest(err)) + } + + return reply({ + ID: id.id, + PublicKey: id.publicKey, + Addresses: id.addresses, + AgentVersion: id.agentVersion, + ProtocolVersion: id.protocolVersion + }) }) } diff --git a/src/http-api/routes/bootstrap.js b/src/http-api/routes/bootstrap.js index 5bc0a40ec7..cb7426fae6 100644 --- a/src/http-api/routes/bootstrap.js +++ b/src/http-api/routes/bootstrap.js @@ -8,14 +8,14 @@ module.exports = (server) => { // https://github.com/ipfs/http-api-spec/blob/master/apiary.apib#L818 api.route({ - method: 'GET', + method: '*', path: '/api/v0/bootstrap', handler: resources.bootstrap.list }) // https://github.com/ipfs/http-api-spec/blob/master/apiary.apib#L866 api.route({ - method: 'GET', + method: '*', path: '/api/v0/bootstrap/add', handler: resources.bootstrap.add, config: { @@ -30,14 +30,14 @@ module.exports = (server) => { // https://github.com/ipfs/http-api-spec/blob/master/apiary.apib#L1081 api.route({ - method: 'GET', + method: '*', path: '/api/v0/bootstrap/list', handler: resources.bootstrap.list }) // https://github.com/ipfs/http-api-spec/blob/master/apiary.apib#L1131 api.route({ - method: 'GET', + method: '*', path: '/api/v0/bootstrap/rm', handler: resources.bootstrap.rm, config: { diff --git a/src/http-api/routes/config.js b/src/http-api/routes/config.js index 452d84ed0b..ae281e2a4c 100644 --- a/src/http-api/routes/config.js +++ b/src/http-api/routes/config.js @@ -19,7 +19,7 @@ module.exports = (server) => { api.route({ method: '*', path: '/api/v0/config/show', - handler: resources.config.show + handler: resources.config.get }) api.route({ diff --git a/src/http-api/routes/id.js b/src/http-api/routes/id.js index c34e3df8b7..9a13f72efc 100644 --- a/src/http-api/routes/id.js +++ b/src/http-api/routes/id.js @@ -6,7 +6,7 @@ module.exports = (server) => { const api = server.select('API') api.route({ - method: 'GET', + method: '*', path: '/api/v0/id', handler: resources.id.get }) diff --git a/src/http-api/routes/repo.js b/src/http-api/routes/repo.js index 6a4511e1f9..f42f03bfc1 100644 --- a/src/http-api/routes/repo.js +++ b/src/http-api/routes/repo.js @@ -7,7 +7,7 @@ module.exports = (server) => { const api = server.select('API') api.route({ - method: 'GET', + method: '*', path: '/api/v0/repo', handler: resources.repo }) diff --git a/src/http-api/routes/swarm.js b/src/http-api/routes/swarm.js index 461edeb547..3b4844cd5a 100644 --- a/src/http-api/routes/swarm.js +++ b/src/http-api/routes/swarm.js @@ -6,7 +6,7 @@ module.exports = (server) => { const api = server.select('API') api.route({ - method: 'GET', + method: '*', path: '/api/v0/swarm/peers', config: { handler: resources.swarm.peers.handler @@ -14,7 +14,7 @@ module.exports = (server) => { }) // api.route({ - // method: 'GET', + // method: '*', // path: '/api/v0/swarm/addrs', // config: { // handler: resources.swarm.addrs.handler @@ -22,7 +22,7 @@ module.exports = (server) => { // }) api.route({ - method: 'GET', + method: '*', path: '/api/v0/swarm/addrs/local', config: { handler: resources.swarm.localAddrs.handler @@ -30,7 +30,7 @@ module.exports = (server) => { }) api.route({ - method: 'GET', + method: '*', path: '/api/v0/swarm/connect', config: { pre: [ @@ -41,7 +41,7 @@ module.exports = (server) => { }) // api.route({ - // method: 'GET', + // method: '*', // path: '/api/v0/swarm/disconnect', // config: { // handler: resources.swarm.disconnect @@ -50,7 +50,7 @@ module.exports = (server) => { // TODO // api.route({ - // method: 'GET', + // method: '*', // path: '/api/v0/swarm/filters', // config: { // handler: resources.swarm.disconnect diff --git a/src/http-api/routes/version.js b/src/http-api/routes/version.js index f24485e680..80287a4f3d 100644 --- a/src/http-api/routes/version.js +++ b/src/http-api/routes/version.js @@ -6,7 +6,7 @@ module.exports = (server) => { const api = server.select('API') api.route({ - method: 'GET', + method: '*', path: '/api/v0/version', handler: resources.version.get }) diff --git a/test/core/both/test-bitswap.js b/test/core/both/test-bitswap.js index d9fc88871d..b75330260f 100644 --- a/test/core/both/test-bitswap.js +++ b/test/core/both/test-bitswap.js @@ -20,67 +20,71 @@ function makeBlock () { } describe('bitswap', () => { - let ipfs - let configBak + let inProcNode // Node spawned inside this process + let swarmAddrsBak beforeEach((done) => { - ipfs = new IPFS(require('../../utils/repo-path')) + inProcNode = new IPFS(require('../../utils/repo-path')) if (!isNode) { - ipfs.config.get((err, config) => { - configBak = JSON.parse(JSON.stringify(config)) + inProcNode.config.get('Addresses.Swarm', (err, swarmAddrs) => { expect(err).to.not.exist - config.Addresses.Swarm = [] - ipfs.config.replace(config, (err) => { + swarmAddrsBak = swarmAddrs + inProcNode.config.set('Addresses.Swarm', [], (err) => { expect(err).to.not.exist - ipfs.load(done) + inProcNode.load(done) }) }) } else { - ipfs.load(done) + inProcNode.load(done) } }) afterEach((done) => { if (!isNode) { - ipfs.config.replace(configBak, done) + inProcNode.config.set('Addresses.Swarm', swarmAddrsBak, done) } else { done() } }) describe('connections', () => { - function connectNodesSingle (node1, node2, done) { - node1.id((err, res) => { + function wire (targetNode, dialerNode, done) { + targetNode.id((err, identity) => { expect(err).to.not.exist - const addr = res.Addresses + const addr = identity.addresses .map((addr) => multiaddr(addr)) .filter((addr) => { return _.includes(addr.protoNames(), 'ws') })[0] - let target + let targetAddr if (addr) { - target = addr.encapsulate(multiaddr(`/ipfs/${res.ID}`)).toString() - target = target.replace('0.0.0.0', '127.0.0.1') + targetAddr = addr.encapsulate(multiaddr(`/ipfs/${identity.id}`)).toString() + targetAddr = targetAddr.replace('0.0.0.0', '127.0.0.1') } else { - // cause browser nodes don't have a websockets addrs - // TODO, what we really need is a way to dial to a peerId only - // and another to dial to peerInfo - target = multiaddr(`/ip4/127.0.0.1/tcp/0/ws/ipfs/${res.ID}`).toString() + // Note: the browser doesn't have + // a websockets listening addr + + // TODO, what we really need is a way to dial to + // a peerId only and another to dial to peerInfo + targetAddr = multiaddr(`/ip4/127.0.0.1/tcp/0/ws/ipfs/${identity.id}`).toString() } - const swarm = node2.libp2p ? node2.libp2p.swarm : node2.swarm - swarm.connect(target, done) + dialerNode.swarm.connect(targetAddr, done) }) } - function connectNodes (node1, node2, done) { + function connectNodes (remoteNode, ipn, done) { series([ - (cb) => connectNodesSingle(node1, node2, cb), + (cb) => { + wire(remoteNode, ipn, cb) + }, (cb) => setTimeout(() => { - // need timeout so we wait for identify to happen - // in the browsers - connectNodesSingle(node2, node1, cb) + // need timeout so we wait for identify + // to happen. + + // This call is just to ensure identify happened + wire(ipn, remoteNode, cb) }, 300) ], done) } @@ -88,38 +92,39 @@ describe('bitswap', () => { function addNode (num, done) { num = leftPad(num, 3, 0) const apiUrl = `/ip4/127.0.0.1/tcp/31${num}` - const node = new API(apiUrl) + const remoteNode = new API(apiUrl) - connectNodes(node, ipfs, (err) => { - done(err, node) + connectNodes(remoteNode, inProcNode, (err) => { + done(err, remoteNode) }) } describe('fetches a remote block', () => { beforeEach((done) => { - ipfs.goOnline(done) + inProcNode.goOnline(done) }) afterEach((done) => { - // ipfs.goOffline(done) - setTimeout(() => ipfs.goOffline(done), 1500) + setTimeout(() => inProcNode.goOffline(done), 1500) }) it('2 peers', (done) => { const block = makeBlock() - let node + let remoteNode series([ // 0. Start node - (cb) => addNode(13, (err, _ipfs) => { - node = _ipfs + (cb) => addNode(13, (err, _remoteNode) => { + expect(err).to.not.exist + remoteNode = _remoteNode cb(err) }), - (cb) => node.block.put(block.data, cb), (cb) => { - ipfs.block.get(block.key, (err, b) => { - expect(err).to.not.exist + remoteNode.block.put(block.data, cb) + }, + (cb) => { + inProcNode.block.get(block.key, (err, b) => { expect(b.data.toString()).to.be.eql(block.data.toString()) - cb() + cb(err) }) } ], done) @@ -130,23 +135,23 @@ describe('bitswap', () => { const blocks = _.range(6).map((i) => makeBlock()) const keys = blocks.map((b) => b.key) - const nodes = [] + const remoteNodes = [] series([ (cb) => addNode(8, (err, _ipfs) => { - nodes.push(_ipfs) + remoteNodes.push(_ipfs) cb(err) }), (cb) => addNode(7, (err, _ipfs) => { - nodes.push(_ipfs) + remoteNodes.push(_ipfs) cb(err) }), - (cb) => connectNodes(nodes[0], nodes[1], cb), - (cb) => nodes[0].block.put(blocks[0].data, cb), - (cb) => nodes[0].block.put(blocks[1].data, cb), - (cb) => nodes[1].block.put(blocks[2].data, cb), - (cb) => nodes[1].block.put(blocks[3].data, cb), - (cb) => ipfs.block.put(blocks[4], cb), - (cb) => ipfs.block.put(blocks[5], cb), + (cb) => connectNodes(remoteNodes[0], remoteNodes[1], cb), + (cb) => remoteNodes[0].block.put(blocks[0].data, cb), + (cb) => remoteNodes[0].block.put(blocks[1].data, cb), + (cb) => remoteNodes[1].block.put(blocks[2].data, cb), + (cb) => remoteNodes[1].block.put(blocks[3].data, cb), + (cb) => inProcNode.block.put(blocks[4], cb), + (cb) => inProcNode.block.put(blocks[5], cb), // 3. Fetch blocks on all nodes (cb) => parallel(_.range(6).map((i) => (cbI) => { const toMh = (k) => bs58.encode(k).toString() @@ -163,9 +168,9 @@ describe('bitswap', () => { } series([ - (cbJ) => check(nodes[0], toMh(keys[i]), cbJ), - (cbJ) => check(nodes[1], toMh(keys[i]), cbJ), - (cbJ) => check(ipfs, keys[i], cbJ) + (cbJ) => check(remoteNodes[0], toMh(keys[i]), cbJ), + (cbJ) => check(remoteNodes[1], toMh(keys[i]), cbJ), + (cbJ) => check(inProcNode, keys[i], cbJ) ], cbI) }), cb) ], done) @@ -175,7 +180,7 @@ describe('bitswap', () => { // wont work without http-api for add describe.skip('fetches a remote file', () => { beforeEach((done) => { - ipfs.goOnline(done) + inProcNode.goOnline(done) }) it('2 peers', (done) => { @@ -194,7 +199,7 @@ describe('bitswap', () => { (val, cb) => { const hash = bs58.encode(val[0].multihash).toString() - ipfs.files.cat(hash, (err, res) => { + inProcNode.files.cat(hash, (err, res) => { expect(err).to.not.exist res.on('file', (data) => { data.content.pipe(bl((err, bldata) => { @@ -211,40 +216,40 @@ describe('bitswap', () => { }) }) - describe('commands', () => { + describe('bitswap API', () => { describe('wantlist', (done) => { it('throws if offline', () => { expect( - () => ipfs.bitswap.wantlist() + () => inProcNode.bitswap.wantlist() ).to.throw(/online/) }) it('returns an array of wanted blocks', (done) => { - ipfs.goOnline((err) => { + inProcNode.goOnline((err) => { expect(err).to.not.exist expect( - ipfs.bitswap.wantlist() + inProcNode.bitswap.wantlist() ).to.be.eql( [] ) - ipfs.goOffline(done) + inProcNode.goOffline(done) }) }) describe('stat', () => { - it('throws if offline', () => { + it('throws while offline', () => { expect( - () => ipfs.bitswap.stat() + () => inProcNode.bitswap.stat() ).to.throw(/online/) }) it('returns the stats', (done) => { - ipfs.goOnline((err) => { + inProcNode.goOnline((err) => { expect(err).to.not.exist - let stats = ipfs.bitswap.stat() + let stats = inProcNode.bitswap.stat() expect(stats).to.have.keys([ 'blocksReceived', @@ -254,7 +259,7 @@ describe('bitswap', () => { 'dupBlksReceived' ]) - ipfs.goOffline(done) + inProcNode.goOffline(done) }) }) }) @@ -262,7 +267,7 @@ describe('bitswap', () => { describe('unwant', () => { it('throws if offline', () => { expect( - () => ipfs.bitswap.unwant('my key') + () => inProcNode.bitswap.unwant('my key') ).to.throw(/online/) }) }) diff --git a/test/core/both/test-id.js b/test/core/both/test-id.js index f1fe6218de..3088363370 100644 --- a/test/core/both/test-id.js +++ b/test/core/both/test-id.js @@ -17,14 +17,14 @@ describe('id', () => { ipfs.id((err, id) => { expect(err).to.not.exist expect(id).to.deep.equal({ - ID: 'QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A', - PublicKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAE=', - Addresses: [ + id: 'QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A', + publicKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAE=', + addresses: [ '/ip4/127.0.0.1/tcp/9990/ws', '/ip4/127.0.0.1/tcp/9999' ], - AgentVersion: 'js-ipfs', - ProtocolVersion: '9000' + agentVersion: 'js-ipfs', + protocolVersion: '9000' }) done() }) diff --git a/test/core/node-only/test-swarm.js b/test/core/node-only/test-swarm.js index 78b0cfbc56..0440f499fa 100644 --- a/test/core/node-only/test-swarm.js +++ b/test/core/node-only/test-swarm.js @@ -39,14 +39,14 @@ describe('swarm', function () { (cb) => { nodeA.id((err, res) => { expect(err).to.not.exist - // nodeAMultiaddr = `${res.Addresses[0]}/ipfs/${res.ID}` + // nodeAMultiaddr = `${res.addresses[0]}/ipfs/${res.ID}` cb() }) }, (cb) => { nodeB.id((err, res) => { expect(err).to.not.exist - nodeBMultiaddr = `${res.Addresses[0]}/ipfs/${res.ID}` + nodeBMultiaddr = `${res.addresses[0]}/ipfs/${res.ID}` cb() }) }