A major new feature release, see release announcement.
Feature: Simplify usage by supporting new default loop. (#159 by @clue)
// old (still supported)
$stream = new ReadableResourceStream($resource, $loop);
$stream = new WritabeResourceStream($resource, $loop);
$stream = new DuplexResourceStream($resource, $loop);
// new (using default loop)
$stream = new ReadableResourceStream($resource);
$stream = new WritabeResourceStream($resource);
$stream = new DuplexResourceStream($resource);
Fix: Fix faulty write buffer behavior when sending large data chunks over TLS (Mac OS X only). (#150 by @clue)
Minor code style improvements to fix phpstan analysis warnings and
add .gitattributes
to exclude dev files from exports.
(#140 by @flow-control and #144 by @reedy)
Improve test suite to run tests on PHP 7.4 and simplify test matrix. (#147 by @clue)
Improvement: Increase performance by optimizing global function and constant look ups. (#137 by @WyriHaximus)
Travis: Test against PHP 7.3. (#138 by @WyriHaximus)
Fix: Ignore empty reads. (#139 by @WyriHaximus)
Contains no other changes, so it's actually fully compatible with the v0.7.7 release.
Fix: Work around reading from unbuffered pipe stream in legacy PHP < 5.4.28 and PHP < 5.5.12 (#126 by @clue)
Improve test suite by simplifying test bootstrapping logic via Composer and test against PHP 7.2 (#127 by @clue and #124 by @carusogabriel)
Fix: Igore excessive fopen()
mode flags for WritableResourceStream
(#119 by @clue)
Fix: Fix forward compatibility with upcoming EventLoop releases (#121 by @clue)
Restructure examples to ease getting started (#123 by @clue)
Improve test suite by adding forward compatibility with PHPUnit 6 and ignore Mac OS X test failures for now until Travis tests work again (#122 by @gabriel-caruso and #120 by @clue)
Fix: Remove event listeners from CompositeStream
once closed and
remove undocumented left-over close
event argument
(#116 by @clue)
Minor documentation improvements: Fix wrong class name in example, fix typos in README and fix forward compatibility with upcoming EventLoop releases in example (#113 by @docteurklein and #114 and #115 by @clue)
Improve test suite by running against Mac OS X on Travis (#112 by @clue)
Improvement: Support Événement 3.0 a long side 2.0 and 1.0 (#108 by @WyriHaximus)
Readme: Corrected loop initialization in usage example (#109 by @pulyavin)
Travis: Lock linux distribution preventing future builds from breaking (#110 by @clue)
$writeChunkSize
parameter to limit maximum number of
bytes to write at once.
(#105 by @clue)$stream = new WritableResourceStream(STDOUT, $loop, null, 8192);
Ignore HHVM test failures for now until Travis tests work again (#106 by @clue)
Removed / BC break: Remove deprecated and unneeded functionality (#45, #87, #90, #91 and #93 by @clue)
Remove deprecated Stream
class, use DuplexResourceStream
instead
(#87 by @clue)
Remove public $buffer
property, use new constructor parameters instead
(#91 by @clue)
Remove public $stream
property from all resource streams
(#90 by @clue)
Remove undocumented and now unused ReadableStream
and WritableStream
(#93 by @clue)
Feature / BC break: Simplify ThroughStream
by using data callback instead of
inheritance. It is now a direct implementation of DuplexStreamInterface
.
(#88 and #89 by @clue)
$through = new ThroughStream(function ($data) {
return json_encode($data) . PHP_EOL;
});
$through->on('data', $this->expectCallableOnceWith("[2, true]\n"));
$through->write(array(2, true));
CompositeStream
starts closed if either side is
already closed and forwards pause to pipe source on first write attempt.
(#96 and #103 by @clue)
If either side of the composite stream closes, it will also close the other side. We now also ensure that if either side is already closed during instantiation, it will also close the other side.
BC break: Mark all classes as final
and
mark internal API as private
to discourage inheritance
(#95 and #99 by @clue)
Feature / BC break: Only emit error
event for fatal errors
(#92 by @clue)
The
error
event was previously also allowed to be emitted for non-fatalerrors, but our implementations actually only ever emitted this as a fatal error and then closed the stream.
Feature: Explicitly allow custom events and exclude any semantics (#97 by @clue)
Strict definition for event callback functions (#101 by @clue)
Support legacy PHP 5.3 through PHP 7.1 and HHVM and improve usage documentation (#100 and #102 by @clue)
Actually require all dependencies so this is self-contained and improve forward compatibility with EventLoop v1.0 and v0.5 (#94 and #98 by @clue)
// old (does still work for BC reasons)
$stream = new Stream($connection, $loop);
// new
$stream = new DuplexResourceStream($connection, $loop);
Note that the DuplexResourceStream
now rejects read-only or write-only
streams, so this may affect BC. If you want a read-only or write-only
resource, use ReadableResourceStream
or WritableResourceStream
instead of
DuplexResourceStream
.
BC note: This class was previously called
Stream
. TheStream
class stillexists for BC reasons and will be removed in future versions of this package.
// old
$stream = new Buffer(STDOUT, $loop);
// new
$stream = new WritableResourceStream(STDOUT, $loop);
$stream = new ReadableResourceStream(STDIN, $loop);
BC note: This is known to affect process pipes on Windows which do not
support non-blocking I/O and could thus block the whole EventLoop previously.
Feature / Fix / BC break: Consistent semantics for
DuplexStreamInterface::end()
to ensure it SHOULD also end readable side
(#86 by @clue)
Fix: Do not use unbuffered reads on pipe streams for legacy PHP < 5.4 (#80 by @clue)
The end
event will now only be emitted for a successful end, not if the
stream closes due to an unrecoverable error
event or if you call close()
explicitly.
If you want to detect when the stream closes (terminates), use the close
event instead.
The
full-drain
event was undocumented and mostly used internally.Relying on this event has attracted some low-quality code in the past, so we've removed this from the public API in order to work out a better solution instead. If you want to detect when the buffer finishes flushing data to the stream, you may want to look into its `end()` method or the `close` event instead.
The documentation now explicitly defines each event and its arguments. Custom events and event arguments are still supported. Most notably, all defined events only receive inherently required event arguments and no longer transmit the instance they are emitted on for consistency and performance reasons.
// old (inconsistent and not supported by all implementations)
$stream->on('data', function ($data, $stream) {
// process $data
});
// new (consistent throughout the whole ecosystem)
$stream->on('data', function ($data) use ($stream) {
// process $data
});
This mostly adds documentation (and thus some stricter, consistent
definitions) for the existing behavior, it does NOT define any major changes otherwise. Most existing code should be compatible with these changes, unless it relied on some undocumented/unintended semantics.
This mostly adds documentation (and thus some stricter, consistent
definitions) for the existing behavior, it does NOT define any major changes otherwise. Most existing code should be compatible with these changes, unless it relied on some undocumented/unintended semantics.
The source stream will now always be paused via pause()
when the
destination stream closes. Also, properly stop piping if the source
stream closes and remove all event forwarding.
require-dev
and improving coverage.
(#74 and #75 by @clue, #66 by @nawarian)Feature: The Buffer
can now be injected into the Stream
(or be used standalone)
(#62 by @clue)
Fix: Forward close
event only once for CompositeStream
and ThroughStream
(#60 by @clue)
Fix: Consistent close
event behavior for Buffer
(#61 by @clue)
Feature: Support setting read buffer size to null
(infinite)
(#42 by @clue)
Fix: Do not emit full-drain
event if Buffer
is closed during drain
event
(#55 by @clue)
Vastly improved performance by factor of 10x to 20x. Raise default buffer sizes to 64 KiB and simplify and improve error handling and unneeded function calls. (#53, #55, #56 by @clue)
Bug fix: Emit error
event and close Stream
when accessing the underlying
stream resource fails with a permanent error.
(#52 and #40 by @clue, #25 by @lysenkobv)
Bug fix: Do not emit empty data
event if nothing has been read (stream reached EOF)
(#39 by @clue)
Add benchmarking script to measure throughput in CI (#41 by @clue)
ReadableStreamInterface
on BufferedSink::createPromise()
Buffer::write()