Need help with stream-spec?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

dominictarr
126 Stars 8 Forks 66 Commits 2 Opened issues

Description

executable specification for Stream (make testing streams easy)

Services available

!
?

Need anything else?

Contributors list

# 21,714
JavaScr...
Shell
Markdow...
Electro...
55 commits
# 2,308
nextjs
GitHub
pull-re...
bug-tra...
1 commit
# 42,467
JavaScr...
Node.js
C
contrib...
1 commit
# 711
C++
node
Linux
js
1 commit
# 72,689
html5
vanilla...
Vanilla...
twilio
1 commit
# 242,160
HTML
CSS
Shell
elastic...
1 commit

StreamSpec

Automatic checking of the Stream implementations.

stream-spec
instruments your stream to verify that it has correct behaviour. All you need to do to test a stream is to wrap it with
stream-spec
, and then pipe some test data through it. it's purpose it to make it easy to test user-land streams have correct behavour.

correct stream behaviour illustrated

correct stream behaviour explained

stream api design style

a simple test

using stream-tester

var spec = require('stream-spec')
var tester = require('stream-tester')

spec(stream) .through({strict: true}) .validateOnExit()

tester.createRandomStream(function () { return 'line ' + Math.random() + '\n' }, 1000) .pipe(stream) .pipe(tester.createPauseStream())

send 1000 random lines through the stream and check that it buffers on pause.

types of
Stream

Writable (but not readable)

a

WritableStream
must implement
write
,
end
,
destroy
and emit
'drain'
if it pauses, and
'close'
after the stream ends, or is destroyed.

If the stream is sync (does no io) it probably does not need to pause, so the

write()
should never equal
false
spec(stream)
  .writable()
  .drainable()
  .validateOnExit()

Readable (but not writable)

a

ReadableStream
must emit
'data'
,
'end'
, and implement
destroy
, and
'close'
after the stream ends, or is destroyed. is strongly recommended to implement
pause
and
resume

If the option

{strict: true}
is passed, it means the stream is not allowed to emit
'data'
or
'end'
when the stream is paused.

If the option

{end: false}
is passed, then end may not be emitted.
spec(stream)
  .readable()
  .pausable({strict: true})) //strict is optional.
  .validateOnExit()

Through (sync writable and readable, aka: 'filter')

A

Stream
that is both readable and writable, and where the input is processed and then emitted as output, more or less directly. Example, zlib. contrast this with duplex stream.

when you call

pause()
on a
ThroughStream
, it should change it into a paused state on the writable side also, and
write()===false
. Calling
resume()
should cause
'drain'
to be emitted eventually.

If the option

{strict: true}
is passed, it means the stream is not allowed to emit
'data'
or
'end'
when the stream is paused.
spec(stream)
  .through({strict: true}) //strict is optional. 
  .validateOnExit()

Duplex

A

Stream
that is both readable and writable, but the streams go off to some other place or thing, and are not coupled directly. The readable and writable side of a
DuplexStream
each have their own pause state.

If the option

{strict: true}
is passed, it means the stream is not allowed to emit
'data'
or
'end'
when the stream is paused.
spec(stream)
  .duplex({strict: true})
  .validateOnExit()

other options

spec(stream, name) //use name as the name of the stream in error messages.

spec(stream, { name: name, //same as above. strict: true, //'data' nor 'end' may be emitted when paused. error: true, //this stream must error. error: false, //this stream must not error. //if neither error: boolean option is passed, the stream may error. })

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.