Files: 1f77997f086f31ce27aa9d3d2401244657e728f6 / index.js
2215 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 | |
24 | if (root) { |
25 | var rootTag = { |
26 | [author]: { |
27 | [tagKey]: {} |
28 | } |
29 | } |
30 | result = merge(result, rootTag) |
31 | } else if (shouldAddTag()) { |
32 | var newTag = { |
33 | [author]: { |
34 | [tagKey]: { |
35 | [message]: timestamp |
36 | } |
37 | } |
38 | } |
39 | result = merge(result, newTag) |
40 | } else if (shouldRemoveTag()) { |
41 | delete result[author][tagKey][message] |
42 | } |
43 | |
44 | return result |
45 | |
46 | function shouldAddTag() { |
47 | if (!tagged) return false |
48 | return !storedTimestamp || timestamp > storedTimestamp |
49 | } |
50 | |
51 | function shouldRemoveTag() { |
52 | return storedTimestamp && tagged === false |
53 | } |
54 | } |
55 | |
56 | function map(msg) { |
57 | // only include your own tags (for now) |
58 | if (msg.value.author !== ssb.id) return |
59 | |
60 | // unbox private message |
61 | if (msg.value.content === 'string') { |
62 | // unbox private message (requires ssb-private plugin) |
63 | msg = ssb.private.unbox(msg) |
64 | } |
65 | |
66 | if (isTag(msg)) { |
67 | return { |
68 | tagKey: msg.value.content.root, |
69 | author: msg.value.author, |
70 | message: msg.value.content.message, |
71 | tagged: msg.value.content.tagged, |
72 | timestamp: msg.value.timestamp |
73 | } |
74 | } else if (isRootTag(msg)) { |
75 | return { |
76 | tagKey: msg.key, |
77 | author: msg.value.author, |
78 | timestamp: msg.value.timestamp, |
79 | root: true |
80 | } |
81 | } |
82 | } |
83 | } |
84 | |
85 | function isRootTag(msg) { |
86 | return get(msg, 'value.content.type') === 'tag' |
87 | } |
88 | |
89 | function isTag(msg) { |
90 | return get(msg, 'value.content.type') === 'tag' |
91 | && ref.isLink(get(msg, 'value.content.message')) |
92 | } |
93 |
Built with git-ssb-web