aboutsummaryrefslogtreecommitdiff
path: root/lib/follows.js
blob: b2625203e02dd7f5d2c0c3fbfe997a7325fd2e29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var pull = require('pull-stream')
var memo = require('asyncmemo')
var lru = require('hashlru')

module.exports = Follows

function Follows(sbot, contacts) {
  if (!(this instanceof Follows)) return new Follows(sbot)

  this.sbot = sbot
  this.contacts = contacts
  var followsCache = lru(100)
  this.getFollows = memo({cache: followsCache}, this.getFollows)

  pull(
    sbot.messagesByType({type: 'contact', old: false}),
    pull.drain(function (msg) {
      var author = msg && msg.value && msg.value.author
      var c = msg && msg.value && msg.value.content
      var follows = author && followsCache.get(author)
      if (follows && c && c.contact) follows[c.contact] = c.following
    }, function (err) {
      if (err) console.trace(err)
    })
  )
}

Follows.prototype.getFollows = function (id, cb) {
  var follows = {}
  pull(
    this.contacts.createFollowsStream(id),
    pull.drain(function (feed) {
      follows[feed] = true
    }, function (err) {
      if (err) return cb(err)
      cb(null, follows)
    })
  )
}

Follows.prototype.close = function (cb) {
  this.sbot.close(cb)
}