WebSocketBundle

Documentation

Version Not Yet Released

You are viewing the documentation for the 1.x branch of the WebSocketBundle package which has not yet been released. Be aware that the API for this version may change before release.

Registering Message Handlers

At its core, the websocket server uses message handlers to handle incoming WAMP messages. Message handlers are the last classes to be called in the websocket server's middleware stack and are directly responsible for processing the incoming request.

Example Handlers

The below classes are simplified examples of message handlers covering both RPC and Topic (PubSub) handlers. In these examples, we are using the bundle's AsMessageHandler attribute to autoconfigure the service and define the route definition for the websocket server's router.

RPC Message Handler

This example handler will add all the numeric values provided in the parameters and return the result to the connected client.

<?php declare(strict_types=1);

namespace App\WebSocket\MessageHandler;

use BabDev\WebSocket\Server\RPCMessageHandler;
use BabDev\WebSocket\Server\WAMP\WAMPConnection;
use BabDev\WebSocket\Server\WAMP\WAMPMessageRequest;
use BabDev\WebSocketBundle\Attribute\AsMessageHandler;

#[AsMessageHandler(path: '/arithmetic/add')]
final class AddValuesMessageHandler implements RPCMessageHandler
{
    /**
     * Handles an RPC "CALL" WAMP message from the client.
     *
     * @param string $id The unique ID of the RPC, required to send a "CALLERROR" or "CALLRESULT" message
     */
    public function onCall(WAMPConnection $connection, string $id, WAMPMessageRequest $request, array $params): void
    {
        $connection->callResult($id, ['sum' => array_sum($params)]);
    }
}

Topic Message Handler

This example handler will simply echo the provided event to all subscribers connected to a topic.

<?php declare(strict_types=1);

namespace App\WebSocket\MessageHandler;

use BabDev\WebSocket\Server\Connection;
use BabDev\WebSocket\Server\TopicMessageHandler;
use BabDev\WebSocket\Server\WAMP\Topic;
use BabDev\WebSocket\Server\WAMP\WAMPConnection;
use BabDev\WebSocket\Server\WAMP\WAMPMessageRequest;
use BabDev\WebSocketBundle\Attribute\AsMessageHandler;

#[AsMessageHandler(path: '/echo')]
final class EchoMessageHandler implements TopicMessageHandler
{
    public function onSubscribe(WAMPConnection $connection, Topic $topic, WAMPMessageRequest $request): void
    {
        $topic->broadcast(['msg' => 'Connection opened'], [], [$connection->getAttributeStore()->get('wamp.session_id')]);
    }

    public function onUnsubscribe(WAMPConnection $connection, Topic $topic, WAMPMessageRequest $request): void
    {
        $topic->broadcast(['msg' => 'Connection closed'], [], [$connection->getAttributeStore()->get('wamp.session_id')]);
    }

    /**
     * Handles a "PUBLISH" WAMP message from the client.
     *
     * @param array|string $event    The event payload for the message
     * @param list<string> $exclude  A list of session IDs the message should be excluded from
     * @param list<string> $eligible A list of session IDs the message should be sent to
     */
    public function onPublish(Connection $connection, Topic $topic, WAMPMessageRequest $request, array|string $event, array $exclude, array $eligible): void
    {
        $topic->broadcast($event, $exclude, $eligible);
    }
}

Configuring the WebSocket Router

The websocket server uses the Symfony Routing Component to manage its routes. This means that with one exception (the attribute class used on message handlers), all configuration for the Symfony router applies to the websocket server as well.

When using attributes to configure routes, the BabDev\WebSocketBundle\Attribute\AsMessageHandler class should be used instead of the Symfony\Component\Routing\Attribute\Route class.

Debugging the WebSocket Router

The bundle also provides support for debugging the websocket router with the babdev:websocket-server:debug:router command, which provides the same capabilities as the framework's debug:router command.

Registering Message Handler Services

When using the AsMessageHandler attribute, the bundle will automatically tag message handler services to use in your application. If not using the attribute, services will need the babdev_websocket_server.message_handler service tag instead.

# config/services.yaml
services:
  App\WebSocket\MessageHandler\EchoMessageHandler:
    tags:
      - { name: babdev_websocket_server.message_handler }