mwyd/psockets

This package is abandoned and no longer maintained. No replacement package was suggested.

Synchronous PHP websocket client

0.11 2021-04-16 16:58 UTC

This package is not auto-updated.

Last update: 2023-02-04 01:53:41 UTC


README

Autobahn Testsuite

Synchronous PHP websocket client

Requirements

  • PHP ^8.0
  • Command prompt or terminal access

Installation

It is recommended to install package via composer

composer require mwyd/psockets

Documentation

abstract class WsClient
{
    /**
    * @var Logger $logger
    */
    protected Logger $logger;
    
    /**  
    * @param string $address valid url
    * @param array $config default values => [
    *   'FLAGS'                 => null,
    *   'CONTEXT'               => null,
    *   'LOG_LEVEL'             => 1,
    *   'BUFFER_SIZE'           => 8192,
    *   'CONNECT_TIMEOUT'       => 10,
    *   'HANDSHAKE_TIMEOUT'     => 2,
    *   'ADDITIONAL_HEADERS'    => []
    * ]
    * @param array['FLAGS']?int alias of socket_create_client flags parameter
    * @param array['CONTEXT']mixed alias of socket_create_client context parameter
    * @param array['CONNECT_TIMEOUT']?float alias of socket_create_client timeout parameter
    * @param array['LOG_LEVEL']int 0 => logs disabled, 1 => connect, disconnect, 2 => connect, disconnect, messages  
    * @param array['HANDSHAKE_TIMEOUT']int seconds
    */
    public function __construct(string $address, array $config);
    
    /**
    *  Method to be called when the connection is opened
    */
    abstract protected function onOpen() : void;
    
    /**
    * Method to be called when a message is received from the server
    */
    abstract protected function onMessage(WsMessage $message) : void;
    
    /**
    * Method to be called when the connection is closed 
    */
    abstract protected function onClose() : void;
    
    /**
    * Writes data to buffer
    * @param string $message message to be written
    * @param bool $isBinary is the message binary
    * @param int $fragmentSize when value is greater than 0 and less than message length data will be sent in many frames otherwise single frame will be sent
    */
    public function send(string $message, bool $isBinary = false, int $fragmentSize = 0) : void;

    /**
    * Closes the connection
    */
    public function close() : void;
    
    /**
    * Returns current connection state 
    * @return int connection state 0 => CST_CONNECTING, 1 => CST_OPEN, 2 => CST_CLOSING, 3 => CST_CLOSED
    */
    public function getState() : int;
    
    /**
    * Returns path
    * @return string path 
    */
    public function getPath() : string;
    
    /**
    * Returns handshake status
    * @return bool success 
    */
    public function getHandshake() : bool;
    
    /**
    * Returns local address
    * @return string local address 
    */
    public function getAdress() : string;
    
    /**
    * Returns amount of bytes in a specified buffer
    * @param string $type buffer type 'r' => read buffer, 'w' => write buffer
    * @return int amount of bytes 
    */
    public function getBufferLen(string $type) : int;
    
    /**
    * Runs the main loop
    */
    public function run() : void;
}

class WsMessage
{
    public function __construct(string $message, bool $isBinary);

    public function isBinary() : bool;
    
    /**
    * @throws \JsonException 
    */
    public function json() : mixed;
    
    public function __toString() : string;
}

class Logger
{
    public function __construct(int $logLevel);
    
    public function log(string $msg, int $level = 0) : void;
    
    public static function warn(string $msg) : void;
    
    public static function err(string $msg) : void;
}

Usage example

<?php

$loader = require_once __DIR__ . "/vendor/autoload.php";

use pSockets\WebSocket\WsClient;
use pSockets\WebSocket\WsMessage;
use pSockets\Utils\Logger;

class MyClient extends WsClient
{
    private int $recvMessages = 0;

    protected function onOpen() : void
    {
        $this->send('Echo message - txt');
        $this->send('Echo message - txt fragmented', fragmentSize: 2);
    }

    protected function onMessage(WsMessage $message) : void
    {
        $this->recvMessages++;

        try
        {
            $json = $message->json();
        }
        catch(\Exception $e)
        {
            Logger::warn($e->getMessage());
        }

        if($this->recvMessages == 2) $this->close();
    }

    protected function onClose() : void
    {
        $this->logger->log('Done');
    }
}

$ws = new MyClient("wss://echo.websocket.org", [
    'LOG_LEVEL' => 2,
    'ADDITIONAL_HEADERS' => [
        'User-Agent: pSockets/Client/0.11',
        'Origin: example.com'
    ]
]);
$ws->run();