function stream_fgets_promise($resource, $size = null, callable $callback)
{
stream_set_blocking($resource, false);
$result = '';
while (! feof($resource)) {
$buffer = fgets($resource, $size);
$buffer !== false && $result .= $buffer;
$callback($buffer === false ? 'WAIT' : 'RECEIVED');
}
return $result;
}