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

WIP: Use the base class #126

Merged
merged 2 commits into from
Nov 28, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
224 changes: 27 additions & 197 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,206 +1,36 @@
'use strict'

const Swarm = require('libp2p-swarm')
const WS = require('libp2p-websockets')
const WebRTCStar = require('libp2p-webrtc-star')
const spdy = require('libp2p-spdy')
const secio = require('libp2p-secio')
const PeerInfo = require('peer-info')
const PeerId = require('peer-id')
const EE = require('events').EventEmitter
const multiaddr = require('multiaddr')
const PeerBook = require('peer-book')
const mafmt = require('mafmt')

exports = module.exports

const OFFLINE_ERROR_MESSAGE = 'The libp2p node is not started yet'
const IPFS_CODE = 421

exports.Node = function Node (pInfo, pBook) {
if (!(this instanceof Node)) {
return new Node(pInfo, pBook)
}

if (!pInfo) {
throw new Error('missing peer info')
}

if (!pBook) {
pBook = new PeerBook()
}

this.peerInfo = pInfo
this.peerBook = pBook

// Swarm
this.swarm = new Swarm(pInfo)
this.swarm.connection.addStreamMuxer(spdy)
this.swarm.connection.reuse()
this.swarm.connection.crypto(secio.tag, secio.encrypt)

this.swarm.on('peer-mux-established', (peerInfo) => {
this.peerBook.put(peerInfo)
})

this.swarm.on('peer-mux-closed', (peerInfo) => {
this.peerBook.removeByB58String(peerInfo.id.toB58String())
})

let isOnline = false

this.start = (callback) => {
// if we have `webrtc-star` addrs, then add
// the WebRTCStar transport
const wstar = new WebRTCStar()

if (wstar.filter(this.peerInfo.multiaddrs).length > 0) {
this.swarm.transport.add('wstar', wstar)
wstar.discovery.on('peer', (peerInfo) => {
this.discovery.emit('peer', peerInfo)
})
this.swarm.listen((err) => {
if (err) {
return callback(err)
}
// WebSockets needs to be added after because
// it can't have a listener on the browser
this.swarm.transport.add('ws', new WS())
isOnline = true
callback()
})
} else {
// if just WebSockets, no thing to listen
this.swarm.transport.add('ws', new WS())
isOnline = true
callback()
}
}

this.stop = (callback) => {
isOnline = false
this.swarm.close(callback)
}

this.dialById = (id, protocol, callback) => {
if (typeof protocol === 'function') {
callback = protocol
protocol = undefined
}

if (!isOnline) {
return callback(new Error(OFFLINE_ERROR_MESSAGE))
}
// NOTE, these dialById only works if a previous dial
// was made until we have PeerRouting
// TODO support PeerRouting when it is Ready
callback(new Error('not implemented yet'))
}

this.dialByMultiaddr = (maddr, protocol, callback) => {
if (typeof protocol === 'function') {
callback = protocol
protocol = undefined
}

if (!isOnline) {
return callback(new Error(OFFLINE_ERROR_MESSAGE))
}

if (typeof maddr === 'string') {
maddr = multiaddr(maddr)
}

if (!mafmt.IPFS.matches(maddr.toString())) {
return callback(new Error('multiaddr not valid'))
}

const ipfsIdB58String = maddr.stringTuples().filter((tuple) => {
if (tuple[0] === IPFS_CODE) {
return true
}
})[0][1]

let peer
try {
peer = this.peerBook.getByB58String(ipfsIdB58String)
} catch (err) {
peer = new PeerInfo(PeerId.createFromB58String(ipfsIdB58String))
}

peer.multiaddr.add(maddr)
this.dialByPeerInfo(peer, protocol, callback)
}

this.dialByPeerInfo = (peer, protocol, callback) => {
if (typeof protocol === 'function') {
callback = protocol
protocol = undefined
}
if (!isOnline) {
return callback(new Error(OFFLINE_ERROR_MESSAGE))
}

this.swarm.dial(peer, protocol, (err, conn) => {
if (err) {
return callback(err)
}
this.peerBook.put(peer)
callback(null, conn)
})
}

this.hangUpById = (id, callback) => {
callback(new Error('not implemented yet'))
// TODO
}

this.hangUpByMultiaddr = (maddr, callback) => {
if (!isOnline) {
return callback(new Error(OFFLINE_ERROR_MESSAGE))
}

if (typeof maddr === 'string') {
maddr = multiaddr(maddr)
}

if (!mafmt.IPFS.matches(maddr.toString())) {
return callback(new Error('multiaddr not valid'))
}

const ipfsIdB58String = maddr.stringTuples().filter((tuple) => {
if (tuple[0] === IPFS_CODE) {
return true
}
})[0][1]

try {
const pi = this.peerBook.getByB58String(ipfsIdB58String)
this.hangUpByPeerInfo(pi, callback)
} catch (err) {
// already disconnected
callback()
}
}

this.hangUpByPeerInfo = (peer, callback) => {
if (!isOnline) {
return callback(new Error(OFFLINE_ERROR_MESSAGE))
}

this.peerBook.removeByB58String(peer.id.toB58String())
this.swarm.hangUp(peer, callback)
}

this.handle = (protocol, handlerFunc, matchFunc) => {
return this.swarm.handle(protocol, handlerFunc, matchFunc)
}

this.unhandle = (protocol) => {
return this.swarm.unhandle(protocol)
const libp2p = require('libp2p')

class Node extends libp2p.Node {
constructor (peerInfo, peerBook) {
const webRTCStar = new WebRTCStar()

const modules = {
transport: [
new WS(),
webRTCStar
],
connection: {
muxer: [
spdy
],
crypto: [
secio
]
},
discovery: [
webRTCStar.discovery
]
}
super(modules, peerInfo, peerBook)
}
}

this.discovery = new EE()
this.routing = null
this.records = null
module.exports = {
Node: Node
Copy link
Contributor

Choose a reason for hiding this comment

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

just module.exports = Node

}
Loading