Simulate lossy or high-latency network conditions. Like the throttling option in the Chrome/Chromium DevTools.
npm install simulate-network-conditions
Let's simulate an unreliable transport protocol (like UDP, unlike TCP) over a bad 2G connection:
const {pipeline} = require('stream')
const simulate = require('simulate-network-conditions')
const signalStrenth = t => t % 20_000 / 20_000
const lossy = simulate.lossByTime((t, i) => {
if (signalStrenth(t) <= .3) {
// packet loss from now on, for 3s
return {from: t, length: 3000}
}
return null // no packet loss
})
const slow = simulate.latency(() => {
const s = signalStrenth(Date.now())
const jitter = Date.now() % 100 / 100
return Math.floor((6 + jitter - s) * 50)
})
// A -> 2G network -> B
pipeline(peerA, simulate(lossy), simulate(slow), peerB)
// B -> 2G network -> A
pipeline(peerB, simulate(lossy), simulate(slow), peerA)
simulate()
returns a transform stream in object mode.
The stream only represents one-way of network traffic. If you want two-way network traffic as usually required, use two emulate()
streams and duplexer3
:
const duplexer = require('duplexer3')
const aToB = simulate([ /* … */ ])
const bToA = simulate([ /* … */ ])
// A end of the connection
const aEnd = duplexer3(aToB, bToA)
// B end of the connection
const bEnd = duplexer3(bToA, aToB)
A
// every packet delayed by exactly .2s
simulate.constantLatency(200)
// jitter: packets randomly delayed by .1-.25s (breaks order!)
simulate.latency(() => 100 + Math.ceil(Math.random() * 150))
// 2% lost (randomly)
simulate.constantLoss(.02)
// 3 packets lost, every 20 packets
simulate.lossByIdx((idx) => ({from: idx + 17, length: 3}))
simulate.lossByIdx((idx, lossPeriodIdx) => {
return {from: lossPeriodIdx * 20, length: 3}
})
// 500ms loss every 3s
simulate.lossByTime(() => ({from: Date.now() + 3_000, length: 500}))
The great Mininet allows you to specify bandwidth, latency & loss, and probably works in a much more accurate way. You can use the mininet
npm package from Node.js.
If you have a question or need support using simulate-network-conditions
, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, use the issues page.