private function onWritable(string $watcherId, $socket, $client)
{
$bytesWritten = @\fwrite($socket, $client->writeBuffer);
if ($bytesWritten === false) {
if (!\is_resource($socket) || @\feof($socket)) {
if ($client->isDead == Client::CLOSED_RD) {
$this->close($client);
} else {
$client->isDead = Client::CLOSED_WR;
$client->writeWatcher = null;
\Amp\cancel($watcherId);
}
}
} else {
$client->bufferSize -= $bytesWritten;
if ($bytesWritten === \strlen($client->writeBuffer)) {
$client->writeBuffer = "";
\Amp\disable($watcherId);
if ($client->onWriteDrain) {
($client->onWriteDrain)($client);
}
} else {
$client->writeBuffer = \substr($client->writeBuffer, $bytesWritten);
\Amp\enable($watcherId);
}
if ($client->bufferPromisor && $client->bufferSize <= $client->options->softStreamCap) {
$promisor = $client->bufferPromisor;
$client->bufferPromisor = null;
$promisor->succeed();
}
}
}