Skip to content

Commit 0bee861

Browse files
authored
Merge pull request #7 from clue-labs/error-first
Reject first() when stream emits an error event
2 parents 1793f25 + 00334dc commit 0bee861

3 files changed

Lines changed: 12 additions & 2 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ event does not pass any data.
8989
If you do not pass a custom event name, then it will wait for the first "data"
9090
event and resolve with a string containing the first data chunk.
9191

92+
The promise will reject if the stream emits an error – unless you're waiting for
93+
the "error" event, in which case it will resolve.
94+
9295
The promise will reject once the stream closes – unless you're waiting for the
9396
"close" event, in which case it will resolve.
9497

src/functions.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ function first(EventEmitterInterface $stream, $event = 'data')
8484
};
8585
$stream->on($event, $listener);
8686

87+
if ($event !== 'error') {
88+
$stream->on('error', function ($error) use ($stream, $event, $listener, $reject) {
89+
$stream->removeListener($event, $listener);
90+
$reject(new \RuntimeException('An error occured on the underlying stream while waiting for event', 0, $error));
91+
});
92+
}
93+
8794
$stream->on('close', function () use ($stream, $event, $listener, $reject) {
8895
$stream->removeListener($event, $listener);
8996
$reject(new \RuntimeException('Stream closed'));

tests/FirstTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ public function testEmittingDataOnStreamResolvesWithFirstEvent()
7676
$this->expectPromiseResolveWith('hello', $promise);
7777
}
7878

79-
public function testEmittingErrorOnStreamDoesNothing()
79+
public function testEmittingErrorOnStreamWillReject()
8080
{
8181
$stream = new ThroughStream();
8282
$promise = Stream\first($stream);
8383

8484
$stream->emit('error', array(new \RuntimeException('test')));
8585

86-
$promise->then($this->expectCallableNever(), $this->expectCallableNever());
86+
$this->expectPromiseReject($promise);
8787
}
8888

8989
public function testEmittingErrorResolvesWhenWaitingForErrorEvent()

0 commit comments

Comments
 (0)