lib/serve.jsView |
---|
16 | 16 … | var pkg = require('../package') |
17 | 17 … | var Busboy = require('busboy') |
18 | 18 … | var mime = require('mime-types') |
19 | 19 … | var ident = require('pull-identify-filetype') |
| 20 … | +var htime = require('human-time') |
20 | 21 … | |
21 | 22 … | module.exports = Serve |
22 | 23 … | |
23 | 24 … | var emojiDir = path.join(require.resolve('emoji-named-characters'), '../pngs') |
36 | 37 … | |
37 | 38 … | function ctype(name) { |
38 | 39 … | switch (name && /[^.\/]*$/.exec(name)[0] || 'html') { |
39 | 40 … | case 'html': return 'text/html' |
| 41 … | + case 'txt': return 'text/plain' |
40 | 42 … | case 'js': return 'text/javascript' |
41 | 43 … | case 'css': return 'text/css' |
42 | 44 … | case 'png': return 'image/png' |
43 | 45 … | case 'json': return 'application/json' |
208 | 210 … | case '/public': return this.public(m[2]) |
209 | 211 … | case '/private': return this.private(m[2]) |
210 | 212 … | case '/search': return this.search(m[2]) |
211 | 213 … | case '/vote': return this.vote(m[2]) |
| 214 … | + case '/peers': return this.peers(m[2]) |
212 | 215 … | } |
213 | 216 … | m = /^(\/?[^\/]*)(\/.*)?$/.exec(url) |
214 | 217 … | switch (m[1]) { |
215 | 218 … | case '/type': return this.type(m[2]) |
304 | 307 … | }) |
305 | 308 … | ) |
306 | 309 … | } |
307 | 310 … | |
| 311 … | +Serve.prototype.peers = function (ext) { |
| 312 … | + var self = this |
| 313 … | + if (self.data.action === 'connect') { |
| 314 … | + return self.app.sbot.gossip.connect(self.data.address, function (err) { |
| 315 … | + if (err) return pull( |
| 316 … | + pull.once(u.renderError(err, ext).outerHTML), |
| 317 … | + self.wrapPage('peers'), |
| 318 … | + self.respondSink(400, {'Content-Type': ctype(ext)}) |
| 319 … | + ) |
| 320 … | + self.data = {} |
| 321 … | + return self.peers(ext) |
| 322 … | + }) |
| 323 … | + } |
| 324 … | + |
| 325 … | + pull( |
| 326 … | + self.app.streamPeers(), |
| 327 … | + paramap(function (peer, cb) { |
| 328 … | + var done = multicb({pluck: 1, spread: true}) |
| 329 … | + var connectedTime = Date.now() - peer.stateChange |
| 330 … | + var addr = peer.host + ':' + peer.port + ':' + peer.key |
| 331 … | + done()(null, h('section', |
| 332 … | + h('form', {method: 'post', action: ''}, |
| 333 … | + peer.client ? '→' : '←', ' ', |
| 334 … | + h('code', peer.host, ':', peer.port, ':'), |
| 335 … | + self.app.render.idLink(peer.key, done()), ' ', |
| 336 … | + htime(new Date(peer.stateChange)), ' ', |
| 337 … | + peer.state === 'connected' ? 'connected' : [ |
| 338 … | + h('input', {name: 'action', type: 'submit', value: 'connect'}), |
| 339 … | + h('input', {name: 'address', type: 'hidden', value: addr}) |
| 340 … | + ] |
| 341 … | + ) |
| 342 … | + |
| 343 … | + |
| 344 … | + )) |
| 345 … | + done(cb) |
| 346 … | + }, 8), |
| 347 … | + pull.map(u.toHTML), |
| 348 … | + self.wrapPeers(), |
| 349 … | + self.wrapPage('peers'), |
| 350 … | + self.respondSink(200, { |
| 351 … | + 'Content-Type': ctype(ext) |
| 352 … | + }) |
| 353 … | + ) |
| 354 … | +} |
| 355 … | + |
| 356 … | + |
308 | 357 … | Serve.prototype.type = function (path) { |
309 | 358 … | var q = this.query |
310 | 359 … | var type = path.substr(1) |
311 | 360 … | var opts = { |
687 | 736 … | h('body', |
688 | 737 … | h('nav.nav-bar', h('form', {action: render.toUrl('/search'), method: 'get'}, |
689 | 738 … | h('a', {href: render.toUrl('/public')}, 'public'), ' ', |
690 | 739 … | h('a', {href: render.toUrl('/private')}, 'private') , ' ', |
| 740 … | + h('a', {href: render.toUrl('/peers')}, 'peers') , ' ', |
691 | 741 … | render.idLink(self.app.sbot.id, done()), ' ', |
692 | 742 … | h('input.search-input', {name: 'q', value: searchQ, |
693 | 743 … | placeholder: 'search'}) |
694 | 744 … | |
833 | 883 … | ]) |
834 | 884 … | }) |
835 | 885 … | } |
836 | 886 … | |
| 887 … | +Serve.prototype.wrapPeers = function (opts) { |
| 888 … | + var self = this |
| 889 … | + return u.hyperwrap(function (peers, cb) { |
| 890 … | + cb(null, [ |
| 891 … | + h('section', |
| 892 … | + h('h3', 'Peers') |
| 893 … | + ), |
| 894 … | + peers |
| 895 … | + ]) |
| 896 … | + }) |
| 897 … | +} |
| 898 … | + |
837 | 899 … | function rows(str) { |
838 | 900 … | return String(str).split(/[^\n]{150}|\n/).length |
839 | 901 … | } |
840 | 902 … | |