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