DNS support (#56)

* feat: dns support
This commit is contained in:
David Dias
2017-03-23 15:09:06 +00:00
committed by GitHub
parent ec467377e6
commit bdfd042ace
6 changed files with 173 additions and 45 deletions

View File

@ -4,25 +4,22 @@ const connect = require('pull-ws/client')
const mafmt = require('mafmt')
const includes = require('lodash.includes')
const Connection = require('interface-connection').Connection
const maToUrl = require('./ma-to-url')
const debug = require('debug')
const log = debug('libp2p:websockets:dialer')
const createListener = require('./listener')
module.exports = class WebSockets {
class WebSockets {
dial (ma, options, callback) {
if (typeof options === 'function') {
callback = options
options = {}
}
if (!callback) {
callback = () => {}
}
callback = callback || function () {}
const maOpts = ma.toOptions()
const url = `ws://${maOpts.host}:${maOpts.port}`
const url = maToUrl(ma)
log('dialing %s', url)
const socket = connect(url, {
binary: true,
@ -30,8 +27,8 @@ module.exports = class WebSockets {
})
const conn = new Connection(socket)
conn.getObservedAddrs = (cb) => cb(null, [ma])
conn.close = (cb) => socket.close(cb)
conn.getObservedAddrs = (callback) => callback(null, [ma])
conn.close = (callback) => socket.close(callback)
return conn
}
@ -54,7 +51,9 @@ module.exports = class WebSockets {
if (includes(ma.protoNames(), 'ipfs')) {
ma = ma.decapsulate('ipfs')
}
return mafmt.WebSockets.matches(ma)
return mafmt.WebSockets.matches(ma) || mafmt.WebSocketsSecure.matches(ma)
})
}
}
module.exports = WebSockets

View File

@ -2,20 +2,14 @@
const Connection = require('interface-connection').Connection
const includes = require('lodash.includes')
// const IPFS_CODE = 421
let createServer = require('pull-ws/server')
if (!createServer) {
createServer = () => {}
}
function noop () {}
const createServer = require('pull-ws/server') || noop
module.exports = (options, handler) => {
const listener = createServer((socket) => {
socket.getObservedAddrs = (cb) => {
socket.getObservedAddrs = (callback) => {
// TODO research if we can reuse the address in anyway
return cb(null, [])
return callback(null, [])
}
handler(new Connection(socket))
@ -24,19 +18,19 @@ module.exports = (options, handler) => {
let listeningMultiaddr
listener._listen = listener.listen
listener.listen = (ma, cb) => {
cb = cb || (() => {})
listener.listen = (ma, callback) => {
callback = callback || noop
listeningMultiaddr = ma
if (includes(ma.protoNames(), 'ipfs')) {
ma = ma.decapsulate('ipfs')
}
listener._listen(ma.toOptions(), cb)
listener._listen(ma.toOptions(), callback)
}
listener.getAddrs = (cb) => {
cb(null, [listeningMultiaddr])
listener.getAddrs = (callback) => {
callback(null, [listeningMultiaddr])
}
return listener

22
src/ma-to-url.js Normal file
View File

@ -0,0 +1,22 @@
'use strict'
const multiaddr = require('multiaddr')
function maToUrl (ma) {
const maStrSplit = ma.toString().split('/')
const proto = ma.protos()[2].name
if (!(proto === 'ws' || proto === 'wss')) {
throw new Error('invalid multiaddr' + ma.toString())
}
let url = ma.protos()[2].name + '://' + maStrSplit[2]
if (!multiaddr.isName(ma)) {
url += ':' + maStrSplit[4]
}
return url
}
module.exports = maToUrl