Publishable (Readable) stream
This package is an experiment to provide a Readable-stream with push functionality.
But wait, push()
is already the cornerstone of Readable streams!
Unfortunately the true push
functionality is only available when all
data is known (and buffered!) before the Readable is piped to a sink,
otherwise you'll get a read() not implemented
error. If either of
these conditions is impossible, you're required to find a way to offer
data up for the read()
function, which at times is unwieldy, if only
conceptually.
Sometimes it is easier to publish chunks when they become known,
e.g. with EventEmitters or Observables. Publishable
extends an
ordinary Readable
stream to offer publish(chunk: T | null)
in
stead of read(size?: number)
.
npm install @strong-roots-capital/publishable
import Publishable from '@strong-roots-capital/publishable'
const source = new Publishable()
const sink = new Writable({
write(chunk: Buffer, _: string, callback: any) {
console.log(chunk.toString())
callback()
}
})
source.pipe(sink)
source.publish('hi there')
source.publish('face here')
source.publish(null)
Note that objectMode
is supported as are all other
_Readable.ReadableOptions
const source = new Publishable<T>({objectMode: true})
Generics are accepted to a limited extent (they do not carry over to
any pipe
d streams but can be used to limit what is published through
a Publishable).
For more experiments with streams, check out the following projects
Do note they are not compatible with node's built-in streams.