diff --git a/package.json b/package.json index 60e3788..de36054 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,12 @@ }, "homepage": "https://github.com/whyrusleeping/js-mafmt#readme", "devDependencies": { - "aegir": "^9.3.0", + "aegir": "^9.3.3", "chai": "^3.5.0", "pre-commit": "^1.2.2" }, "dependencies": { - "multiaddr": "^2.1.3" + "multiaddr": "^2.2.0" }, "contributors": [ "David Dias ", @@ -46,4 +46,4 @@ "Jeromy Johnson ", "dignifiedquire " ] -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 8266d2b..9153927 100644 --- a/src/index.js +++ b/src/index.js @@ -1,44 +1,88 @@ 'use strict' -var multiaddr = require('multiaddr') +const 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) +/* + * Valid combinations + */ +const DNS4 = base('dns4') +const DNS6 = base('dns6') +const DNS = or( + base('dns'), + DNS4, + DNS6 +) -// 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 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 WebSocketsSecure = or( + and(TCP, base('wss')), + and(DNS, base('wss')) +) + +const HTTP = or( + and(TCP, base('http')), + and(DNS), + and(DNS, base('http')) +) + +const WebRTCStar = or( + and(base('libp2p-webrtc-star'), WebSockets, base('ipfs')), + and(base('libp2p-webrtc-star'), WebSocketsSecure, base('ipfs')) +) + +const WebRTCDirect = and(base('libp2p-webrtc-direct'), HTTP) + +const Reliable = or( + WebSockets, + WebSocketsSecure, + HTTP, + WebRTCStar, + WebRTCDirect, + TCP, + UTP +) + +const IPFS = or( + and(Reliable, base('ipfs')), + WebRTCStar +) + +exports.DNS = DNS +exports.DNS4 = DNS4 +exports.DNS6 = DNS6 exports.IP = IP exports.TCP = TCP exports.UDP = UDP exports.UTP = UTP exports.HTTP = HTTP exports.WebSockets = WebSockets +exports.WebSocketsSecure = WebSocketsSecure exports.WebRTCStar = WebRTCStar 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 +111,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 +125,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 +137,7 @@ function or () { return out } - var result = { + const result = { toString: function () { return '{ ' + args.join(' ') + ' }' }, input: args, matches: matches, @@ -104,13 +148,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..fecd3ed 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -2,78 +2,104 @@ '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', + '/dns4/ipfs.io', + '/dns4/libp2p.io', + '/dns6/protocol.ai' + ] + + const badDNS = [ + '/ip4/127.0.0.1' + ] + + 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 goodWSS = [ + '/dns/ipfs.io/wss', + '/ip4/1.2.3.4/tcp/3456/wss', + '/ip6/::/tcp/0/wss' + ] + + 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/dns/ipfs.io/wss/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 badWSS = [ + '/ip4/0.0.0.0/tcp/12345/udp/2222/wss', + '/ip6/::/ip4/0.0.0.0/udp/1234/wss' + ] + + 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 +108,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 +116,11 @@ describe('multiaddr validation', function () { }) } + it('DNS validation', function () { + assertMatches(mafmt.DNS, goodDNS) + assertMismatches(mafmt.DNS, badDNS, badIP, goodTCP) + }) + it('IP validation', function () { assertMatches(mafmt.IP, goodIP) assertMismatches(mafmt.IP, badIP, goodTCP) @@ -120,6 +151,11 @@ describe('multiaddr validation', function () { assertMismatches(mafmt.WebSockets, goodIP, goodUDP, badWS) }) + it('WebSocketsSecure validation', function () { + assertMatches(mafmt.WebSocketsSecure, goodWSS) + assertMismatches(mafmt.WebSocketsSecure, goodIP, badWSS, goodUDP, badWS) + }) + it('WebRTC-star validation', function () { assertMatches(mafmt.WebRTCStar, goodWebRTCStar) assertMismatches(mafmt.WebRTCStar, goodIP, goodUDP, badWS)