-
-
Notifications
You must be signed in to change notification settings - Fork 17
Open
Labels
Description
I'm having problems figuring out the connection was closed.
Below is the code example I'm using for testing.
It connects to endpoint, sends ping messages to a server every 5 second, and sends pong messages to a server when it gets a ping message from server.
It also closes connection on the client side after 30 seconds just for testing purporses.
What I am expecting:
- get WebsocketClosedException while attempting to send a ping message after connection was closed
- get EventLoop still working after connection was closed and thus trying to send ping message resulting in WebsocketClosedException
- get onClose callback called when connection is closed (either by client or by server)
What I am getting:
- onClose never gets called, no matter who closed the connection
- no exception at all after the connection is closed - the script just hangs in while loop, EventLoop stops trying to send ping message. This cover both cases of connection being closed on the client and on the server.
- issuing
$connection->close()doesn't result on connection actually disappering from the server. The server still 'sees' this connection
In the end I need a reliable way to understand, that the connection was closed. On the server in particular.
Any advice is very apriciated.
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
use Revolt\EventLoop;
use function Amp\weakClosure;
use function Amp\Websocket\Client\connect;
$serverUrl = 'ws://dev.sportlevel.com/highway';
$connection = connect($serverUrl);
$connection->onClose(function () {
echo "connection is closed!" . PHP_EOL;
});
EventLoop::repeat(5, weakClosure(function () use ($connection) {
$pingMessage = json_encode([
'msg_type' => 'ping',
'timestamp' => microtime(true),
]);
echo "sending ping: {$pingMessage}" . PHP_EOL;
try {
$connection->sendText($pingMessage);
} catch (\Exception $e) {
echo "send ping failed! " . $e->getMessage() . PHP_EOL;
}
}));
EventLoop::delay(30, function () use ($connection) {
$connection->close();
});
while (1) {
if ($message = $connection->receive()) {
$payload = $message->buffer();
echo "Received: {$payload}" . PHP_EOL;
$message = json_decode($payload, true);
if ($message['msg_type'] == 'ping') {
$pongMessage = json_encode([
'msg_type' => 'pong',
'timestamp' => $message['timestamp'],
]);
echo "send pong: {$pongMessage}" . PHP_EOL;
try {
$connection->sendText($pongMessage);
} catch (\Exception $e) {
echo "send pong failed! " . $e->getMessage() . PHP_EOL;
}
}
}
}