8.0.0-pre4 • Published 5 years ago

observable-process v8.0.0-pre4

Weekly downloads
65
License
ISC
Repository
github
Last release
5 years ago

ObservableProcess

CircleCI Coverage Status install size Language grade: JavaScript

ObservableProcess enhances the slightly too low-level Node.JS ChildProcess model with functionality to observe the behavior of processes more conveniently. In particular:

  • easy access to the accumulated content of stdout and stderr
  • await content in stdout and stderr
  • combines stdout and stderr into a new output stream
  • await the process end
  • easier access to the process exit code
  • signals whether the process ended naturally or was manually terminated

ObservableProcess is for short-lived processes, for example when testing the terminal output of applications. Since ObservableProcess stores all output from the child process in memory, executing long-running processes that produce lots of output through ObservableProcess will cause high memory consumption.

Setup

Add this library to your code base:

Load this library into your JavaScript code:

const observableProcess = require("observable-process")

or

import * as observableProcess from "observable-process"

Starting processes

The best way to provide the command to start is in the form of an argv array:

const observable = observableProcess.start(["node", "server.js"])

You can also provide the full command line to run as a string:

const observable = observableProcess.start("node server.js")

By default, the process runs in the current directory. To set a different working directory for the subprocess:

const observable = observableProcess.start("node server.js", { cwd: "~/tmp" })

You can provide custom environment variables for the process:

const observable = observableProcess.start("node server.js", {
  env: {
    foo: "bar",
    PATH: process.env.PATH,
  },
})

Without an env parameter, ObservableProcess uses the environment variables from the parent process.

Reading output

The stdout and stderr variables of an ObservableProcess behave like normal readable streams:

// normal consumption of data from STDOUT via the event stream
observable.stdout.on("data", function () {
  // ...
})

They also provide extra functionality to access and search their aggregated content. To get all content from STDOUT as a string:

const text = observable.stdout.fullText()

To wait for text to appear in STDOUT:

const match = await observable.stdout.waitForText("server is online")
// => "server is online"

To wait for a regular expression on STDOUT:

const match = await observable.stdout.waitForRegex(/running at port \d+/)
// => "running at port 3000"

Comparable functionality is available for stderr. ObservableProcess also provides a new output stream with the combined content of STDOUT and STDERR:

observable.output.on("data", function (data) {
  // ...
})
const text = observable.output.fullText()
await observable.output.waitForText("server is online")
const port = await observable.output.waitForRegex(/running at port \d+./)

You also get a copy of the process output after it ended (see below).

Sending input to the process

ObservableProcess exposes the stdin stream of its underlying ChildProcess:

observable.stdin.write("my input\n")
observable.stdin.end()

Get the process id

observable.pid()

Stop the process

Wait until the process ends naturally:

const result = await observable.waitForEnd()
assert.equal(result, {
  status: "finished",
  exitCode: 0,
  stdText: "... content from STDOUT ...",
  errText: "... content from STDERR ...",
  combinedText: "... content from both STDOUT and STDERR ...",
})

Manually stop the process:

const result = await observable.kill()
assert.equal(result, {
  status: "killed",
  stdText: "... content from STDOUT ...",
  errText: "... content from STDERR ...",
  combinedText: "... content from both STDOUT and STDERR ...",
})

Related libraries

  • nexpect: Allows to define expectations on command output, and send it input, but doesn't allow to add more listeners to existing long-running processes, which makes declarative testing hard.

Development

If you want to hack on ObservableProcess:

  • run all tests: make test
  • run automated code repair: make fix
  • see all make commands: make help

To deploy a new version:

  • update the version in package.json and commit to master
  • run npm publish
8.0.0-pre3

5 years ago

8.0.0-pre4

5 years ago

8.0.0-pre2

5 years ago

8.0.0-pre1

5 years ago

7.0.3

5 years ago

7.0.2

5 years ago

7.0.1

6 years ago

7.0.0

6 years ago

6.0.0

6 years ago

5.0.0

7 years ago

4.1.4

7 years ago

4.1.3

7 years ago

4.1.2

7 years ago

4.1.1

7 years ago

4.1.0

7 years ago

4.0.0

8 years ago

3.4.2

8 years ago

3.4.1

8 years ago

3.4.0

8 years ago

3.3.0

8 years ago

3.2.2

9 years ago

3.2.1

9 years ago

3.2.0

9 years ago

3.1.0

9 years ago

3.0.0

9 years ago

2.3.2

9 years ago

2.3.1

9 years ago

2.3.0

9 years ago

2.2.0

9 years ago

2.1.0

9 years ago

2.0.0

9 years ago

1.3.2

9 years ago

1.3.1

9 years ago

1.3.0

9 years ago

1.2.0

9 years ago

1.1.0

9 years ago

1.0.1

9 years ago

1.0.0

9 years ago

0.8.1

9 years ago

0.8.0

9 years ago

0.7.0

9 years ago

0.6.6

10 years ago

0.6.5

10 years ago

0.6.4

10 years ago

0.6.3

10 years ago

0.6.2

10 years ago

0.6.1

10 years ago

0.6.0

10 years ago

0.5.2

10 years ago

0.5.1

10 years ago

0.5.0

10 years ago

0.4.0

10 years ago

0.3.0

10 years ago

0.2.0

10 years ago

0.1.0

10 years ago