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