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

Commit d82aa47

Browse files
committed
fix(ping): convert the ping messages to lowercase
1 parent 1435655 commit d82aa47

File tree

6 files changed

+94
-33
lines changed

6 files changed

+94
-33
lines changed

src/ping-pull-stream.js

Lines changed: 6 additions & 1 deletion
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

Lines changed: 6 additions & 8 deletions
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

Lines changed: 12 additions & 8 deletions
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

Lines changed: 23 additions & 0 deletions
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

Lines changed: 23 additions & 0 deletions
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

Lines changed: 24 additions & 16 deletions
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 () {
@@ -71,10 +72,10 @@ describe('.ping', function () {
7172
expect(res).to.be.an('array')
7273
expect(res).to.have.lengthOf(3)
7374
res.forEach(packet => {
74-
expect(packet).to.have.keys('Success', 'Time', 'Text')
75-
expect(packet.Time).to.be.a('number')
75+
expect(packet).to.have.keys('success', 'time', 'text')
76+
expect(packet.time).to.be.a('number')
7677
})
77-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
78+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
7879
expect(resultMsg).to.exist()
7980
done()
8081
})
@@ -86,10 +87,10 @@ describe('.ping', function () {
8687
expect(res).to.be.an('array')
8788
expect(res).to.have.lengthOf(4)
8889
res.forEach(packet => {
89-
expect(packet).to.have.keys('Success', 'Time', 'Text')
90-
expect(packet.Time).to.be.a('number')
90+
expect(packet).to.have.keys('success', 'time', 'text')
91+
expect(packet.time).to.be.a('number')
9192
})
92-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
93+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
9394
expect(resultMsg).to.exist()
9495
done()
9596
})
@@ -101,10 +102,10 @@ describe('.ping', function () {
101102
expect(res).to.be.an('array')
102103
expect(res).to.have.lengthOf(4)
103104
res.forEach(packet => {
104-
expect(packet).to.have.keys('Success', 'Time', 'Text')
105-
expect(packet.Time).to.be.a('number')
105+
expect(packet).to.have.keys('success', 'time', 'text')
106+
expect(packet.time).to.be.a('number')
106107
})
107-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
108+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
108109
expect(resultMsg).to.exist()
109110
done()
110111
})
@@ -125,10 +126,10 @@ describe('.ping', function () {
125126
expect(res).to.be.an('array')
126127
expect(res).to.have.lengthOf(3)
127128
res.forEach(packet => {
128-
expect(packet).to.have.keys('Success', 'Time', 'Text')
129-
expect(packet.Time).to.be.a('number')
129+
expect(packet).to.have.keys('success', 'time', 'text')
130+
expect(packet.time).to.be.a('number')
130131
})
131-
const resultMsg = res.find(packet => packet.Text.includes('Average latency'))
132+
const resultMsg = res.find(packet => packet.text.includes('Average latency'))
132133
expect(resultMsg).to.exist()
133134
})
134135
})
@@ -141,10 +142,10 @@ describe('.ping', function () {
141142
expect(data).to.be.an('array')
142143
expect(data).to.have.lengthOf(3)
143144
data.forEach(packet => {
144-
expect(packet).to.have.keys('Success', 'Time', 'Text')
145-
expect(packet.Time).to.be.a('number')
145+
expect(packet).to.have.keys('success', 'time', 'text')
146+
expect(packet.time).to.be.a('number')
146147
})
147-
const resultMsg = data.find(packet => packet.Text.includes('Average latency'))
148+
const resultMsg = data.find(packet => packet.text.includes('Average latency'))
148149
expect(resultMsg).to.exist()
149150
done()
150151
})
@@ -156,7 +157,7 @@ describe('.ping', function () {
156157
ipfs.pingReadableStream(otherId)
157158
.on('data', data => {
158159
expect(data).to.be.an('object')
159-
expect(data).to.have.keys('Success', 'Time', 'Text')
160+
expect(data).to.have.keys('success', 'time', 'text')
160161
packetNum++
161162
})
162163
.on('error', err => {
@@ -167,4 +168,11 @@ describe('.ping', function () {
167168
done()
168169
})
169170
})
171+
172+
it('message conversion fails if invalid message is received', () => {
173+
const messageConverter = new PingMessageStream()
174+
expect(() => {
175+
messageConverter.write({some: 'InvalidMessage'})
176+
}).to.throw('Invalid ping message received')
177+
})
170178
})

0 commit comments

Comments
 (0)