From 85dab5115b28e14fcb7356b60d51ae83fd66361e Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 15:04:48 +0100 Subject: [PATCH 01/16] rm -rf src/* --- src/index.js | 134 --------------------- src/listener.js | 312 ------------------------------------------------ src/utils.js | 106 ---------------- 3 files changed, 552 deletions(-) delete mode 100644 src/index.js delete mode 100644 src/listener.js delete mode 100644 src/utils.js diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 879b310..0000000 --- a/src/index.js +++ /dev/null @@ -1,134 +0,0 @@ -'use strict' - -const debug = require('debug') -const log = debug('libp2p:websocket-star') -const multiaddr = require('multiaddr') -const EE = require('events').EventEmitter -const PeerId = require('peer-id') -const PeerInfo = require('peer-info') -const Connection = require('interface-connection').Connection -const setImmediate = require('async/setImmediate') -const utils = require('./utils') -const Listener = require('./listener') -const cleanUrlSIO = utils.cleanUrlSIO -const mafmt = require('mafmt') - -class WebsocketStar { - /** - * WebsocketStar Transport - * @class - * @param {Object} options - Options for the listener - * @param {PeerId} options.id - Id for the crypto challenge - */ - constructor (options) { - options = options || {} - - this.id = options.id - this.flag = options.allowJoinWithDisabledChallenge // let's just refer to it as "flag" - - this.discovery = new EE() - this.discovery.start = (callback) => { - setImmediate(callback) - } - this.discovery.stop = (callback) => { - setImmediate(callback) - } - - this.listeners_list = {} - this._peerDiscovered = this._peerDiscovered.bind(this) - } - - /** - * Sets the id after transport creation (aka the lazy way) - * @param {PeerId} id - * @returns {undefined} - */ - lazySetId (id) { - if (!id) return - this.id = id - this.canCrypto = true - } - - /** - * Dials a peer - * @param {Multiaddr} ma - Multiaddr to dial to - * @param {Object} options - * @param {function} callback - * @returns {Connection} - */ - dial (ma, options, callback) { - if (typeof options === 'function') { - callback = options - options = {} - } - - let url - try { - url = cleanUrlSIO(ma) - } catch (err) { - return callback(err) // early - } - const listener = this.listeners_list[url] - if (!listener) { - callback(new Error('No listener for this server')) - return new Connection() - } - return listener.dial(ma, options, callback) - } - - /** - * Creates a listener - * @param {Object} options - * @param {function} handler - * @returns {Listener} - */ - createListener (options, handler) { - if (typeof options === 'function') { - handler = options - options = {} - } - - const listener = new Listener({ - id: this.id, - handler, - listeners: this.listeners_list, - flag: this.flag - }) - - listener.on('peer', this._peerDiscovered) - - return listener - } - - /** - * Filters multiaddrs - * @param {Multiaddr[]} multiaddrs - * @returns {boolean} - */ - filter (multiaddrs) { - if (!Array.isArray(multiaddrs)) { - multiaddrs = [multiaddrs] - } - - return multiaddrs.filter((ma) => mafmt.WebSocketStar.matches(ma)) - } - - /** - * Used to fire peer events on the discovery part - * @param {Multiaddr} maStr - * @fires Discovery#peer - * @returns {undefined} - * @private - */ - _peerDiscovered (maStr) { - log('Peer Discovered:', maStr) - const peerIdStr = maStr.split('/ipfs/').pop() - const peerId = PeerId.createFromB58String(peerIdStr) - const peerInfo = new PeerInfo(peerId) - - peerInfo.multiaddrs.add(multiaddr(maStr)) - this.discovery.emit('peer', peerInfo) - } -} - -module.exports = WebsocketStar diff --git a/src/listener.js b/src/listener.js deleted file mode 100644 index d271be9..0000000 --- a/src/listener.js +++ /dev/null @@ -1,312 +0,0 @@ -'use strict' - -const debug = require('debug') -const log = debug('libp2p:websocket-star:listener') -const multiaddr = require('multiaddr') -const io = require('socket.io-client') -const sp = require('socket.io-pull-stream') -const uuid = require('uuid') -const series = require('async/series') -const EE = require('events').EventEmitter -const Connection = require('interface-connection').Connection -const once = require('once') -const setImmediate = require('async/setImmediate') -const utils = require('./utils') -const cleanUrlSIO = utils.cleanUrlSIO -const crypto = require('libp2p-crypto') - -const noop = once(() => {}) - -const sioOptions = { - transports: ['websocket'], - 'force new connection': true -} - -/** - * Listener for signalling server - * @class - * @param {Object} options - Options for the listener - * @param {PeerId} options.id - Id for the crypto challenge - * @param {function} options.handler - Incomming connection handler - */ -class Listener extends EE { - constructor (options) { - super() - this.id = options.id - this.log = log.bind(log, 'listener#offline') - this.canCrypto = Boolean(options.id) - this._handler = options.handler || noop - this.listeners_list = options.listeners || {} - this.flag = options.flag - } - - // "private" functions - /** - * Connects to the signalling server - * @param {function} cb - callback - * @returns {undefined} - * @private - */ - _up (cb) { - cb = cb ? once(cb) : noop - if (this.io) { - return cb() - } - - this.log = log.bind(log, 'listener#' + this.server) - this.log('dialing to signalling server') - const _io = this.io = io.connect(this.server, sioOptions) - - sp(_io, { codec: 'buffer' }) - _io.once('error', cb) - _io.once('connect_error', cb) - _io.once('connect', cb) - - const proto = new utils.Protocol(this.log) - - proto.addRequest('ws-peer', ['multiaddr'], (socket, peer) => this.emit('peer', peer)) - proto.addRequest('ss-incomming', ['string', 'multiaddr', 'function'], this._incommingDial.bind(this)) - proto.handleSocket(_io) - } - - /** - * Disconnects from signalling server - * @returns {undefined} - * @private - */ - _down () { - if (!this.io) { - return - } - - this.io.disconnect() - this.emit('close') - delete this.io - } - - /** - * Performs a cryptoChallenge - * @param {function} callback - callback - * @returns {undefined} - * @private - */ - _cryptoChallenge (callback) { - if (!this.io) { - return callback(new Error('Not connected')) - } - - const pubKeyStr = this.canCrypto ? crypto.keys.marshalPublicKey(this.id.pubKey).toString('hex') : '' - - const maStr = this.ma.toString() - - this.io.emit('ss-join', maStr, pubKeyStr, (err, sig) => { - if (err) { return callback(err) } - - if (sig) { - if (!this.canCrypto) { - this._down() - return callback(new Error("Can't sign cryptoChallenge: No id provided")) - } - - this.log('performing cryptoChallenge') - - this.id.privKey.sign(Buffer.from(sig), (err, signature) => { - if (err) { - return callback(err) - } - this.signature = signature.toString('hex') - this._join(callback) - }) - } else { - if (!this.flag) { - this._down() - return callback(new Error('Tried to listen on a server with crypto challenge disabled!\n This is prohibited by default and can lead to security issues!\n Please set "allowJoinWithDisabledChallenge" to true in the constructor options (but only if you know what you are doing)!')) - } - this.signature = '_' - callback() - } - }) - } - - /** - * Performs a cryptoChallenge when no signature is found - * @param {function} cb - callback - * @returns {undefined} - * @private - */ - _crypto (cb) { - cb = cb ? once(cb) : noop - - this.log('joining') - - if (!this.io) { - return cb(new Error('Not connected')) - } - - if (this.signature) { - this._join((err, needNewChallenge) => { - if (needNewChallenge) { - return this.cryptoChallenge(cb) - } - cb(err) - }) - } else { - this._cryptoChallenge(cb) - } - } - - /** - * Emits ss-join with the multiaddr and signature - * - * @param {function} cb - callback - * @returns {undefined} - * @private - */ - _join (cb) { - this.io.emit('ss-join', this.ma.toString(), this.signature, cb) - } - - /** - * Handles incomming dials - * @listens ss-incomming - * @param {socket.io_client} socket - * @param {string} dialId - Unique id for this dial - * @param {string} dialFrom - Multiaddr as string - * @param {function} cb - callback - * @returns {undefined} - * @private - */ - _incommingDial (socket, dialId, dialFrom, cb) { - this.log('dial#' + dialId + ' incomming from', dialFrom) - const ma = multiaddr(dialFrom) - const source = this.io.createSource(dialId + '.dialer') - const sink = this.io.createSink(dialId + '.listener') - - cb() - - const conn = new Connection( - { - sink: sink, - source: source - }, { - getObservedAddrs: (cb) => cb(null, [ma]) - } - ) - this.emit('connection', conn) - this._handler(conn) - } - - // public functions - /** - * Listens on a multiaddr - * @param {Multiaddr} ma - * @param {function} callback - * @returns {undefined} - */ - listen (ma, callback) { - this.ma = ma - this.server = cleanUrlSIO(ma) - this.listeners_list[this.server] = this - callback = callback ? once(callback) : noop - - series([ - (cb) => this._up(cb), - (cb) => this._crypto(cb) - ], (err) => { - if (err) { - this.log('success', err) - if (!(err instanceof Error)) err = new Error(err) - log(err) - this._down() - this.emit('error', err) - this.emit('close') - return callback(err) - } else this.log('success') - - this.io.on('reconnect', () => { - // force to get a new signature - this.signature = null - this._crypto((err) => { - if (err) { - this.log('reconnect error', err) - this.emit('error', err) - } else this.log('reconnected') - }) - }) - - this.emit('listening') - callback() - }) - } - - /** - * Gets the addresses the listener listens on - * @param {function} callback - * @returns {undefined} - */ - getAddrs (callback) { - setImmediate(() => callback(null, this.ma ? [this.ma] : [])) - } - - close (callback) { - callback = callback ? once(callback) : noop - - this._down() - - callback() - } - - // called from transport - /** - * Dials a peer - * @param {Multiaddr} ma - Multiaddr to dial to - * @param {Object} options - * @param {function} callback - * @returns {undefined} - */ - dial (ma, options, callback) { - if (typeof options === 'function') { - callback = options - options = {} - } - - const _ma = multiaddr(ma) - - const conn = new Connection(null) - - const dialId = uuid() - const dlog = this.log.bind(log, 'dial#' + dialId) - - callback = callback ? once(callback) : noop - - let io = this.io - - if (!io) { - return callback(new Error('Not listening')) - } - - const sink = io.createSink(dialId + '.dialer') - - dlog('dialing', ma.toString()) - - // "multiaddr", "multiaddr", "string", "function" - dialFrom, dialTo, dialId, cb - io.emit('ss-dial', this.ma.toString(), ma.toString(), dialId, err => { - if (err) return callback(err instanceof Error ? err : new Error(err)) - dlog(err ? 'error: ' + err.toString() : 'success') - const source = io.createSource(dialId + '.listener') - conn.setInnerConn( - { - sink: sink, - source: source - }, { - getObservedAddrs: (cb) => cb(null, [_ma]) - } - ) - callback(null, conn) - }) - - return conn - } -} - -module.exports = Listener diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index dff78c9..0000000 --- a/src/utils.js +++ /dev/null @@ -1,106 +0,0 @@ -'use strict' - -const multiaddr = require('multiaddr') -const Id = require('peer-id') -const crypto = require('libp2p-crypto') -const mafmt = require('mafmt') - -function cleanUrlSIO (ma) { - const protos = ma.protos() - const ipProto = protos[0].name - const tcpProto = protos[1].name - const wsProto = protos[2].name - const stringTuples = ma.stringTuples() - const tcpPort = stringTuples[1][1] - - if (tcpProto !== 'tcp' || (wsProto !== 'ws' && wsProto !== 'wss')) { - throw new Error('invalid multiaddr: ' + ma.toString()) - } - - let host = stringTuples[0][1] - if (ipProto === 'ip6') { - host = '[' + host + ']' - } - - let proto = wsProto === 'wss' ? 'https' : 'http' - let port = - (wsProto === 'ws' && tcpPort === 80) || (wsProto === 'wss' && tcpPort === 443) - ? '' : tcpPort - - return proto + '://' + host + (port ? ':' + port : '') -} - -const types = { - string: v => typeof v === 'string', - object: v => typeof v === 'object', - multiaddr: v => { - if (!types.string(v)) return - try { - multiaddr(v) - return true - } catch (e) { - return false - } - }, - function: v => typeof v === 'function' -} - -function validate (def, data) { - if (!Array.isArray(data)) throw new Error('Data is not an array') - def.forEach((type, index) => { - if (!types[type]) { - console.error('Type %s does not exist', type) // eslint-disable-line no-console - throw new Error('Type ' + type + ' does not exist') - } - if (!types[type](data[index])) throw new Error('Data at index ' + index + ' is invalid for type ' + type) - }) -} - -function Protocol (log) { - if (!log) log = () => {} - const self = this - self.requests = {} - self.addRequest = (name, def, handle) => { - self.requests[name] = { - def, - handle - } - } - self.handleSocket = (socket) => { - socket.r = {} - Object.keys(self.requests).forEach((request) => { - const r = self.requests[request] - socket.on(request, function () { - const data = [...arguments] - try { - validate(r.def, data) - data.unshift(socket) - r.handle.apply(null, data) - } catch (e) { - log(e) - log('peer %s has sent invalid data for request %s', socket.id || '', request, data) - } - }) - }) - } -} - -function getIdAndValidate (pub, id, cb) { - Id.createFromPubKey(Buffer.from(pub, 'hex'), (err, _id) => { - if (err) { - return cb(new Error('Crypto error')) - } - if (_id.toB58String() !== id) { - return cb(new Error('Id is not matching')) - } - - return cb(null, crypto.keys.unmarshalPublicKey(Buffer.from(pub, 'hex'))) - }) -} - -exports = module.exports -exports.cleanUrlSIO = cleanUrlSIO -exports.validate = validate -exports.Protocol = Protocol -exports.getIdAndValidate = getIdAndValidate -exports.validateMa = (ma) => mafmt.WebSocketStar.matches(multiaddr(ma)) From e5f92e487902d8408f0b9784fee44ce9c36a9f96 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 15:46:28 +0100 Subject: [PATCH 02/16] Add first draft (If the code does not work this might be because it says draft and thats because I didn't test) --- src/index.js | 112 +++++++++++++++++++++++++++++++++++++ src/listener.js | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ src/proto.js | 25 +++++++++ 3 files changed, 281 insertions(+) create mode 100644 src/index.js create mode 100644 src/listener.js create mode 100644 src/proto.js diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..0f1f09d --- /dev/null +++ b/src/index.js @@ -0,0 +1,112 @@ +'use strict' + +const debug = require('debug') +const log = debug('libp2p:websocket-star') +const EE = require('events').EventEmitter +const Id = require('peer-id') +const Peer = require('peer-info') +const Connection = require('interface-connection').Connection +const setImmediate = require('async/setImmediate') +const Listener = require('./listener') +const mafmt = require('mafmt') +const assert = require('assert') + +module.exports = class WebsocketStar { + /** + * WebsocketStar Transport + * @class + * @param {Object} options - Options for the listener + * @param {PeerId} options.id - Id for the crypto challenge + */ + constructor (options) { + options = options || {} + + log('creating new WebsocketStar transport') + + this.id = options.id + assert(this.id, 'Id MUST be set since v2') + this.b58 = this.id.toB58String() + this.flag = options.allowJoinWithDisabledChallenge // let's just refer to it as "flag" + + this.discovery = new EE() + this.discovery.start = (callback) => { + setImmediate(callback) + } + this.discovery.stop = (callback) => { + setImmediate(callback) + } + + this.listeners_list = {} + this._peerDiscovered = this._peerDiscovered.bind(this) + } + + /** + * Dials a peer + * @param {Multiaddr} ma - Multiaddr to dial to + * @param {Object} options + * @param {function} callback + * @returns {Connection} + */ + dial (ma, options, callback) { // TODO: fallback to /p2p-circuit/DST if no relay for addr? + if (typeof options === 'function') { + callback = options + options = {} + } + + const listener = this.listeners_list[someUniqueId] // TODO: what could be used as uniqueId ? + if (!listener) { + callback(new Error('No listener for this server')) + return new Connection() + } + + // TODO: use direct dialing (`this.swarm.dial(peer)`) + } + + /** + * Creates a listener + * @param {Object} options + * @param {function} handler + * @returns {Listener} + */ + createListener (options, handler) { + if (typeof options === 'function') { + handler = options + options = {} + } + + const listener = new Listener(this, handler) + + listener.on('peers', peers => peers.forEach(peer => this._peerDiscovered(peer, listener))) + + return listener + } + + /** + * Filters multiaddrs + * @param {Multiaddr[]} multiaddrs + * @returns {boolean} + */ + filter (multiaddrs) { + if (!Array.isArray(multiaddrs)) { + multiaddrs = [multiaddrs] + } + + return multiaddrs.filter((ma) => mafmt.WebSocketStar.matches(ma)) + } + + /** + * Used to fire peer events on the discovery part + * @param {Multiaddr} maStr + * @fires Discovery#peer + * @returns {undefined} + * @private + */ + _peerDiscovered (id, listener) { + // TODO: exclude self + log('Peer Discovered:', id) + const peer = new Peer(new Id(id)) + + peer.multiaddrs.add(listener.getFullAddr(peer.id.toB58String())) + this.discovery.emit('peer', peer) + } +} diff --git a/src/listener.js b/src/listener.js new file mode 100644 index 0000000..68180b0 --- /dev/null +++ b/src/listener.js @@ -0,0 +1,144 @@ +'use strict' + +const debug = require('debug') +const log = debug('libp2p:websocket-star:listener') +const multiaddr = require('multiaddr') +const EE = require('events').EventEmitter +const once = require('once') +const setImmediate = require('async/setImmediate') + +const pull = require('pull-stream') +const lp = require('pull-length-prefixed') +const Pushable = require('pull-pushable') + +const {IdentifyRequest, IdentifyResponse, DiscoveryEvent, DiscoveryACK} = require('./proto') // TODO: move to client + +const noop = once(() => {}) + +/** + * Listener for signalling server + * @class + * @param {WebsocketStar} main - Instance of main class + * @param {function} handler - Handler function + */ +module.exports = class Listener extends EE { + constructor (main, handler) { + this.handler = handler + this.id = main.id + this.listeners = main.listeners_list + this.swarm = main.swarm + this.source = Pushable() + this._push = this.source.push.bind(this.source) + } + + _disconnect (err) { + this.source.abort(err) + this.disconnected = err + this.emit('disconnect', err) + this.emit('close') + if (typeof err !== 'boolean') return this.emit('error', err) + } + + sink (read) { + let first = true + let second = false + const next = (err, data) => { + if (this.disconnected) return read(this.disconnected) + if (err) { + this._disconnect(err) + return read(err) + } + // data is binary protobuf. first packet is IdentifyRequest, after that DiscoveryEvent + try { + if (first) { + first = false + second = true + const request = this.identify = IdentifyRequest.decode(data) + this.emit('identify', request) + } else { + const event = DiscoveryEvent.decode(data) + if (second) { + second = false + this.emit('identifySuccess', event) + } + this.emit('peers', event.id) + } + } catch (e) { + this._disconnect(e) + return read(e) + } + + read(null, next) + } + } + + /** + * Listens on a multiaddr + * @param {Multiaddr} ma + * @param {function} callback + * @returns {undefined} + */ + listen (ma, callback) { + callback = callback ? once(callback) : noop + const {id} = this + this.swarm.dial(ma, '/ws-star/2.0.0', (err, conn) => { + if (err) return callback(err) + pull( + conn, + lp.decode(), + this, + lp.encode(), + conn + ) + + this.ma = ma + + this.once('identify', request => { + id.privKey.sign(request.nonce, (err, signature) => { + if (err) return callback(err) + const json = id.toJSON() + const response = { + id: json.id, + pubKey: json.pubKey, + signature + } + this.response = response + this._push(IdentifyResponse.encode(response)) + this.once('identifySuccess', callback) + this.once('disconnect', callback) + }) + }) + }) + } + + /** + * Gets the addresses the listener listens on + * @param {function} callback + * @returns {undefined} + */ + getAddrs (callback) { + setImmediate(() => callback(null, this.ma ? [this.ma] : [])) + } + + /** + * Closes the listener + * @param {function} callback + * @returns {undefined} + */ + close (callback) { + callback = callback ? once(callback) : noop + + this._down() + + callback() + } + + /** + * Get full address of peer + * @param {String} id - base58-encoded ipfs id + * @returns {multiaddr} full address + */ + getFullAddr (id) { + return this.relayAddr.encapsulate('ipfs', id) + } +} diff --git a/src/proto.js b/src/proto.js new file mode 100644 index 0000000..42d9589 --- /dev/null +++ b/src/proto.js @@ -0,0 +1,25 @@ +'use strict' + +const protons = require('protons') + +module.exports = protons(` + + message IdentifyRequest { + required string nonce = 1; + } + + message IdentifyResponse { + required string id = 1; + required string pubKey = 2; + required bytes signature = 3; + } + + message DiscoveryEvent { + repeated bytes id = 1; + } + + message DiscoveryACK { + required bool ok = 1; + } + +`) From 274a0a9babff04e0661e8133800f904fc0894fb3 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 15:47:15 +0100 Subject: [PATCH 03/16] Remove old tests --- test/dial.spec.js | 128 ---------------------------------- test/disconnect.spec.js | 60 ---------------- test/discovery.spec.js | 51 -------------- test/filter.spec.js | 43 ------------ test/ids.json | 9 --- test/instance.spec.js | 20 ------ test/listen.spec.js | 82 ---------------------- test/node.js | 3 - test/reconnect.node.js | 84 ---------------------- test/strict.spec.js | 73 ------------------- test/utils.spec.js | 49 ------------- test/valid-connection.spec.js | 70 ------------------- 12 files changed, 672 deletions(-) delete mode 100644 test/dial.spec.js delete mode 100644 test/disconnect.spec.js delete mode 100644 test/discovery.spec.js delete mode 100644 test/filter.spec.js delete mode 100644 test/ids.json delete mode 100644 test/instance.spec.js delete mode 100644 test/listen.spec.js delete mode 100644 test/node.js delete mode 100644 test/reconnect.node.js delete mode 100644 test/strict.spec.js delete mode 100644 test/utils.spec.js delete mode 100644 test/valid-connection.spec.js diff --git a/test/dial.spec.js b/test/dial.spec.js deleted file mode 100644 index 21933d7..0000000 --- a/test/dial.spec.js +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const multiaddr = require('multiaddr') -const each = require('async/each') -const map = require('async/map') -const pull = require('pull-stream') -const Buffer = require('safe-buffer').Buffer - -const WebSocketsStar = require('../src') -const PeerId = require('peer-id') - -describe('dial', () => { - let listeners = [] - let ws1 - let ma1 - // let ma1v6 - - let ws2 - let ma2 - let ma2v6 - - const peerId1 = 'QmS8BL7M8jrXYhHo2ofEVeiq5aDKTr29ksmpcqWxjZGvpX' - const peerId2 = 'QmeJGHUQ4hsMvPzAoXCdkT1Z9NBgjT7BenVPENUgpufENP' - - const maDNS = '/dns/ws-star-signal-3.servep2p.com' - const maDNS6 = '/dns6/ws-star-signal-2.servep2p.com' - const maRemoteIP4 = '/ip4/148.251.206.162/tcp/9090' - const maRemoteIP6 = '/ip6/2a01:4f8:212:e0::1/tcp/4287' - - const maLocalIP4 = '/ip4/127.0.0.1/tcp/15001' - // const maLocalIP6 = '/ip6/::1/tcp/15003' - const maGen = (base, id, sec) => multiaddr(`/${base}/${sec ? 'wss' : 'ws'}/p2p-websocket-star/ipfs/${id}`) - - if (process.env.REMOTE_DNS) { - // test with deployed signalling server using DNS - console.log('Using DNS:', maDNS, maDNS6) // eslint-disable-line no-console - ma1 = maGen(maDNS, peerId1, true) - // ma1v6 = maGen(maDNS6, peerId1) - - ma2 = maGen(maDNS, peerId2, true) - ma2v6 = maGen(maDNS6, peerId2, true) - } else if (process.env.REMOTE_IP) { - // test with deployed signalling server using IP - console.log('Using IP:', maRemoteIP4, maRemoteIP6) // eslint-disable-line no-console - ma1 = maGen(maRemoteIP4, peerId1) - // ma1v6 = maGen(maRemoteIP6, peerId1) - - ma2 = maGen(maRemoteIP4, peerId2) - ma2v6 = maGen(maRemoteIP6, peerId2) - } else { - ma1 = maGen(maLocalIP4, peerId1) - // ma1v6 = maGen(maLocalIP6, peerId1) - - ma2 = maGen(maLocalIP4, peerId2) - ma2v6 = maGen(maLocalIP4, peerId2) - } - - before((done) => { - map(require('./ids.json'), PeerId.createFromJSON, (err, ids) => { - if (err) return done(err) - ws1 = new WebSocketsStar({ id: ids[0], allowJoinWithDisabledChallenge: true }) - ws2 = new WebSocketsStar({ id: ids[1], allowJoinWithDisabledChallenge: true }) - - each([ - [ws1, ma1], - [ws2, ma2] - // [ws1, ma1v6], - // [ws2, ma2v6] - ], (i, n) => listeners[listeners.push(i[0].createListener((conn) => pull(conn, conn))) - 1].listen(i[1], n), done) - }) - }) - - it('dial on IPv4, check callback', (done) => { - ws1.dial(ma2, (err, conn) => { - expect(err).to.not.exist() - - const data = Buffer.from('some data') - - pull( - pull.values([data]), - conn, - pull.collect((err, values) => { - expect(err).to.not.exist() - values[0] = Buffer.from(values[0]) - expect(values).to.eql([data]) - done() - }) - ) - }) - }) - - it('dial offline / non-exist()ent node on IPv4, check callback', (done) => { - const maOffline = multiaddr('/ip4/127.0.0.1/tcp/40404/ws/p2p-websocket-star/ipfs/ABCD') - - ws1.dial(maOffline, (err) => { - expect(err).to.exist() - done() - }) - }) - - it.skip('dial on IPv6, check callback', (done) => { - ws1.dial(ma2v6, (err, conn) => { - expect(err).to.not.exist() - - const data = Buffer.from('some data') - - pull( - pull.values([data]), - conn, - pull.collect((err, values) => { - expect(err).to.not.exist() - values[0] = Buffer.from(values[0]) - expect(values).to.be.eql([data]) - done() - }) - ) - }) - }) - - after(done => each(listeners, (l, next) => l.close(next), done)) -}) diff --git a/test/disconnect.spec.js b/test/disconnect.spec.js deleted file mode 100644 index 411eb2f..0000000 --- a/test/disconnect.spec.js +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const multiaddr = require('multiaddr') -const series = require('async/series') -const pull = require('pull-stream') - -const WebSocketStar = require('../src') - -describe('disconnect', () => { - let ws1 - const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo5a') - - let ws2 - const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo5b') - - let conn - let otherConn - - before((done) => { - series([first, second], dial) - - function first (next) { - ws1 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws1.createListener((conn) => pull(conn, conn)) - listener.listen(ma1, next) - } - - function second (next) { - ws2 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws2.createListener((conn) => (otherConn = conn)) - listener.listen(ma2, next) - } - - function dial () { - conn = ws1.dial(ma2, done) - } - }) - - it('all conns die when one peer quits', (done) => { - pull( - conn, - pull.collect(err => { - if (err) return done(err) - pull( - otherConn, - pull.collect(err => { - if (err) return done(err) - done() - }) - ) - }) - ) - const url = Object.keys(ws2.listeners_list).shift() - ws2.listeners_list[url]._down() - }) -}) diff --git a/test/discovery.spec.js b/test/discovery.spec.js deleted file mode 100644 index 9b2f46c..0000000 --- a/test/discovery.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) -const multiaddr = require('multiaddr') -const each = require('async/each') - -const WebSocketStar = require('../src') - -describe('peer discovery', () => { - let listeners = [] - let ws1 - const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo3A') - - let ws2 - const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15003/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo3B') - - it('listen on the first', (done) => { - ws1 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws1.createListener((/* conn */) => {}) - - listeners.push(listener) - listener.listen(ma1, (err) => { - expect(err).to.not.exist() - done() - }) - }) - - it('listen on the second, discover the first', (done) => { - ws2 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - ws1.discovery.once('peer', (peerInfo) => { - expect(peerInfo.multiaddrs.has(ma2)).to.equal(true) - done() - }) - - const listener = ws2.createListener((/* conn */) => {}) - - listeners.push(listener) - listener.listen(ma2, (err) => { - expect(err).to.not.exist() - }) - }).timeout(5000) - - after(done => each(listeners, (l, next) => l.close(next), done)) -}) diff --git a/test/filter.spec.js b/test/filter.spec.js deleted file mode 100644 index dc45e94..0000000 --- a/test/filter.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) -const multiaddr = require('multiaddr') - -const WebSocketStar = require('../src') - -describe('filter', () => { - it('filters non valid websocket-star multiaddrs', () => { - const ws = new WebSocketStar() - - const maArr = [ - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star'), - multiaddr('/dns/libp2p.io/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), - multiaddr('/dns/signal.libp2p.io/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), - multiaddr('/dns/signal.libp2p.io/wss/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo2'), - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo3'), - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), - multiaddr('/ip4/127.0.0.1/tcp/9090/ws/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), - multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), - multiaddr('/p2p-websocket-star/ip4/127.0.0.1/tcp/9090/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4') - ] - - const filtered = ws.filter(maArr) - expect(filtered.length).to.not.equal(maArr.length) - expect(filtered.length).to.equal(8) - }) - - it('filter a single addr for this transport', () => { - const ws = new WebSocketStar() - const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1') - - const filtered = ws.filter(ma) - expect(filtered.length).to.equal(1) - }) -}) diff --git a/test/ids.json b/test/ids.json deleted file mode 100644 index ddada33..0000000 --- a/test/ids.json +++ /dev/null @@ -1,9 +0,0 @@ -[{ - "id": "QmS8BL7M8jrXYhHo2ofEVeiq5aDKTr29ksmpcqWxjZGvpX", - "privKey": "CAASqAkwggSkAgEAAoIBAQCvOmZWflGVczEuoCLPhMAfiGVNyEiE0QvzHAcKpAgNoZwu5MQ+t8RPKhgWAaWnxuWNEIK2E5doJxeQo2N2HuZpRLgJYQfBa9KZnW50nGXbPcUOomyStGjgc321uAKFsBcPdGwvvRO8up2qISFW6fqkI0hR6uC7kBmLXN0Trq/D2cLVXatupR9OLijwRK1iDlYBcCvJs/zk3sEVg11V5BO5BNLdnsEziU2cTu2jGta4KZPIDxow9z8hhjt0Oc2rP25Orqlz5Olhe7EeQRhtBoid3Xhz5zgTB63sc7jPGEhw/+nFksM70Xv0aplWZPalYA/0Lj+ZeqM5Br2zR56hALQDAgMBAAECggEABVIapWm0hHs49Rd7tx1q0ApOOSxpt065tCoXtKUCcZeErI/ZvaXK2jSHArQOGagadEwaC/lQUaNOPeAYNw/9IxkpFW/S0na5sFxtbDELjrqzbxxTe6jqvlYDbS8nNHQCXz/DwTdWkBaCjxXuczsrlyxTF9mv9UIM5IRvWhel0qaPNFcKILEH0hNcogInBNAty9tmJFQ3PS4zbDWXfuOn2g2lHF+QGkOsOAc66gLFlaDxAbdG5l9FYexgNWf5X1tedCWeY8SBaH3UXZW8bgB0FMWGMBgAo9y/9OG55H9GTSkHR8M+9JEYuhlvClckbCda7x7dervYqEiDUOLKFUWg4QKBgQDj4uQzuygYJJoGZ+/TO8DWWop61Yv2+z5uZ63lgLlLl3Vruklblx7tr0PdmhO/484nGJHuFzPIY5YVE0MdDFiQIvAd9VAXSc+UI97riy9nyi29ke+hmtSJ7P1ibTJnkYwOYZKElWw28BodVKjf9fliyuNyN0NHcbRplA5T0nSbyQKBgQDE2HUIloX3lTrD7qFkMC7NmuiFgeAJ2X1BIXt0rvDMBx/ZHRJw9C3ZqTDDNErOvOBcInWhucYReYfuk15GtGsjL5gj4xCudWwyJp+qNuN3odLa1dml7JJcIjybDJYEUou6Wy9+OUypNGgCFQH47jUjMc74Zu8jrGnLEM1dUtRfawKBgQC6esec4XE82G7GATWKWGJDxlF9lNP1JsF+3Q67OGvoxKcMoaM39OEVRQ+2/kddBlCDQ6Le/1ObjoqY8mtAEQND56MwELcaZ4caxYO8oegH+bUWZJ6AUs/LkggDDDJr9/lxJz0bi57DEhV8nPOYWZNa2YXnx/shMpWcs9BJnXVYqQKBgQCxxRIciWO/LkP+Apo6UtFR2Z44RAxCmOnnUgeeXwcUGzMF7p1i6QInWgaxo54TirvMOUqmnZFk4q6CJRC1JebDxg3OCxhblav6tqrnG97dgYVdIFgI4tdi4YB+PiWVDb8ms4b2pWS4Qp3Tk4lOeEIA4NCbwMojG2gHfcsZht5ItQKBgCTAamelN5EBxCHXCsXZ0Y2id5WBGmtG9TUyB/HdpTaVdgqBe+mSzYfotkXhotFTysdr17mrGo8IgDZx3w4EJBeiIpzQltCGcdiQQOw61NhMNEF8wDj9+icFpaNICar7syG1JJqfLpclldjltlAynfDNLTTYQdMHry0Ra86odruz", - "pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvOmZWflGVczEuoCLPhMAfiGVNyEiE0QvzHAcKpAgNoZwu5MQ+t8RPKhgWAaWnxuWNEIK2E5doJxeQo2N2HuZpRLgJYQfBa9KZnW50nGXbPcUOomyStGjgc321uAKFsBcPdGwvvRO8up2qISFW6fqkI0hR6uC7kBmLXN0Trq/D2cLVXatupR9OLijwRK1iDlYBcCvJs/zk3sEVg11V5BO5BNLdnsEziU2cTu2jGta4KZPIDxow9z8hhjt0Oc2rP25Orqlz5Olhe7EeQRhtBoid3Xhz5zgTB63sc7jPGEhw/+nFksM70Xv0aplWZPalYA/0Lj+ZeqM5Br2zR56hALQDAgMBAAE=" -}, { - "id": "QmeJGHUQ4hsMvPzAoXCdkT1Z9NBgjT7BenVPENUgpufENP", - "privKey": "CAASqAkwggSkAgEAAoIBAQCpTpSE6G13invylM9p+weRFxvi3CsQHNi1uvrUxgfsjpZX4mtS23GOmH5iSyA3wwXwICHu2erwp3KMsPRT7z8nzdBJO7clAZZEZGlfhQe1qXXFST5RNCVwVCUAaxYvlJzWaxUGv0i7qc95SwhJiNWfYf9qX4+oIgQrYcVbEydT43kABdIxO/lY9iMSmN0fSV02zQ/7DgJd8Ni/2wA6mc9YLw1UffLzHYzvGqHp1la1KrrB4K57Pn8dvDWD4qa7wg/LxYY/SX8RudBlRh3uvJfsMcX5t4dLI5w7shSrXDYbhzsHaPWCjY0MMley4TJrlzRZv/4lr+GhZIp3HmxDYtGdAgMBAAECggEBAKDCMFuSpn5fTBmmGtuytBicLKpYC7uc6FiGVi06a8O+EBsarnVaUJTpTvfeBZVs5HKA0DePS3l+RVI5o4UfIoSU9DTVMq08uIXwIe3EzvE7GsxdI4LPVM032HpxM/uxzMn7m1dwwYsPTiUJjbDk8JIJ5xAF9M3cnsDicRZtNWZ8hlp7TuBb3nEX8r28mVLmkIVYJq6KZLOO3u+07OKIvKwdNr3YA4UkzpRG0LOQLdE8/mtbPC+NhiorEntW5iyNiF0yL0UgSN/p7GtaoOLr/9sDU1C5cb5g9MwbXs6ljQjO6/ZfUdZ+AZQrXsd8OG+9UvcIYsgfFhzhz3nVSqOj0wECgYEA4qQZywKtqZ3IcWLrE3jSFl2GUtk4jRpfLLdrTBGkobtYc1zqTdfbNoBAbCorJcone6iwc4Cp3S4qUEmnckJpVahKR3vTpD6tRixix71VzljWmhH57gsF6Tc9B/ztgxMTFzfzR0M1QHuBeAXHiOCUcIjj5pDYMcRCrLkuqkl2Q9ECgYEAvz0o298+uHeaFoC71AT0W7b/G355eWtPpE3+qu48x6I6XC4dotjoo6Nn571DOAVhJMSZiCCzgz9TPwhELvrnIVZE+P6aiuYPZt7MJlVrUVannV3Sr0CZPCd1JxnNx/zefUY01AWm9OWuJXxQPvGWfgawUA4UbpFrmjFvc4uDYA0CgYAv2Cqlw6P7mZZ18Ubk7m2TUR0JIlgg2X9cBkB9Z4AUsGMEv4mq8zWQtNRkwSYorRtWrI7LY074pUVDe7kAkup/ra44lvhfxOd5V+dmeR7DF9f94Gudh/Awgnu80vUk5YLzNNmDorl8KlZziuzLhXVwqEVMKCmrn93fbpxeUHHJ8QKBgGatPKnIlBFQzd91IOO2AUjY2OF3J1tknW8XHTvDC8kXtgPWEr1jfoyVaG1I9bU3Vi/6ioBHJnq6XkTCeHFM7xm8Cu4xLOKUoQJXbv7J8APM5dOdE0hbA6sDeGgU96J/hyl1r1mC62AjjTu9IgyZg3aIutNQq/GtjDtOfYtpBZFlAoGBALFW1cEOY5myLtuiclt+GzEIyqBznf9o1Y1LGVTXCYtyZ9Zb5XW0hasJ77qV6kjkZwoDaBVrFm8pulWVYbrIkSkPHc1I5xfinq36Z2OHIlEGJijk/sqBwkCvUEffpAjpi31qlTVsesPNt7sS6FUpbSHYVmzHsg+RD7kvPIDaFPEo", - "pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpTpSE6G13invylM9p+weRFxvi3CsQHNi1uvrUxgfsjpZX4mtS23GOmH5iSyA3wwXwICHu2erwp3KMsPRT7z8nzdBJO7clAZZEZGlfhQe1qXXFST5RNCVwVCUAaxYvlJzWaxUGv0i7qc95SwhJiNWfYf9qX4+oIgQrYcVbEydT43kABdIxO/lY9iMSmN0fSV02zQ/7DgJd8Ni/2wA6mc9YLw1UffLzHYzvGqHp1la1KrrB4K57Pn8dvDWD4qa7wg/LxYY/SX8RudBlRh3uvJfsMcX5t4dLI5w7shSrXDYbhzsHaPWCjY0MMley4TJrlzRZv/4lr+GhZIp3HmxDYtGdAgMBAAE=" -}] diff --git a/test/instance.spec.js b/test/instance.spec.js deleted file mode 100644 index 1945aa8..0000000 --- a/test/instance.spec.js +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const WebSocketStar = require('../src') - -describe('instantiate the transport', () => { - it('create', () => { - const wstar = new WebSocketStar() - expect(wstar).to.exist() - }) - - it('create without new', () => { - expect(() => WebSocketStar()).to.throw() - }) -}) diff --git a/test/listen.spec.js b/test/listen.spec.js deleted file mode 100644 index 2f4e9b1..0000000 --- a/test/listen.spec.js +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const multiaddr = require('multiaddr') - -const WebSocketStar = require('../src') - -// const skiptravis = process.env.TRAVIS ? it.skip : it - -describe('listen', () => { - let ws - - const ma = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooooA') - const mav6 = multiaddr('/ip6/::1/tcp/15003/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooooB') - - before(() => { - ws = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - }) - - it('listen, check for callback', (done) => { - const listener = ws.createListener((conn) => {}) - - listener.listen(ma, (err) => { - expect(err).to.not.exist() - listener.close(done) - }) - }) - - it('listen, check for listening event', (done) => { - const listener = ws.createListener((conn) => {}) - - listener.once('listening', () => listener.close(done)) - listener.listen(ma) - }) - - it('listen, check for the close event', (done) => { - const listener = ws.createListener((conn) => {}) - - listener.listen(ma, (err) => { - expect(err).to.not.exist() - listener.once('close', done) - listener.close() - }) - }) - - it.skip('close listener with connections, through timeout', (done) => { - // TODO ? Should this apply ? - }) - - // travis ci has some ipv6 issues. circle ci is fine. - // Also, aegir is failing to propagate the environment variables - // into the browser: https://github.com/ipfs/aegir/issues/177 - // ..., which was causing this test to fail. - // Activate this test after the issue is solved. - // skiptravis('listen on IPv6 addr', (done) => { - it.skip('listen on IPv6 addr', (done) => { - const listener = ws.createListener((conn) => {}) - - listener.listen(mav6, (err) => { - expect(err).to.not.exist() - listener.close(done) - }) - }) - - it('getAddrs', (done) => { - const listener = ws.createListener((conn) => {}) - listener.listen(ma, (err) => { - expect(err).to.not.exist() - listener.getAddrs((err, addrs) => { - expect(err).to.not.exist() - expect(addrs[0]).to.deep.equal(ma) - listener.close(done) - }) - }) - }) -}) diff --git a/test/node.js b/test/node.js deleted file mode 100644 index 7eb34a1..0000000 --- a/test/node.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -require('./reconnect.node.js') diff --git a/test/reconnect.node.js b/test/reconnect.node.js deleted file mode 100644 index 5d15552..0000000 --- a/test/reconnect.node.js +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const multiaddr = require('multiaddr') -const rendezvous = require('libp2p-websocket-star-rendezvous') - -const WebSocketStar = require('../src') - -const SERVER_PORT = 13580 - -describe('reconnect to signaling server', () => { - let r - let ws1 - const ma1 = multiaddr('/ip4/127.0.0.1/tcp/13580/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo6A') - - let ws2 - const ma2 = multiaddr('/ip4/127.0.0.1/tcp/13580/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo6B') - - let ws3 - const ma3 = multiaddr('/ip4/127.0.0.1/tcp/13580/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo6C') - - before((done) => { - r = rendezvous.start({ - port: SERVER_PORT, - cryptoChallenge: false - }, done) - }) - - after((done) => r.stop(done)) - - it('listen on the first', (done) => { - ws1 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws1.createListener((conn) => {}) - listener.listen(ma1, (err) => { - expect(err).to.not.exist() - done() - }) - }) - - it('listen on the second, discover the first', (done) => { - ws2 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - ws1.discovery.once('peer', (peerInfo) => { - expect(peerInfo.multiaddrs.has(ma2)).to.equal(true) - done() - }) - - const listener = ws2.createListener((conn) => {}) - listener.listen(ma2, (err) => { - expect(err).to.not.exist() - }) - }) - - it('stops the server', (done) => { - r.stop(done) - }) - - it('starts the server again', (done) => { - r = rendezvous.start({ port: SERVER_PORT, cryptoChallenge: false }, done) - }) - - it('wait a bit for clients to reconnect', (done) => { - setTimeout(done, 1990) - }) - - it('listen on the third, first discovers it', (done) => { - ws3 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws3.createListener((conn) => {}) - listener.listen(ma3, (err) => expect(err).to.not.exist()) - - ws1.discovery.once('peer', (peerInfo) => { - expect(peerInfo.multiaddrs.has(ma3)).to.equal(true) - done() - }) - }) -}) diff --git a/test/strict.spec.js b/test/strict.spec.js deleted file mode 100644 index 86305af..0000000 --- a/test/strict.spec.js +++ /dev/null @@ -1,73 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const PeerId = require('peer-id') -const multiaddr = require('multiaddr') -const each = require('async/each') -const map = require('async/map') -const pull = require('pull-stream') - -const WebSocketStar = require('../src') - -const SERVER_PORT = 15004 - -describe('strict', () => { - let id1 - let ma1 - let l1 - let w1 - - let id2 - let ma2 - let l2 - let w2 - - before((done) => { - map(require('./ids.json'), PeerId.createFromJSON, (err, keys) => { - expect(err).to.not.exist() - - id1 = keys.shift() - id2 = keys.shift() - ma1 = multiaddr('/ip4/127.0.0.1/tcp/' + SERVER_PORT + '/ws/p2p-websocket-star/ipfs/' + id1.toB58String()) - ma2 = multiaddr('/ip4/127.0.0.1/tcp/' + SERVER_PORT + '/ws/p2p-websocket-star/ipfs/' + id2.toB58String()) - - done() - }) - }) - - it('listen on the server', (done) => { - w1 = new WebSocketStar({ id: id1 }) - w2 = new WebSocketStar({ id: id2 }) - - l1 = w1.createListener(conn => pull(conn, conn)) - l2 = w2.createListener(conn => pull(conn, conn)) - - each([ - [l1, ma1], - [l2, ma2] - ], (i, n) => i[0].listen(i[1], n), done) - }) - - it('dial peer 1 to peer 2', (done) => { - w1.dial(ma2, (err, conn) => { - expect(err).to.not.exist() - const buf = Buffer.from('hello') - - pull( - pull.values([buf]), - conn, - pull.collect((err, res) => { - expect(err).to.not.exist() - expect(res).to.eql([buf]) - done() - }) - ) - }) - }) -}) diff --git a/test/utils.spec.js b/test/utils.spec.js deleted file mode 100644 index 553d26c..0000000 --- a/test/utils.spec.js +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) -const multiaddr = require('multiaddr') -const cleanUrlSIO = require('../src/utils').cleanUrlSIO - -describe('utils', () => { - const modernMultiaddrStringDNS = '/dns4/star-signal.cloud.ipfs.team/tcp/443/wss/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - - const modernMultiaddrStringDNS2 = '/dns4/star-signal.cloud.ipfs.team/tcp/9999/wss/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - const modernMultiaddrStringDNS3 = '/dns4/star-signal.cloud.ipfs.team/tcp/80/ws/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - const modernMultiaddrStringDNS4 = '/dns4/star-signal.cloud.ipfs.team/tcp/8080/ws/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - - const invalidMultiaddrStringDNS = '/dns4/star-signal.cloud.ipfs.team/udp/8080/wss/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - const invalidMultiaddrStringDNS2 = '/dns4/star-signal.cloud.ipfs.team/tcp/8080/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - const invalidMultiaddrStringDNS3 = '/dns4/star-signal.cloud.ipfs.team/ws/p2p-websocket-star/ipfs/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' - - // Create actual multiaddrs - const modernMultiaddrDNS = multiaddr(modernMultiaddrStringDNS) - const modernMultiaddrDNS2 = multiaddr(modernMultiaddrStringDNS2) - const modernMultiaddrDNS3 = multiaddr(modernMultiaddrStringDNS3) - const modernMultiaddrDNS4 = multiaddr(modernMultiaddrStringDNS4) - - const invalidMultiaddrDNS = multiaddr(invalidMultiaddrStringDNS) - const invalidMultiaddrDNS2 = multiaddr(invalidMultiaddrStringDNS2) - const invalidMultiaddrDNS3 = multiaddr(invalidMultiaddrStringDNS3) - - it('cleanUrlSIO websocket-star modern', () => { - const newUrlSIOStringDNS = cleanUrlSIO(modernMultiaddrDNS) - const newUrlSIOStringDNS2 = cleanUrlSIO(modernMultiaddrDNS2) - const newUrlSIOStringDNS3 = cleanUrlSIO(modernMultiaddrDNS3) - const newUrlSIOStringDNS4 = cleanUrlSIO(modernMultiaddrDNS4) - - expect(() => cleanUrlSIO(modernMultiaddrDNS)).to.not.throw() - expect(() => cleanUrlSIO(invalidMultiaddrDNS)).to.throw(Error, 'invalid multiaddr') - expect(() => cleanUrlSIO(invalidMultiaddrDNS2)).to.throw(Error, 'invalid multiaddr') - expect(() => cleanUrlSIO(invalidMultiaddrDNS3)).to.throw(Error, 'invalid multiaddr') - - expect(newUrlSIOStringDNS).to.equal('https://star-signal.cloud.ipfs.team') - expect(newUrlSIOStringDNS2).to.equal('https://star-signal.cloud.ipfs.team:9999') - expect(newUrlSIOStringDNS3).to.equal('http://star-signal.cloud.ipfs.team') - expect(newUrlSIOStringDNS4).to.equal('http://star-signal.cloud.ipfs.team:8080') - }) -}) diff --git a/test/valid-connection.spec.js b/test/valid-connection.spec.js deleted file mode 100644 index cd803e1..0000000 --- a/test/valid-connection.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -/* eslint-env mocha */ - -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - -const multiaddr = require('multiaddr') -const series = require('async/series') -const pull = require('pull-stream') - -const WebSocketStar = require('../src') - -describe('valid Connection', () => { - let ws1 - const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo5a') - - let ws2 - const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo5b') - - let conn - - before((done) => { - series([first, second], dial) - - function first (next) { - ws1 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws1.createListener((conn) => pull(conn, conn)) - listener.listen(ma1, next) - } - - function second (next) { - ws2 = new WebSocketStar({ allowJoinWithDisabledChallenge: true }) - - const listener = ws2.createListener((conn) => pull(conn, conn)) - listener.listen(ma2, next) - } - - function dial () { - conn = ws1.dial(ma2, done) - } - }) - - it('get observed addrs', (done) => { - conn.getObservedAddrs((err, addrs) => { - expect(err).to.not.exist() - expect(addrs[0].toString()).to.equal(ma2.toString()) - done() - }) - }) - - it('get Peer Info', (done) => { - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.exist() - done() - }) - }) - - it('set Peer Info', (done) => { - conn.setPeerInfo('info') - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.not.exist() - expect(peerInfo).to.equal('info') - done() - }) - }) -}) From 502f0339def6dc58e3db2e441a3ff38b6f68ef5c Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 15:58:33 +0100 Subject: [PATCH 04/16] A few logic updates - Pkg fix --- package.json | 2 ++ src/index.js | 19 +++++-------------- src/listener.js | 2 ++ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 0a2ae9e..c6dc01d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,8 @@ "once": "^1.4.0", "peer-id": "^0.10.4", "peer-info": "^0.11.4", + "protons": "^1.0.1", + "pull-length-prefixed": "^1.3.0", "pull-stream": "^3.6.1", "socket.io-client": "^2.0.4", "socket.io-pull-stream": "^0.1.3", diff --git a/src/index.js b/src/index.js index 0f1f09d..be68e18 100644 --- a/src/index.js +++ b/src/index.js @@ -41,25 +41,16 @@ module.exports = class WebsocketStar { } /** - * Dials a peer + * Dials a peer - should actually never get called because p2p-circuit handles dials * @param {Multiaddr} ma - Multiaddr to dial to * @param {Object} options * @param {function} callback + * @private * @returns {Connection} */ - dial (ma, options, callback) { // TODO: fallback to /p2p-circuit/DST if no relay for addr? - if (typeof options === 'function') { - callback = options - options = {} - } - - const listener = this.listeners_list[someUniqueId] // TODO: what could be used as uniqueId ? - if (!listener) { - callback(new Error('No listener for this server')) - return new Connection() - } - - // TODO: use direct dialing (`this.swarm.dial(peer)`) + dial (ma, options, callback) { + callback(new Error('This should never have been called!')) + return new Connection() } /** diff --git a/src/listener.js b/src/listener.js index 68180b0..8d7a48c 100644 --- a/src/listener.js +++ b/src/listener.js @@ -81,6 +81,7 @@ module.exports = class Listener extends EE { listen (ma, callback) { callback = callback ? once(callback) : noop const {id} = this + ma = multiaddr(ma) this.swarm.dial(ma, '/ws-star/2.0.0', (err, conn) => { if (err) return callback(err) pull( @@ -92,6 +93,7 @@ module.exports = class Listener extends EE { ) this.ma = ma + this.relayAddr = ma.decapsulate('p2p-ws-star').encapsulate('p2p-circuit') this.once('identify', request => { id.privKey.sign(request.nonce, (err, signature) => { From b07db937b7edd1331044b59fc5d93430311cc55a Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 16:22:36 +0100 Subject: [PATCH 05/16] docs: Update PROTOCOL --- CRYPTO_PUZZLE.md | 30 ----------------------- PROTOCOL.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 30 deletions(-) delete mode 100644 CRYPTO_PUZZLE.md create mode 100644 PROTOCOL.md diff --git a/CRYPTO_PUZZLE.md b/CRYPTO_PUZZLE.md deleted file mode 100644 index 2f759d7..0000000 --- a/CRYPTO_PUZZLE.md +++ /dev/null @@ -1,30 +0,0 @@ -# Crypto Challenge - -The crypto challenge is a simple signature challenge. - -The challenge works as follows: - -- Client emits "ss-join" with the following parameters: - - (string) multiaddr: The multiaddr as string - - (string) pubkey: The marshaled public key as hex string - - (function) cb: The callback function -- Server recieves "ss-join" - - gets id from multiaddr using `addr.split('ipfs/').pop()` - - gets id from public key - - matches both ids - - creates an unique nonce - - stores both the key and the nonce and responds using the callback: `cb(null, nonce)` - - if any error occurs during the process the server responds with: `cb(err)` -- Client recieves callback response - - signs nonce using the private key of the id - - responds by emitting "ss-join" - - (string) multiaddr: The multiaddr as string - - (string) signature: The signature as hex string - - (function) cb: The callback function -- Server recieves second "ss-join" - - verifies stored nonce was signed with the stored key - - if not the server responds with: `cb("Invalid signature")` - - finalizes join - - responds with: `cb()` -- Client recieves response -- Client is now authorized for `multiaddr` diff --git a/PROTOCOL.md b/PROTOCOL.md new file mode 100644 index 0000000..907a520 --- /dev/null +++ b/PROTOCOL.md @@ -0,0 +1,64 @@ +# Protocol + +### `/ws-star/2.0.0` + +## Connecting & Crypto challenge + +```protobuf +message IdentifyRequest { + required string nonce = 1; +} + +message IdentifyResponse { + required string id = 1; + required string pubKey = 2; + required bytes signature = 3; +} +``` + +### Error Handling + +If verifing the IdentifyResponse fails the connection gets closed by the server (protocol error) + +### Example Connection + +C: connects + +S: Uses `.getPeerInfo()` to get id. Generates random nonce (64 byte alphanumeric string) and sends IndentifyRequest. + +C: Signs nonce and send id, pubkey and signature back to server as IndentifyResponse + +S: Verifies IndentifyResponse + +S: Server adds peer to peerDB, starts to announce peer +(If peer disconnects server stops to announce it) + +## Discovery + +The server peer periodically sends a list of all ids (in binary instead of b58) + +The client peer responds with discovery ACKs (which are basically pings) + +```protobuf +message DiscoveryEvent { + repeated bytes id = 1; +} + +message DiscoveryACK { + required bool ok = 1; +} +``` + +## Dials + +Dials work using p2p-circuit (currently with a fixed relay server) + +### Example Connection + +`assumes a and b are already connected & identified` + +Ca: Connects via `/p2p-circuit/ipfs/` + +Ca -> S -> Cb: Uses p2p-circuit to establish a connection with `` + +Cb: Finishes up connection From f43e5f49c5e1306af54390a84ca8b4f4c4286a05 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 16:23:25 +0100 Subject: [PATCH 06/16] docs: Update PROTOCOL --- PROTOCOL.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/PROTOCOL.md b/PROTOCOL.md index 907a520..5c5baaa 100644 --- a/PROTOCOL.md +++ b/PROTOCOL.md @@ -55,8 +55,6 @@ Dials work using p2p-circuit (currently with a fixed relay server) ### Example Connection -`assumes a and b are already connected & identified` - Ca: Connects via `/p2p-circuit/ipfs/` Ca -> S -> Cb: Uses p2p-circuit to establish a connection with `` From b3651dc6f112cadc58b6661fa0074bffa7989712 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 17:02:57 +0100 Subject: [PATCH 07/16] chore: remove unneded packages --- package.json | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index c6dc01d..8b0635f 100644 --- a/package.json +++ b/package.json @@ -27,22 +27,15 @@ "license": "MIT", "dependencies": { "async": "^2.6.0", - "data-queue": "0.0.3", "debug": "^3.1.0", "interface-connection": "^0.3.2", - "libp2p-crypto": "^0.11.0", "mafmt": "^3.0.2", - "merge-recursive": "0.0.3", "multiaddr": "^3.0.2", "once": "^1.4.0", - "peer-id": "^0.10.4", "peer-info": "^0.11.4", "protons": "^1.0.1", "pull-length-prefixed": "^1.3.0", - "pull-stream": "^3.6.1", - "socket.io-client": "^2.0.4", - "socket.io-pull-stream": "^0.1.3", - "uuid": "^3.1.0" + "pull-stream": "^3.6.1" }, "directories": { "test": "test" @@ -51,7 +44,11 @@ "aegir": "^12.3.0", "chai": "^4.1.2", "dirty-chai": "^2.0.1", - "libp2p-websocket-star-rendezvous": "github:libp2p/js-libp2p-websocket-star-rendezvous", + "libp2p": "^0.15.1", + "libp2p-multiplex": "^0.5.1", + "libp2p-secio": "^0.9.0", + "libp2p-spdy": "^0.11.0", + "libp2p-websockets": "^0.10.4", "lodash": "^4.17.4" }, "repository": { From ba0f0125fb7029d036675b6cb1c0c510fe4e2d22 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 17:31:01 +0100 Subject: [PATCH 08/16] Fixes --- src/index.js | 4 ++++ src/listener.js | 1 + 2 files changed, 5 insertions(+) diff --git a/src/index.js b/src/index.js index be68e18..35d7bfd 100644 --- a/src/index.js +++ b/src/index.js @@ -40,6 +40,10 @@ module.exports = class WebsocketStar { this._peerDiscovered = this._peerDiscovered.bind(this) } + setSwarm(swarm) { + this.swarm = swarm + } + /** * Dials a peer - should actually never get called because p2p-circuit handles dials * @param {Multiaddr} ma - Multiaddr to dial to diff --git a/src/listener.js b/src/listener.js index 8d7a48c..c6d250f 100644 --- a/src/listener.js +++ b/src/listener.js @@ -23,6 +23,7 @@ const noop = once(() => {}) */ module.exports = class Listener extends EE { constructor (main, handler) { + super() this.handler = handler this.id = main.id this.listeners = main.listeners_list From e4ffd06f73778d7a26d4ab913d1bcac197ecb3bb Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Tue, 23 Jan 2018 18:57:29 +0100 Subject: [PATCH 09/16] Lint fixes --- src/index.js | 5 +++-- src/listener.js | 17 +++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index 35d7bfd..4c6caf5 100644 --- a/src/index.js +++ b/src/index.js @@ -40,7 +40,7 @@ module.exports = class WebsocketStar { this._peerDiscovered = this._peerDiscovered.bind(this) } - setSwarm(swarm) { + setSwarm (swarm) { this.swarm = swarm } @@ -91,7 +91,8 @@ module.exports = class WebsocketStar { /** * Used to fire peer events on the discovery part - * @param {Multiaddr} maStr + * @param {id} id - Buffer containing id + * @param {Listener} listener - Listener which discovered this peer * @fires Discovery#peer * @returns {undefined} * @private diff --git a/src/listener.js b/src/listener.js index c6d250f..79109a4 100644 --- a/src/listener.js +++ b/src/listener.js @@ -1,7 +1,7 @@ 'use strict' -const debug = require('debug') -const log = debug('libp2p:websocket-star:listener') +/* const debug = require('debug') +const log = debug('libp2p:websocket-star:listener') */ const multiaddr = require('multiaddr') const EE = require('events').EventEmitter const once = require('once') @@ -15,13 +15,13 @@ const {IdentifyRequest, IdentifyResponse, DiscoveryEvent, DiscoveryACK} = requir const noop = once(() => {}) -/** - * Listener for signalling server - * @class - * @param {WebsocketStar} main - Instance of main class - * @param {function} handler - Handler function - */ module.exports = class Listener extends EE { + /** + * Listener for signalling server + * @class + * @param {WebsocketStar} main - Instance of main class + * @param {function} handler - Handler function + */ constructor (main, handler) { super() this.handler = handler @@ -63,6 +63,7 @@ module.exports = class Listener extends EE { this.emit('identifySuccess', event) } this.emit('peers', event.id) + this._push(DiscoveryACK.encode({ok: true})) } } catch (e) { this._disconnect(e) From 7fb5161443a2a151f19bd8be0beb9d11fb1c4bcc Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Wed, 24 Jan 2018 14:13:17 +0100 Subject: [PATCH 10/16] Fix --- src/listener.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/listener.js b/src/listener.js index 79109a4..b44a5f4 100644 --- a/src/listener.js +++ b/src/listener.js @@ -11,7 +11,9 @@ const pull = require('pull-stream') const lp = require('pull-length-prefixed') const Pushable = require('pull-pushable') -const {IdentifyRequest, IdentifyResponse, DiscoveryEvent, DiscoveryACK} = require('./proto') // TODO: move to client +const debug = require('debug') + +const {IdentifyRequest, IdentifyResponse, DiscoveryEvent, DiscoveryACK} = require('./proto') const noop = once(() => {}) @@ -29,6 +31,7 @@ module.exports = class Listener extends EE { this.listeners = main.listeners_list this.swarm = main.swarm this.source = Pushable() + this.log = debug('libp2p:websocket-star:listener#offline') this._push = this.source.push.bind(this.source) } @@ -60,7 +63,7 @@ module.exports = class Listener extends EE { const event = DiscoveryEvent.decode(data) if (second) { second = false - this.emit('identifySuccess', event) + this.emit('identifySuccess') } this.emit('peers', event.id) this._push(DiscoveryACK.encode({ok: true})) @@ -72,6 +75,8 @@ module.exports = class Listener extends EE { read(null, next) } + + read(null, next) } /** @@ -81,6 +86,8 @@ module.exports = class Listener extends EE { * @returns {undefined} */ listen (ma, callback) { + const log = this.log = debug('libp2p:websocket-star:listener@' + ma.toString()) + log('connecting') callback = callback ? once(callback) : noop const {id} = this ma = multiaddr(ma) @@ -95,10 +102,13 @@ module.exports = class Listener extends EE { ) this.ma = ma - this.relayAddr = ma.decapsulate('p2p-ws-star').encapsulate('p2p-circuit') + this.relayAddr = ma.decapsulate('p2p-websocket-star').encapsulate('p2p-circuit') + + log('waiting for identify') this.once('identify', request => { - id.privKey.sign(request.nonce, (err, signature) => { + log('executing identify') + id.privKey.sign(Buffer.from(request.nonce), (err, signature) => { if (err) return callback(err) const json = id.toJSON() const response = { From 19630678b83995049495337558ec8c4125834405 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Wed, 24 Jan 2018 15:52:32 +0100 Subject: [PATCH 11/16] Fixes --- src/index.js | 7 ++++--- src/listener.js | 26 +++++++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/index.js b/src/index.js index 4c6caf5..a1b06cf 100644 --- a/src/index.js +++ b/src/index.js @@ -98,11 +98,12 @@ module.exports = class WebsocketStar { * @private */ _peerDiscovered (id, listener) { - // TODO: exclude self - log('Peer Discovered:', id) const peer = new Peer(new Id(id)) + if (peer.id.toB58String() === this.id.toB58String()) return + const addr = listener.getFullAddr(peer.id.toB58String()) + log('Peer Discovered: %s', addr) - peer.multiaddrs.add(listener.getFullAddr(peer.id.toB58String())) + peer.multiaddrs.add(addr) this.discovery.emit('peer', peer) } } diff --git a/src/listener.js b/src/listener.js index b44a5f4..add4292 100644 --- a/src/listener.js +++ b/src/listener.js @@ -36,7 +36,7 @@ module.exports = class Listener extends EE { } _disconnect (err) { - this.source.abort(err) + // this.source.abort(err) // TODO: fix 'TypeError: this.source.abort is not a function' this.disconnected = err this.emit('disconnect', err) this.emit('close') @@ -46,11 +46,18 @@ module.exports = class Listener extends EE { sink (read) { let first = true let second = false + this.once('close', err => { + if (second) { + second = false + this.emit('identifyError', err) + } + }) + const {log} = this const next = (err, data) => { if (this.disconnected) return read(this.disconnected) if (err) { this._disconnect(err) - return read(err) + return read(true) } // data is binary protobuf. first packet is IdentifyRequest, after that DiscoveryEvent try { @@ -61,6 +68,7 @@ module.exports = class Listener extends EE { this.emit('identify', request) } else { const event = DiscoveryEvent.decode(data) + log('got peers: %s', event.id.length) if (second) { second = false this.emit('identifySuccess') @@ -118,8 +126,16 @@ module.exports = class Listener extends EE { } this.response = response this._push(IdentifyResponse.encode(response)) - this.once('identifySuccess', callback) - this.once('disconnect', callback) + this.once('identifySuccess', () => { + this.removeAllListeners('identifyError') + log('identify was successfull') + callback() + }) + this.once('identifyError', err => { + this.removeAllListeners('identifySuccess') + log('indentify was unsuccessfull: %s', err) + callback(err) + }) }) }) }) @@ -153,6 +169,6 @@ module.exports = class Listener extends EE { * @returns {multiaddr} full address */ getFullAddr (id) { - return this.relayAddr.encapsulate('ipfs', id) + return this.relayAddr.encapsulate('ipfs/' + id) } } From 03e3c95d046f9e4a3f54b2cac5756e43c661b8e4 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Thu, 25 Jan 2018 14:05:46 +0100 Subject: [PATCH 12/16] Fixes --- src/listener.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/listener.js b/src/listener.js index add4292..d61b8b1 100644 --- a/src/listener.js +++ b/src/listener.js @@ -30,7 +30,7 @@ module.exports = class Listener extends EE { this.id = main.id this.listeners = main.listeners_list this.swarm = main.swarm - this.source = Pushable() + this.source = Pushable(err => this._disconnect(err)) this.log = debug('libp2p:websocket-star:listener#offline') this._push = this.source.push.bind(this.source) } @@ -40,7 +40,7 @@ module.exports = class Listener extends EE { this.disconnected = err this.emit('disconnect', err) this.emit('close') - if (typeof err !== 'boolean') return this.emit('error', err) + // if (typeof err !== 'boolean') return this.emit('error', err) } sink (read) { @@ -158,9 +158,11 @@ module.exports = class Listener extends EE { close (callback) { callback = callback ? once(callback) : noop - this._down() + if (this.disconnected) return callback() - callback() + this.once('close', () => callback()) + + this._disconnect(true) } /** From c0f3c10a9527645a8bdf612d094df84793a9f38c Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Thu, 25 Jan 2018 14:12:21 +0100 Subject: [PATCH 13/16] Add dummy test --- test/dummy.spec.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/dummy.spec.js diff --git a/test/dummy.spec.js b/test/dummy.spec.js new file mode 100644 index 0000000..bf8c9ad --- /dev/null +++ b/test/dummy.spec.js @@ -0,0 +1 @@ +it('tests are in the https://github.com/libp2p/js-libp2p-websocket-star-rendezvous repo! Please clone that and link the package!') From 645ae8a10bfb7e37b1ae0a89e884b34c4bc9c170 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Thu, 25 Jan 2018 14:12:40 +0100 Subject: [PATCH 14/16] Fix dummy test Ugh... --- test/dummy.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dummy.spec.js b/test/dummy.spec.js index bf8c9ad..0cc31d9 100644 --- a/test/dummy.spec.js +++ b/test/dummy.spec.js @@ -1 +1 @@ -it('tests are in the https://github.com/libp2p/js-libp2p-websocket-star-rendezvous repo! Please clone that and link the package!') +it('tests are in the https://github.com/libp2p/js-libp2p-websocket-star-rendezvous repo! Please clone that and link the package!', () => {}) From f626132f4990c539fe4134b69ac090ec478eb277 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Thu, 25 Jan 2018 14:16:04 +0100 Subject: [PATCH 15/16] Make lint happy --- test/dummy.spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/dummy.spec.js b/test/dummy.spec.js index 0cc31d9..287bf4b 100644 --- a/test/dummy.spec.js +++ b/test/dummy.spec.js @@ -1 +1,5 @@ +'use strict' + +/* eslint-env mocha */ + it('tests are in the https://github.com/libp2p/js-libp2p-websocket-star-rendezvous repo! Please clone that and link the package!', () => {}) From cf7e7a404f3580e5841492306ec0799495aaa439 Mon Sep 17 00:00:00 2001 From: mkg20001 Date: Fri, 16 Feb 2018 13:50:46 +0100 Subject: [PATCH 16/16] chore: Upgrade package and use .dialProtocol --- README.md | 2 +- package.json | 12 ++++++------ src/listener.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 226f42e..d2a1ceb 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Id.create((err, id) => { throw err } - node.dial(peerInfo, "/test/1.0.0", (err, conn) => { + node.dialProtocol(peerInfo, "/test/1.0.0", (err, conn) => { if (err) { throw err } diff --git a/package.json b/package.json index 8b0635f..d65adf5 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,10 @@ "async": "^2.6.0", "debug": "^3.1.0", "interface-connection": "^0.3.2", - "mafmt": "^3.0.2", + "mafmt": "^4.0.0", "multiaddr": "^3.0.2", "once": "^1.4.0", - "peer-info": "^0.11.4", + "peer-info": "^0.11.6", "protons": "^1.0.1", "pull-length-prefixed": "^1.3.0", "pull-stream": "^3.6.1" @@ -41,15 +41,15 @@ "test": "test" }, "devDependencies": { - "aegir": "^12.3.0", + "aegir": "^13.0.0", "chai": "^4.1.2", "dirty-chai": "^2.0.1", - "libp2p": "^0.15.1", + "libp2p": "^0.16.5", "libp2p-multiplex": "^0.5.1", - "libp2p-secio": "^0.9.0", + "libp2p-secio": "^0.9.2", "libp2p-spdy": "^0.11.0", "libp2p-websockets": "^0.10.4", - "lodash": "^4.17.4" + "lodash": "^4.17.5" }, "repository": { "type": "git", diff --git a/src/listener.js b/src/listener.js index d61b8b1..f86a40a 100644 --- a/src/listener.js +++ b/src/listener.js @@ -99,7 +99,7 @@ module.exports = class Listener extends EE { callback = callback ? once(callback) : noop const {id} = this ma = multiaddr(ma) - this.swarm.dial(ma, '/ws-star/2.0.0', (err, conn) => { + this.swarm.dialProtocol(ma, '/ws-star/2.0.0', (err, conn) => { if (err) return callback(err) pull( conn,