git ssb

7+

dinoworm 🐛 / patchcore



Commit b70e39416e0ec7a808742b9841a6cd32d45b3354

Add new backlinks filter obs function. This is a helper function to watch for links back to a message and add them to an observable list if they pass a given filter.

Gordon Martin committed on 11/26/2017, 8:17:54 PM
Parent: ba518865234ed63cae50900c6ee8404aa6686cfa

Files changed

backlinks/obs_filter.jsadded
backlinks/obs_filter.jsView
@@ -1,0 +1,80 @@
1 +var nest = require('depnest')
2 +var pull = require('pull-stream')
3 +var MutantPullReduce = require('mutant-pull-reduce')
4 +var Value = require('mutant/value')
5 +
6 +exports.needs = nest({
7 + 'sbot.pull.backlinks': 'first'
8 +})
9 +
10 +exports.gives = nest("backlinks.filter.obs", true)
11 +
12 +/**
13 + * sbot.filter.obs returns an observable list of messages that link
14 + * back to the message with the given message ID (@id). Only messages that
15 + * pass the filter function are added to the list.
16 + *
17 + * When a message arrives, if passing it to the filter function (@filterFn)
18 + * does not result in it returning 'true' the message is not added to the
19 + * observable list.
20 + *
21 + * A 'sync' observable property is also added to the returned observable
22 + * which is 'true' when all previously seen messages are caught up with.
23 + *
24 + * Note: Unlike backlinks.obs.for this does not cache the observable for
25 + * callers that supply the same arguments.
26 + */
27 +exports.create = function(api) {
28 + function pullFilterReduceObs(id, filterFn) {
29 + if (!id || typeof(id) !== "string") {
30 + throw new Error("id must be a string.")
31 + }
32 +
33 + if (!filterFn || typeof(filterFn) !== "function") {
34 + throw new Error("filterFn must be a function.")
35 + }
36 +
37 + var sync = Value(false)
38 +
39 + var msgBacklinks = api.sbot.pull.backlinks({
40 + query: [{
41 + $filter: {
42 + dest: id
43 + }
44 + }],
45 + live: true
46 + })
47 +
48 + var filteredBacklinks = pull(
49 + msgBacklinks,
50 + pull(
51 + pull.map(setSyncIfSyncMsg.bind(null, sync),
52 + pull.filter(filterFn)
53 + ))
54 + )
55 +
56 + var backlinksObs = MutantPullReduce(filteredBacklinks, (state, msg) => {
57 + state.push(msg)
58 + return state;
59 + }, {
60 + startValue: [],
61 + nextTick: true
62 + })
63 +
64 + backlinksObs.sync = sync
65 +
66 + return backlinksObs;
67 + }
68 +
69 + return nest({
70 + "backlinks.filter.obs": (id, filterFn) => pullFilterReduceObs(id, filterFn)
71 + })
72 +}
73 +
74 +function setSyncIfSyncMsg(syncObs, msg) {
75 + if (msg.sync) {
76 + syncObs.set(true)
77 + }
78 +
79 + return msg
80 +}

Built with git-ssb-web