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

refactor: async #10

Merged
merged 2 commits into from
Sep 27, 2019
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
40 changes: 5 additions & 35 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,38 +1,8 @@
dist
# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
**/node_modules/
**/*.log
package-lock.json

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

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

# node-waf configuration
.lock-wscript

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

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history
docs
dist
40 changes: 40 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
language: node_js
cache: npm
stages:
- check
- test
- cov

node_js:
- '10'
- '12'

os:
- linux
- osx
- windows

script: npx nyc -s npm run test:node -- --bail
after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov

jobs:
include:
- stage: check
script:
- npx aegir dep-check
- npm run lint

- stage: test
name: chrome
addons:
chrome: stable
script: npx aegir test -t browser -t webworker

- stage: test
name: firefox
addons:
firefox: latest
script: npx aegir test -t browser -t webworker -- --browsers FirefoxHeadless

notifications:
email: false
33 changes: 18 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The API is presented with both Node.js and Go primitives, however, there is not
## Modules that implement the interface

- [JavaScript libp2p-mdns](https://github.com/libp2p/js-libp2p-mdns)
- [JavaScript libp2p-railing](https://github.com/libp2p/js-libp2p-railing)
- [JavaScript libp2p-bootstrap](https://github.com/libp2p/js-libp2p-bootstrap)
- [JavaScript libp2p-kad-dht](https://github.com/libp2p/js-libp2p-kad-dht)
- [JavaScript libp2p-webrtc-star](https://github.com/libp2p/js-libp2p-webrtc-star)
- [JavaScript libp2p-websocket-star](https://github.com/libp2p/js-libp2p-websocket-star)
Expand All @@ -44,37 +44,40 @@ Install `interface-peer-discovery` as one of the dependencies of your project an
const test = require('interface-peer-discovery')

const common = {
setup (cb) {
cb(null, yourMuxer)
setup () {
return YourDiscovery
},
teardown (cb) {
cb()
teardown () {
// Clean up any resources created by setup()
}
}

// use all of the test suits
test(common)
```

### Go

> WIP - go-libp2p does not have a test suite available for Peer Discovery yet.

## API

A valid (read: that follows this abstraction) Peer Discovery module must implement the following API:

### `start` the service

- `JavaScript` discovery.start(callback)
- `Go` NA
- `await discovery.start()`

Start the discovery service.

It returns a `Promise`

### `stop` the service

- `JavaScript` discovery.stop(callback)
- `Go` NA
- `await discovery.stop()`

Stop the discovery service.

It returns a `Promise`

### discoverying peers

- `JavaScript` discovery.on('peer', function (peerInfo) {})
- `Go` NA
- `discovery.on('peer', (peerInfo) => {})`

Everytime a peer is discovered by a discovery service, it emmits a `peer` event with the discover peer's [PeerInfo](https://github.com/libp2p/js-peer-info).
37 changes: 24 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,29 @@
"leadMaintainer": "Vasco Santos <[email protected]>",
"main": "src/index.js",
"scripts": {
"lint": "aegir-lint",
"build": "aegir-build",
"test": "exit 0",
"release": "aegir-release",
"release-minor": "aegir-release --type minor",
"release-major": "aegir-release --type major"
"lint": "aegir lint",
"build": "aegir build",
"test": "aegir test",
"test:node": "aegir test -t node",
"test:browser": "aegir test -t browser -t webworker",
"release": "aegir release",
"release-minor": "aegir release --type minor",
"release-major": "aegir release --type major"
},
"pre-commit": [
"lint",
"test"
"pre-push": [
"lint"
],
"repository": {
"type": "git",
"url": "https://github.com/libp2p/interface-peer-discovery.git"
},
"keywords": [
"libp2p",
"network",
"p2p",
"peer",
"discovery",
"peer-to-peer",
"IPFS"
],
"author": "David Dias <[email protected]>",
Expand All @@ -31,13 +38,17 @@
"homepage": "https://github.com/libp2p/interface-peer-discovery",
"dependencies": {},
"devDependencies": {
"aegir": "^18.2.2"
"aegir": "^20.3.1",
"chai": "^4.2.0",
"dirty-chai": "^2.0.1",
"peer-id": "^0.13.3",
"peer-info": "^0.17.0"
},
"engines": {
"node": ">=4.0.0",
"npm": ">=3.0.0"
"node": ">=10.0.0",
"npm": ">=6.0.0"
},
"contributors": [
"David Dias <[email protected]>"
]
}
}
32 changes: 32 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* eslint-env mocha */
'use strict'

module.exports = (common) => {
describe('interface-peer-discovery', () => {
let discovery

before(() => {
discovery = common.setup()
})

after(() => common.teardown && common.teardown())

it('can start the service', async () => {
await discovery.start()
})

it('can start and stop the service', async () => {
await discovery.start()
await discovery.stop()
})

it('should not fail to stop the service if it was not started', async () => {
await discovery.stop()
})

it('should not fail to start the service if it is already started', async () => {
await discovery.start()
await discovery.start()
})
Copy link
Contributor

Choose a reason for hiding this comment

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

discovery.on and discovery.removeListener should get added as well, but those can wait until we add a proper test suite here, since they'll get tested as a part of that.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yap, I plan to add them in a next step, once we are working more closely with all the other peer discovery protocols.

Things are slightly different for each of them, and I need to have a better context on all of them to create a generic test setup for all. This way, I think we can start with this for the *-star, and then upgrade them once we get into dht and mdns ones

})
}
13 changes: 13 additions & 0 deletions test/compliance.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* eslint-env mocha */
'use strict'

const tests = require('../src')
const MockDiscovery = require('./mock-discovery')

describe('compliance tests', () => {
tests({
setup () {
return new MockDiscovery()
}
})
})
1 change: 0 additions & 1 deletion test/index.js

This file was deleted.

48 changes: 48 additions & 0 deletions test/mock-discovery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
'use strict'

const { EventEmitter } = require('events')

const PeerId = require('peer-id')
const PeerInfo = require('peer-info')

/**
* Emits 'peer' events on discovery.
*/
class MockDiscovery extends EventEmitter {
/**
* Constructs a new Bootstrap.
*
* @param {Object} options
* @param {number} options.discoveryDelay - the delay to find a peer (in milli-seconds)
*/
constructor (options = {}) {
super()

this.options = options
this._isRunning = false
this._timer = null
}

start () {
this._isRunning = true
this._discoverPeer()
}

stop () {
clearTimeout(this._timer)
this._isRunning = false
}

async _discoverPeer () {
if (!this._isRunning) return

const peerId = await PeerId.create({ bits: 512 })
const peerInfo = new PeerInfo(peerId)

this._timer = setTimeout(() => {
this.emit('peer', peerInfo)
}, this.options.discoveryDelay || 1000)
}
}

module.exports = MockDiscovery