public function onWritable($watcherId, $socket, Rfc6455Client $client)
{
$bytes = @fwrite($socket, $client->writeBuffer);
$client->bytesSent += $bytes;
if ($bytes != \strlen($client->writeBuffer)) {
$client->writeBuffer = substr($client->writeBuffer, $bytes);
} elseif ($bytes == 0 && $client->closedAt && (!is_resource($socket) || @feof($socket))) {
// usually read watcher cares about aborted TCP connections, but when
// $client->closedAt is true, it might be the case that read watcher
// is already cancelled and we need to ensure that our writing promise
// is fulfilled in unloadClient() with a failure
unset($this->closeTimeouts[$client->id]);
$this->unloadClient($client);
} else {
$client->framesSent++;
$client->writeDeferred->succeed();
if ($client->writeControlQueue) {
$key = key($client->writeControlQueue);
$client->writeBuffer = $client->writeControlQueue[$key];
$client->lastSentAt = $this->now;
$client->writeDeferred = $client->writeDeferredControlQueue[$key];
unset($client->writeControlQueue[$key], $client->writeDeferredControlQueue[$key]);
while (\strlen($client->writeBuffer) < 65536 && $client->writeControlQueue) {
$key = key($client->writeControlQueue);
$client->writeBuffer .= $client->writeControlQueue[$key];
$client->writeDeferredControlQueue[$key]->succeed($client->writeDeferred);
unset($client->writeControlQueue[$key], $client->writeDeferredControlQueue[$key]);
}
while (\strlen($client->writeBuffer) < 65536 && $client->writeDataQueue) {
$key = key($client->writeDataQueue);
$client->writeBuffer .= $client->writeDataQueue[$key];
$client->writeDeferredDataQueue[$key]->succeed($client->writeDeferred);
unset($client->writeDataQueue[$key], $client->writeDeferredDataQueue[$key]);
}
} elseif ($client->closedAt) {
@stream_socket_shutdown($socket, STREAM_SHUT_WR);
\Amp\cancel($watcherId);
$client->writeWatcher = null;
$client->writeDeferred = null;
$client->writeBuffer = "";
} elseif ($client->writeDataQueue) {
$key = key($client->writeDataQueue);
$client->writeBuffer = $client->writeDataQueue[$key];
$client->lastDataSentAt = $this->now;
$client->lastSentAt = $this->now;
$client->writeDeferred = $client->writeDeferredDataQueue[$key];
unset($client->writeDataQueue[$key], $client->writeDeferredDataQueue[$key]);
while (\strlen($client->writeBuffer) < 65536 && $client->writeDataQueue) {
$key = key($client->writeDataQueue);
$client->writeBuffer .= $client->writeDataQueue[$key];
$client->writeDeferredDataQueue[$key]->succeed($client->writeDeferred);
unset($client->writeDataQueue[$key], $client->writeDeferredDataQueue[$key]);
}
} else {
$client->writeDeferred = null;
$client->writeBuffer = "";
\Amp\disable($watcherId);
}
}
}