This commit is contained in:
David Dias 2016-01-19 17:23:52 +01:00
parent fe4ba45975
commit c6da9925dc
5 changed files with 213 additions and 210 deletions

118
index.js
View File

@ -1,118 +0,0 @@
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 Reliable = or(TCP, UTP)
var IPFS = and(Reliable, base('ipfs'))
exports.IP = IP
exports.TCP = TCP
exports.UDP = UDP
exports.UTP = UTP
exports.Reliable = Reliable
exports.IPFS = IPFS
function and() {
var args = Array.from(arguments)
function matches(a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
out = partialMatch(a.protoNames())
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch(a) {
if (a.length < args.length) {
return null
}
args.some(function(arg) {
a = arg.partialMatch(a)
if (a === null) {
return true
}
})
return a
}
return {
input: args,
matches: matches,
partialMatch: partialMatch,
}
}
function or() {
var args = Array.from(arguments)
function matches(a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
var out = partialMatch(a.protoNames())
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch(a) {
var out = null
args.some(function(arg) {
res = arg.partialMatch(a)
if (res) {
out = res
return true
}
})
return out
}
return {
toString: function() { return "{ " + args.join(" ") + " }" },
input: args,
matches: matches,
partialMatch: partialMatch,
}
}
function base(n) {
var name = n
function matches(a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
pnames = a.protoNames()
if (pnames.length === 1 && pnames[0] === name) {
return true
}
return false
}
function partialMatch(protos) {
if (protos.length === 0) {
return null
}
if (protos[0] === name) {
return protos.slice(1)
}
return null
}
return {
toString: function() {return name} ,
matches: matches,
partialMatch: partialMatch,
}
}

View File

@ -2,10 +2,15 @@
"name": "js-mafmt", "name": "js-mafmt",
"version": "1.0.1", "version": "1.0.1",
"description": "A multiaddr validator", "description": "A multiaddr validator",
"main": "index.js", "main": "src/index.js",
"scripts": { "scripts": {
"test": "node test.js" "lint": "standard",
"test": "node tests/test.js"
}, },
"pre-commit": [
"lint",
"test"
],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/whyrusleeping/js-mafmt.git" "url": "git+https://github.com/whyrusleeping/js-mafmt.git"
@ -20,6 +25,8 @@
}, },
"homepage": "https://github.com/whyrusleeping/js-mafmt#readme", "homepage": "https://github.com/whyrusleeping/js-mafmt#readme",
"devDependencies": { "devDependencies": {
"pre-commit": "^1.1.2",
"standard": "^5.4.1",
"tape": "^4.4.0" "tape": "^4.4.0"
}, },
"dependencies": { "dependencies": {

118
src/index.js Normal file
View File

@ -0,0 +1,118 @@
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 Reliable = or(TCP, UTP)
var IPFS = and(Reliable, base('ipfs'))
exports.IP = IP
exports.TCP = TCP
exports.UDP = UDP
exports.UTP = UTP
exports.Reliable = Reliable
exports.IPFS = IPFS
function and () {
var args = Array.from(arguments)
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
var out = partialMatch(a.protoNames())
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch (a) {
if (a.length < args.length) {
return null
}
args.some(function (arg) {
a = arg.partialMatch(a)
if (a === null) {
return true
}
})
return a
}
return {
input: args,
matches: matches,
partialMatch: partialMatch
}
}
function or () {
var args = Array.from(arguments)
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
var out = partialMatch(a.protoNames())
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch (a) {
var out = null
args.some(function (arg) {
var res = arg.partialMatch(a)
if (res) {
out = res
return true
}
})
return out
}
return {
toString: function () { return '{ ' + args.join(' ') + ' }' },
input: args,
matches: matches,
partialMatch: partialMatch
}
}
function base (n) {
var name = n
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
var pnames = a.protoNames()
if (pnames.length === 1 && pnames[0] === name) {
return true
}
return false
}
function partialMatch (protos) {
if (protos.length === 0) {
return null
}
if (protos[0] === name) {
return protos.slice(1)
}
return null
}
return {
toString: function () { return name },
matches: matches,
partialMatch: partialMatch
}
}

90
test.js
View File

@ -1,90 +0,0 @@
var test = require('tape')
var mafmt = require('./')
test('basic stuff works', function(t) {
var good_ip = [
"/ip4/0.0.0.0",
"/ip6/fc00::",
]
var bad_ip = [
"/ip4/0.0.0.0/tcp/555",
"/udp/789/ip6/fc00::",
]
var good_tcp = [
"/ip4/0.0.7.6/tcp/1234",
"/ip6/::/tcp/0",
]
var bad_tcp = [
"/tcp/12345",
"/ip6/fc00::/udp/5523/tcp/9543",
]
var good_udp = [
"/ip4/0.0.7.6/udp/1234",
"/ip6/::/udp/0",
]
var bad_udp = [
"/udp/12345",
"/ip6/fc00::/tcp/5523/udp/9543",
]
/*
var good_utp = [
"/ip4/1.2.3.4/udp/3456/utp",
"/ip6/::/udp/0/utp",
]
var bad_utp = [
"/ip4/0.0.0.0/tcp/12345/utp",
"/ip6/1.2.3.4/ip4/0.0.0.0/udp/1234/utp",
"/utp",
]
*/
function assertMatches(p) {
var tests = Array.from(arguments).slice(1)
tests.forEach(function(test) {
test.forEach(function(testcase) {
if (!p.matches(testcase)) {
t.fail("should have matched: " + testcase + " " + p)
}
})
})
}
function assertMismatches(p) {
var tests = Array.from(arguments).slice(1)
tests.forEach(function(test) {
test.forEach(function(testcase) {
t.equal(p.matches(testcase), false, "should not have matched: "+testcase+" "+p)
})
})
}
assertMatches(mafmt.IP, good_ip)
assertMismatches(mafmt.IP, bad_ip, good_tcp)
assertMatches(mafmt.TCP, good_tcp)
assertMismatches(mafmt.TCP, bad_tcp, good_ip)
assertMatches(mafmt.UDP, good_udp)
assertMismatches(mafmt.UDP, bad_udp, good_ip, good_tcp /*, good_utp*/)
/*
assertMatches(mafmt.UTP, good_utp)
assertMismatches(mafmt.UTP, bad_utp, good_ip, good_tcp, good_udp)
assertMatches(mafmt.Reliable, good_utp, good_tcp)
assertMismatches(mafmt.Reliable, good_ip, good_udp)
*/
t.end()
})

86
tests/test.js Normal file
View File

@ -0,0 +1,86 @@
var test = require('tape')
var mafmt = require('./../src')
test('basic stuff works', function (t) {
var good_ip = [
'/ip4/0.0.0.0',
'/ip6/fc00::'
]
var bad_ip = [
'/ip4/0.0.0.0/tcp/555',
'/udp/789/ip6/fc00::'
]
var good_tcp = [
'/ip4/0.0.7.6/tcp/1234',
'/ip6/::/tcp/0'
]
var bad_tcp = [
'/tcp/12345',
'/ip6/fc00::/udp/5523/tcp/9543'
]
var good_udp = [
'/ip4/0.0.7.6/udp/1234',
'/ip6/::/udp/0'
]
var bad_udp = [
'/udp/12345',
'/ip6/fc00::/tcp/5523/udp/9543'
]
/*
var good_utp = [
"/ip4/1.2.3.4/udp/3456/utp",
"/ip6/::/udp/0/utp",
]
var bad_utp = [
"/ip4/0.0.0.0/tcp/12345/utp",
"/ip6/1.2.3.4/ip4/0.0.0.0/udp/1234/utp",
"/utp",
]
*/
function assertMatches (p) {
var tests = Array.from(arguments).slice(1)
tests.forEach(function (test) {
test.forEach(function (testcase) {
if (!p.matches(testcase)) {
t.fail('should have matched: ' + testcase + ' ' + p)
}
})
})
}
function assertMismatches (p) {
var tests = Array.from(arguments).slice(1)
tests.forEach(function (test) {
test.forEach(function (testcase) {
t.equal(p.matches(testcase), false, 'should not have matched: ' + testcase + ' ' + p)
})
})
}
assertMatches(mafmt.IP, good_ip)
assertMismatches(mafmt.IP, bad_ip, good_tcp)
assertMatches(mafmt.TCP, good_tcp)
assertMismatches(mafmt.TCP, bad_tcp, good_ip)
assertMatches(mafmt.UDP, good_udp)
assertMismatches(mafmt.UDP, bad_udp, good_ip, good_tcp /*, good_utp*/)
/*
assertMatches(mafmt.UTP, good_utp)
assertMismatches(mafmt.UTP, bad_utp, good_ip, good_tcp, good_udp)
assertMatches(mafmt.Reliable, good_utp, good_tcp)
assertMismatches(mafmt.Reliable, good_ip, good_udp)
*/
t.end()
})