Commit ebe8d562f226c534e1f12af64c355eb6ba6dba13
use `backlinks.obs.for` on likes, references and rollup (shared cache)
Matt McKegg committed on 6/28/2017, 7:37:23 AMParent: d05e2f3f94a5847f7a6ef694ef45f7d8d15cc025
Files changed
feed/pull/rollup.js | changed |
message/obs/backlinks.js | changed |
message/obs/likes.js | changed |
feed/pull/rollup.js | ||
---|---|---|
@@ -5,11 +5,13 @@ | ||
5 | 5 … | var pull = require('pull-stream') |
6 | 6 … | var nest = require('depnest') |
7 | 7 … | var extend = require('xtend') |
8 | 8 … | var HLRU = require('hashlru') |
9 … | +var resolve = require('mutant/resolve') | |
10 … | +var onceTrue = require('mutant/once-true') | |
9 | 11 … | |
10 | 12 … | exports.needs = nest({ |
11 | - 'sbot.pull.backlinks': 'first', | |
13 … | + 'backlinks.obs.for': 'first', | |
12 | 14 … | 'sbot.async.get': 'first', |
13 | 15 … | 'message.sync.root': 'first', |
14 | 16 … | 'message.sync.unbox': 'first' |
15 | 17 … | }) |
@@ -84,18 +86,16 @@ | ||
84 | 86 … | pull.filter(rootFilter || (() => true)), |
85 | 87 … | |
86 | 88 … | // ADD REPLIES |
87 | 89 … | pull.asyncMap((rootMessage, cb) => { |
88 | - pull( | |
89 | - api.sbot.pull.backlinks({ | |
90 | - query: [{$filter: { dest: rootMessage.key }}] | |
91 | - }), | |
92 | - pull.filter(msg => (api.message.sync.root(msg) || rootMessage.key) === rootMessage.key), | |
93 | - pull.collect((err, replies) => { | |
94 | - if (err) return cb(err) | |
95 | - cb(null, extend(rootMessage, { replies })) | |
90 … | + // use global backlinks cache | |
91 … | + var backlinks = api.backlinks.obs.for(rootMessage.key) | |
92 … | + onceTrue(backlinks.sync, () => { | |
93 … | + var replies = resolve(backlinks).filter((msg) => { | |
94 … | + return (api.message.sync.root(msg) || rootMessage.key) === rootMessage.key | |
96 | 95 … | }) |
97 | - ) | |
96 … | + cb(null, extend(rootMessage, { replies })) | |
97 … | + }) | |
98 | 98 … | }) |
99 | 99 … | ) |
100 | 100 … | }) |
101 | 101 … | } |
message/obs/backlinks.js | ||
---|---|---|
@@ -1,40 +1,38 @@ | ||
1 | 1 … | var nest = require('depnest') |
2 | -var MutantPullReduce = require('mutant-pull-reduce') | |
2 … | +var computed = require('mutant/computed') | |
3 | 3 … | |
4 | 4 … | exports.needs = nest({ |
5 | - 'sbot.pull.backlinks': 'first' | |
5 … | + 'backlinks.obs.for': 'first' | |
6 | 6 … | }) |
7 | 7 … | |
8 | 8 … | exports.gives = nest('message.obs.backlinks', true) |
9 | 9 … | |
10 | 10 … | exports.create = function (api) { |
11 | 11 … | return nest({ |
12 … | + // DEPRECATED: should use backlinks.obs.for | |
12 | 13 … | 'message.obs.backlinks': (id) => backlinks(id) |
13 | 14 … | }) |
14 | 15 … | |
15 | 16 … | function backlinks (id) { |
16 | - return MutantPullReduce(api.sbot.pull.backlinks({ | |
17 | - query: [ | |
18 | - {$filter: { | |
19 | - dest: id | |
20 | - }}, | |
21 | - {$map: { | |
22 | - dest: 'dest', | |
23 | - id: 'key', | |
24 | - timestamp: 'timestamp', | |
25 | - type: ['value', 'content', 'type'], | |
26 | - root: ['value', 'content', 'root'], | |
27 | - branch: ['value', 'content', 'branch'], | |
28 | - author: ['value', 'author'] | |
29 | - }} | |
30 | - ] | |
31 | - }), (result, msg) => { | |
32 | - if (msg.type !== 'vote' && msg.type !== 'about') { | |
33 | - result.push(msg) | |
34 | - } | |
35 | - return result | |
17 … | + return computed([api.backlinks.obs.for(id)], (msgs) => { | |
18 … | + return msgs.map(map).filter((backlink) => { | |
19 … | + return backlink.type !== 'vote' && backlink.type !== 'about' | |
20 … | + }) | |
36 | 21 … | }, { |
37 | - startValue: [] | |
22 … | + // objects coming down this stream will be immutable | |
23 … | + comparer: (a, b) => a === b | |
38 | 24 … | }) |
39 | 25 … | } |
26 … | + | |
27 … | + function map (msg) { | |
28 … | + return { | |
29 … | + dest: msg.dest, | |
30 … | + id: msg.key, | |
31 … | + timestamp: msg.timestamp, | |
32 … | + type: msg.value.content.type, | |
33 … | + root: msg.value.content.root, | |
34 … | + branch: msg.value.content.branch, | |
35 … | + author: msg.value.author | |
36 … | + } | |
37 … | + } | |
40 | 38 … | } |
message/obs/likes.js | |||
---|---|---|---|
@@ -1,14 +1,15 @@ | |||
1 | 1 … | var nest = require('depnest') | |
2 | 2 … | var ref = require('ssb-ref') | |
3 | -var MutantPullReduce = require('mutant-pull-reduce') | ||
4 | -var SortedArray = require('sorted-array-functions') | ||
3 … | +var MutantArray = require('mutant/array') | ||
4 … | +var concat = require('mutant/concat') | ||
5 … | +var watch = require('mutant/watch') | ||
5 | 6 … | ||
6 | 7 … | var { computed } = require('mutant') | |
7 | 8 … | ||
8 | 9 … | exports.needs = nest({ | |
9 | 10 … | 'message.sync.unbox': 'first', | |
10 | - 'sbot.pull.backlinks': 'first' | ||
11 … | + 'backlinks.obs.for': 'first' | ||
11 | 12 … | }) | |
12 | 13 … | ||
13 | 14 … | exports.gives = nest({ | |
14 | 15 … | 'sbot.hook.publish': true, | |
@@ -30,74 +31,57 @@ | |||
30 | 31 … | if (!c.vote || !c.vote.link) return | |
31 | 32 … | ||
32 | 33 … | activeLikes.forEach((likes) => { | |
33 | 34 … | if (likes.id === c.vote.link) { | |
34 | - likes.push({ | ||
35 | - dest: c.vote.link, | ||
36 | - id: msg.key, | ||
37 | - expression: c.vote.expression, | ||
38 | - value: c.vote.value, | ||
39 | - timestamp: msg.value.timestamp, | ||
40 | - author: msg.value.author | ||
41 | - }) | ||
35 … | + likes.push(msg) | ||
42 | 36 … | } | |
43 | 37 … | }) | |
44 | 38 … | }, | |
45 | 39 … | 'message.obs.likes': (id) => { | |
46 | 40 … | if (!ref.isLink(id)) throw new Error('an id must be specified') | |
47 | 41 … | var obs = get(id) | |
48 | 42 … | obs.id = id | |
49 | - return computed(obs, getLikes, { | ||
43 … | + var result = computed(obs, getLikes, { | ||
50 | 44 … | // allow manual append for simulated realtime | |
51 | 45 … | onListen: () => activeLikes.add(obs), | |
52 | 46 … | onUnlisten: () => activeLikes.delete(obs) | |
53 | 47 … | }) | |
48 … | + result.sync = obs.sync | ||
49 … | + return result | ||
54 | 50 … | } | |
55 | 51 … | }) | |
56 | 52 … | ||
57 | 53 … | function get (id) { | |
58 | - var likes = MutantPullReduce(api.sbot.pull.backlinks({ | ||
59 | - live: true, | ||
60 | - query: [ | ||
61 | - {$filter: { | ||
62 | - dest: id, | ||
63 | - value: { | ||
64 | - content: { | ||
65 | - type: 'vote', | ||
66 | - vote: { link: id } | ||
54 … | + var backlinks = api.backlinks.obs.for(id) | ||
55 … | + var merge = MutantArray() | ||
56 … | + | ||
57 … | + var likes = computed([backlinks.sync, concat([backlinks, merge])], (sync, backlinks) => { | ||
58 … | + if (sync) { | ||
59 … | + return backlinks.reduce((result, msg) => { | ||
60 … | + var c = msg.value.content | ||
61 … | + if (c.type === 'vote' && c.vote && c.vote.link === id) { | ||
62 … | + var value = result[msg.value.author] | ||
63 … | + if (!value || value[0] < msg.value.timestamp) { | ||
64 … | + result[msg.value.author] = [msg.value.timestamp, c.vote.value, c.vote.expression] | ||
67 | 65 … | } | |
68 | 66 … | } | |
69 | - }}, | ||
70 | - {$map: { | ||
71 | - dest: 'dest', | ||
72 | - id: 'key', | ||
73 | - expression: ['value', 'content', 'vote', 'expression'], | ||
74 | - value: ['value', 'content', 'vote', 'value'], | ||
75 | - timestamp: 'timestamp', | ||
76 | - author: ['value', 'author'] | ||
77 | - }} | ||
78 | - ] | ||
79 | - }), (result, msg) => { | ||
80 | - if (!result[msg.author]) { | ||
81 | - result[msg.author] = [] | ||
67 … | + return result | ||
68 … | + }, {}) | ||
69 … | + } else { | ||
70 … | + return {} | ||
82 | 71 … | } | |
83 | - SortedArray.add(result[msg.author], msg, mostRecent) | ||
84 | - return result | ||
85 | - }, { | ||
86 | - startValue: [] | ||
87 | 72 … | }) | |
73 … | + | ||
74 … | + likes.push = merge.push | ||
75 … | + likes.sync = backlinks.sync | ||
88 | 76 … | return likes | |
89 | 77 … | } | |
90 | 78 … | } | |
91 | 79 … | ||
92 | 80 … | function getLikes (likes) { | |
93 | 81 … | return Object.keys(likes).reduce((result, id) => { | |
94 | - if (likes[id][0].value) { | ||
82 … | + if (likes[id][1] > 0) { | ||
95 | 83 … | result.push(id) | |
96 | 84 … | } | |
97 | 85 … | return result | |
98 | 86 … | }, []) | |
99 | 87 … | } | |
100 | - | ||
101 | -function mostRecent (a, b) { | ||
102 | - return b.timestamp - a.timestamp | ||
103 | -} |
Built with git-ssb-web