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

process-streams

v1.0.3

Published

Wrapper for piping data into and out of child processes

Downloads

148,857

Readme

process-streams

NPM version ci-badge

Wrapper for piping data into and out of child processes

Motivation

The goal of this small package is to provide a interface for streaming data to and from child-processes. It may be possible to stream data to a process via stdout and read the result from stdin, but it may also be necessary to store the data in a temporary file and provide the filename to the process as argument.

A concrete example is ffmpeg: It is possible to encode webm-videos to a stream, but h264 must always be stored in a temporary file first. On the other hand in some cases it is not possible to stream data into ffmpeg, so data must be stored in a temporary file prior to calling ffmpeg.

Overview

ProcessStreams provides the methods exec, execFile and spawn from the child_process with the same arguments. The return value however is always a through-stream. The command line arguments are examined for occurences of the strings <INPUT> and <OUTPUT>.

  • If <INPUT> is present, the stream input is piped into a temporary file and <INPUT> is replaced by its filename.
  • If <OUTPUT> is present, it is replaced by the name of a temporary file and the contents of this file is used as stream output for the resulting stream.
  • If <INPUT> or <OUTPUT> are not present, the stream input is directly piped to the child processes stdin (or the child processes stdout is piped to the stream output).

Temporary files are always deleted when no longer needed.

Installation

npm install process-streams

Simple Examples

The following examples actually only pipes data to stdout, but via child processes with different temp-file options.

const stringToStream = require('string-to-stream')

const ProcessStream = require('process-streams')
const ps = new ProcessStream()

// This basically pipes the stream as-is to stdout
// through multiple variations of process-streams

// Temporary files for input and output
stringToStream('hello\n')
  .pipe(ps.exec('cp <INPUT> <OUTPUT>'))
  .pipe(ps.spawn('cp', ['<INPUT>', '<OUTPUT>']))
  .pipe(ps.execFile('cp', ['<INPUT>', '<OUTPUT>']))

  // Stream input, use temp-file for output
  .pipe(ps.spawn('tee', ['<OUTPUT>']))

  // Temp-file for input, Stream for output
  .pipe(ps.spawn('cat', ['<INPUT>']))

  // Pipe both sides
  .pipe(ps.spawn('cat'))

  // Result to stdout
  .pipe(process.stdout)

Output:

hello

Functions

ps.spawn(command, [args], [options])

For details about function arguments please refer to the api documentation of child_process.spawn(command, [args], [options])

ps.exec(command, [options], callback)

For details about function arguments please refer to the api documentation of child_process.exec(command, [options], callback)

ps.execFile(file, [args], [options], [callback])

For details about function arguments please refer to the api documentation of child_process.execFile(file, [args], [options], [callback])

ps.factory(useTmpIn, useTmpOut, callback)

This function uses the provided callback to connect input and output of the resulting stream. useTmpIn and useTmpOut are booleans that define which parts of the stream temp should use temp files. callback has the signature function(input, output, callback). "input" and "output" are either streams of paths of temporary files. The callback must be called when data is available for output. If "tmpUseOut" is false, this can be called immediately. It "tmpUseOut" is true it must be called, when the output tempfile has completely been written to.

Changing the placeholder tokens

The tokens <INPUT> and <OUTPUT> can be changed:

const stringToStream = require('string-to-stream')

const ProcessStream = require('process-streams')
const ps = new ProcessStream('[IN]', '[OUT]')
stringToStream('hello\n')
  .pipe(ps.exec('cp [IN] [OUT]'))
  .pipe(process.stdout)

Events

Process errors (such as not finding the executable file) are emitted on the resulting stream as 'error' event. The 'started' event is emitted when the is started. Its first argument is the child-process object, second and third arguments are the command and args passed to ps.exec, ps.spawn or ps.execFile), but with the placeholders resolved to the their actual temporary files.

const stringToStream = require('string-to-stream')

const ProcessStream = require('process-streams')
const ps = new ProcessStream()

stringToStream('hello\n')
  .pipe(ps.spawn('cat'))
  .on('error', function (err) {
    // Handle errors
    console.log('error', err)
  })
  .on('input-closed', function (err) {
    // Handle ECONNRESET and EPIPE processe's stdin
    console.log('input-closed', err)
  })
  .on('started', function (process, command, args) {
    // If "ps.exec" is called, 'command' contains the whole
    // resolved command and 'args' is undefined.
  })
  .on('exit', function (code, signal) {
    // see the 'child_process' documentation for the 'exit'-event.
  })
  .pipe(process.stdout)

License

process-streams is published under the MIT-license.

See LICENSE for details.

Release-Notes

For release notes, see CHANGELOG.md

Contributing guidelines

See CONTRIBUTING.md.

Funding :coffee:

You can send me money, if you like my work: