/** * Watch for incoming data. * * @param Connection $connection */ private function handleSocketEvents(Connection $connection) { $buffer = ''; $connection->getSocket()->on('data', function ($data) use(&$buffer, $connection) { $buffer .= $data; while (($newlinePosition = strpos($buffer, "\n")) !== false) { $jsonMessage = substr($buffer, 0, $newlinePosition); $buffer = substr($buffer, $newlinePosition + 1); try { $connection->setLastMessageReceivedAt(new \DateTime()); $message = $this->deserializer->deserialize(\Blackjack\json_parse($jsonMessage)); $connection->notify($message); } catch (\Exception $e) { // Invalid message $connection->getSocket()->write(json_encode(['alias' => 'invalid_message'])); $connection->getSocket()->close(); return; } } // Limit buffer to 1 MB $bufferSizeLimit = 1024 * 1024; if (strlen($buffer) > $bufferSizeLimit) { $buffer = substr($buffer, strlen($buffer) - $bufferSizeLimit); } }); $connection->getSocket()->on('close', function () use($connection) { $this->handlePlayerDisconnection($connection); }); }