plugins/gossip/index.jsView |
---|
254 | 254 … | |
255 | 255 … | timeout = Math.max(10e3, Math.min(timeout, 30*60e3)) |
256 | 256 … | return ping({timeout: timeout}) |
257 | 257 … | }, |
| 258 … | + pingPeers: function () { |
| 259 … | + var drains = {} |
| 260 … | + var queue = [] |
| 261 … | + var waitingCb |
| 262 … | + for(var id in server.peers) { |
| 263 … | + if(id !== server.id) server.peers[id].forEach(function (peer) { |
| 264 … | + var pings |
| 265 … | + try { |
| 266 … | + pings = peer.gossip.ping() |
| 267 … | + } catch(e) { |
| 268 … | + return |
| 269 … | + } |
| 270 … | + pull( |
| 271 … | + pull.once(true), |
| 272 … | + pings, |
| 273 … | + pull.take(1), |
| 274 … | + drains[peer.id] = pull.collect(function (err, values) { |
| 275 … | + delete drains[peer.id] |
| 276 … | + var cb = waitingCb |
| 277 … | + if (err) { |
| 278 … | + if (cb && Object.keys(drains).length === 0) { |
| 279 … | + waitingCb = null |
| 280 … | + cb(true) |
| 281 … | + } |
| 282 … | + return |
| 283 … | + } |
| 284 … | + var val = {peer: peer.id, value: values[0]} |
| 285 … | + if (cb) { |
| 286 … | + waitingCb = null |
| 287 … | + cb(null, val) |
| 288 … | + } else { |
| 289 … | + queue.push(val) |
| 290 … | + } |
| 291 … | + }) |
| 292 … | + ) |
| 293 … | + }) |
| 294 … | + } |
| 295 … | + return function (abort, cb) { |
| 296 … | + if(abort) { |
| 297 … | + for(var id in drains) { |
| 298 … | + drains[id].abort(abort) |
| 299 … | + } |
| 300 … | + return cb(abort) |
| 301 … | + } |
| 302 … | + if (queue.length > 0) { |
| 303 … | + cb(null, queue.shift()) |
| 304 … | + } else if (Object.keys(drains).length === 0) { |
| 305 … | + cb(true) |
| 306 … | + } else { |
| 307 … | + waitingCb = cb |
| 308 … | + } |
| 309 … | + } |
| 310 … | + }, |
258 | 311 … | reconnect: function () { |
259 | 312 … | for(var id in server.peers) |
260 | 313 … | if(id !== server.id) |
261 | 314 … | server.peers[id].forEach(function (peer) { |