Skip to content

Commit cad41aa

Browse files
Add missing APIs; final changes (#51)
* Relocate things in docs via export order * Update Node docs link to v18 * Add missing APIs * Add doc reorder change entry * Drop misleading/outdated comment
1 parent edb19d9 commit cad41aa

File tree

5 files changed

+198
-29
lines changed

5 files changed

+198
-29
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,29 @@ Breaking changes:
4242

4343
New features:
4444
- Added event handlers for `Writeable` streams (#49 by @JordanMartinez)
45+
- Added missing APIs (#51 by @JordanMartinez)
46+
47+
- readable, readableEnded, readableFlowing, readableHighWaterMark, readableLength
48+
- pipe'
49+
- writeable, writeableEnded, writeableCorked, errored, writeableFinished, writeableHighWaterMark, writeableLength, writeableNeedDrain
50+
- closed, destroyed
51+
- allowHalfOpen
52+
- pipeline
53+
- fromString, fromBuffer
54+
- newPassThrough
4555

4656
Bugfixes:
57+
- Drop misleading comment for `setEncoding` (#51 by @JordanMartinez)
58+
59+
For context, see #37.
4760

4861
Other improvements:
4962
- Bumped CI's node version to `lts/*` (#48 by @JordanMartinez)
5063
- Updated CI `actions/checkout` and `actions/setup-nodee` to `v3` (#48 by @JordanMartinez)
5164
- Format code via purs-tidy; enforce formatting via CI (#48 by @JordanMartinez)
5265
- Refactor tests using `passThrough` streams (#49 by @JordanMartinez)
5366
- Updated FFI to use uncurried functions (#50 by @JordanMartinez)
67+
- Relocated `setEncoding`, `Read`, and `Write` for better locality in docs (#51 by @JordanMartinez)
5468

5569
## [v7.0.0](https://github.com/purescript-node/purescript-node-streams/releases/tag/v7.0.0) - 2022-04-29
5670

src/Node/Stream.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import stream from "node:stream";
2+
13
export const setEncodingImpl = (s, enc) => s.setEncoding(enc);
24

35
export const readChunkImpl = (useBuffer, useString, chunk) => {
@@ -14,6 +16,16 @@ export const readChunkImpl = (useBuffer, useString, chunk) => {
1416
}
1517
};
1618

19+
export const readableImpl = (r) => r.readable;
20+
21+
export const readableEndedImpl = (r) => r.readableEnded;
22+
23+
export const readableFlowingImpl = (r) => r.readableFlowing;
24+
25+
export const readableHighWaterMarkImpl = (r) => r.readableHighWaterMark;
26+
27+
export const readableLengthImpl = (r) => r.readableLength;
28+
1729
export const resumeImpl = (r) => r.resume();
1830

1931
export const pauseImpl = (r) => r.pause;
@@ -22,6 +34,8 @@ export const isPausedImpl = (r) => r.isPaused;
2234

2335
export const pipeImpl = (r, w) => r.pipe(w);
2436

37+
export const pipeCbImpl = (r, w, cb) => r.pipe(w, cb);
38+
2539
export const unpipeAllImpl = (r) => r.unpipe();
2640

2741
export const unpipeImpl = (r, w) => r.unpipe(w);
@@ -48,6 +62,36 @@ export const endCbImpl = (w, cb) => w.end(cb);
4862

4963
export const endImpl = (w) => w.end();
5064

65+
export const writeableImpl = (w) => w.writeable;
66+
67+
export const writeableEndedImpl = (w) => w.writeableEnded;
68+
69+
export const writeableCorkedImpl = (w) => w.writeableCorked;
70+
71+
export const erroredImpl = (w) => w.errored;
72+
73+
export const writeableFinishedImpl = (w) => w.writeableFinished;
74+
75+
export const writeableHighWaterMarkImpl = (w) => w.writeableHighWaterMark;
76+
77+
export const writeableLengthImpl = (w) => w.writeableLength;
78+
79+
export const writeableNeedDrainImpl = (w) => w.writeableNeedDrain;
80+
5181
export const destroyImpl = (w) => w.destroy();
5282

5383
export const destroyErrorImpl = (w, e) => w.destroy(e);
84+
85+
export const closedImpl = (w) => w.closed;
86+
87+
export const destroyedImpl = (w) => w.destroyed;
88+
89+
export const allowHalfOpenImpl = (d) => d.allowHalfOpen;
90+
91+
export const pipelineImpl = (src, transforms, dst, cb) => stream.pipeline([src, ...transforms, dst], cb);
92+
93+
export const readableFromStrImpl = (str) => stream.Readable.from(str, { objectMode: false });
94+
95+
export const readableFromBufImpl = (buf) => stream.Readable.from(buf, { objectMode: false });
96+
97+
export const newPassThrough = () => new stream.PassThrough({ objectMode: false });

src/Node/Stream.purs

Lines changed: 127 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
-- | This module provides a low-level wrapper for the [Node Stream API](https://nodejs.org/api/stream.html).
1+
-- | This module provides a low-level wrapper for the [Node Stream API (v18 LTS)](https://nodejs.org/docs/latest-v18.x/api/stream.html).
22

33
module Node.Stream
4-
( Stream
5-
, Read
6-
, Readable
4+
( Read
75
, Write
6+
, Stream
7+
, Readable
88
, Writable
99
, Duplex
1010
, toEventEmitter
11-
, setEncoding
1211
, closeH
1312
, errorH
1413
, drainH
@@ -23,10 +22,16 @@ module Node.Stream
2322
, readableH
2423
, resumeH
2524
, endH
25+
, readable
26+
, readableEnded
27+
, readableFlowing
28+
, readableHighWaterMark
29+
, readableLength
2630
, resume
2731
, pause
2832
, isPaused
2933
, pipe
34+
, pipe'
3035
, unpipe
3136
, unpipeAll
3237
, read
@@ -35,17 +40,33 @@ module Node.Stream
3540
, readString'
3641
, readEither
3742
, readEither'
43+
, writeable
44+
, writeableEnded
45+
, writeableCorked
46+
, errored
47+
, writeableFinished
48+
, writeableHighWaterMark
49+
, writeableLength
50+
, writeableNeedDrain
3851
, write
3952
, write'
4053
, writeString
4154
, writeString'
4255
, cork
4356
, uncork
57+
, setEncoding
4458
, setDefaultEncoding
4559
, end
4660
, end'
4761
, destroy
4862
, destroy'
63+
, closed
64+
, destroyed
65+
, allowHalfOpen
66+
, pipeline
67+
, fromString
68+
, fromBuffer
69+
, newPassThrough
4970
) where
5071

5172
import Prelude
@@ -240,9 +261,6 @@ readEither' r size = do
240261
-- | Set the encoding used to read chunks as strings from the stream. This
241262
-- | function may be useful when you are passing a readable stream to some other
242263
-- | JavaScript library, which already expects an encoding to be set.
243-
-- |
244-
-- | Where possible, you should try to use `onDataString` instead of this
245-
-- | function.
246264
setEncoding
247265
:: forall w
248266
. Readable w
@@ -282,6 +300,31 @@ resumeH = EventHandle "resume" identity
282300
endH :: forall w. EventHandle0 (Readable w)
283301
endH = EventHandle "end" identity
284302

303+
readable :: forall w. Readable w -> Effect Boolean
304+
readable r = runEffectFn1 readableImpl r
305+
306+
foreign import readableImpl :: forall w. EffectFn1 (Readable w) (Boolean)
307+
308+
readableEnded :: forall w. Readable w -> Effect Boolean
309+
readableEnded r = runEffectFn1 readableEndedImpl r
310+
311+
foreign import readableEndedImpl :: forall w. EffectFn1 (Readable w) (Boolean)
312+
313+
readableFlowing :: forall w. Readable w -> Effect Boolean
314+
readableFlowing r = runEffectFn1 readableFlowingImpl r
315+
316+
foreign import readableFlowingImpl :: forall w. EffectFn1 (Readable w) (Boolean)
317+
318+
readableHighWaterMark :: forall w. Readable w -> Effect Boolean
319+
readableHighWaterMark r = runEffectFn1 readableHighWaterMarkImpl r
320+
321+
foreign import readableHighWaterMarkImpl :: forall w. EffectFn1 (Readable w) (Boolean)
322+
323+
readableLength :: forall w. Readable w -> Effect Boolean
324+
readableLength r = runEffectFn1 readableLengthImpl r
325+
326+
foreign import readableLengthImpl :: forall w. EffectFn1 (Readable w) (Boolean)
327+
285328
-- | Resume reading from the stream.
286329
resume :: forall w. Readable w -> Effect Unit
287330
resume r = runEffectFn1 resumeImpl r
@@ -306,6 +349,11 @@ pipe r w = runEffectFn2 pipeImpl r w
306349

307350
foreign import pipeImpl :: forall w r. EffectFn2 (Readable w) (Writable r) (Unit)
308351

352+
pipe' :: forall w r. Readable w -> Writable r -> { end :: Boolean } -> Effect Unit
353+
pipe' r w o = runEffectFn3 pipeCbImpl r w o
354+
355+
foreign import pipeCbImpl :: forall w r. EffectFn3 (Readable w) (Writable r) ({ end :: Boolean }) (Unit)
356+
309357
-- | Detach a Writable stream previously attached using `pipe`.
310358
unpipe :: forall w r. Readable w -> Writable r -> Effect Unit
311359
unpipe r w = runEffectFn2 unpipeImpl r w
@@ -318,6 +366,46 @@ unpipeAll r = runEffectFn1 unpipeAllImpl r
318366

319367
foreign import unpipeAllImpl :: forall w. EffectFn1 (Readable w) (Unit)
320368

369+
writeable :: forall r. Writable r -> Effect Boolean
370+
writeable w = runEffectFn1 writeableImpl w
371+
372+
foreign import writeableImpl :: forall r. EffectFn1 (Writable r) (Boolean)
373+
374+
writeableEnded :: forall r. Writable r -> Effect Boolean
375+
writeableEnded w = runEffectFn1 writeableEndedImpl w
376+
377+
foreign import writeableEndedImpl :: forall r. EffectFn1 (Writable r) (Boolean)
378+
379+
writeableCorked :: forall r. Writable r -> Effect Boolean
380+
writeableCorked w = runEffectFn1 writeableCorkedImpl w
381+
382+
foreign import writeableCorkedImpl :: forall r. EffectFn1 (Writable r) (Boolean)
383+
384+
errored :: forall rw. Stream rw -> Effect Boolean
385+
errored rw = runEffectFn1 erroredImpl rw
386+
387+
foreign import erroredImpl :: forall rw. EffectFn1 (Stream rw) (Boolean)
388+
389+
writeableFinished :: forall r. Writable r -> Effect Boolean
390+
writeableFinished w = runEffectFn1 writeableFinishedImpl w
391+
392+
foreign import writeableFinishedImpl :: forall r. EffectFn1 (Writable r) (Boolean)
393+
394+
writeableHighWaterMark :: forall r. Writable r -> Effect Number
395+
writeableHighWaterMark w = runEffectFn1 writeableHighWaterMarkImpl w
396+
397+
foreign import writeableHighWaterMarkImpl :: forall r. EffectFn1 (Writable r) (Number)
398+
399+
writeableLength :: forall r. Writable r -> Effect Number
400+
writeableLength w = runEffectFn1 writeableLengthImpl w
401+
402+
foreign import writeableLengthImpl :: forall r. EffectFn1 (Writable r) (Number)
403+
404+
writeableNeedDrain :: forall r. Writable r -> Effect Boolean
405+
writeableNeedDrain w = runEffectFn1 writeableNeedDrainImpl w
406+
407+
foreign import writeableNeedDrainImpl :: forall r. EffectFn1 (Writable r) (Boolean)
408+
321409
write :: forall r. Writable r -> Buffer -> Effect Boolean
322410
write w b = runEffectFn2 writeImpl w b
323411

@@ -385,3 +473,34 @@ destroy' w e = runEffectFn2 destroyErrorImpl w e
385473

386474
foreign import destroyErrorImpl :: forall r. EffectFn2 (Stream r) (Error) Unit
387475

476+
closed :: forall r. Stream r -> Effect Boolean
477+
closed w = runEffectFn1 closedImpl w
478+
479+
foreign import closedImpl :: forall r. EffectFn1 (Stream r) (Boolean)
480+
481+
destroyed :: forall r. Stream r -> Effect Boolean
482+
destroyed w = runEffectFn1 destroyedImpl w
483+
484+
foreign import destroyedImpl :: forall r. EffectFn1 (Stream r) (Boolean)
485+
486+
allowHalfOpen :: Duplex -> Effect Boolean
487+
allowHalfOpen d = runEffectFn1 allowHalfOpenImpl d
488+
489+
foreign import allowHalfOpenImpl :: EffectFn1 (Duplex) (Boolean)
490+
491+
pipeline :: forall w r. Readable w -> Array Duplex -> Writable r -> (Error -> Effect Unit) -> Effect Unit
492+
pipeline src transforms dest cb = runEffectFn4 pipelineImpl src transforms dest cb
493+
494+
foreign import pipelineImpl :: forall w r. EffectFn4 (Readable w) (Array Duplex) (Writable r) ((Error -> Effect Unit)) (Unit)
495+
496+
fromString :: String -> Effect (Readable ())
497+
fromString str = runEffectFn1 readableFromStrImpl str
498+
499+
foreign import readableFromStrImpl :: EffectFn1 (String) (Readable ())
500+
501+
fromBuffer :: Buffer -> Effect (Readable ())
502+
fromBuffer buf = runEffectFn1 readableFromBufImpl buf
503+
504+
foreign import readableFromBufImpl :: EffectFn1 (Buffer) (Readable ())
505+
506+
foreign import newPassThrough :: Effect Duplex

test/Main.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1 @@
11
export { createGzip, createGunzip } from "zlib";
2-
import { PassThrough } from "stream";
3-
4-
export function passThrough() {
5-
return new PassThrough;
6-
}

0 commit comments

Comments
 (0)