Completed
Pull Request — develop (#126)
by Xaver
01:09
created

main.js ➔ ... ➔ mesh[Object.keys[?!?]].interfaces.tunnel.forEach   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
nc 1
dl 0
loc 3
rs 10
nop 1
1
define(['moment', 'utils/router', 'leaflet', 'gui', 'helper', 'utils/language'],
2
  function (moment, Router, L, GUI, helper, Language) {
3
    'use strict';
4
5
    return function (config) {
6
      function handleData(data) {
7
        var dataNodes = {};
8
        dataNodes.nodes = [];
9
        var dataGraph = {};
10
        dataGraph.batadv = {};
11
        dataGraph.batadv.nodes = [];
12
        dataGraph.batadv.links = [];
13
        var gateways = {};
14
15
        function rearrangeLinks(d) {
16
          d.source += dataGraph.batadv.nodes.length;
17
          d.target += dataGraph.batadv.nodes.length;
18
        }
19
20
        for (var i = 0; i < data.length; ++i) {
21
          var vererr;
22
          if (i % 2) {
23
            if (data[i].version !== 1) {
24
              vererr = 'Unsupported graph version: ' + data[i].version;
25
              console.error(vererr); // silent fail
26
            } else {
27
              data[i].batadv.links.forEach(rearrangeLinks);
28
              dataGraph.batadv.nodes = dataGraph.batadv.nodes.concat(data[i].batadv.nodes);
29
              dataGraph.batadv.links = dataGraph.batadv.links.concat(data[i].batadv.links);
30
              dataGraph.timestamp = data[i].timestamp;
31
            }
32
          } else if (data[i].version !== 2) {
33
            vererr = 'Unsupported nodes version: ' + data[i].version;
34
            console.error(vererr); // silent fail
35
          } else {
36
            dataNodes.nodes = dataNodes.nodes.concat(data[i].nodes);
37
            dataNodes.timestamp = data[i].timestamp;
38
          }
39
        }
40
41
        var nodes = dataNodes.nodes.filter(function (d) {
42
          return 'firstseen' in d && 'lastseen' in d;
43
        });
44
45
        nodes.forEach(function (node) {
46
          node.firstseen = moment.utc(node.firstseen).local();
47
          node.lastseen = moment.utc(node.lastseen).local();
48
        });
49
50
        var now = moment();
51
        var age = moment(now).subtract(config.maxAge, 'days');
52
53
        var newnodes = helper.limit('firstseen', age, helper.sortByKey('firstseen', nodes).filter(helper.online));
54
        var lostnodes = helper.limit('lastseen', age, helper.sortByKey('lastseen', nodes).filter(helper.offline));
55
56
        var graphnodes = {};
57
58
        dataNodes.nodes.forEach(function (d) {
59
          graphnodes[d.nodeinfo.node_id] = d;
60
        });
61
62
        var graph = dataGraph.batadv;
63
64
        graph.nodes.forEach(function (d) {
65
          if (d.node_id in graphnodes) {
66
            d.node = graphnodes[d.node_id];
67
            if (d.unseen) {
68
              d.node.flags.online = true;
69
              d.node.flags.unseen = true;
70
            }
71
          }
72
        });
73
74
        graph.links.forEach(function (d) {
75
          d.source = graph.nodes[d.source];
76
77
          if (graph.nodes[d.target].node) {
78
            d.target = graph.nodes[d.target];
79
          } else {
80
            d.target = undefined;
81
          }
82
        });
83
84
        var links = graph.links.filter(function (d) {
85
          return d.target !== undefined;
86
        });
87
88
        nodes.forEach(function (d) {
89
          d.neighbours = [];
90
          if (d.flags.gateway) {
91
            var mesh = d.nodeinfo.network.mesh;
92
            mesh[Object.keys(mesh)[0]].interfaces.tunnel.forEach(function (mac) {
93
              gateways[mac] = d.nodeinfo.hostname;
94
            });
95
          }
96
        });
97
98
        links.forEach(function (d) {
99
          var ids;
100
101
          ids = [d.source.node.nodeinfo.node_id, d.target.node.nodeinfo.node_id];
102
          d.source.node.neighbours.push({ node: d.target.node, link: d, incoming: false });
103
          d.target.node.neighbours.push({ node: d.source.node, link: d, incoming: true });
104
105
          d.id = ids.join('-');
106
107
          try {
108
            d.latlngs = [];
109
            d.latlngs.push(L.latLng(d.source.node.nodeinfo.location.latitude, d.source.node.nodeinfo.location.longitude));
110
            d.latlngs.push(L.latLng(d.target.node.nodeinfo.location.latitude, d.target.node.nodeinfo.location.longitude));
111
112
            d.distance = d.latlngs[0].distanceTo(d.latlngs[1]);
113
          } catch (e) {
114
            // ignore exception
115
          }
116
        });
117
118
        links.sort(function (a, b) {
119
          return b.tq - a.tq;
120
        });
121
122
        return {
123
          now: now,
124
          timestamp: moment.utc(dataNodes.timestamp).local(),
125
          nodes: {
126
            all: nodes,
127
            new: newnodes,
128
            lost: lostnodes
129
          },
130
          graph: {
131
            links: links,
132
            nodes: graph.nodes
133
          },
134
          gateways: gateways
135
        };
136
      }
137
138
      var language = new Language(config);
139
      var router = new Router(language);
140
141
      var urls = [];
142
143
      if (typeof config.dataPath === 'string' || config.dataPath instanceof String) {
144
        config.dataPath = [config.dataPath];
145
      }
146
147
      for (var i in config.dataPath) {
148
        if (config.dataPath.hasOwnProperty(i)) {
149
          urls.push(config.dataPath[i] + 'nodes.json');
150
          urls.push(config.dataPath[i] + 'graph.json');
151
        }
152
      }
153
154
      function update() {
155
        language.init(router);
156
        return Promise.all(urls.map(helper.getJSON))
157
          .then(handleData);
158
      }
159
160
      update()
161
        .then(function (d) {
162
          var gui = new GUI(config, router, language);
163
          gui.setData(d);
164
          router.setData(d);
165
          router.resolve();
166
167
          window.setInterval(function () {
168
            update().then(function (n) {
169
              gui.setData(n);
170
              router.setData(n);
171
            });
172
          }, 60000);
173
        })
174
        .catch(function (e) {
175
          document.querySelector('.loader').innerHTML += e.message
176
            + '<br /><br /><button onclick="location.reload(true)" class="btn text">Try to reload</button><br /> or report to your community';
177
          console.warn(e);
178
        });
179
    };
180
  });
181