git ssb

0+

Josiah / ssb-tags



Tree: 1f77997f086f31ce27aa9d3d2401244657e728f6

Files: 1f77997f086f31ce27aa9d3d2401244657e728f6 / index.js

2215 bytesRaw
1var FlumeReduce = require('flumeview-reduce')
2var ref = require('ssb-ref')
3var get = require('lodash/get')
4var merge = require('lodash/merge')
5
6exports.name = 'tags'
7exports.version = require('./package.json').version
8exports.manifest = {
9 stream: 'source',
10 get: 'async'
11}
12
13var initialState = {}
14
15exports.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
85function isRootTag(msg) {
86 return get(msg, 'value.content.type') === 'tag'
87}
88
89function 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