npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

streamable-buffers

v3.3.2

Published

Buffer-backed Streams for reading and writing.

Downloads

200

Readme

Note: the library uses some ES6 features

Node Streamable Buffers

Build Status Code Climate Code Coverage npm

Simple Readable and Writable Streams that use a Buffer to store received data, or for data to send out. Useful for test code, debugging, and a wide range of other utilities.

npm install streamable-buffers --save

Usage

To use the stream buffers in your module, simply import it and away you go.

const streamBuffers = require('streamable-buffers');

WritableStreamBuffer

WritableStreamBuffer implements the standard stream.Writable interface. All writes to this stream will accumulate in an internal Buffer. If the internal buffer overflows it will be resized automatically. The initial size of the Buffer and the amount in which it grows can be configured in the constructor.

There is also a possibility to limit the maximum amount of bytes to be written to the buffer, by specifying the limit option. If the limit is reached - an Error will be thrown, and 'error' event will be emitted.

const myWritableStreamBuffer = new streamBuffers.WritableStreamBuffer({
	initialSize: (100 * 1024),    // start at 100 kilobytes.
	incrementAmount: (10 * 1024), // grow by 10 kilobytes each time buffer overflows.
	limit: (1024 * 1024)          // maximum buffer size to write is 1 megabyte
});

The default initial size and increment amount are stored in the following constants:

streamBuffers.DEFAULT_INITIAL_SIZE      // (8 * 1024)
streamBuffers.DEFAULT_INCREMENT_AMOUNT  // (8 * 1024)
streamBuffers.DEFAULT_LIMIT             // (64 * 1024)

Writing is standard Stream stuff:

myWritableStreamBuffer.write(myBuffer);
// - or -
myWritableStreamBuffer.write('\u00bd + \u00bc = \u00be', 'utf8');

You can query the size of the data being held in the Buffer, and also how big the Buffer's max capacity currently is:

myWritableStreamBuffer.write('ASDF');
streamBuffers.size();     // 4.
streamBuffers.maxSize();  // Whatever was configured as initial size. In our example: (100 * 1024).

Retrieving the contents of the Buffer is simple.

// Gets all held data as a Buffer.
myWritableStreamBuffer.getContents();

// Gets all held data as a utf8 string.
myWritableStreamBuffer.getContentsAsString('utf8');

// Gets first 5 bytes as a Buffer.
myWritableStreamBuffer.getContents(5);

// Gets first 5 bytes as a utf8 string.
myWritableStreamBuffer.getContentsAsString('utf8', 5);

Care should be taken when getting encoded strings from WritableStream, as it doesn't really care about the contents (multi-byte characters will not be respected).

Destroying or ending the WritableStream will not delete the contents of Buffer, but will disallow any further writes.

myWritableStreamBuffer.write('ASDF');
myWritableStreamBuffer.end();
myWritableStreamBuffer.getContentsAsString(); // -> 'ASDF'

ReadableStreamBuffer

ReadableStreamBuffer implements the standard stream.Readable, but can have data inserted into it. This data will then be pumped out in chunks as readable events. The data to be sent out is held in a Buffer, which can grow in much the same way as a WritableStreamBuffer does, if data is being put in Buffer faster than it is being pumped out.

The frequency in which chunks are pumped out, and the size of the chunks themselves can be configured in the constructor. The initial size and increment amount of internal Buffer can be configured too. In the following example 2kb chunks will be output every 10 milliseconds:

const myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
	frequency: 10,   // in milliseconds.
	chunkSize: 2048  // in bytes.
});

Default frequency and chunk size:

streamBuffers.DEFAULT_CHUNK_SIZE  // (1024)
streamBuffers.DEFAULT_FREQUENCY   // (1)

Putting data in Buffer to be pumped out is easy:

myReadableStreamBuffer.put(aBuffer);
myReadableStreamBuffer.put('A String', 'utf8');

Chunks are pumped out via standard stream.Readable semantics. This means you can use the old streams1 way:

myReadableStreamBuffer.on('data', function(data) {
  // streams1.x style data
  assert.isTrue(data instanceof Buffer);
});

Or the streams2+ way:

myReadableStreamBuffer.on('readable', function(data) {
  var chunk;
  while((chunk = myReadableStreamBuffer.read()) !== null) {
    assert.isTrue(chunk instanceof Buffer);
  }
});

Because ReadableStreamBuffer is simply an implementation of stream.Readable, it implements pause / resume / setEncoding / etc.

Once you're done putting data into a ReadableStreamBuffer, you can call stop() on it.

myReadableStreamBuffer.put('the last data this stream will ever see');
myReadableStreamBuffer.stop();

Once the ReadableStreamBuffer is done pumping out the data in its internal buffer, it will emit the usual end event. You cannot write any more data to the stream once you've called stop() on it.

It is possible to simulate 'error' Event:

myReadableStreamBuffer.on('error', function(err) {
  ...
});
myReadableStreamBuffer.put('Send some data', 'utf-8')
myReadableStreamBuffer.error();  // interrupt with simulating invalid chunk

You cannot write any more data to the stream once you've called error() on it.

License

node-stream-buffer is free and unencumbered public domain software. For more information, see the accompanying UNLICENSE file.