A stream reader with async functions

Downloads in past


1.2.06 years ago6 years agoMinified + gzip package size for async-stream-reader in KB


!NPM versionnpm-imagenpm-url !build statustravis-imagetravis-url !Test coveragecoveralls-imagecoveralls-url
An async way to read stream


Sometime you may want to read something from a stream, typically a file stream, in an async-await style. This tool may help you by providing an async read method for streams.
The async-stream-reader holds events and returns them one by one every time async StreamReader#next get called. If async-stream-reader has got some events in the holder, it will try to pause the input stream, and resume it if the holder get empty.
So as long as the input stream supports pause and resume, you can just do your work at each frame of data at ease, without worring missing something, or memory consumed in large quantities


const fs            = require('fs');
const readline      = require('readline');
const StreamReader  = require('async-stream-reader');

const rl = readline.createInterface({
    input: fs.createReadStream("./foo.txt");
const reader = new StreamReader(rl, {
    events: { data: 'line', end: 'close' },

async main() {
    let line;
    while (line = await {

main().catch(error => console.log(error));

API docs

StreamReader#constructor(readableStream, options)

  • readableStream: The stream you want to read data from. In fact it can be either a readable stream or an event emitter. the reaableStream should have method 'on' to listen to the data/end/error events, and methods 'pause' / 'resume' / 'isPaused' to control the input flow (but input flow control methods are not required, though missing them may cause events stacking in a large amount).
  • options: 'options.puase', 'options.resume' and 'options.isPuased' should be strings and refers to the method names to control the input stream, defaults are 'pause', 'resume' and 'isPaused'. is an object with properties 'data', 'end' and 'error', each of them refers to the name of the event the stream should emit. Event name can be a string or an array of strings.

async StreaReader#next() throws Error

  • Returns the payload on the next event. If stream ended, undefined or options.end will be returned.
  • Caution! Payloads are stored in a queue as well as errors. That means if an error occurred, it won't be thrown until get called and consumes the error on the head of the queue.


Thanks @Divvito for rewriting this in typescript version.