2016-08-18 16:18:17 +02:00
|
|
|
'use strict'
|
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
const { expect } = require('chai')
|
|
|
|
const pair = require('it-pair/duplex')
|
|
|
|
const pipe = require('it-pipe')
|
|
|
|
const pLimit = require('p-limit')
|
|
|
|
const { collect, tap, consume } = require('streaming-iterables')
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
module.exports = async (Muxer, nStreams, nMsg, limit) => {
|
|
|
|
const [dialerSocket, listenerSocket] = pair()
|
|
|
|
const { check, done } = marker((4 * nStreams) + (nStreams * nMsg))
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
const msg = 'simple msg'
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
const listener = new Muxer(async stream => {
|
|
|
|
expect(stream).to.exist // eslint-disable-line
|
|
|
|
check()
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
await pipe(
|
|
|
|
stream,
|
|
|
|
tap(chunk => check()),
|
|
|
|
consume
|
|
|
|
)
|
|
|
|
|
|
|
|
check()
|
|
|
|
pipe([], stream)
|
|
|
|
})
|
|
|
|
|
|
|
|
const dialer = new Muxer()
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
pipe(listenerSocket, listener, listenerSocket)
|
|
|
|
pipe(dialerSocket, dialer, dialerSocket)
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
const spawnStream = async n => {
|
|
|
|
const stream = dialer.newStream()
|
2017-03-16 15:56:47 +00:00
|
|
|
expect(stream).to.exist // eslint-disable-line
|
2016-08-18 16:18:17 +02:00
|
|
|
check()
|
2019-09-16 16:48:04 +01:00
|
|
|
|
|
|
|
const res = await pipe(
|
|
|
|
(function * () {
|
|
|
|
for (let i = 0; i < nMsg; i++) {
|
|
|
|
// console.log('n', n, 'msg', i)
|
|
|
|
yield new Promise(resolve => resolve(msg))
|
|
|
|
}
|
|
|
|
})(),
|
2016-08-18 16:18:17 +02:00
|
|
|
stream,
|
2019-09-16 16:48:04 +01:00
|
|
|
collect
|
2016-08-18 16:18:17 +02:00
|
|
|
)
|
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
expect(res).to.be.eql([])
|
|
|
|
check()
|
2016-08-18 16:18:17 +02:00
|
|
|
}
|
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
const limiter = pLimit(limit || Infinity)
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
await Promise.all(
|
|
|
|
Array.from(Array(nStreams), (_, i) => limiter(() => spawnStream(i)))
|
|
|
|
)
|
|
|
|
|
|
|
|
return done
|
2016-08-18 16:18:17 +02:00
|
|
|
}
|
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
function marker (n) {
|
|
|
|
let check
|
2016-08-18 16:18:17 +02:00
|
|
|
let i = 0
|
2019-09-16 16:48:04 +01:00
|
|
|
const done = new Promise((resolve, reject) => {
|
|
|
|
check = err => {
|
|
|
|
i++
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
if (err) {
|
|
|
|
/* eslint-disable-next-line */
|
|
|
|
console.error('Failed after %s iterations', i)
|
|
|
|
return reject(err)
|
|
|
|
}
|
2016-08-18 16:18:17 +02:00
|
|
|
|
2019-09-16 16:48:04 +01:00
|
|
|
if (i === n) {
|
|
|
|
resolve()
|
|
|
|
}
|
2016-08-18 16:18:17 +02:00
|
|
|
}
|
2019-09-16 16:48:04 +01:00
|
|
|
})
|
|
|
|
return { check, done }
|
2016-08-18 16:18:17 +02:00
|
|
|
}
|