Compare commits

...

13 Commits

Author SHA1 Message Date
79428f3e62 chore: release version v0.12.0 2018-04-05 17:00:33 +01:00
8a394b5286 chore: update contributors 2018-04-05 17:00:33 +01:00
b7f73bcda1 test: fix dial error test 2018-04-05 17:00:19 +01:00
8b44aa28ee chore: update deps 2018-04-05 16:56:23 +01:00
ded1f6831c feat: add class-is module 2018-04-05 16:55:54 +01:00
5ef24695fc docs: fixing the broken example in README (#91)
* Working example fix

* Char fix

* Corrected output, and add yarn to gitignore
2018-04-05 16:55:25 +01:00
df0aa059ca chore: release version v0.11.6 2018-02-20 10:27:27 +00:00
bf74e9acad chore: update contributors 2018-02-20 10:27:26 +00:00
83c4617e8d chore: update deps 2018-02-20 10:27:17 +00:00
3b7e68bc8a docs: update and polish 2018-02-20 10:25:18 +00:00
de1d7fe75c chore: tiny refactor 2018-02-07 06:40:00 +00:00
9c77a69ae3 chore: tiny refactor 2018-02-07 06:26:02 +00:00
50840a8067 test: refactor 2018-02-07 06:06:15 +00:00
10 changed files with 87 additions and 79 deletions

3
.gitignore vendored
View File

@ -4,6 +4,9 @@ docs
test/repo-tests*
**/bundle.js
# yarn
yarn.lock
# Logs
logs
*.log

View File

@ -1,3 +1,18 @@
<a name="0.12.0"></a>
# [0.12.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.6...v0.12.0) (2018-04-05)
### Features
* add class-is module ([ded1f68](https://github.com/libp2p/js-libp2p-tcp/commit/ded1f68))
<a name="0.11.6"></a>
## [0.11.6](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.5...v0.11.6) (2018-02-20)
<a name="0.11.5"></a>
## [0.11.5](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.4...v0.11.5) (2018-02-07)

View File

@ -9,23 +9,17 @@
![](https://img.shields.io/badge/npm-%3E%3D3.0.0-orange.svg?style=flat-square)
![](https://img.shields.io/badge/Node.js-%3E%3D6.0.0-orange.svg?style=flat-square)
![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)
![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)
[![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/interface-transport)
[![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/interface-connection)
> Node.js implementation of the TCP module that libp2p uses, which implements the [interface-connection](https://github.com/libp2p/interface-connection) interface for dial/listen.
`libp2p-tcp` in Node.js is a very thin shim that adds support for dialing to a `multiaddr`. This small shim will enable libp2p to use other different transports.
**Note:** This module uses [pull-streams](https://pull-stream.github.io) for all stream based interfaces.
> JavaScript implementation of the TCP module for libp2p. It exposes the [interface-transport](https://github.com/libp2p/interface-connection) for dial/listen. `libp2p-tcp` is a very thin shim that adds support for dialing to a `multiaddr`. This small shim will enable libp2p to use other different transports.
## Table of Contents
- [Install](#install)
- [npm](#npm)
- [Usage](#usage)
- [Example](#example)
- [This module uses `pull-streams`](#this-module-uses-pull-streams)
- [Converting `pull-streams` to Node.js Streams](#converting-pull-streams-to-nodejs-streams)
- [API](#api)
- [Contribute](#contribute)
- [License](#license)
@ -35,24 +29,21 @@
### npm
```sh
> npm i libp2p-tcp
> npm install libp2p-tcp
```
## Usage
### Example
```js
const TCP = require('libp2p-tcp')
const multiaddr = require('multiaddr')
const pull = require('pull-stream')
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const mh2 = multiaddr('/ip6/::/tcp/9092')
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
const tcp = new TCP()
const listener = tcp.createListener(mh1, (socket) => {
const listener = tcp.createListener((socket) => {
console.log('new connection opened')
pull(
pull.values(['hello']),
@ -60,15 +51,21 @@ const listener = tcp.createListener(mh1, (socket) => {
)
})
listener.listen(() => {
listener.listen(mh, () => {
console.log('listening')
pull(
tcp.dial(mh1),
pull.log,
pull.onEnd(() => {
tcp.close()
})
tcp.dial(mh),
pull.collect((err, values) => {
if (!err) {
console.log(`Value: ${values.toString()}`)
} else {
console.log(`Error: ${err}`)
}
// Close connection after reading
listener.close()
}),
)
})
```
@ -78,35 +75,13 @@ Outputs:
```sh
listening
new connection opened
hello
Value: hello
```
### This module uses `pull-streams`
We expose a streaming interface based on `pull-streams`, rather then on the Node.js core streams implementation (aka Node.js streams). `pull-streams` offers us a better mechanism for error handling and flow control guarantees. If you would like to know more about why we did this, see the discussion at this [issue](https://github.com/ipfs/js-ipfs/issues/362).
You can learn more about pull-streams at:
- [The history of Node.js streams, nodebp April 2014](https://www.youtube.com/watch?v=g5ewQEuXjsQ)
- [The history of streams, 2016](http://dominictarr.com/post/145135293917/history-of-streams)
- [pull-streams, the simple streaming primitive](http://dominictarr.com/post/149248845122/pull-streams-pull-streams-are-a-very-simple)
- [pull-streams documentation](https://pull-stream.github.io/)
#### Converting `pull-streams` to Node.js Streams
If you are a Node.js streams user, you can convert a pull-stream to a Node.js stream using the module [`pull-stream-to-stream`](https://github.com/dominictarr/pull-stream-to-stream), giving you an instance of a Node.js stream that is linked to the pull-stream. For example:
```js
const pullToStream = require('pull-stream-to-stream')
const nodeStreamInstance = pullToStream(pullStreamInstance)
// nodeStreamInstance is an instance of a Node.js Stream
```
To learn more about this utility, visit https://pull-stream.github.io/#pull-stream-to-stream.
## API
### Transport
[![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/interface-transport)
`libp2p-tcp` accepts TCP addresses both IPFS and non IPFS encapsulated addresses, i.e:
@ -116,6 +91,10 @@ To learn more about this utility, visit https://pull-stream.github.io/#pull-stre
Both for dialing and listening.
### Connection
[![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/interface-connection)
## Contribute
Contributions are welcome! The libp2p implementation in JavaScript is a work in progress. As such, there's a few things you can do right now to help out:

View File

@ -1,6 +1,6 @@
{
"name": "libp2p-tcp",
"version": "0.11.5",
"version": "0.12.0",
"description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces",
"main": "src/index.js",
"scripts": {
@ -34,29 +34,32 @@
"npm": ">=3.0.0"
},
"devDependencies": {
"aegir": "^12.4.0",
"aegir": "^13.0.6",
"chai": "^4.1.2",
"dirty-chai": "^2.0.1",
"interface-transport": "~0.3.5",
"interface-transport": "~0.3.6",
"lodash.isfunction": "^3.0.9",
"pre-commit": "^1.2.2",
"pull-stream": "^3.6.1"
"pull-stream": "^3.6.7"
},
"dependencies": {
"class-is": "^1.1.0",
"debug": "^3.1.0",
"interface-connection": "~0.3.2",
"ip-address": "^5.8.9",
"lodash.includes": "^4.3.0",
"lodash.isfunction": "^3.0.9",
"mafmt": "^3.0.2",
"multiaddr": "^3.0.2",
"mafmt": "^6.0.0",
"multiaddr": "^4.0.0",
"once": "^1.4.0",
"stream-to-pull-stream": "^1.7.2"
},
"contributors": [
"Alan Shaw <alan@tableflip.io>",
"David Dias <daviddias.p@gmail.com>",
"Diogo Silva <fsdiogo@gmail.com>",
"Dmitriy Ryajov <dryajov@gmail.com>",
"Drew Stone <drewstone329@gmail.com>",
"Evan Schwartz <evan.mark.schwartz@gmail.com>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
"Greenkeeper <support@greenkeeper.io>",

View File

@ -4,19 +4,25 @@ const multiaddr = require('multiaddr')
const Address6 = require('ip-address').Address6
module.exports = (socket) => {
let mh
let ma
if (socket.remoteFamily === 'IPv6') {
var addr = new Address6(socket.remoteAddress)
const addr = new Address6(socket.remoteAddress)
if (addr.v4) {
var ip4 = addr.to4().correctForm()
mh = multiaddr('/ip4/' + ip4 + '/tcp/' + socket.remotePort)
const ip4 = addr.to4().correctForm()
ma = multiaddr('/ip4/' + ip4 +
'/tcp/' + socket.remotePort
)
} else {
mh = multiaddr('/ip6/' + socket.remoteAddress + '/tcp/' + socket.remotePort)
ma = multiaddr('/ip6/' + socket.remoteAddress +
'/tcp/' + socket.remotePort
)
}
} else {
mh = multiaddr('/ip4/' + socket.remoteAddress + '/tcp/' + socket.remotePort)
ma = multiaddr('/ip4/' + socket.remoteAddress +
'/tcp/' + socket.remotePort)
}
return mh
return ma
}

View File

@ -3,6 +3,7 @@
const net = require('net')
const toPull = require('stream-to-pull-stream')
const mafmt = require('mafmt')
const withIs = require('class-is')
const includes = require('lodash.includes')
const isFunction = require('lodash.isfunction')
const Connection = require('interface-connection').Connection
@ -21,9 +22,8 @@ class TCP {
options = {}
}
callback = callback || noop
callback = once(callback || noop)
callback = once(callback)
const cOpts = ma.toOptions()
log('Connecting to %s %s', cOpts.port, cOpts.host)
@ -58,7 +58,7 @@ class TCP {
options = {}
}
handler = handler || (() => {})
handler = handler || noop
return createListener(handler)
}
@ -82,4 +82,4 @@ class TCP {
}
}
module.exports = TCP
module.exports = withIs(TCP, { className: 'TCP', symbolName: '@libp2p/js-libp2p-tcp/tcp' })

View File

@ -3,12 +3,12 @@
const tests = require('interface-transport')
const multiaddr = require('multiaddr')
const Tcp = require('../src')
const TCP = require('../src')
describe('interface-transport compliance', () => {
tests({
setup (cb) {
let tcp = new Tcp()
let tcp = new TCP()
const addrs = [
multiaddr('/ip4/127.0.0.1/tcp/9091'),
multiaddr('/ip4/127.0.0.1/tcp/9092'),

View File

@ -89,7 +89,7 @@ describe('Connection Wrap', () => {
})
it('dial error', (done) => {
tcp.dial(multiaddr('/ip4/999.0.0.1/tcp/1234'), (err) => {
tcp.dial(multiaddr('/ip4/127.0.0.1/tcp/22234'), (err) => {
expect(err).to.exist()
done()
})

View File

@ -9,6 +9,9 @@ const TCP = require('../src')
const multiaddr = require('multiaddr')
describe('filter addrs', () => {
const base = '/ip4/127.0.0.1'
const ipfs = '/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw'
let tcp
before(() => {
@ -16,25 +19,24 @@ describe('filter addrs', () => {
})
it('filter valid addrs for this transport', () => {
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const mh2 = multiaddr('/ip4/127.0.0.1/udp/9090')
const mh3 = multiaddr('/ip4/127.0.0.1/tcp/9090/http')
const mh4 = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const mh5 = multiaddr('/ip4/127.0.0.1/tcp/9090/http/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const mh6 = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw' +
'/p2p-circuit/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const ma1 = multiaddr(base + '/tcp/9090')
const ma2 = multiaddr(base + '/udp/9090')
const ma3 = multiaddr(base + '/tcp/9090/http')
const ma4 = multiaddr(base + '/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const ma5 = multiaddr(base + '/tcp/9090/http' + ipfs)
const ma6 = multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-circuit' + ipfs)
const valid = tcp.filter([mh1, mh2, mh3, mh4, mh5, mh6])
const valid = tcp.filter([ma1, ma2, ma3, ma4, ma5, ma6])
expect(valid.length).to.equal(2)
expect(valid[0]).to.deep.equal(mh1)
expect(valid[1]).to.deep.equal(mh4)
expect(valid[0]).to.deep.equal(ma1)
expect(valid[1]).to.deep.equal(ma4)
})
it('filter a single addr for this transport', () => {
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const ma1 = multiaddr(base + '/tcp/9090')
const valid = tcp.filter(mh1)
const valid = tcp.filter(ma1)
expect(valid.length).to.equal(1)
expect(valid[0]).to.deep.equal(mh1)
expect(valid[0]).to.eql(ma1)
})
})