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