Aerys\Websocket\Rfc6455Endpoint::onWritable PHP Method

onWritable() public method

public onWritable ( $watcherId, $socket, Aerys\Websocket\Rfc6455Client $client )
$client Aerys\Websocket\Rfc6455Client
    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);
            }
        }
    }