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() }) }