hopglass/lib/datadistributor.js
Milan Paessler 9e7049c9e3 infobox/node: resolve nexthop and gateway from data
not perfect yet: the mac address doesn't always match
2016-11-19 02:17:08 +01:00

86 lines
1.8 KiB
JavaScript

define(["filters/nodefilter"], function (NodeFilter) {
return function () {
var targets = []
var filterObservers = []
var filters = []
var filteredData
var data
function remove(d) {
targets = targets.filter( function (e) { return d !== e } )
}
function add(d) {
targets.push(d)
if (filteredData !== undefined)
d.setData(filteredData)
}
function setData(d) {
data = d
refresh()
}
function refresh() {
if (data === undefined)
return
var filter = filters.reduce( function (a, f) {
return function (d) {
return a(d) && f.run(d)
}
}, function () { return true })
filteredData = new NodeFilter(filter)(data)
filteredData.nodeDict = {}
filteredData.nodes.all.forEach(function (d) {
filteredData.nodeDict[dictGet(d, ["nodeinfo", "network", "mac"]).substr(9)] = d
})
targets.forEach( function (t) {
t.setData(filteredData)
})
}
function notifyObservers() {
filterObservers.forEach( function (d) {
d.filtersChanged(filters)
})
}
function addFilter(d) {
filters.push(d)
notifyObservers()
d.setRefresh(refresh)
refresh()
}
function removeFilter(d) {
filters = filters.filter( function (e) { return d !== e } )
notifyObservers()
refresh()
}
function watchFilters(d) {
filterObservers.push(d)
d.filtersChanged(filters)
return function () {
filterObservers = filterObservers.filter( function (e) { return d !== e })
}
}
return { add: add,
remove: remove,
setData: setData,
addFilter: addFilter,
removeFilter: removeFilter,
watchFilters: watchFilters,
refresh: refresh
}
}
})