Commit 48f815c98ba097ec6e2176c0b6727e86e8c74c2a
Merge branch 'network-connect' of ssb://%s9mSFATE4RGyJx9wgH22lBrvD4CgUQW4yeguSWWjtqc=.sha256
Ev Bogue committed on 9/17/2016, 4:31:37 PMParent: ac953328a93f9bf165c04473766270dd2360fc91
Parent: bf386541acf88522e4d21e6143eb5c9add5d0ead
Files changed
modules/network.js | changed |
sbot-api.js | changed |
modules/network.js | ||
---|---|---|
@@ -3,8 +3,9 @@ | ||
3 | 3 … | var plugs = require('../plugs') |
4 | 4 … | |
5 | 5 … | var avatar = plugs.first(exports.avatar = []) |
6 | 6 … | var sbot_gossip_peers = plugs.first(exports.sbot_gossip_peers = []) |
7 … | +var sbot_gossip_connect = plugs.first(exports.sbot_gossip_connect = []) | |
7 | 8 … | //sbot_gossip_connect |
8 | 9 … | //sbot_gossip_add |
9 | 10 … | |
10 | 11 … | var human = require('human-time') |
@@ -16,20 +17,84 @@ | ||
16 | 17 … | exports.menu_items = function () { |
17 | 18 … | return h('a', {href: '#/network'}, '/network') |
18 | 19 … | } |
19 | 20 … | |
21 … | +//types of peers | |
22 … | + | |
23 … | + | |
24 … | +//on the same wifi network | |
25 … | +function isLocal (e) { | |
26 … | + // don't rely on private ip address, because | |
27 … | + // cjdns creates fake private ip addresses. | |
28 … | + return ip.isPrivate(e.host) && e.type === 'local' | |
29 … | +} | |
30 … | + | |
31 … | + | |
32 … | +//pub is running scuttlebot >=8 | |
33 … | +//have connected successfully. | |
34 … | +function isLongterm (e) { | |
35 … | + return e.ping && e.ping.rtt.mean > 0 | |
36 … | +} | |
37 … | + | |
38 … | +//pub is running scuttlebot < 8 | |
39 … | +//have connected sucessfully | |
40 … | +function isLegacy (peer) { | |
41 … | + return /connect/.test(peer.state) || peer.duration.mean > 0 && !exports.isLongterm(peer) | |
42 … | +} | |
43 … | + | |
44 … | +//tried to connect, but failed. | |
45 … | +function isInactive (e) { | |
46 … | + return e.stateChange && e.duration.mean == 0 | |
47 … | +} | |
48 … | + | |
49 … | +//havn't tried to connect peer yet. | |
50 … | +function isUnattempted (e) { | |
51 … | + return !e.stateChange | |
52 … | +} | |
53 … | + | |
54 … | +function getType (e) { | |
55 … | + return ( | |
56 … | + isLongterm(e) ? 'modern' | |
57 … | + : isLegacy(e) ? 'legacy' | |
58 … | + : isInactive(e) ? 'inactive' | |
59 … | + : isUnattempted(e) ? 'unattempted' | |
60 … | + : 'other' //should never happen | |
61 … | + ) | |
62 … | +} | |
63 … | + | |
64 … | +var states = { | |
65 … | + connected: 3, | |
66 … | + connecting: 2 | |
67 … | +} | |
68 … | + | |
69 … | +var types = { | |
70 … | + modern: 4, | |
71 … | + legacy: 3, | |
72 … | + inactive: 2, | |
73 … | + unattempted: 1, | |
74 … | + other: 0 | |
75 … | +} | |
76 … | + | |
77 … | +function round(n) { | |
78 … | + return Math.round(n*100)/100 | |
79 … | +} | |
80 … | + | |
81 … | +function duration (s) { | |
82 … | + if(!s) return s | |
83 … | + if (Math.abs(s) > 30000) | |
84 … | + return round(s/60000)+'m' | |
85 … | + else if (Math.abs(s) > 500) | |
86 … | + return round(s/1000)+'s' | |
87 … | + else | |
88 … | + return round(s)+'ms' | |
89 … | +} | |
90 … | + | |
20 | 91 … | exports.screen_view = function (path) { |
21 | 92 … | |
22 | 93 … | if(path !== '/network') return |
23 | 94 … | |
24 | - var ol = h('ol.network') | |
95 … | + var ol = h('ul.network') | |
25 | 96 … | |
26 | - var states = { | |
27 | - connected: 3, | |
28 | - connecting: 2, | |
29 | - disconnecting: 1 | |
30 | - } | |
31 | - | |
32 | 97 … | ;(function poll () { |
33 | 98 … | |
34 | 99 … | //if this tab isn't open, don't update. |
35 | 100 … | //todo: make a better way to do this... |
@@ -38,21 +103,37 @@ | ||
38 | 103 … | |
39 | 104 … | sbot_gossip_peers(function (err, list) { |
40 | 105 … | ol.innerHTML = '' |
41 | 106 … | list.sort(function (a, b) { |
42 | - return (states[b.state] || 0) - (states[a.state] || 0) || b.stateChange - a.stateChange | |
107 … | + return ( | |
108 … | + (states[b.state] || 0) - (states[a.state] || 0) | |
109 … | + || types[getType(b)] - types[getType(a)] | |
110 … | + || b.stateChange - a.stateChange | |
111 … | + ) | |
43 | 112 … | }).forEach(function (peer) { |
44 | - ol.appendChild(h('li', | |
113 … | + ol.appendChild(h('div', | |
45 | 114 … | avatar(peer.key, 'thumbnail'), |
46 | 115 … | h('div', |
47 | 116 … | peer.state || 'not connected', |
48 | 117 … | ' ', |
118 … | + getType(peer), | |
119 … | + ' ', | |
120 … | + //TODO: show nicer details, with labels. etc. | |
121 … | + peer.ping ? duration(peer.ping.rtt.mean) : '', | |
122 … | + ' ', | |
123 … | + peer.ping ? duration(peer.ping.skew.mean) : '', | |
49 | 124 … | h('label', |
50 | 125 … | {title: new Date(peer.stateChange).toString()}, |
51 | 126 … | peer.stateChange && ('(' + human(new Date(peer.stateChange))) + ')') |
52 | 127 … | ), |
53 | 128 … | 'source:'+peer.source, |
54 | - h('pre', legacyToMultiServer(peer)) | |
129 … | + h('pre', legacyToMultiServer(peer)), | |
130 … | + h('button', 'connect', {onclick: function () { | |
131 … | + sbot_gossip_connect(peer, function (err) { | |
132 … | + if(err) console.error(err) | |
133 … | + else console.log('connected to', peer) | |
134 … | + }) | |
135 … | + }}) | |
55 | 136 … | ) |
56 | 137 … | ) |
57 | 138 … | }) |
58 | 139 … | |
@@ -75,4 +156,10 @@ | ||
75 | 156 … | |
76 | 157 … | |
77 | 158 … | |
78 | 159 … | |
160 … | + | |
161 … | + | |
162 … | + | |
163 … | + | |
164 … | + | |
165 … | + |
sbot-api.js | ||
---|---|---|
@@ -125,8 +125,12 @@ | ||
125 | 125 … | }), |
126 | 126 … | sbot_gossip_peers: rec.async(function (cb) { |
127 | 127 … | sbot.gossip.peers(cb) |
128 | 128 … | }), |
129 … | + //liteclient won't have permissions for this | |
130 … | + sbot_gossip_connect: rec.async(function (opts, cb) { | |
131 … | + sbot.gossip.connect(opts, cb) | |
132 … | + }), | |
129 | 133 … | sbot_publish: rec.async(function (content, cb) { |
130 | 134 … | if(content.recps) |
131 | 135 … | content = ssbKeys.box(content, content.recps.map(function (e) { |
132 | 136 … | return ref.isFeed(e) ? e : e.link |
@@ -158,4 +162,6 @@ | ||
158 | 162 … | |
159 | 163 … | |
160 | 164 … | |
161 | 165 … | |
166 … | + | |
167 … | + |
Built with git-ssb-web