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