Skip to content
This repository was archived by the owner on Mar 11, 2020. It is now read-only.

update the dial interface to cope with new pull additions #8

Merged
merged 3 commits into from
Sep 5, 2016
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
12 changes: 10 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
**/node_modules/
**/*.log
test/repo-tests*

# Logs
logs
*.log

coverage

# Runtime data
pids
*.pid
Expand All @@ -19,9 +25,11 @@ coverage
# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
build

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

lib
dist
34 changes: 34 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
**/node_modules/
**/*.log
test/repo-tests*

# Logs
logs
*.log

coverage

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

build

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

test
10 changes: 10 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
sudo: false
language: node_js
node_js:
- "stable"

before_install:
- npm install -g npm

script:
- npm run lint
49 changes: 25 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,29 @@ Include this badge in your readme if you make a module that is compatible with t

## Node.js

```
var tape = require('tape')
var tests = require('interface-transport/tests')
var YourTransportHandler = require('../src')

var common = {
setup: function (t, cb) {
cb(null, YourTransportHandler)
},
teardown: function (t, cb) {
cb()
}
}

tests(tape, common)
```js
/* eslint-env mocha */
'use strict'

const tests = require('interface-transport')
const multiaddr = require('multiaddr')
const YourTransport = require('../src')

describe('compliance', () => {
tests({
setup (cb) {
let t = new YourTransport()
const addrs = [
multiaddr('valid-multiaddr-for-your-transport'),
multiaddr('valid-multiaddr2-for-your-transport')
]
cb(null, t, addrs)
},
teardown (cb) {
cb()
}
})
})
```

## Go
Expand All @@ -62,8 +70,6 @@ A valid (read: that follows the interface defined) transport, must implement the
- type: `Transport`
- `new Transport([options])`
- `transport.dial(multiaddr, [options, callback])`
- event: 'connect'
- event: 'error'
- `transport.createListener([options], handlerFunction)`
- type: `transport.Listener`
- event: 'listening'
Expand Down Expand Up @@ -94,14 +100,9 @@ This method dials a transport to the Peer listening on `multiaddr`.

`[options]` is an optional argument, which can be used by some implementations

`callback` should follow the `function (err, conn)` signature.

`conn` is the same `conn` that gets returned by call, which should follow [`interface-connection`](https://github.com/diasdavid/interface-connection). This `conn` object can emit 3 extra events:

- `connect` -
- `timeout` -
- `error` -
`callback` should follow the `function (err)` signature.

`err` is an `Error` instance to signal that the dial was unsuccessful, this error can be a 'timeout' or simply 'error'.

### Create a listener

Expand Down
23 changes: 21 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@
"type": "git",
"url": "https://github.com/diasdavid/interface-transport.git"
},
"main": "src/index.js",
"jsnext:main": "src/index.js",
"scripts": {
"lint": "aegir-lint",
"build": "aegir-build",
"release": "aegir-release",
"release-minor": "aegir-release --type minor",
"release-major": "aegir-release --type major",
"coverage": "exit(0)",
"coverage-publish": "exit(0)"
},
"pre-commit": [
"lint",
"test"
],
"keywords": [
"IPFS"
],
Expand All @@ -15,9 +30,13 @@
"url": "https://github.com/diasdavid/interface-transport/issues"
},
"homepage": "https://github.com/diasdavid/interface-transport",
"devDependencies": {},
"devDependencies": {
"aegir": "^6.0.1"
},
"dependencies": {
"chai": "^3.5.0",
"multiaddr": "^2.0.2",
"timed-tape": "^0.1.1"
"pull-goodbye": "0.0.1",
"pull-stream": "^3.4.4"
}
}
74 changes: 74 additions & 0 deletions src/dial-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/* eslint-env mocha */
'use strict'

const expect = require('chai').expect
const pull = require('pull-stream')
const goodbye = require('pull-goodbye')

module.exports = (common) => {
describe('dial', () => {
let addrs
let transport
let listener

before((done) => {
common.setup((err, _transport, _addrs) => {
if (err) return done(err)
transport = _transport
addrs = _addrs
done()
})
})

after((done) => {
common.teardown(done)
})

beforeEach((done) => {
listener = transport.createListener((conn) => {
pull(
conn,
pull.map((x) => {
if (x.toString() !== 'GOODBYE') {
return new Buffer(x.toString() + '!')
}
return x
}),
conn
)
})
listener.listen(addrs[0], done)
})

afterEach((done) => {
listener.close(done)
})

it('simple', (done) => {
const s = goodbye({
source: pull.values([new Buffer('hey')]),
sink: pull.collect((err, values) => {
expect(err).to.not.exist
expect(
values
).to.be.eql(
[new Buffer('hey!')]
)
done()
})
})

pull(s, transport.dial(addrs[0]), s)
})

it('to non existent listener', (done) => {
pull(
transport.dial(addrs[1]),
pull.onEnd((err) => {
expect(err).to.exist
done()
})
)
})
})
}
12 changes: 12 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-env mocha */
'use strict'

const dial = require('./dial-test')
const listen = require('./listen-test')

module.exports = (common) => {
describe('interface-transport', () => {
dial(common)
listen(common)
})
}
118 changes: 118 additions & 0 deletions src/listen-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/* eslint max-nested-callbacks: ["error", 8] */
/* eslint-env mocha */
'use strict'

const expect = require('chai').expect
const pull = require('pull-stream')

module.exports = (common) => {
describe('listen', () => {
let addrs
let transport

before((done) => {
common.setup((err, _transport, _addrs) => {
if (err) return done(err)
transport = _transport
addrs = _addrs
done()
})
})

after((done) => {
common.teardown(done)
})

it('simple', (done) => {
const listener = transport.createListener((conn) => {})
listener.listen(addrs[0], () => {
listener.close(done)
})
})

it('close listener with connections, through timeout', (done) => {
const finish = plan(3, done)
const listener = transport.createListener((conn) => {
pull(conn, conn)
})

listener.listen(addrs[0], () => {
const socket1 = transport.dial(addrs[0], () => {
listener.close(finish)
})

pull(
transport.dial(addrs[0]),
pull.onEnd(() => {
finish()
})
)

pull(
pull.values([Buffer('Some data that is never handled')]),
socket1,
pull.onEnd(() => {
finish()
})
)
})
})

describe('events', () => {
// TODO: figure out why it fails in the full test suite
it.skip('connection', (done) => {
const finish = plan(2, done)

const listener = transport.createListener()

listener.on('connection', (conn) => {
expect(conn).to.exist
finish()
})

listener.listen(addrs[0], () => {
transport.dial(addrs[0], () => {
listener.close(finish)
})
})
})

it('listening', (done) => {
const listener = transport.createListener()
listener.on('listening', () => {
listener.close(done)
})
listener.listen(addrs[0])
})

// TODO: how to get the listener to emit an error?
it.skip('error', (done) => {
const listener = transport.createListener()
listener.on('error', (err) => {
expect(err).to.exist
listener.close(done)
})
})

it('close', (done) => {
const finish = plan(2, done)
const listener = transport.createListener()
listener.on('close', finish)

listener.listen(addrs[0], () => {
listener.close(finish)
})
})
})
})
}

function plan (n, done) {
let i = 0
return (err) => {
if (err) return done(err)
i++

if (i === n) done()
}
}
Loading