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

magic-pump

v0.0.3

Published

This useful tool is for you who want to read the same stream multiple times.

Downloads

29

Readme

Magic Pump

This useful tool is for you who want to read the same stream multiple times and works exactly like the classic pump.

What problem does it solve?

The classic pump library cant reuse the same stream to read, what sometimes is needed like in cases that we need pump two or more times a stream like the req (request of Express) for example.

Usage of Magic Pump

You just have to pass the stream source and stream dest to be pumped and then process your logic in callback.

var magicpump = require('magicpump');
var fs = require('fs');

var source = fs.createReadStream('/dev/random');
var dest = fs.createWriteStream('/dev/null');

magicpump(source, dest, function(err){
  console.log('pipe finished', err);
});

setTimeout(function() {
  dest.destroy() // when dest is closed magic pump will destroy source
}, 1000)

Usage of classic Pump

Simply pass the streams you want to pipe together to pump and add an optional callback:

var pump = require('pump')
var fs = require('fs')
 
var source = fs.createReadStream('/dev/random')
var dest = fs.createWriteStream('/dev/null')
 
pump(source, dest, function(err) {
  console.log('pipe finished', err)
})
 
setTimeout(function() {
  dest.destroy() // when dest is closed pump will destroy source
}, 1000)

Difference between Magic-Pump and Pump

Let's have a look on the following source code:

var source = fs.createReadStream('/dev/random');

function pumpA(data) {
  console.log('the data of pump A is... ', data.toString('utf8'));
}

function pumpB(data) {
  console.log('the data of pump B is... ', data.toString('utf8'));
}

function pumpC(data) {
  console.log('the data of pump C is... ', data.toString('utf8'));
}

pump(source, concat(pumpA), (err) => {
  pump(source, concat(pumpB), (err) => {
    pump(source, concat(pumpC), (err) => {
      console.log('all pipes finished', err);
    });
  });
});

If you try execute that, should get an error like this:

the data of pump A is...  [content of source stream here]
pipe finished Error: premature close
the data of pump B is... undefined
pipe finished
the data of pump C is... undefined
pipe finished

With Magic Pump you can solve this problem! Magic Pump create a new stream in memory and duplicate the buffer if you want read the same stream more than one time. Let's see:

var source = fs.createReadStream('/dev/random');

function pumpA(data) {
  console.log('the data of pump A is... ', data.toString('utf8'));
}

function pumpB(data) {
  console.log('the data of pump B is... ', data.toString('utf8'));
}

function pumpC(data) {
  console.log('the data of pump C is... ', data.toString('utf8'));
}

magicpump(source, concat(pumpA), (err) => {
  magicpump(source, concat(pumpB), (err) => {
    magicpump(source, concat(pumpC), (err) => {
      console.log('all pipes finished', err);
    });
  });
});

And all is done! The magic pump will do the work and clone those buffers internally for you, giving the correct data output like this:

the data of pump A is...  [content of source stream here]
the data of pump B is...  [content of source stream here]
the data of pump C is...  [content of source stream here]
pipe finished