main.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. define(["moment", "router", "leaflet", "gui", "numeral"],
  2. function (moment, Router, L, GUI, numeral) {
  3. return function (config) {
  4. function handleData(data) {
  5. var dataNodes = {}
  6. dataNodes.nodes = []
  7. var dataGraph = {}
  8. dataGraph.batadv = {}
  9. dataGraph.batadv.nodes = []
  10. dataGraph.batadv.links = []
  11. function rearrangeLinks(d) {
  12. d.source += dataGraph.batadv.nodes.length
  13. d.target += dataGraph.batadv.nodes.length
  14. }
  15. for (var i = 0; i < data.length; ++i) {
  16. var vererr
  17. if(i % 2)
  18. if (data[i].version !== 1) {
  19. vererr = "Unsupported graph version: " + data[i].version
  20. console.log(vererr) //silent fail
  21. } else {
  22. data[i].batadv.links.forEach(rearrangeLinks)
  23. dataGraph.batadv.nodes = dataGraph.batadv.nodes.concat(data[i].batadv.nodes)
  24. dataGraph.batadv.links = dataGraph.batadv.links.concat(data[i].batadv.links)
  25. dataGraph.timestamp = data[i].timestamp
  26. }
  27. else
  28. if (data[i].version !== 2) {
  29. vererr = "Unsupported nodes version: " + data[i].version
  30. console.log(vererr) //silent fail
  31. } else {
  32. dataNodes.nodes = dataNodes.nodes.concat(data[i].nodes)
  33. dataNodes.timestamp = data[i].timestamp
  34. }
  35. }
  36. var nodes = dataNodes.nodes.filter( function (d) {
  37. return "firstseen" in d && "lastseen" in d
  38. })
  39. nodes.forEach( function(node) {
  40. node.firstseen = moment.utc(node.firstseen).local()
  41. node.lastseen = moment.utc(node.lastseen).local()
  42. })
  43. var now = moment()
  44. var age = moment(now).subtract(config.maxAge, "days")
  45. var newnodes = limit("firstseen", age, sortByKey("firstseen", nodes).filter(online))
  46. var lostnodes = limit("lastseen", age, sortByKey("lastseen", nodes).filter(offline))
  47. var graphnodes = {}
  48. dataNodes.nodes.forEach( function (d) {
  49. graphnodes[d.nodeinfo.node_id] = d
  50. })
  51. var graph = dataGraph.batadv
  52. graph.nodes.forEach( function (d) {
  53. if (d.node_id in graphnodes)
  54. d.node = graphnodes[d.node_id]
  55. })
  56. graph.links.forEach( function (d) {
  57. if (graph.nodes[d.source].node)
  58. d.source = graph.nodes[d.source]
  59. else
  60. d.source = undefined
  61. if (graph.nodes[d.target].node)
  62. d.target = graph.nodes[d.target]
  63. else
  64. d.target = undefined
  65. })
  66. var links = graph.links.filter( function (d) {
  67. return d.source !== undefined && d.target !== undefined
  68. })
  69. links.forEach( function (d) {
  70. var ids = [d.source.node.nodeinfo.node_id, d.target.node.nodeinfo.node_id]
  71. d.id = ids.sort().join("-")
  72. if (!("location" in d.source.node.nodeinfo && "location" in d.target.node.nodeinfo))
  73. return
  74. d.latlngs = []
  75. d.latlngs.push(L.latLng(d.source.node.nodeinfo.location.latitude, d.source.node.nodeinfo.location.longitude))
  76. d.latlngs.push(L.latLng(d.target.node.nodeinfo.location.latitude, d.target.node.nodeinfo.location.longitude))
  77. d.distance = d.latlngs[0].distanceTo(d.latlngs[1])
  78. })
  79. nodes.forEach( function (d) {
  80. d.neighbours = []
  81. })
  82. links.forEach( function (d) {
  83. d.source.node.neighbours.push({ node: d.target.node, link: d })
  84. d.target.node.neighbours.push({ node: d.source.node, link: d })
  85. })
  86. return { now: now,
  87. timestamp: moment.utc(dataNodes.timestamp).local(),
  88. nodes: {
  89. all: nodes,
  90. new: newnodes,
  91. lost: lostnodes
  92. },
  93. graph: {
  94. links: links,
  95. nodes: graph.nodes
  96. }
  97. }
  98. }
  99. numeral.language("de")
  100. moment.locale("de")
  101. var router = new Router()
  102. var urls = []
  103. if (typeof config.dataPath === "string" || config.dataPath instanceof String)
  104. config.dataPath = [config.dataPath]
  105. for (var i in config.dataPath) {
  106. urls.push(config.dataPath[i] + "nodes.json")
  107. urls.push(config.dataPath[i] + "graph.json")
  108. }
  109. function update() {
  110. return Promise.all(urls.map(getJSON))
  111. .then(handleData)
  112. }
  113. update()
  114. .then(function (d) {
  115. var gui = new GUI(config, router)
  116. gui.setData(d)
  117. router.setData(d)
  118. router.start()
  119. window.setInterval(function () {
  120. update().then(function (d) {
  121. gui.setData(d)
  122. router.setData(d)
  123. })
  124. }, 60000)
  125. })
  126. .catch(function (e) {
  127. document.body.textContent = e
  128. console.log(e)
  129. })
  130. }
  131. })