Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .aegir.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module.exports = {
webpack: {
resolve: {
alias: {
'libp2p-ipfs': 'libp2p-ipfs-browser',
'node-forge': path.resolve(
path.dirname(require.resolve('libp2p-crypto')),
'../vendor/forge.bundle.js'
Expand Down
15 changes: 9 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"coverage": "gulp coverage",
"test": "gulp test",
"test:node": "gulp test:node",
"test:core:node": "TEST=core npm run test:node",
"test:browser": "gulp test:browser",
"build": "gulp build",
"release": "gulp release",
Expand All @@ -37,14 +38,15 @@
},
"homepage": "https://github.com/ipfs/js-ipfs#readme",
"devDependencies": {
"aegir": "^3.1.0",
"aegir": "^3.2.0",
"buffer-loader": "0.0.1",
"chai": "^3.5.0",
"expose-loader": "^0.7.1",
"form-data": "^1.0.0-rc3",
"gulp": "^3.9.1",
"idb-plus-blob-store": "^1.1.2",
"interface-ipfs-core": "^0.1.5",
"left-pad": "^1.1.0",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are you sure you want to use this module :D

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahaha I was waiting for someone to catch this :D

"lodash": "^4.11.2",
"mocha": "^2.5.1",
"ncp": "^2.0.0",
Expand All @@ -65,19 +67,20 @@
"glob": "^7.0.3",
"hapi": "^13.4.1",
"ipfs-api": "^4.1.0",
"ipfs-bitswap": "^0.3.1",
"ipfs-bitswap": "^0.4.0",
"ipfs-block": "^0.3.0",
"ipfs-block-service": "^0.4.0",
"ipfs-merkle-dag": "^0.6.0",
"ipfs-multipart": "^0.1.0",
"ipfs-repo": "^0.8.0",
"ipfs-unixfs-engine": "^0.8.0",
"joi": "^8.0.5",
"libp2p-ipfs": "^0.9.0",
"libp2p-ipfs-browser": "^0.8.0",
"libp2p-swarm": "^0.19.0",
"libp2p-ipfs": "^0.10.0",
"libp2p-ipfs-browser": "^0.9.0",
"libp2p-swarm": "^0.19.4",
"lodash.get": "^4.3.0",
"lodash.set": "^4.2.0",
"mafmt": "^2.1.1",
"multiaddr": "^2.0.2",
"path-exists": "^3.0.0",
"peer-book": "^0.3.0",
Expand Down Expand Up @@ -109,4 +112,4 @@
"kumavis <kumavis@users.noreply.github.com>",
"nginnever <ginneversource@gmail.com>"
]
}
}
4 changes: 2 additions & 2 deletions src/core/ipfs/go-online.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ module.exports = function goOnline (self) {
}

self._bitswap = new Bitswap(
self._peerInfo,
self._libp2pNode.peerInfo,
self._libp2pNode,
self._repo.datastore,
self._peerInfoBook
self._libp2pNode.peerBook
)
self._bitswap.start()
self._blockS.goOnline(self._bitswap)
Expand Down
50 changes: 31 additions & 19 deletions src/core/ipfs/libp2p.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
'use strict'

const peerId = require('peer-id')
const PeerInfo = require('peer-info')
const multiaddr = require('multiaddr')
const Libp2pNode = require('libp2p-ipfs').Node
const mafmt = require('mafmt')

const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR

module.exports = function libp2p (self) {
// NOTE: TODO CONSIDER/ CONSIDERING putting all of libp2p (start, stop, peerbook and so on) inside the libp2p object and reduce one layer

return {
start: (callback) => {
self._libp2pNode = new Libp2pNode(self._peerInfo)
self._libp2pNode.start(() => {
// TODO connect to bootstrap nodes, it will get us more addrs
self._peerInfo.multiaddrs.forEach((ma) => {
self._libp2pNode.peerInfo.multiaddrs.forEach((ma) => {
console.log('Swarm listening on', ma.toString())
})
callback()
})

self._libp2pNode.discovery.on('peer', (peerInfo) => {
self._peerInfoBook.put(peerInfo)
self._libp2pNode.swarm.dial(peerInfo)
self._libp2pNode.peerBook.put(peerInfo)
self._libp2pNode.dialByPeerInfo(peerInfo, () => {})
})
self._libp2pNode.swarm.on('peer-mux-established', (peerInfo) => {
self._peerInfoBook.put(peerInfo)
self._libp2pNode.peerBook.put(peerInfo)
})
},
stop: (callback) => {
self._libp2pNode.swarm.close(callback)
self._libp2pNode.stop(callback)
},
swarm: {
peers: (callback) => {
if (!self.isOnline()) {
return callback(OFFLINE_ERROR)
}

callback(null, self._peerInfoBook.getAll())
callback(null, self._libp2pNode.peerBook.getAll())
},
// all the addrs we know
addrs: (callback) => {
Expand All @@ -51,34 +53,44 @@ module.exports = function libp2p (self) {
return callback(OFFLINE_ERROR)
}

callback(null, self._peerInfo.multiaddrs)
callback(null, self._libp2pNode.peerInfo.multiaddrs)
},
connect: (ma, callback) => {
connect: (maddr, callback) => {
if (!self.isOnline()) {
return callback(OFFLINE_ERROR)
}

const idStr = ma.toString().match(/\/ipfs\/(.*)/)
if (!idStr) {
return callback(new Error('invalid multiaddr'))
if (typeof maddr === 'string') {
maddr = multiaddr(maddr)
}

if (!mafmt.IPFS.matches(maddr.toString())) {
return callback(new Error('multiaddr not valid'))
}
const id = peerId.createFromB58String(idStr[1])
const peer = new PeerInfo(id)

peer.multiaddr.add(multiaddr(ma))
let ipfsIdB58String
maddr.stringTuples().forEach((tuple) => {
if (tuple[0] === 421) {
ipfsIdB58String = tuple[1]
}
})

self._peerInfoBook.put(peer)
const id = peerId.createFromB58String(ipfsIdB58String)

self._libp2pNode.swarm.dial(peer, (err) => {
self._libp2pNode.dialByMultiaddr(maddr, (err) => {
callback(err, id)
})
},
disconnect: (callback) => {
disconnect: (maddr, callback) => {
if (!self.isOnline()) {
return callback(OFFLINE_ERROR)
}

throw new Error('Not implemented')
if (typeof maddr === 'string') {
maddr = multiaddr(maddr)
}

self._libp2pNode.hangUpByMultiaddr(maddr, callback)
},
filters: () => {
// TODO
Expand Down
2 changes: 1 addition & 1 deletion test/cli/test-bitswap.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ describe('bitswap', function () {
let ipfs

before((done) => {
createTempNode(4, (err, _ipfs) => {
createTempNode(38, (err, _ipfs) => {
expect(err).to.not.exist
ipfs = _ipfs
ipfs.goOnline(done)
Expand Down
6 changes: 4 additions & 2 deletions test/core/both/test-bitswap.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const _ = require('lodash')
const series = require('run-series')
const waterfall = require('run-waterfall')
const parallel = require('run-parallel')
const leftPad = require('left-pad')
const Block = require('ipfs-block')
const bs58 = require('bs58')
const bl = require('bl')
Expand Down Expand Up @@ -65,7 +66,7 @@ describe('bitswap', () => {
// 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/0.0.0.0/tcp/0/ipfs/${res.ID}`).toString()
target = multiaddr(`/ip4/0.0.0.0/tcp/0/ws/ipfs/${res.ID}`).toString()
}

const swarm = node2.libp2p ? node2.libp2p.swarm : node2.swarm
Expand All @@ -85,7 +86,8 @@ describe('bitswap', () => {
}

function addNode (num, done) {
const apiUrl = `/ip4/127.0.0.1/tcp/1100${num}`
num = leftPad(num, 3, 0)
const apiUrl = `/ip4/127.0.0.1/tcp/31${num}`
const node = new API(apiUrl)

connectNodes(node, ipfs, (err) => {
Expand Down
142 changes: 98 additions & 44 deletions test/core/node-only/test-swarm.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,76 +2,130 @@
'use strict'

const expect = require('chai').expect
const parallel = require('run-parallel')

const createTempNode = require('../../utils/temp-node')

describe('swarm', function () {
this.timeout(20000)
this.timeout(20 * 1000)

var ipfsA
var ipfsB
var ipfsAAddr
let nodeA
let nodeB

before((done) => {
createTempNode(2, (err, ipfs) => {
expect(err).to.not.exist
ipfsA = ipfs
// let nodeAMultiaddr
let nodeBMultiaddr

createTempNode(3, (err, ipfs) => {
expect(err).to.not.exist
ipfsB = ipfs
done()
})
})
it('create 2 temporary nodes', (done) => {
parallel([
(cb) => {
createTempNode(2, (err, tmpNode) => {
expect(err).to.not.exist
nodeA = tmpNode
cb()
})
},
(cb) => {
createTempNode(3, (err, tmpNode) => {
expect(err).to.not.exist
nodeB = tmpNode
cb()
})
}
], done)
})

before((done) => {
ipfsA.id((err, res) => {
expect(err).to.not.exist
ipfsAAddr = `${res.Addresses[0]}/ipfs/${res.ID}`
done()
})
it('get each peer addr', (done) => {
parallel([
(cb) => {
nodeA.id((err, res) => {
expect(err).to.not.exist
// 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}`
cb()
})
}
], done)
})

it('start', (done) => {
ipfsA.goOnline((err) => {
expect(err).to.not.exist
ipfsB.goOnline((err) => {
expect(err).to.not.exist
done()
})
})
it('start 2 nodes', (done) => {
parallel([
nodeA.goOnline,
nodeB.goOnline
], done)
})

it('connect', (done) => {
ipfsB.libp2p.swarm.connect(ipfsAAddr, (err, res) => {
it('libp2p.swarm.connect nodeA to nodeB', (done) => {
nodeA.libp2p.swarm.connect(nodeBMultiaddr, (err) => {
expect(err).to.not.exist
done()
// So that identify has time to execute
setTimeout(done, 500)
})
})

it('peers', (done) => {
ipfsB.libp2p.swarm.peers((err, res) => {
expect(err).to.not.exist
expect(Object.keys(res)).to.have.length(1)
done()
})
it('libp2p.swarm.peers on nodeA and nodeB match each other', (done) => {
parallel([
(cb) => {
nodeA.libp2p.swarm.peers((err, res) => {
expect(err).to.not.exist
expect(Object.keys(res)).to.have.length(1)
cb()
})
},
(cb) => {
nodeB.libp2p.swarm.peers((err, res) => {
expect(err).to.not.exist
expect(Object.keys(res)).to.have.length(1)
cb()
})
}
], done)
})

it('localAddrs', (done) => {
ipfsB.libp2p.swarm.localAddrs((err, res) => {
it('libp2p.swarm.localAddrs', (done) => {
nodeB.libp2p.swarm.localAddrs((err, res) => {
expect(err).to.not.exist
expect(res.length).to.equal(2)
done()
})
})

it.skip('disconnect', (done) => {})

it.skip('stop', (done) => {
ipfsA.goOffline((err) => {
it('libp2p.swarm.disconnect nodeB from nodeA', (done) => {
nodeA.libp2p.swarm.disconnect(nodeBMultiaddr, (err) => {
expect(err).to.not.exist
ipfsB.goOffline(done)
// So that identify has time to execute
setTimeout(check, 500)

function check () {
parallel([
(cb) => {
nodeA.libp2p.swarm.peers((err, res) => {
expect(err).to.not.exist
expect(Object.keys(res)).to.have.length(0)
cb()
})
},
(cb) => {
nodeB.libp2p.swarm.peers((err, res) => {
expect(err).to.not.exist
expect(Object.keys(res)).to.have.length(0)
cb()
})
}
], done)
}
})
})

it('stop', (done) => {
parallel([
nodeA.goOffline,
nodeB.goOffline
], done)
})
})
Loading