1
0
mirror of https://github.com/danog/byte-stream.git synced 2024-11-30 04:19:23 +01:00

Add async readline/echo and add composer commands

This commit is contained in:
Daniil Gentili 2019-07-15 16:16:07 +02:00
parent 22113f2f14
commit eaec19ea30
6 changed files with 93 additions and 10 deletions

View File

@ -52,5 +52,14 @@
"platform": { "platform": {
"php": "7.0.0" "php": "7.0.0"
} }
},
"scripts": {
"check": [
"@cs",
"@test"
],
"cs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff --dry-run",
"cs-fix": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff",
"test": "@php -dzend.assertions=1 -dassert.exception=1 ./vendor/bin/phpunit --coverage-text"
} }
} }

View File

@ -1,15 +1,15 @@
<?php <?php
use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Amp\ByteStream\ZlibOutputStream; use Amp\ByteStream\ZlibOutputStream;
use Amp\Loop; use Amp\Loop;
use function Amp\ByteStream\getStdin;
use function Amp\ByteStream\getStdout;
require __DIR__ . "/../vendor/autoload.php"; require __DIR__."/../vendor/autoload.php";
Loop::run(function () { Loop::run(function () {
$stdin = new ResourceInputStream(STDIN); $stdin = getStdin();
$stdout = new ResourceOutputStream(STDOUT); $stdout = getStdout();
$gzout = new ZlibOutputStream($stdout, ZLIB_ENCODING_GZIP); $gzout = new ZlibOutputStream($stdout, ZLIB_ENCODING_GZIP);

View File

@ -1,15 +1,15 @@
<?php <?php
use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Amp\ByteStream\ZlibInputStream; use Amp\ByteStream\ZlibInputStream;
use Amp\Loop; use Amp\Loop;
use function Amp\ByteStream\getStdin;
use function Amp\ByteStream\getStdout;
require __DIR__ . "/../vendor/autoload.php"; require __DIR__."/../vendor/autoload.php";
Loop::run(function () { Loop::run(function () {
$stdin = new ResourceInputStream(STDIN); $stdin = getStdin();
$stdout = new ResourceOutputStream(STDOUT); $stdout = getStdout();
$gzin = new ZlibInputStream($stdin, ZLIB_ENCODING_GZIP); $gzin = new ZlibInputStream($stdin, ZLIB_ENCODING_GZIP);

View File

@ -0,0 +1,18 @@
<?php
use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Amp\ByteStream\ZlibOutputStream;
use Amp\Loop;
use function Amp\ByteStream\bufferEcho;
use function Amp\ByteStream\readLine;
require __DIR__ . "/../vendor/autoload.php";
Loop::run(function () {
yield bufferEcho("Hello from async PHP!\n");
$question = yield readLine("What is your question? ");
yield bufferEcho("I see your question is $question.\n");
yield bufferEcho("\nUnfortunately, I'm just a small script and I can't answer that, feel free to contact us at #amphp on freenode though!\n\n");
yield bufferEcho("Bye!\n\n");
});

View File

@ -155,3 +155,39 @@ function getStderr(): ResourceOutputStream
return $stream; return $stream;
} }
/**
* Buffered async readline function.
*
* @param string $prompt Optional prompt to print to console
*
* @return \Amp\Promise Will resolve with the read line
*/
function readLine(string $prompt = ''): Promise
{
return call(static function () use ($prompt) {
$stdin = getStdin();
if ($prompt) {
yield getStdout()->write($prompt);
}
static $lines = [''];
while (\count($lines) < 2 && ($chunk = yield $stdin->read()) !== null) {
$chunk = \explode("\n", \str_replace(["\r", "\n\n"], "\n", $chunk));
$lines[\count($lines) - 1] .= \array_shift($chunk);
$lines = \array_merge($lines, $chunk);
}
return \array_shift($lines);
});
}
/**
* Simple wrapper function to asynchronously write a string to the PHP output buffer.
*
* @param string $string
* @return Promise
*/
function bufferEcho($string): Promise
{
return getOutputBufferStream()->write($string);
}

View File

@ -4,7 +4,9 @@ namespace Amp\ByteStream\Test;
use Amp\ByteStream\ResourceOutputStream; use Amp\ByteStream\ResourceOutputStream;
use Amp\ByteStream\StreamException; use Amp\ByteStream\StreamException;
use Amp\Loop;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use function Amp\ByteStream\bufferEcho;
use function Amp\Promise\wait; use function Amp\Promise\wait;
class ResourceOutputStreamTest extends TestCase class ResourceOutputStreamTest extends TestCase
@ -66,4 +68,22 @@ class ResourceOutputStreamTest extends TestCase
wait($stream->write("foobar")); wait($stream->write("foobar"));
wait($stream->write("foobar")); wait($stream->write("foobar"));
} }
public function testEcho()
{
Loop::run(function () {
$data = "\n".\base64_encode(\random_bytes(10))."\n";
$found = false;
\ob_start(static function ($match) use (&$found, $data) {
if ($match === $data) {
$found = true;
return '';
}
return $match;
});
yield bufferEcho($data);
\ob_end_flush();
$this->assertTrue($found, "Data wasn't sent to the output buffer");
});
}
} }