mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-07-08 21:31:32 +00:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
a85f041843 | |||
2c0cda2a7c | |||
b4ba267589 | |||
4c81f39ebe | |||
76922383ab | |||
3fc57ff397 | |||
13b36dcaa6 | |||
61bebd10fc | |||
97cde1ccb4 | |||
07b0cdc30e | |||
73b6d60e32 | |||
808f7495a9 | |||
ae21a6facf | |||
3aba3fd176 | |||
dc2da39a19 | |||
f8b441fff5 | |||
190ad54f9e | |||
582f8bed2e |
20
CHANGELOG.md
20
CHANGELOG.md
@ -1,3 +1,23 @@
|
|||||||
|
<a name="0.15.2"></a>
|
||||||
|
## [0.15.2](https://github.com/libp2p/js-libp2p/compare/v0.15.1...v0.15.2) (2018-01-28)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.15.1"></a>
|
||||||
|
## [0.15.1](https://github.com/libp2p/js-libp2p/compare/v0.15.0...v0.15.1) (2018-01-16)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* typo in DHT setup ([#151](https://github.com/libp2p/js-libp2p/issues/151)) ([61bebd1](https://github.com/libp2p/js-libp2p/commit/61bebd1))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.15.0"></a>
|
||||||
|
# [0.15.0](https://github.com/libp2p/js-libp2p/compare/v0.14.3...v0.15.0) (2018-01-07)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.14.3"></a>
|
<a name="0.14.3"></a>
|
||||||
## [0.14.3](https://github.com/libp2p/js-libp2p/compare/v0.14.2...v0.14.3) (2017-12-15)
|
## [0.14.3](https://github.com/libp2p/js-libp2p/compare/v0.14.2...v0.14.3) (2017-12-15)
|
||||||
|
|
||||||
|
@ -164,10 +164,11 @@ class Node extends libp2p {
|
|||||||
|
|
||||||
- `peer`: can be an instance of [PeerInfo][], [PeerId][] or [multiaddr][]
|
- `peer`: can be an instance of [PeerInfo][], [PeerId][] or [multiaddr][]
|
||||||
- `protocol`: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')
|
- `protocol`: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')
|
||||||
|
- `callback`: Function with signature `function (err, conn) {}` where `conn` is a [Connection](https://github.com/libp2p/interface-connection) object
|
||||||
|
|
||||||
`callback` is a function with the following `function (err, conn) {}` signature, where `err` is an Error in of failure to dial the connection and `conn` is a [Connection][] instance in case of a protocol selected, if not it is undefined.
|
`callback` is a function with the following `function (err, conn) {}` signature, where `err` is an Error in of failure to dial the connection and `conn` is a [Connection][] instance in case of a protocol selected, if not it is undefined.
|
||||||
|
|
||||||
#### `libp2p.hangUp(peer, callback)
|
#### `libp2p.hangUp(peer, callback)`
|
||||||
|
|
||||||
> Closes an open connection with a peer, graciously.
|
> Closes an open connection with a peer, graciously.
|
||||||
|
|
||||||
@ -196,7 +197,7 @@ class Node extends libp2p {
|
|||||||
> Handle new protocol
|
> Handle new protocol
|
||||||
|
|
||||||
- `protocol`: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')
|
- `protocol`: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')
|
||||||
- `handlerFunc`: Function with signature `function (protocol, conn) {}`
|
- `handlerFunc`: Function with signature `function (protocol, conn) {}` where `conn` is a [Connection](https://github.com/libp2p/interface-connection) object
|
||||||
- `matchFunc`: Function for matching on protocol (exact matching, semver, etc). Default to exact match.
|
- `matchFunc`: Function for matching on protocol (exact matching, semver, etc). Default to exact match.
|
||||||
|
|
||||||
#### `libp2p.unhandle(protocol)`
|
#### `libp2p.unhandle(protocol)`
|
||||||
|
@ -10,8 +10,8 @@ Let us know if you find any issue or if you want to contribute and add a new tut
|
|||||||
- [Protocol and Stream Muxing](./protocol-and-stream-muxing)
|
- [Protocol and Stream Muxing](./protocol-and-stream-muxing)
|
||||||
- [Encrypted Communications](./encrypted-communications)
|
- [Encrypted Communications](./encrypted-communications)
|
||||||
- [Discovery Mechanisms](./discovery-mechanisms)
|
- [Discovery Mechanisms](./discovery-mechanisms)
|
||||||
- [Peer Routing](./peer-routing)
|
- [Peer Routing](./peer-and-content-routing)
|
||||||
- [Content Routing](./content-routing)
|
- [Content Routing](./peer-and-content-routing)
|
||||||
- [PubSub](./pubsub)
|
- [PubSub](./pubsub)
|
||||||
- [NAT Traversal](./nat-traversal)
|
- [NAT Traversal](./nat-traversal)
|
||||||
- Circuit Relay (future)
|
- Circuit Relay (future)
|
||||||
|
@ -10,7 +10,7 @@ function createNode (callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const peerIdStr = peerInfo.id.toB58String()
|
const peerIdStr = peerInfo.id.toB58String()
|
||||||
const ma = `/dns4/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star/ipfs/${peerIdStr}`
|
const ma = `/dns4/star-signal.cloud.ipfs.team/tcp/443/wss/p2p-webrtc-star/ipfs/${peerIdStr}`
|
||||||
|
|
||||||
peerInfo.multiaddrs.add(ma)
|
peerInfo.multiaddrs.add(ma)
|
||||||
|
|
||||||
|
27
package.json
27
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libp2p",
|
"name": "libp2p",
|
||||||
"version": "0.14.3",
|
"version": "0.15.2",
|
||||||
"description": "JavaScript base class for libp2p bundles",
|
"description": "JavaScript base class for libp2p bundles",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -39,15 +39,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^2.6.0",
|
"async": "^2.6.0",
|
||||||
"libp2p-ping": "~0.6.0",
|
"libp2p-ping": "~0.6.0",
|
||||||
"libp2p-swarm": "~0.34.0",
|
"libp2p-swarm": "~0.35.1",
|
||||||
"mafmt": "^3.0.2",
|
"mafmt": "^3.0.2",
|
||||||
"multiaddr": "^3.0.1",
|
"multiaddr": "^3.0.2",
|
||||||
"peer-book": "~0.5.2",
|
"peer-book": "~0.5.4",
|
||||||
"peer-id": "~0.10.3",
|
"peer-id": "~0.10.5",
|
||||||
"peer-info": "~0.11.3"
|
"peer-info": "~0.11.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"aegir": "^12.2.0",
|
"aegir": "^12.4.0",
|
||||||
"chai": "^4.1.2",
|
"chai": "^4.1.2",
|
||||||
"cids": "~0.5.2",
|
"cids": "~0.5.2",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
@ -57,9 +57,9 @@
|
|||||||
"libp2p-mdns": "~0.9.1",
|
"libp2p-mdns": "~0.9.1",
|
||||||
"libp2p-multiplex": "~0.5.1",
|
"libp2p-multiplex": "~0.5.1",
|
||||||
"libp2p-railing": "~0.7.1",
|
"libp2p-railing": "~0.7.1",
|
||||||
"libp2p-secio": "~0.8.1",
|
"libp2p-secio": "~0.9.1",
|
||||||
"libp2p-spdy": "~0.11.0",
|
"libp2p-spdy": "~0.11.0",
|
||||||
"libp2p-tcp": "~0.11.1",
|
"libp2p-tcp": "~0.11.2",
|
||||||
"libp2p-webrtc-star": "~0.13.3",
|
"libp2p-webrtc-star": "~0.13.3",
|
||||||
"libp2p-websockets": "~0.10.4",
|
"libp2p-websockets": "~0.10.4",
|
||||||
"libp2p-websocket-star": "~0.7.2",
|
"libp2p-websocket-star": "~0.7.2",
|
||||||
@ -70,8 +70,8 @@
|
|||||||
"pull-serializer": "~0.3.2",
|
"pull-serializer": "~0.3.2",
|
||||||
"pull-stream": "^3.6.1",
|
"pull-stream": "^3.6.1",
|
||||||
"safe-buffer": "^5.1.1",
|
"safe-buffer": "^5.1.1",
|
||||||
"sinon": "^4.1.3",
|
"sinon": "^4.2.2",
|
||||||
"wrtc": "0.0.63"
|
"wrtc": "0.0.65"
|
||||||
},
|
},
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Chris Bratlien <chrisbratlien@gmail.com>",
|
"Chris Bratlien <chrisbratlien@gmail.com>",
|
||||||
@ -80,7 +80,11 @@
|
|||||||
"Dmitriy Ryajov <dryajov@gmail.com>",
|
"Dmitriy Ryajov <dryajov@gmail.com>",
|
||||||
"Elven <mon.samuel@qq.com>",
|
"Elven <mon.samuel@qq.com>",
|
||||||
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
||||||
|
"Giovanni T. Parra <fiatjaf@gmail.com>",
|
||||||
|
"Irakli Gozalishvili <rfobic@gmail.com>",
|
||||||
"Joel Gustafson <joelg@mit.edu>",
|
"Joel Gustafson <joelg@mit.edu>",
|
||||||
|
"John Rees <johnrees@users.noreply.github.com>",
|
||||||
|
"Kevin Kwok <antimatter15@gmail.com>",
|
||||||
"Lars Gierth <lgierth@users.noreply.github.com>",
|
"Lars Gierth <lgierth@users.noreply.github.com>",
|
||||||
"Maciej Krüger <mkg20001@gmail.com>",
|
"Maciej Krüger <mkg20001@gmail.com>",
|
||||||
"Nuno Nogueira <nunofmn@gmail.com>",
|
"Nuno Nogueira <nunofmn@gmail.com>",
|
||||||
@ -88,6 +92,7 @@
|
|||||||
"RasmusErik Voel Jensen <github@solsort.com>",
|
"RasmusErik Voel Jensen <github@solsort.com>",
|
||||||
"Richard Littauer <richard.littauer@gmail.com>",
|
"Richard Littauer <richard.littauer@gmail.com>",
|
||||||
"Ryan Bell <ryan@piing.net>",
|
"Ryan Bell <ryan@piing.net>",
|
||||||
|
"Tiago Alves <alvesjtiago@gmail.com>",
|
||||||
"greenkeeperio-bot <support@greenkeeper.io>",
|
"greenkeeperio-bot <support@greenkeeper.io>",
|
||||||
"mayerwin <mayerwin@users.noreply.github.com>",
|
"mayerwin <mayerwin@users.noreply.github.com>",
|
||||||
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>"
|
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>"
|
||||||
|
3
pdd/README.md
Normal file
3
pdd/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# PDD Test Stories Implementation
|
||||||
|
|
||||||
|
> Implementation of the Compliance tests from https://github.com/libp2p/interop
|
20
pdd/package.json
Normal file
20
pdd/package.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "pdd-impl",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "PDD Test Stories implementation",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": " "
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"PDD",
|
||||||
|
"libp2p"
|
||||||
|
],
|
||||||
|
"author": "David Dias <daviddias@ipfs.io>",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"libp2p": "file:./..",
|
||||||
|
"libp2p-interop": "github:libp2p/interop#master",
|
||||||
|
"tape": "^4.8.0"
|
||||||
|
}
|
||||||
|
}
|
104
pdd/pdd-the-ipfs-bundle--story-1--peer-a.js
Normal file
104
pdd/pdd-the-ipfs-bundle--story-1--peer-a.js
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const TCP = require('libp2p-tcp')
|
||||||
|
const WebSockets = require('libp2p-websockets')
|
||||||
|
const SECIO = require('libp2p-secio')
|
||||||
|
const Multiplex = require('libp2p-multiplex')
|
||||||
|
const Railing = require('libp2p-railing')
|
||||||
|
const MulticastDNS = require('libp2p-mdns')
|
||||||
|
const KadDHT = require('libp2p-kad-dht')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const series = require('async/series')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class IPFSBundle extends libp2p {
|
||||||
|
constructor (peerInfo, options) {
|
||||||
|
options = Object.assign({ bootstrap: [] }, options)
|
||||||
|
|
||||||
|
const modules = {
|
||||||
|
transport: [
|
||||||
|
new TCP(),
|
||||||
|
new WebSockets()
|
||||||
|
],
|
||||||
|
connection: {
|
||||||
|
muxer: [
|
||||||
|
Multiplex
|
||||||
|
],
|
||||||
|
crypto: [
|
||||||
|
SECIO
|
||||||
|
]
|
||||||
|
},
|
||||||
|
discovery: [
|
||||||
|
new MulticastDNS(peerInfo, 'ipfs.local'),
|
||||||
|
new Railing(options.bootstrap)
|
||||||
|
],
|
||||||
|
DHT: KadDHT
|
||||||
|
}
|
||||||
|
|
||||||
|
super(modules, peerInfo, undefined, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 1 - peerA', (t) => {
|
||||||
|
t.plan(10)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerA, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10000')
|
||||||
|
node = new IPFSBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node successfully')
|
||||||
|
t.ok(node.isStarted(), 'PeerA is Running')
|
||||||
|
|
||||||
|
const peerBAddr = `/ip4/127.0.0.1/tcp/10001/ipfs/${PeerB.id}`
|
||||||
|
|
||||||
|
node.handle('/time/1.0.0', (protocol, conn) => {
|
||||||
|
pull(
|
||||||
|
pull.values([Date.now().toString()]),
|
||||||
|
conn,
|
||||||
|
pull.onEnd((err) => {
|
||||||
|
t.ifErr(err)
|
||||||
|
t.pass('Sent time successfully')
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
series([
|
||||||
|
(cb) => setTimeout(cb, 5 * 1000), // time to run both scripts
|
||||||
|
(cb) => node.ping(peerBAddr, (err, p) => {
|
||||||
|
t.ifErr(err, 'initiated Ping to PeerB')
|
||||||
|
p.once('error', (err) => t.ifErr(err, 'Ping should not fail'))
|
||||||
|
p.once('ping', (time) => {
|
||||||
|
t.pass('ping PeerB successfully')
|
||||||
|
p.stop()
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
(cb) => node.dial(peerBAddr, '/echo/1.0.0', (err, conn) => {
|
||||||
|
t.ifErr(err, 'dial successful')
|
||||||
|
|
||||||
|
const data = Buffer.from('Hey')
|
||||||
|
|
||||||
|
pull(
|
||||||
|
pull.values([data]),
|
||||||
|
conn,
|
||||||
|
pull.collect((err, values) => {
|
||||||
|
t.ifErr(err, 'Received echo back')
|
||||||
|
t.deepEqual(values[0], data)
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
(cb) => setTimeout(cb, 2 * 1000) // time to both finish
|
||||||
|
], () => node.stop((err) => t.ifErr(err, 'PeerA has stopped')))
|
||||||
|
})
|
||||||
|
})
|
98
pdd/pdd-the-ipfs-bundle--story-1--peer-b.js
Normal file
98
pdd/pdd-the-ipfs-bundle--story-1--peer-b.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const TCP = require('libp2p-tcp')
|
||||||
|
const WebSockets = require('libp2p-websockets')
|
||||||
|
const SECIO = require('libp2p-secio')
|
||||||
|
const Multiplex = require('libp2p-multiplex')
|
||||||
|
const Railing = require('libp2p-railing')
|
||||||
|
const MulticastDNS = require('libp2p-mdns')
|
||||||
|
const KadDHT = require('libp2p-kad-dht')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const series = require('async/series')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class IPFSBundle extends libp2p {
|
||||||
|
constructor (peerInfo, options) {
|
||||||
|
options = Object.assign({ bootstrap: [] }, options)
|
||||||
|
|
||||||
|
const modules = {
|
||||||
|
transport: [
|
||||||
|
new TCP(),
|
||||||
|
new WebSockets()
|
||||||
|
],
|
||||||
|
connection: {
|
||||||
|
muxer: [
|
||||||
|
Multiplex
|
||||||
|
],
|
||||||
|
crypto: [
|
||||||
|
SECIO
|
||||||
|
]
|
||||||
|
},
|
||||||
|
discovery: [
|
||||||
|
new MulticastDNS(peerInfo, 'ipfs.local'),
|
||||||
|
new Railing(options.bootstrap)
|
||||||
|
],
|
||||||
|
DHT: KadDHT
|
||||||
|
}
|
||||||
|
|
||||||
|
super(modules, peerInfo, undefined, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 1 - peerA', (t) => {
|
||||||
|
t.plan(8)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerB, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10001')
|
||||||
|
node = new IPFSBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node successfully')
|
||||||
|
t.ok(node.isStarted(), 'PeerB is Running')
|
||||||
|
|
||||||
|
const peerAAddr = `/ip4/127.0.0.1/tcp/10000/ipfs/${PeerA.id}`
|
||||||
|
|
||||||
|
node.handle('/echo/1.0.0', (protocol, conn) => {
|
||||||
|
pull(
|
||||||
|
conn,
|
||||||
|
conn,
|
||||||
|
pull.onEnd((err) => t.ifErr(err, 'echo was successful'))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
series([
|
||||||
|
(cb) => setTimeout(cb, 5 * 1000), // time to run both scripts
|
||||||
|
(cb) => node.ping(peerAAddr, (err, p) => {
|
||||||
|
t.ifErr(err, 'initiated Ping to PeerA')
|
||||||
|
p.once('error', (err) => t.ifErr(err, 'Ping should not fail'))
|
||||||
|
p.once('ping', (time) => {
|
||||||
|
t.pass('ping PeerA successfully')
|
||||||
|
p.stop()
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
(cb) => node.dial(peerAAddr, '/time/1.0.0', (err, conn) => {
|
||||||
|
t.ifErr(err, 'dial successful')
|
||||||
|
|
||||||
|
pull(
|
||||||
|
pull.values([]),
|
||||||
|
conn,
|
||||||
|
pull.collect((err, values) => {
|
||||||
|
t.ifErr(err, 'Received time')
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
(cb) => setTimeout(cb, 2 * 1000) // time to both finish
|
||||||
|
], () => node.stop((err) => t.ifErr(err, 'PeerB has stopped')))
|
||||||
|
})
|
||||||
|
})
|
0
pdd/pdd-the-ipfs-bundle--story-2--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-2--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-2--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-2--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-3--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-d.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-d.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-e.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-4--peer-e.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-a.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-b.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-c.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-d.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-d.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-e.js
Normal file
0
pdd/pdd-the-ipfs-bundle--story-5--peer-e.js
Normal file
54
pdd/pdd-transport--story-1--peer-a.js
Normal file
54
pdd/pdd-transport--story-1--peer-a.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const TCP = require('libp2p-tcp')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new TCP()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 1 - peerA', (t) => {
|
||||||
|
t.plan(6)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerA, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10000')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node')
|
||||||
|
t.ok(node.isStarted(), 'PeerA is running')
|
||||||
|
|
||||||
|
const PeerBAddr = `/ip4/127.0.0.1/tcp/10001/ipfs/${PeerB.id}`
|
||||||
|
|
||||||
|
node.dial(PeerBAddr, '/echo/1.0.0', (err, conn) => {
|
||||||
|
t.ifErr(err, 'dial successful')
|
||||||
|
|
||||||
|
const data = Buffer.from('Heey')
|
||||||
|
|
||||||
|
pull(
|
||||||
|
pull.values([data]),
|
||||||
|
conn,
|
||||||
|
pull.collect((err, values) => {
|
||||||
|
t.ifErr(err, 'Received echo back')
|
||||||
|
t.deepEqual(values[0], data)
|
||||||
|
node.stop((err) => t.ifErr(err, 'PeerA has stopped'))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
49
pdd/pdd-transport--story-1--peer-b.js
Normal file
49
pdd/pdd-transport--story-1--peer-b.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const TCP = require('libp2p-tcp')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new TCP()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 1 - peerB', (t) => {
|
||||||
|
t.plan(5)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerB, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10001')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err)
|
||||||
|
t.ok(node.isStarted(), 'PeerB is running')
|
||||||
|
|
||||||
|
node.handle('/echo/1.0.0', (protocol, conn) => {
|
||||||
|
pull(
|
||||||
|
conn,
|
||||||
|
conn,
|
||||||
|
pull.onEnd((err) => {
|
||||||
|
t.ifErr(err)
|
||||||
|
t.pass('Received End of Connection')
|
||||||
|
node.stop((err) => {
|
||||||
|
t.ifErr(err, 'PeerB has stopped')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
54
pdd/pdd-transport--story-2--peer-a.js
Normal file
54
pdd/pdd-transport--story-2--peer-a.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const WebSockets = require('libp2p-websockets')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new WebSockets()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 2 - peerA', (t) => {
|
||||||
|
t.plan(6)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerA, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10000/ws')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node')
|
||||||
|
t.ok(node.isStarted(), 'PeerA is running')
|
||||||
|
|
||||||
|
const PeerBAddr = `/ip4/127.0.0.1/tcp/10001/ws/ipfs/${PeerB.id}`
|
||||||
|
|
||||||
|
node.dial(PeerBAddr, '/echo/1.0.0', (err, conn) => {
|
||||||
|
t.ifErr(err, 'dial successful')
|
||||||
|
|
||||||
|
const data = Buffer.from('Heey')
|
||||||
|
|
||||||
|
pull(
|
||||||
|
pull.values([data]),
|
||||||
|
conn,
|
||||||
|
pull.collect((err, values) => {
|
||||||
|
t.ifErr(err, 'Received echo back')
|
||||||
|
t.deepEqual(values[0], data)
|
||||||
|
node.stop((err) => t.ifErr(err, 'PeerA has stopped'))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
49
pdd/pdd-transport--story-2--peer-b.js
Normal file
49
pdd/pdd-transport--story-2--peer-b.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const WebSockets = require('libp2p-websockets')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const pull = require('pull-stream')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new WebSockets()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 2 - peerB', (t) => {
|
||||||
|
t.plan(5)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerB, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10001/ws')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err)
|
||||||
|
t.ok(node.isStarted(), 'PeerB is running')
|
||||||
|
|
||||||
|
node.handle('/echo/1.0.0', (protocol, conn) => {
|
||||||
|
pull(
|
||||||
|
conn,
|
||||||
|
pull.through(v => v, err => {
|
||||||
|
t.ifErr(err)
|
||||||
|
t.pass('Received End of Connection')
|
||||||
|
node.stop((err) => {
|
||||||
|
t.ifErr(err, 'PeerB has stopped')
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
conn
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
42
pdd/pdd-transport--story-3--peer-a.js
Normal file
42
pdd/pdd-transport--story-3--peer-a.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const TCP = require('libp2p-tcp')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new TCP()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 3 - peerA', (t) => {
|
||||||
|
t.plan(4)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerA, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10000')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node')
|
||||||
|
t.ok(node.isStarted(), 'PeerA is running')
|
||||||
|
|
||||||
|
const PeerBAddr = `/ip4/127.0.0.1/tcp/10001/ws/ipfs/${PeerB.id}`
|
||||||
|
|
||||||
|
setTimeout(() => node.dial(PeerBAddr, '/echo/1.0.0', (err, conn) => {
|
||||||
|
t.ok(err, 'dial failed')
|
||||||
|
node.stop((err) => t.ifErr(err, 'PeerA has stopped'))
|
||||||
|
}), 1000)
|
||||||
|
})
|
||||||
|
})
|
42
pdd/pdd-transport--story-3--peer-b.js
Normal file
42
pdd/pdd-transport--story-3--peer-b.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const test = require('tape')
|
||||||
|
const libp2p = require('libp2p')
|
||||||
|
const WebSockets = require('libp2p-websockets')
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const PeerA = require('libp2p-interop/peer-a.json')
|
||||||
|
const PeerB = require('libp2p-interop/peer-b.json')
|
||||||
|
|
||||||
|
class MyBundle extends libp2p {
|
||||||
|
constructor (peerInfo) {
|
||||||
|
const modules = {
|
||||||
|
transport: [new WebSockets()]
|
||||||
|
}
|
||||||
|
super(modules, peerInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('story 3 - peerB', (t) => {
|
||||||
|
t.plan(4)
|
||||||
|
let node
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerInfo.create(PeerB, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10000/ws')
|
||||||
|
node = new MyBundle(peerInfo)
|
||||||
|
node.start(cb)
|
||||||
|
}
|
||||||
|
], (err) => {
|
||||||
|
t.ifErr(err, 'created Node')
|
||||||
|
t.ok(node.isStarted(), 'PeerA is running')
|
||||||
|
|
||||||
|
const PeerAAddr = `/ip4/127.0.0.1/tcp/10000/ws/ipfs/${PeerA.id}`
|
||||||
|
|
||||||
|
setTimeout(() => node.dial(PeerAAddr, '/echo/1.0.0', (err, conn) => {
|
||||||
|
t.ok(err, 'dial failed')
|
||||||
|
node.stop((err) => t.ifErr(err, 'PeerA has stopped'))
|
||||||
|
}), 1000)
|
||||||
|
})
|
||||||
|
})
|
12
src/index.js
12
src/index.js
@ -83,7 +83,7 @@ class Node extends EventEmitter {
|
|||||||
if (_modules.DHT) {
|
if (_modules.DHT) {
|
||||||
this._dht = new this.modules.DHT(this.swarm, {
|
this._dht = new this.modules.DHT(this.swarm, {
|
||||||
kBucketSize: 20,
|
kBucketSize: 20,
|
||||||
datastoer: _options.DHT && _options.DHT.datastore
|
datastore: _options.DHT && _options.DHT.datastore
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,8 +314,11 @@ class Node extends EventEmitter {
|
|||||||
// PeerInfo
|
// PeerInfo
|
||||||
if (PeerInfo.isPeerInfo(peer)) {
|
if (PeerInfo.isPeerInfo(peer)) {
|
||||||
p = peer
|
p = peer
|
||||||
// Multiaddr instance (not string)
|
// Multiaddr instance or Multiaddr String
|
||||||
} else if (multiaddr.isMultiaddr(peer)) {
|
} else if (multiaddr.isMultiaddr(peer) || typeof peer === 'string') {
|
||||||
|
if (typeof peer === 'string') {
|
||||||
|
peer = multiaddr(peer)
|
||||||
|
}
|
||||||
const peerIdB58Str = peer.getPeerId()
|
const peerIdB58Str = peer.getPeerId()
|
||||||
try {
|
try {
|
||||||
p = this.peerBook.get(peerIdB58Str)
|
p = this.peerBook.get(peerIdB58Str)
|
||||||
@ -323,7 +326,8 @@ class Node extends EventEmitter {
|
|||||||
p = new PeerInfo(PeerId.createFromB58String(peerIdB58Str))
|
p = new PeerInfo(PeerId.createFromB58String(peerIdB58Str))
|
||||||
}
|
}
|
||||||
p.multiaddrs.add(peer)
|
p.multiaddrs.add(peer)
|
||||||
// PeerId
|
|
||||||
|
// PeerId
|
||||||
} else if (PeerId.isPeerId(peer)) {
|
} else if (PeerId.isPeerId(peer)) {
|
||||||
const peerIdB58Str = peer.toB58String()
|
const peerIdB58Str = peer.toB58String()
|
||||||
try {
|
try {
|
||||||
|
@ -465,7 +465,9 @@ describe('transports', () => {
|
|||||||
], done)
|
], done)
|
||||||
})
|
})
|
||||||
|
|
||||||
after((done) => {
|
after(function (done) {
|
||||||
|
this.timeout(10 * 1000)
|
||||||
|
|
||||||
parallel([
|
parallel([
|
||||||
(cb) => nodeAll.stop(cb),
|
(cb) => nodeAll.stop(cb),
|
||||||
(cb) => nodeTCP.stop(cb),
|
(cb) => nodeTCP.stop(cb),
|
||||||
|
Reference in New Issue
Block a user