Files: 9fc97c76b6c3a194ee7d1ccab6a3fe398866e4b4 / index.js
2100 bytesRaw
1 | var FlumeReduce = require('flumeview-reduce') |
2 | var ref = require('ssb-ref') |
3 | |
4 | exports.name = 'tags' |
5 | exports.version = require('./package.json').version |
6 | exports.manifest = { |
7 | stream: 'source', |
8 | get: 'async' |
9 | } |
10 | |
11 | exports.init = function (ssb, config) { |
12 | return ssb._flumeUse('tags', FlumeReduce('test', reduce, map)) |
13 | |
14 | function reduce (result, item) { |
15 | if (!result) result = {} |
16 | if (!result.tags) result.tags = {} |
17 | if (!result.messages) result.messages = {} |
18 | var tags = result.tags |
19 | var messages = result.messages |
20 | |
21 | if (item) { |
22 | var { tag, author, message, tagged, timestamp } = item |
23 | |
24 | if (!tags[author]) tags[author] = {} |
25 | if (!tags[author][tag]) tags[author][tag] = {} |
26 | if ( |
27 | tagged && |
28 | (!tags[author][tag][message] || |
29 | timestamp > tags[author][tag][message].timestamp) |
30 | ) { |
31 | tags[author][tag][message] = { timestamp, tagged } |
32 | } else if (!tagged && tags[author][tag][message]) { |
33 | delete tags[author][tag][message] |
34 | } |
35 | |
36 | if (!messages[message]) messages[message] = {} |
37 | if (!messages[message][tag]) messages[message][tag] = {} |
38 | if ( |
39 | tagged && |
40 | (!messages[message][tag][author] || |
41 | timestamp > messages[message][tag][author].timestamp) |
42 | ) { |
43 | messages[message][tag][author] = { timestamp, tagged } |
44 | } else if (!tagged && messages[message][tag][author]) { |
45 | delete messages[message][tag][authpr] |
46 | } |
47 | } |
48 | |
49 | return result |
50 | } |
51 | |
52 | function map (msg) { |
53 | // only include your own tags (for now) |
54 | if (msg.value.author !== ssb.id) return |
55 | |
56 | // unbox private message |
57 | if (msg.value.content === 'string') { |
58 | // unbox private message (requires ssb-private plugin) |
59 | msg = ssb.private.unbox(msg) |
60 | } |
61 | |
62 | if (msg.value.content && msg.value.content.type === 'tag' && ref.isLink(msg.value.content.message)) { |
63 | return { |
64 | tag: msg.key, |
65 | author: msg.value.author, |
66 | message: msg.value.content.message, |
67 | tagged: msg.value.content.tagged, |
68 | timestamp: msg.value.timestamp |
69 | } |
70 | } |
71 | } |
72 | } |
73 |
Built with git-ssb-web