What is the best way to create a readable stream from an array and pipe values to a writable stream? I have seen substack\'s example using setInterval and I can implement that s
You can solve this problem by creating a readable stream and pushing values into it.
Streams are a pain, but it's often easier to work with them directly than to use libraries.
If you're working with an array of strings or buffers, this will work:
'use strict'
const Stream = require('stream')
const readable = new Stream.Readable()
readable.pipe(process.stdout)
const items = ['a', 'b', 'c']
items.forEach(item => readable.push(item))
// no more data
readable.push(null)
Notes:
readable.pipe(process.stdout)
does two things: puts the stream into "flowing" mode and sets up the process.stdout writable stream to receive data from readable
Readable#push
method is for the creator of the readable stream, not the stream consumer.Readable#push(null)
to signal that there is no more data.To make a stream from an array of things that are neither strings nor buffers, you need both the readable stream and the writable stream to be in "Object Mode". In the example below, I made the following changes:
{objectMode: true}
Instead of piping to process.stdout
, pipe to a simple writable stream that is in object mode.
'use strict'
const Stream = require('stream')
const readable = new Stream.Readable({objectMode: true})
const writable = new Stream.Writable({objectMode: true})
writable._write = (object, encoding, done) => {
console.log(object)
// ready to process the next chunk
done()
}
readable.pipe(writable)
const items = [1, 2, 3]
items.forEach(item => readable.push(item))
// end the stream
readable.push(null)
Where is the data coming from? If it's a streaming data source, it's better to manipulate the stream using a transform stream than to convert to/from an array.