js-mafmt/src/index.js

226 lines
4.0 KiB
JavaScript
Raw Normal View History

2016-03-23 15:07:25 +01:00
'use strict'
const multiaddr = require('multiaddr')
/*
* Valid combinations
*/
2017-01-22 14:36:58 +00:00
const DNS4 = base('dns4')
const DNS6 = base('dns6')
const _DNS = or(
base('dnsaddr'),
2017-01-22 14:36:58 +00:00
DNS4,
DNS6
)
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 DNS = or(
and(_DNS, base('tcp')),
_DNS
)
const WebSockets = or(
and(TCP, base('ws')),
and(DNS, base('ws'))
)
2017-01-20 17:46:26 +00:00
const WebSocketsSecure = or(
and(TCP, base('wss')),
and(DNS, base('wss'))
)
const HTTP = or(
and(TCP, base('http')),
and(DNS),
and(DNS, base('http'))
)
2017-01-20 17:46:26 +00:00
const WebRTCStar = or(
and(WebSockets, base('p2p-webrtc-star'), base('ipfs')),
and(WebSocketsSecure, base('p2p-webrtc-star'), base('ipfs'))
2017-01-20 17:46:26 +00:00
)
const WebSocketStar = or(
and(WebSockets, base('p2p-websocket-star'), base('ipfs')),
and(WebSocketsSecure, base('p2p-websocket-star'), base('ipfs')),
and(WebSockets, base('p2p-websocket-star')),
and(WebSocketsSecure, base('p2p-websocket-star'))
)
const WebRTCDirect = and(HTTP, base('p2p-webrtc-direct'))
2017-01-20 17:46:26 +00:00
const Reliable = or(
WebSockets,
WebSocketsSecure,
HTTP,
WebRTCStar,
WebRTCDirect,
TCP,
UTP
)
2017-02-25 23:41:14 -08:00
let _IPFS = or(
and(Reliable, base('ipfs')),
2017-02-25 23:41:14 -08:00
WebRTCStar,
base('ipfs')
)
const _Circuit = or(
2017-02-25 23:41:14 -08:00
and(_IPFS, base('p2p-circuit'), _IPFS),
and(_IPFS, base('p2p-circuit')),
and(base('p2p-circuit'), _IPFS),
and(Reliable, base('p2p-circuit')),
and(base('p2p-circuit'), Reliable),
2017-02-25 23:41:14 -08:00
base('p2p-circuit')
)
const CircuitRecursive = () => or(
and(_Circuit, CircuitRecursive),
_Circuit
)
const Circuit = CircuitRecursive()
2017-02-25 23:41:14 -08:00
const IPFS = or(
and(Circuit, _IPFS, Circuit),
2017-02-25 23:41:14 -08:00
and(_IPFS, Circuit),
2017-02-26 00:07:33 -08:00
and(Circuit, _IPFS),
Circuit,
2017-02-25 23:41:14 -08:00
_IPFS
)
exports.DNS = DNS
2017-01-22 14:36:58 +00:00
exports.DNS4 = DNS4
exports.DNS6 = DNS6
2016-01-19 17:23:52 +01:00
exports.IP = IP
exports.TCP = TCP
exports.UDP = UDP
exports.UTP = UTP
exports.HTTP = HTTP
2016-03-12 12:36:19 +00:00
exports.WebSockets = WebSockets
2017-01-20 17:46:26 +00:00
exports.WebSocketsSecure = WebSocketsSecure
exports.WebSocketStar = WebSocketStar
2016-05-21 19:57:26 +01:00
exports.WebRTCStar = WebRTCStar
exports.WebRTCDirect = WebRTCDirect
2016-01-19 17:23:52 +01:00
exports.Reliable = Reliable
2017-02-25 23:41:14 -08:00
exports.Circuit = Circuit
2016-01-19 17:23:52 +01:00
exports.IPFS = IPFS
/*
* Validation funcs
*/
2016-01-19 17:23:52 +01:00
function and () {
const args = Array.from(arguments)
2016-01-19 17:23:52 +01:00
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
let out = partialMatch(a.protoNames())
2016-01-19 17:23:52 +01:00
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch (a) {
if (a.length < args.length) {
return null
}
args.some((arg) => {
a = typeof arg === 'function'
? arg().partialMatch(a)
: arg.partialMatch(a)
2016-01-19 17:23:52 +01:00
if (a === null) {
return true
}
})
return a
}
return {
input: args,
matches: matches,
partialMatch: partialMatch
}
}
function or () {
const args = Array.from(arguments)
2016-01-19 17:23:52 +01:00
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
const out = partialMatch(a.protoNames())
2016-01-19 17:23:52 +01:00
if (out === null) {
return false
}
return out.length === 0
}
function partialMatch (a) {
let out = null
args.some((arg) => {
const res = typeof arg === 'function'
? arg().partialMatch(a)
: arg.partialMatch(a)
2016-01-19 17:23:52 +01:00
if (res) {
out = res
return true
}
})
return out
}
const result = {
2016-01-19 17:23:52 +01:00
toString: function () { return '{ ' + args.join(' ') + ' }' },
input: args,
matches: matches,
partialMatch: partialMatch
}
return result
2016-01-19 17:23:52 +01:00
}
function base (n) {
const name = n
2016-01-19 17:23:52 +01:00
function matches (a) {
if (typeof a === 'string') {
a = multiaddr(a)
}
const pnames = a.protoNames()
2016-01-19 17:23:52 +01:00
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
}
}