Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit b3b512d

Browse files
committed
feat: first shot at ping implementaion
1 parent efb8268 commit b3b512d

File tree

5 files changed

+78
-41
lines changed

5 files changed

+78
-41
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@
151151
"progress": "^2.0.0",
152152
"promisify-es6": "^1.0.3",
153153
"pull-abortable": "^4.1.1",
154+
"pull-catch": "^1.0.0",
154155
"pull-defer": "^0.2.2",
155156
"pull-file": "^1.1.0",
156157
"pull-ndjson": "^0.1.1",

src/cli/commands/ping.js

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
'use strict'
22

3+
const pull = require('pull-stream/pull')
4+
const drain = require('pull-stream/sinks/drain')
5+
const pullCatch = require('pull-catch')
6+
37
const print = require('../utils').print
48

59
module.exports = {
@@ -19,26 +23,20 @@ module.exports = {
1923
const peerId = argv.peerId
2024
const count = argv.count || 10
2125

22-
print('PING ' + peerId)
23-
24-
let noOfTimes = 0
25-
let totalTime = 0
26-
27-
const pingCb = (err, p) => {
28-
if (err) {
29-
throw err
30-
}
31-
let time = p.Time
32-
totalTime = totalTime + time
33-
noOfTimes = noOfTimes + 1
34-
print('Pong received: time=' + time + ' ms')
35-
if (noOfTimes === count) {
36-
print('Average latency: ' + totalTime / count + 'ms')
37-
}
38-
}
39-
40-
for (let i = 0; i < count; i++) {
41-
argv.ipfs.ping(peerId, pingCb)
42-
}
26+
pull(
27+
argv.ipfs.pingPullStream(peerId, { count }),
28+
pullCatch(err => {
29+
throw err
30+
}),
31+
drain(({ Time, Text }) => {
32+
// Check if it's a pong
33+
if (Time) {
34+
print(`Pong received: time=${Time} ms`)
35+
// Status response
36+
} else {
37+
print(Text)
38+
}
39+
})
40+
)
4341
}
4442
}

src/core/components/ping.js

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,51 @@ const promisify = require('promisify-es6')
44
const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR
55
const PeerId = require('peer-id')
66
const PeerInfo = require('peer-info')
7-
var Readable = require('stream').Readable
7+
const Readable = require('readable-stream').Readable
8+
9+
function getPacket (msg) {
10+
// Default msg
11+
const basePacket = {Success: false, Time: 0, Text: ''}
12+
// ndjson
13+
return `${JSON.stringify(Object.assign({}, basePacket, msg))}\n`
14+
}
815

916
module.exports = function ping (self) {
10-
return promisify((peerId, cb) => {
17+
return promisify((peerId, count, cb) => {
1118
if (!self.isOnline()) {
1219
return cb(new Error(OFFLINE_ERROR))
1320
}
1421

15-
var outputStream = new Readable()
16-
outputStream._read = function (size) {
17-
}
22+
const source = new Readable({
23+
read: function () {}
24+
})
1825

1926
let peer
2027
try {
2128
peer = self._libp2pNode.peerBook.get(peerId)
2229
} catch (err) {
30+
// Conforming with go implemmentation, not sure if makes sense to log this
31+
// since we perform no `findPeer`
32+
source.push(getPacket({Success: true, Text: `Looking up peer ${peerId}`}))
2333
peer = new PeerInfo(PeerId.createFromB58String(peerId))
2434
}
2535

2636
self._libp2pNode.ping(peer, (err, p) => {
27-
p.once('ping', (time) => {
28-
outputStream.push(JSON.stringify([{}, { Success: true, Time: time }, { Text: 'Average latency: ' + time + ' ms' }]))
29-
outputStream.push(null)
30-
p.stop()
31-
cb(err, outputStream)
37+
let packetCount = 0
38+
let totalTime = 0
39+
source.push(getPacket({Success: true, Text: `PING ${peerId}`}))
40+
p.on('ping', (time) => {
41+
source.push(getPacket({ Success: true, Time: time }))
42+
totalTime += time
43+
packetCount++
44+
if (packetCount >= count) {
45+
const average = totalTime/count
46+
p.stop()
47+
source.push(getPacket({ Success: false, Text: `Average latency: ${average}ms`}))
48+
source.push(null)
49+
}
3250
})
3351
})
52+
cb(null, source)
3453
})
3554
}

src/http/api/resources/ping.js

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
11
'use strict'
22

3+
const Joi = require('joi')
34
const boom = require('boom')
5+
const toStream = require('pull-stream-to-stream')
46

57
exports = module.exports
68

7-
exports.get = (request, reply) => {
8-
const ipfs = request.server.app.ipfs
9-
const peerId = request.query.arg
9+
exports.get = {
10+
validate: {
11+
query: Joi.object().keys({
12+
n: Joi.alternatives()
13+
.when('count', {
14+
is: true, then: Joi.any().forbidden(),
15+
otherwise: Joi.number().greater(0)
16+
}),
17+
count: Joi.number().greater(0),
18+
arg: Joi.string()
19+
})
20+
},
21+
handler: (request, reply) => {
22+
const ipfs = request.server.app.ipfs
23+
const peerId = request.query.arg
24+
// Default count to 10
25+
const count = request.query.n || request.query.count || 10
1026

11-
ipfs.ping(peerId, (err, outputStream) => {
12-
if (err) {
13-
return reply(boom.badRequest(err))
14-
}
27+
ipfs.ping(peerId, count, (err, sourceStream) => {
28+
if (err) {
29+
return reply(boom.badRequest(err))
30+
}
31+
console.log(sourceStream)
1532

16-
return reply(outputStream).type('application/json').header('x-chunked-output', '1')
17-
})
33+
return reply(sourceStream).type('application/json').header('x-chunked-output', '1')
34+
})
35+
}
1836
}

src/http/api/routes/ping.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ module.exports = (server) => {
1313
parse: false,
1414
output: 'stream'
1515
},
16-
handler: resources.ping.get
16+
handler: resources.ping.get.handler,
17+
validate: resources.ping.get.validate
1718
}
1819
})
1920
}

0 commit comments

Comments
 (0)