mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-04-26 11:02:14 +00:00
fix: stop stream after first pong received (#545)
When connecting to go-IPFS from a webworker, the stream opened by the ping protocol is never closed. The change here uses `take` to only receive one buffer from the remote node before closing the stream.
This commit is contained in:
parent
f39e8f0da9
commit
be8fc9daf1
@ -8,7 +8,7 @@ const errCode = require('err-code')
|
|||||||
const crypto = require('libp2p-crypto')
|
const crypto = require('libp2p-crypto')
|
||||||
const pipe = require('it-pipe')
|
const pipe = require('it-pipe')
|
||||||
const { toBuffer } = require('it-buffer')
|
const { toBuffer } = require('it-buffer')
|
||||||
const { collect } = require('streaming-iterables')
|
const { collect, take } = require('streaming-iterables')
|
||||||
|
|
||||||
const { PROTOCOL, PING_LENGTH } = require('./constants')
|
const { PROTOCOL, PING_LENGTH } = require('./constants')
|
||||||
|
|
||||||
@ -29,6 +29,7 @@ async function ping (node, peer) {
|
|||||||
const [result] = await pipe(
|
const [result] = await pipe(
|
||||||
[data],
|
[data],
|
||||||
stream,
|
stream,
|
||||||
|
stream => take(1, stream),
|
||||||
toBuffer,
|
toBuffer,
|
||||||
collect
|
collect
|
||||||
)
|
)
|
||||||
|
@ -6,9 +6,11 @@ chai.use(require('dirty-chai'))
|
|||||||
const { expect } = chai
|
const { expect } = chai
|
||||||
|
|
||||||
const pTimes = require('p-times')
|
const pTimes = require('p-times')
|
||||||
|
const pipe = require('it-pipe')
|
||||||
|
|
||||||
const peerUtils = require('../utils/creators/peer')
|
const peerUtils = require('../utils/creators/peer')
|
||||||
const baseOptions = require('../utils/base-options')
|
const baseOptions = require('../utils/base-options')
|
||||||
|
const { PROTOCOL } = require('../../src/ping/constants')
|
||||||
|
|
||||||
describe('ping', () => {
|
describe('ping', () => {
|
||||||
let nodes
|
let nodes
|
||||||
@ -32,4 +34,40 @@ describe('ping', () => {
|
|||||||
const averageLatency = latencies.reduce((p, c) => p + c, 0) / latencies.length
|
const averageLatency = latencies.reduce((p, c) => p + c, 0) / latencies.length
|
||||||
expect(averageLatency).to.be.a('Number')
|
expect(averageLatency).to.be.a('Number')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('only waits for the first response to arrive', async () => {
|
||||||
|
nodes[1].handle(PROTOCOL, async ({ connection, stream }) => {
|
||||||
|
let firstInvocation = true
|
||||||
|
|
||||||
|
await pipe(
|
||||||
|
stream,
|
||||||
|
function (stream) {
|
||||||
|
const output = {
|
||||||
|
[Symbol.asyncIterator]: () => output,
|
||||||
|
next: async () => {
|
||||||
|
if (firstInvocation) {
|
||||||
|
firstInvocation = false
|
||||||
|
|
||||||
|
for await (const data of stream) {
|
||||||
|
return {
|
||||||
|
value: data,
|
||||||
|
done: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new Promise() // never resolve
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
},
|
||||||
|
stream
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const latency = await nodes[0].ping(nodes[1].peerInfo)
|
||||||
|
|
||||||
|
expect(latency).to.be.a('Number')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user