Commit a3f728451ea4f496b80c42138d030295e43de153
add blob.obs.has
Matt McKegg committed on 6/12/2017, 5:00:12 AMParent: 023b5287cd3877535d9f446f55f213582430a9d6
Files changed
blob/obs/has.js | added |
blob/obs/has.js | |||
---|---|---|---|
@@ -1,0 +1,57 @@ | |||
1 … | +var nest = require('depnest') | ||
2 … | +var pull = require('pull-stream') | ||
3 … | +var Value = require('mutant/value') | ||
4 … | +var onceTrue = require('mutant/once-true') | ||
5 … | +var defer = require('pull-defer') | ||
6 … | + | ||
7 … | +exports.needs = nest({ | ||
8 … | + 'sbot.obs.connection': 'first' | ||
9 … | +}) | ||
10 … | + | ||
11 … | +exports.gives = nest('blob.obs.has', true) | ||
12 … | + | ||
13 … | +exports.create = function (api) { | ||
14 … | + var cbs = null | ||
15 … | + | ||
16 … | + return nest('blob.obs.has', function (id) { | ||
17 … | + var value = Value() | ||
18 … | + onceTrue(api.sbot.obs.connection, sbot => { | ||
19 … | + sbot.blobs.has(id, (_, has) => { | ||
20 … | + if (has) { | ||
21 … | + value.set(true) | ||
22 … | + } else { | ||
23 … | + value.set(false) | ||
24 … | + waitFor(id, () => value.set(true)) | ||
25 … | + } | ||
26 … | + }) | ||
27 … | + }) | ||
28 … | + return value | ||
29 … | + }) | ||
30 … | + | ||
31 … | + function waitFor (id, cb) { | ||
32 … | + if (!cbs) { | ||
33 … | + cbs = {} | ||
34 … | + pull( | ||
35 … | + StreamWhenConnected(api.sbot.obs.connection, sbot => sbot.blobs.ls({old: false})), | ||
36 … | + pull.drain(blob => { | ||
37 … | + if (cbs[blob]) { | ||
38 … | + while (cbs[blob].length) { | ||
39 … | + cbs[blob].pop()() | ||
40 … | + } | ||
41 … | + delete cbs[blob] | ||
42 … | + } | ||
43 … | + }) | ||
44 … | + ) | ||
45 … | + } | ||
46 … | + if (!cbs[id]) cbs[id] = [] | ||
47 … | + cbs[id].push(cb) | ||
48 … | + } | ||
49 … | +} | ||
50 … | + | ||
51 … | +function StreamWhenConnected (connection, fn) { | ||
52 … | + var stream = defer.source() | ||
53 … | + onceTrue(connection, function (connection) { | ||
54 … | + stream.resolve(fn(connection)) | ||
55 … | + }) | ||
56 … | + return stream | ||
57 … | +} |
Built with git-ssb-web