git ssb

0+

mixmix / ssb-testing-guide



Tree: fb0cba24167c50cf440489ad83da27b22e163686

Files: fb0cba24167c50cf440489ad83da27b22e163686 / difficult / ex1 / index.js

1720 bytesRaw
1const flumeView = require('flumeview-level')
2const pull = require('pull-stream')
3const NAME = 'channels'
4const VERSION = 1
5
6module.exports = {
7 name: NAME,
8 version: VERSION,
9 manifest: {
10 read: 'source',
11 list: 'async',
12 count: 'async'
13 },
14 init: function (server, config) {
15 const view = server._flumeUse(
16 NAME,
17 flumeView(VERSION, map)
18 )
19
20 return {
21 read: view.read,
22 list: list,
23 count: count
24 }
25
26 function map (msg) {
27 const { author, content } = msg.value
28 if (isPost(content) && hasChannel(content)) return [[ content.channel, msg.value.timestamp ]]
29 return []
30
31 function isPost (content) {
32 return content.type === 'post'
33 }
34
35 function hasChannel(content) {
36 return content.channel
37 }
38 }
39
40 function list (opts, cb) {
41 if (typeof opts === 'function') return list({}, opts)
42
43 opts = Object.assign({}, opts, { keys: true, values: false, seqs: false })
44
45 pull(
46 view.read(opts),
47 pull.map(data => data[0]),
48 pull.collect((err, msgs) => {
49 if (err) cb(err)
50 cb(null, Array.from(new Set(msgs.sort())))
51 })
52 )
53 }
54
55 function count (opts, cb) {
56 if (typeof opts === 'function') return count({}, opts)
57
58 opts = Object.assign({}, opts, { keys: true, values: false, seqs: false })
59
60 pull(
61 view.read(opts),
62 pull.map(data => data[0]),
63 pull.collect((err, msgs) => {
64 if (err) cb(err)
65 var collection = msgs.sort().reduce((coll, msg) => {
66 coll[msg] = (coll[msg] || 0) + 1
67 return coll
68 }, {})
69 cb(null, collection)
70 })
71 )
72 }
73 }
74}
75
76

Built with git-ssb-web