Documentation > Classes > Server

class WebSocket\Server implements Psr\Log\LoggerAwareInterface, Stringable
{
    use WebSocket\Trait\ListenerTrait;
    use WebSocket\Trait\OpcodeTrait;
    use WebSocket\Trait\SendMethodsTrait;

    /* ---------- Magic methods ------------------------------------------------------------------------------------ */

    /**
     * @param int $port Socket port to listen to
     * @param string $scheme Scheme (tcp or ssl)
     * @throws InvalidArgumentException If invalid port provided
     */
    public function __construct(int $port = 80, bool $ssl = false);

    /**
     * Get string representation of instance.
     * @return string String representation.
     */
    public function __toString(): string;

    /* ---------- Configuration ------------------------------------------------------------------------------------ */

    /**
     * Set stream factory to use.
     * @param Phrity\Net\StreamFactory $streamFactory
     * @return self
     */
    public function setStreamFactory(Phrity\Net\StreamFactory $streamFactory): self;

    /**
     * Set logger.
     * @param Psr\Log\LoggerInterface $logger Logger implementation
     * @return self
     */
    public function setLogger(Psr\Log\LoggerInterface $logger): self;

    /**
     * Set timeout.
     * @param int $timeout Timeout in seconds
     * @return self
     * @throws InvalidArgumentException If invalid timeout provided
     */
    public function setTimeout(int $timeout): self;

    /**
     * Get timeout.
     * @return int Timeout in seconds
     */
    public function getTimeout(): int;

    /**
     * Set frame size.
     * @param int $frameSize Frame size in bytes
     * @return self
     * @throws InvalidArgumentException If invalid frameSize provided
     */
    public function setFrameSize(int $frameSize): self;

    /**
     * Get frame size.
     * @return int Frame size in bytes
     */
    public function getFrameSize(): int;

    /**
     * Get socket port number.
     * @return int port
     */
    public function getPort(): int;

    /**
     * Get connection scheme.
     * @return string scheme
     */
    public function getScheme(): string;

    /**
     * Number of currently connected clients.
     * @return int Connection count
     */
    public function getConnectionCount(): int;

    /**
     * Add a middleware.
     * @param WebSocket\Middleware\MiddlewareInterface $middleware
     * @return self
     */
     public function addMiddleware(WebSocket\Middleware\MiddlewareInterface $middleware): self;

    /* ---------- Messaging operations ----------------------------------------------------------------------------- */

    /**
     * Send message (broadcast to all connected clients).
     * @param WebSocket\Message\Message $message Message to send
     */
    public function send(WebSocket\Message\Message $message): Message

    /* ---------- Listener operations ------------------------------------------------------------------------------ */

    /**
     * Start server listener.
     * @throws Throwable On low level error
     */
    public function start(): void;

    /**
     * Stop server listener (resumable).
     */
    public function stop(): void;

    /**
     * If server is running (accepting connections and messages).
     * @return bool
     */
    public function isRunning(): bool;

    /* ---------- Connection management ---------------------------------------------------------------------------- */

    /**
     * Disconnect all connections and stop server.
     */
    public function disconnect(): void;

    /* ---------- Internal helper methods -------------------------------------------------------------------------- */

    protected function createSocketServer(): void;
    protected function acceptSocket(Phrity\Net\SocketServer $socket): void;
    protected function detachUnconnected(): void;
    protected function performHandshake(WebSocket\Connection $connection): ServerRequest;
}