diff --git a/src/index.js b/src/index.js index 8266d2b..610889b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,25 +1,37 @@ 'use strict' -var multiaddr = require('multiaddr') - -var IP = or(base('ip4'), base('ip6')) -var TCP = and(IP, base('tcp')) -var UDP = and(IP, base('udp')) -var UTP = and(UDP, base('utp')) -var WebSockets = and(TCP, base('ws')) -var HTTP = and(TCP, base('http')) -var WebRTCStar = and(base('libp2p-webrtc-star'), WebSockets, base('ipfs')) -var WebRTCDirect = and(base('libp2p-webrtc-direct'), HTTP) -var Reliable = or(WebSockets, TCP, UTP) - -// required cause some transports are already IPFS aware (like WebRTCStar) -var IPFS = { - matches: function (args) { - var IPFS = and(Reliable, base('ipfs')) - return IPFS.matches(args) || WebRTCStar.matches(args) - } -} - +const multiaddr = require('multiaddr') + +/* + * Valid combinations + */ +const DNS = base('dns') +const IP = or(base('ip4'), base('ip6')) +const TCP = and(IP, base('tcp')) +const UDP = and(IP, base('udp')) +const UTP = and(UDP, base('utp')) + +const WebSockets = or( + and(TCP, base('ws')), + and(DNS, base('ws')) +) +const HTTP = or( + and(TCP, base('http')), + and(DNS), + and(DNS, base('http')) +) + +const WebRTCStar = and(base('libp2p-webrtc-star'), WebSockets, base('ipfs')) +const WebRTCDirect = and(base('libp2p-webrtc-direct'), HTTP) + +const Reliable = or(WebSockets, TCP, UTP) + +const IPFS = or( + and(Reliable, base('ipfs')), + and(WebRTCStar) +) + +exports.DNS = DNS exports.IP = IP exports.TCP = TCP exports.UDP = UDP @@ -31,14 +43,18 @@ exports.WebRTCDirect = WebRTCDirect exports.Reliable = Reliable exports.IPFS = IPFS +/* + * Validation funcs + */ + function and () { - var args = Array.from(arguments) + const args = Array.from(arguments) function matches (a) { if (typeof a === 'string') { a = multiaddr(a) } - var out = partialMatch(a.protoNames()) + let out = partialMatch(a.protoNames()) if (out === null) { return false } @@ -67,13 +83,13 @@ function and () { } function or () { - var args = Array.from(arguments) + const args = Array.from(arguments) function matches (a) { if (typeof a === 'string') { a = multiaddr(a) } - var out = partialMatch(a.protoNames()) + const out = partialMatch(a.protoNames()) if (out === null) { return false } @@ -81,9 +97,9 @@ function or () { } function partialMatch (a) { - var out = null + let out = null args.some(function (arg) { - var res = arg.partialMatch(a) + const res = arg.partialMatch(a) if (res) { out = res return true @@ -93,7 +109,7 @@ function or () { return out } - var result = { + const result = { toString: function () { return '{ ' + args.join(' ') + ' }' }, input: args, matches: matches, @@ -104,13 +120,13 @@ function or () { } function base (n) { - var name = n + const name = n function matches (a) { if (typeof a === 'string') { a = multiaddr(a) } - var pnames = a.protoNames() + const pnames = a.protoNames() if (pnames.length === 1 && pnames[0] === name) { return true } diff --git a/test/index.spec.js b/test/index.spec.js index 43d91b2..ad6cc90 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -2,78 +2,87 @@ 'use strict' -var expect = require('chai').expect -var mafmt = require('./../src') +const expect = require('chai').expect +const mafmt = require('./../src') describe('multiaddr validation', function () { - var goodIP = [ + const goodDNS = [ + '/dns/ipfs.io', + '/dns/protocol.ai' + ] + + const goodIP = [ '/ip4/0.0.0.0', '/ip6/fc00::' ] - var badIP = [ + const badIP = [ '/ip4/0.0.0.0/tcp/555', '/udp/789/ip6/fc00::' ] - var goodTCP = [ + const goodTCP = [ '/ip4/0.0.7.6/tcp/1234', '/ip6/::/tcp/0' ] - var badTCP = [ + const badTCP = [ '/tcp/12345', '/ip6/fc00::/udp/5523/tcp/9543' ] - var goodUDP = [ + const goodUDP = [ '/ip4/0.0.7.6/udp/1234', '/ip6/::/udp/0' ] - var badUDP = [ + const badUDP = [ '/udp/12345', '/ip6/fc00::/tcp/5523/udp/9543' ] - var goodUTP = [ + const goodUTP = [ '/ip4/1.2.3.4/udp/3456/utp', '/ip6/::/udp/0/utp' ] - var badUTP = [ + const badUTP = [ '/ip4/0.0.0.0/tcp/12345/utp', '/ip6/::/ip4/0.0.0.0/udp/1234/utp' ] - var goodWS = [ + const goodWS = [ + '/dns/ipfs.io/ws', '/ip4/1.2.3.4/tcp/3456/ws', '/ip6/::/tcp/0/ws' ] - var goodWebRTCStar = [ + const goodWebRTCStar = [ '/libp2p-webrtc-star/ip4/1.2.3.4/tcp/3456/ws/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4', + '/libp2p-webrtc-star/dns/ipfs.io/ws/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4', + '/libp2p-webrtc-star/ip6/::/tcp/0/ws/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo5' ] - var goodWebRTCDirect = [ + const goodWebRTCDirect = [ + // '/libp2p-webrtc-direct/dns/ipfs.io', '/libp2p-webrtc-direct/ip4/1.2.3.4/tcp/3456/http', '/libp2p-webrtc-direct/ip6/::/tcp/0/http' ] - var badWS = [ + const badWS = [ '/ip4/0.0.0.0/tcp/12345/udp/2222/ws', '/ip6/::/ip4/0.0.0.0/udp/1234/ws' ] - var goodIPFS = [ + const goodIPFS = [ '/ip4/127.0.0.1/tcp/20008/ws/ipfs/QmUjNmr8TgJCn1Ao7DvMy4cjoZU15b9bwSCBLE3vwXiwgj', '/libp2p-webrtc-star/ip4/1.2.3.4/tcp/3456/ws/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4', '/ip4/1.2.3.4/tcp/3456/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4' ] function assertMatches (p) { - var tests = Array.from(arguments).slice(1) + const tests = Array.from(arguments).slice(1) tests.forEach(function (test) { test.forEach(function (testcase) { expect(p.matches(testcase)).to.be.eql(true) @@ -82,7 +91,7 @@ describe('multiaddr validation', function () { } function assertMismatches (p) { - var tests = Array.from(arguments).slice(1) + const tests = Array.from(arguments).slice(1) tests.forEach(function (test) { test.forEach(function (testcase) { expect(p.matches(testcase)).to.be.eql(false) @@ -90,6 +99,11 @@ describe('multiaddr validation', function () { }) } + it('DNS validation', function () { + assertMatches(mafmt.DNS, goodDNS) + assertMismatches(mafmt.DNS, badIP, goodTCP) + }) + it('IP validation', function () { assertMatches(mafmt.IP, goodIP) assertMismatches(mafmt.IP, badIP, goodTCP)