Skip to content
This repository was archived by the owner on Mar 10, 2020. It is now read-only.

Commit 632af40

Browse files
JGAntunesdaviddias
authored andcommitted
fix(ping): convert the ping messages to lowercase
1 parent 2abe1eb commit 632af40

6 files changed

+94
-33
lines changed

src/ping-pull-stream.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
const toPull = require('stream-to-pull-stream')
44
const deferred = require('pull-defer')
5+
const pump = require('pump')
56
const moduleConfig = require('./utils/module-config')
7+
const PingMessageStream = require('./utils/ping-message-stream')
68

79
module.exports = (arg) => {
810
const send = moduleConfig(arg)
@@ -18,10 +20,13 @@ module.exports = (arg) => {
1820
qs: opts
1921
}
2022
const p = deferred.source()
23+
const response = new PingMessageStream()
2124

2225
send(request, (err, stream) => {
2326
if (err) { return p.abort(err) }
24-
p.resolve(toPull.source(stream))
27+
28+
pump(stream, response)
29+
p.resolve(toPull.source(response))
2530
})
2631

2732
return p

src/ping-readable-stream.js

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
'use strict'
22

3-
const Stream = require('readable-stream')
43
const pump = require('pump')
54
const moduleConfig = require('./utils/module-config')
5+
const PingMessageStream = require('./utils/ping-message-stream')
66

77
module.exports = (arg) => {
88
const send = moduleConfig(arg)
@@ -17,17 +17,15 @@ module.exports = (arg) => {
1717
args: id,
1818
qs: opts
1919
}
20-
// ndjson streams objects
21-
const pt = new Stream.PassThrough({
22-
objectMode: true
23-
})
20+
21+
const response = new PingMessageStream()
2422

2523
send(request, (err, stream) => {
26-
if (err) { return pt.destroy(err) }
24+
if (err) { return response.destroy(err) }
2725

28-
pump(stream, pt)
26+
pump(stream, response)
2927
})
3028

31-
return pt
29+
return response
3230
}
3331
}

src/ping.js

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
'use strict'
22

33
const promisify = require('promisify-es6')
4+
const pump = require('pump')
5+
const concat = require('concat-stream')
46
const moduleConfig = require('./utils/module-config')
5-
const streamToValue = require('./utils/stream-to-value')
7+
const PingMessageStream = require('./utils/ping-message-stream')
68

79
module.exports = (arg) => {
810
const send = moduleConfig(arg)
@@ -30,14 +32,16 @@ module.exports = (arg) => {
3032

3133
// Transform the response stream to a value:
3234
// [{ Success: <boolean>, Time: <number>, Text: <string> }]
33-
const transform = (res, callback) => {
34-
streamToValue(res, (err, res) => {
35-
if (err) {
36-
return callback(err)
35+
const transform = (stream, callback) => {
36+
const messageConverter = new PingMessageStream()
37+
pump(
38+
stream,
39+
messageConverter,
40+
concat({encoding: 'object'}, (data) => callback(null, data)),
41+
(err) => {
42+
if (err) callback(err)
3743
}
38-
39-
callback(null, res)
40-
})
44+
)
4145
}
4246

4347
send.andTransform(request, transform, callback)

src/utils/ping-message-converter.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict'
2+
3+
// Converts IPFS API ping messages to lowercase
4+
//
5+
// {
6+
// Success: true,
7+
// Text: 'foobar',
8+
// Time: 0
9+
// }
10+
//
11+
12+
module.exports = function pingMessageConverter (obj) {
13+
if (!isPingMessage(obj)) throw new Error('Invalid ping message received')
14+
return {
15+
success: obj.Success,
16+
time: obj.Time,
17+
text: obj.Text
18+
}
19+
}
20+
21+
function isPingMessage (obj) {
22+
return obj && typeof obj.Success === 'boolean'
23+
}

src/utils/ping-message-stream.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict'
2+
3+
const TransformStream = require('readable-stream').Transform
4+
const pingMessageConverter = require('./ping-message-converter')
5+
6+
class PingMessageStream extends TransformStream {
7+
constructor (options) {
8+
const opts = Object.assign(options || {}, { objectMode: true })
9+
super(opts)
10+
}
11+
12+
_transform (obj, enc, callback) {
13+
try {
14+
const msg = pingMessageConverter(obj)
15+
this.push(msg)
16+
} catch (err) {
17+
return callback(err)
18+
}
19+
callback()
20+
}
21+
}
22+
23+
module.exports = PingMessageStream

test/ping.spec.js

+24-16
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const parallel = require('async/parallel')
1212
const series = require('async/series')
1313

1414
const IPFSApi = require('../src')
15+
const PingMessageStream = require('../src/utils/ping-message-stream')
1516
const f = require('./utils/factory')
1617

1718
describe('.ping', function () {
@@ -77,10 +78,10 @@ describe('.ping', function () {
7778
expect(res).to.be.an('array')
7879
expect(res).to.have.lengthOf(3)
7980
res.forEach(packet => {
80-
expect(packet).to.have.keys('Success', 'Time', 'Text')
81-
expect(packet.Time).to.be.a('number')
81+
expect(packet).to.have.keys('success', 'time', 'text')
82+
expect(packet.time).to.be.a('number')
8283
})
83-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
84+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
8485
expect(resultMsg).to.exist()
8586
done()
8687
})
@@ -92,10 +93,10 @@ describe('.ping', function () {
9293
expect(res).to.be.an('array')
9394
expect(res).to.have.lengthOf(4)
9495
res.forEach(packet => {
95-
expect(packet).to.have.keys('Success', 'Time', 'Text')
96-
expect(packet.Time).to.be.a('number')
96+
expect(packet).to.have.keys('success', 'time', 'text')
97+
expect(packet.time).to.be.a('number')
9798
})
98-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
99+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
99100
expect(resultMsg).to.exist()
100101
done()
101102
})
@@ -107,10 +108,10 @@ describe('.ping', function () {
107108
expect(res).to.be.an('array')
108109
expect(res).to.have.lengthOf(4)
109110
res.forEach(packet => {
110-
expect(packet).to.have.keys('Success', 'Time', 'Text')
111-
expect(packet.Time).to.be.a('number')
111+
expect(packet).to.have.keys('success', 'time', 'text')
112+
expect(packet.time).to.be.a('number')
112113
})
113-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
114+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
114115
expect(resultMsg).to.exist()
115116
done()
116117
})
@@ -131,10 +132,10 @@ describe('.ping', function () {
131132
expect(res).to.be.an('array')
132133
expect(res).to.have.lengthOf(3)
133134
res.forEach(packet => {
134-
expect(packet).to.have.keys('Success', 'Time', 'Text')
135-
expect(packet.Time).to.be.a('number')
135+
expect(packet).to.have.keys('success', 'time', 'text')
136+
expect(packet.time).to.be.a('number')
136137
})
137-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
138+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
138139
expect(resultMsg).to.exist()
139140
})
140141
})
@@ -147,10 +148,10 @@ describe('.ping', function () {
147148
expect(data).to.be.an('array')
148149
expect(data).to.have.lengthOf(3)
149150
data.forEach(packet => {
150-
expect(packet).to.have.keys('Success', 'Time', 'Text')
151-
expect(packet.Time).to.be.a('number')
151+
expect(packet).to.have.keys('success', 'time', 'text')
152+
expect(packet.time).to.be.a('number')
152153
})
153-
const resultMsg = data.find(packet => packet.Text.includes('Average latency'))
154+
const resultMsg = data.find(packet => packet.text.includes('Average latency'))
154155
expect(resultMsg).to.exist()
155156
done()
156157
})
@@ -162,7 +163,7 @@ describe('.ping', function () {
162163
ipfs.pingReadableStream(otherId)
163164
.on('data', data => {
164165
expect(data).to.be.an('object')
165-
expect(data).to.have.keys('Success', 'Time', 'Text')
166+
expect(data).to.have.keys('success', 'time', 'text')
166167
packetNum++
167168
})
168169
.on('error', err => {
@@ -173,4 +174,11 @@ describe('.ping', function () {
173174
done()
174175
})
175176
})
177+
178+
it('message conversion fails if invalid message is received', () => {
179+
const messageConverter = new PingMessageStream()
180+
expect(() => {
181+
messageConverter.write({some: 'InvalidMessage'})
182+
}).to.throw('Invalid ping message received')
183+
})
176184
})

0 commit comments

Comments
 (0)