What is stream-throttle?
The stream-throttle npm package is used to throttle the rate of data flowing through a stream. This can be useful in various scenarios such as limiting the bandwidth usage, controlling the rate of data processing, or simulating network conditions.
What are stream-throttle's main functionalities?
Throttle Read Stream
This feature allows you to throttle the read stream to a specified rate. In this example, the data from 'input.txt' is read at a rate of 1 KB per second and written to 'output.txt'.
const fs = require('fs');
const { Throttle } = require('stream-throttle');
const readStream = fs.createReadStream('input.txt');
const throttle = new Throttle({ rate: 1024 }); // 1 KB per second
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(throttle).pipe(writeStream);
Throttle Write Stream
This feature allows you to throttle the write stream to a specified rate. In this example, the data from 'input.txt' is read and written to 'output.txt' at a rate of 2 KB per second.
const fs = require('fs');
const { Throttle } = require('stream-throttle');
const readStream = fs.createReadStream('input.txt');
const throttle = new Throttle({ rate: 2048 }); // 2 KB per second
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream).pipe(throttle);
Throttle Duplex Stream
This feature allows you to throttle a duplex stream, which is both readable and writable. In this example, the duplex stream is throttled to a rate of 512 bytes per second.
const { Throttle } = require('stream-throttle');
const { Duplex } = require('stream');
const duplexStream = new Duplex({
read(size) {
this.push('data');
},
write(chunk, encoding, callback) {
console.log(chunk.toString());
callback();
}
});
const throttle = new Throttle({ rate: 512 }); // 512 bytes per second
duplexStream.pipe(throttle).pipe(duplexStream);
Other packages similar to stream-throttle
limiter
The 'limiter' package provides a generic rate limiting solution that can be used to throttle various types of operations, including streams. It is more flexible in terms of the types of operations it can throttle but requires more manual setup compared to stream-throttle.
bottleneck
The 'bottleneck' package is a powerful rate limiter that can be used to control the rate of asynchronous operations. While it is not specifically designed for streams, it can be adapted to throttle stream operations. It offers advanced features like clustering and priority queues.
stream-meter
The 'stream-meter' package measures the rate of data flowing through a stream but does not throttle it. It can be used in conjunction with other packages to implement throttling based on the measured rate. It is useful for monitoring and logging purposes.
stream-throttle
A rate limiter for Node.js streams.
API usage
This module exports two classes, Throttle
and ThrottleGroup
.
Throttle
creates a single throttled stream, based on stream.Transform
. It accepts an opts
parameter with the following keys:
opts.rate
is the throttling rate, in bytes per second.opts.chunksize
(optional) is the maximum chunk size into which larger writes are decomposed; the default is opts.rate
/10.
The opts
object may also contain options to be passed to the stream.Transform
constructor.
For example, the following code throttles stdin to stdout at 10 bytes per second:
process.stdin.pipe(new Throttle({rate: 10})).pipe(process.stdout)
ThrottleGroup
allows the creation of a group of streams whose aggregate bandwidth is throttled. The constructor accepts the same opts
argument as for Throttle
. Call throttle
on a ThrottleGroup
object to create a new throttled stream belonging to the group.
For example, the following code creates two HTTP connections to www.google.com:80
, and throttles their aggregate (downstream) bandwidth to 10 KB/s:
var addr = { host: 'www.google.com', port: 80 };
var tg = new ThrottleGroup({rate: 10240});
var conn1 = net.createConnection(addr),
conn2 = net.createConnection(addr);
var thr1 = conn1.pipe(tg.throttle()),
thr2 = conn2.pipe(tg.throttle());
// Reads from thr1 and thr2 are throttled to 10 KB/s in aggregate
Command line usage
This package installs a throttleproxy
binary which implements a command-line utility for throttling connections. Run throttleproxy -h
for instructions.
Contributing
Feel free to open an issue or send a pull request.
License
BSD-style. See the LICENSE file.
Author
Copyright © 2013 Tiago Quelhas. Contact me at <tiagoq@gmail.com>
.