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.

Managing Middleware

By default, this bundle registers server middleware by finding all services with the babdev_websocket_server.server_middleware tag and sorting them by priority.

Below is the list of middleware provided by this bundle and the library and their default priorities:

Middleware ClassService IDPriority
BabDev\WebSocket\Server\WAMP\Middleware\DispatchMessageToHandlerbabdev_websocket_server.server.server_middleware.dispatch_to_message_handler0
BabDev\WebSocket\Server\WAMP\Middleware\UpdateTopicSubscriptionsbabdev_websocket_server.server.server_middleware.update_topic_subscriptions-10
BabDev\WebSocket\Server\WAMP\Middleware\ParseWAMPMessagebabdev_websocket_server.server.server_middleware.parse_wamp_message-20
BabDev\WebSocket\Server\WebSocket\Middleware\EstablishWebSocketConnectionbabdev_websocket_server.server.server_middleware.establish_websocket_connection-30
BabDev\WebSocketBundle\Server\Middleware\AuthenticateUserbabdev_websocket_server.server.server_middleware.authenticate_user-40
BabDev\WebSocket\Server\Session\Middleware\InitializeSessionbabdev_websocket_server.server.server_middleware.initialize_session-50
BabDev\WebSocket\Server\Http\Middleware\RestrictToAllowedOriginsbabdev_websocket_server.server.server_middleware.restrict_to_allowed_origins-60
BabDev\WebSocket\Server\Http\Middleware\RejectBlockedIpAddressbabdev_websocket_server.server.server_middleware.reject_blocked_ip_address-70
BabDev\WebSocket\Server\Http\Middleware\ResolveForwardedClientAddressbabdev_websocket_server.server.server_middleware.resolve_forwarded_client_address-80
BabDev\WebSocket\Server\Http\Middleware\ParseHttpRequestbabdev_websocket_server.server.server_middleware.parse_http_request-90

Adding Middleware

New middleware should be added with a priority lower than 0 as the BabDev\WebSocket\Server\WAMP\Middleware\DispatchMessageToHandler middleware should be the last middleware in the stack.

Middleware added between the WAMP middleware must implement the interface expected by the middleware decorating it:

  • Middleware with a priority between -20 and 0 is decorated by the BabDev\WebSocket\Server\WAMP\Middleware\ParseWAMPMessage or BabDev\WebSocket\Server\WAMP\Middleware\UpdateTopicSubscriptions middleware, and must implement BabDev\WebSocket\Server\WAMPServerMiddleware
  • Middleware with a priority between -30 and -20 is decorated by the BabDev\WebSocket\Server\WebSocket\Middleware\EstablishWebSocketConnection middleware, and should implement BabDev\WebSocket\Server\WebSocketServerMiddleware and return the sub-protocols of the middleware it decorates from getSubProtocols(); otherwise, the wamp sub-protocol is not supported and clients are rejected when the strict sub-protocol check is enabled

Middleware must have the decorated middleware as the first parameter in the constructor, and cannot use a named parameter in the service definition (i.e. $middleware: !abstract decorated middleware for YAML); this is required for the compiler pass which builds the middleware stack to correctly set the arguments.

The bundle supports autoconfiguration of BabDev\WebSocket\Server\ServerMiddleware classes using the #[AsServerMiddleware] attribute on your middleware class.

<?php declare(strict_types=1);

namespace App\WebSocket\Middleware;

use BabDev\WebSocket\Server\ServerMiddleware;
use BabDev\WebSocketBundle\Attribute\AsServerMiddleware;

#[AsServerMiddleware(priority: -100)]
final readonly class EarlyMiddleware implements ServerMiddleware
{
    public function __construct(
        private ServerMiddleware $middleware,
    ) {}

    /* Class implementation */
}

If you are not using autoconfiguration, the service should be tagged with the babdev_websocket_server.server_middleware service tag and the priority specified.

# config/services.yaml
services:
  App\WebSocket\Middleware\EarlyMiddleware:
    arguments:
      - !abstract decorated middleware
    tags:
      - { name: babdev_websocket_server.server_middleware, priority: -100 }