Commit a802072d7617b6d4a9de94ea317a53968dd3b63a
add willReplicate
Dominic Tarr committed on 12/17/2018, 7:16:04 PMParent: 74fdd566bc891a78ae65fcc6e0220fdcbbde4e21
Files changed
index.js | changed |
index.js | ||
---|---|---|
@@ -1,13 +1,15 @@ | ||
1 | -var pull = require('pull-stream') | |
2 | -var Reduce = require('flumeview-reduce') | |
3 | -var I = require('./valid') | |
1 … | +var pull = require('pull-stream') | |
2 … | +var Reduce = require('flumeview-reduce') | |
3 … | +var I = require('./valid') | |
4 | 4 … | var deepEquals = require('deep-equals') |
5 | -var crypto = require('crypto') | |
6 | -var ssbKeys = require('ssb-keys') | |
7 | -var ssbClient = require('ssb-client') | |
8 | -var types = require('./types') | |
5 … | +var types = require('./types') | |
6 … | +var paramap = require('pull-paramap') | |
7 … | +var ssbClient = require('ssb-client') | |
8 … | +var crypto = require('crypto') | |
9 … | +var ssbKeys = require('ssb-keys') | |
9 | 10 … | |
11 … | + | |
10 | 12 … | function code(err, c) { |
11 | 13 … | err.code = 'user-invites:'+c |
12 | 14 … | return err |
13 | 15 … | } |
@@ -29,13 +31,14 @@ | ||
29 | 31 … | exports.version = '1.0.0' |
30 | 32 … | exports.manifest = { |
31 | 33 … | getInvite: 'async', |
32 | 34 … | confirm: 'async', |
33 | - create: 'async' | |
35 … | + create: 'async', | |
36 … | + willReplicate: 'async' | |
34 | 37 … | } |
35 | 38 … | |
36 | 39 … | exports.permissions = { |
37 | -// master: {allow: ['create']} | |
40 … | + anonymous: {allow: ['willReplicate']}, | |
38 | 41 … | } |
39 | 42 … | |
40 | 43 … | // KNOWN BUG: it's possible to accept an invite more than once, |
41 | 44 … | // but peers will ignore subsequent acceptances. it's possible |
@@ -49,10 +52,10 @@ | ||
49 | 52 … | var init = false |
50 | 53 … | var layer = sbot.friends.createLayer('user-invites') |
51 | 54 … | |
52 | 55 … | var caps = config.caps || {} |
56 … | + caps.userInvite = caps.userInvite || require('./cap') | |
53 | 57 … | var initial = {invites: {}, accepts: {}, hosts: {}, guests: {}} |
54 | - caps.userInvite = caps.userInvite || require('./cap') | |
55 | 58 … | |
56 | 59 … | function reduce (acc, data, _seq) { |
57 | 60 … | if(!acc) acc = initial |
58 | 61 … | var msg = data.value |
@@ -200,19 +203,8 @@ | ||
200 | 203 … | ) |
201 | 204 … | }, cb) |
202 | 205 … | } |
203 | 206 … | |
204 | - | |
205 | - function getAccept (invite_id, cb) { | |
206 | - getResponse(invite_id, function (msg) { | |
207 | - return ( | |
208 | - msg.content.type === 'user-invite/accept' && | |
209 | - msg.content.receipt === invite_id | |
210 | - ) | |
211 | - }, cb) | |
212 | - } | |
213 | - | |
214 | - | |
215 | 207 … | //used to request that a server confirms your acceptance. |
216 | 208 … | invites.confirm = function (accept, cb) { |
217 | 209 … | var invite_id = accept.content.receipt |
218 | 210 … | //check if the invite in question hasn't already been accepted. |
@@ -238,8 +230,33 @@ | ||
238 | 230 … | }) |
239 | 231 … | }) |
240 | 232 … | } |
241 | 233 … | |
234 … | + | |
235 … | + //if the caller is someone we know, let them know wether | |
236 … | + //we are willing to confirm (and replicate) their guest. | |
237 … | + invites.willReplicate = function (opts, cb) { | |
238 … | + if(isFunction(opts)) cb = opts, opts = {} | |
239 … | + var id = this.id //id of caller | |
240 … | + var max = config.friends && config.friends.hops || config.replicate && config.replicate.hops || 3 | |
241 … | + sbot.friends.hops({}, function (err, hops) { | |
242 … | + // compare hops of caller (host to be) with max - 1 | |
243 … | + // because that means that the hops of the guest | |
244 … | + // will be in range. | |
245 … | + if(hops[id] <= (max - 1)) cb(null, true) | |
246 … | + else cb(null, false) | |
247 … | + }) | |
248 … | + } | |
249 … | + | |
250 … | + function getAccept (invite_id, cb) { | |
251 … | + getResponse(invite_id, function (msg) { | |
252 … | + return ( | |
253 … | + msg.content.type === 'user-invite/accept' && | |
254 … | + msg.content.receipt === invite_id | |
255 … | + ) | |
256 … | + }, cb) | |
257 … | + } | |
258 … | + | |
242 | 259 … | //retrive pubs who might be willing to confirm your invite. (used when creating an invte) |
243 | 260 … | function getNearbyPubs (opts, cb) { |
244 | 261 … | var maxHops = opts.hops || 2 |
245 | 262 … | sbot.deviceAddress.getState(function (err, state) { |
@@ -265,9 +282,26 @@ | ||
265 | 282 … | a.hops - b.hops || |
266 | 283 … | b.availability - a.availability |
267 | 284 … | ) |
268 | 285 … | }) |
269 | - cb(null, near) | |
286 … | + | |
287 … | + if(opts.offline) return cb(null, near) | |
288 … | + | |
289 … | + pull( | |
290 … | + pull.values(near), | |
291 … | + paramap(function (pub, cb) { | |
292 … | + sbot.connect(pub.address, function (err, rpc) { | |
293 … | + rpc.userInvites.willReplicate({}, function (err, v) { | |
294 … | + //pass through input if true, else (err or false) | |
295 … | + //then drop. | |
296 … | + cb(null, v && pub) | |
297 … | + }) | |
298 … | + }) | |
299 … | + },3), | |
300 … | + pull.filter(Boolean), | |
301 … | + pull.take(3), | |
302 … | + pull.collect(cb) | |
303 … | + ) | |
270 | 304 … | }) |
271 | 305 … | }) |
272 | 306 … | } |
273 | 307 … | |
@@ -296,8 +330,10 @@ | ||
296 | 330 … | function connectFirst (keys, pubs, cb) { |
297 | 331 … | var n = 0, err |
298 | 332 … | pubs.forEach(function (addr) { |
299 | 333 … | n++ |
334 … | + //don't use sbot.connect here, because we are connecting | |
335 … | + //with a different cap. | |
300 | 336 … | ssbClient(keys, { |
301 | 337 … | remote: addr, |
302 | 338 … | caps: caps, |
303 | 339 … | manifest: { |
@@ -395,9 +431,11 @@ | ||
395 | 431 … | }) |
396 | 432 … | }) |
397 | 433 … | } |
398 | 434 … | } |
435 … | + | |
399 | 436 … | return invites |
400 | 437 … | } |
401 | 438 … | |
402 | 439 … | |
403 | 440 … | |
441 … | + |
Built with git-ssb-web