php-websocket-rpc/rpc-client

Async RPC client over WebSocket using amphp and msgpack

Maintainers

Package info

github.com/php-websocket-rpc/rpc-client

Issues

pkg:composer/php-websocket-rpc/rpc-client

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

dev-main 2026-05-20 04:01 UTC

This package is auto-updated.

Last update: 2026-05-20 05:44:12 UTC


README

Async RPC client over WebSocket using amphp and msgpack.

Install

composer require php-websocket-rpc/rpc-client

Requires PHP 8.5+, ext-msgpack, and the amphp ecosystem.

Quick Start

use PhpWebsocketRpc\RpcClient\Client\RpcClient;

$client = RpcClient::connect('ws://127.0.0.1:9502/rpc');

// ─── Typed request/response ───

$response = $client->call(new MathDivideRequest(x: 10, y: 2))->await();
echo $response->result; // 5

// ─── Fire-and-forget notification ───

$client->notify(new LogMessage(text: 'Hello!'));

// ─── Using contract proxies ───

$math = $client->createProxy(MathService::class);

$result = $math->add(10, 5);               // call/response
echo $result;                               // 15

$math->log('Hello!');                       // notification

foreach ($math->count(10) as $value) {      // streaming
    echo $value;
}

$math->onEvent(function (string $event) {   // subscribe
    echo "Got: $event";
});

$chat->send('Hello!');                      // publish

Features

  • Typed RPC calls — send typed payloads, receive typed responses
  • Contract proxiescreateProxy() generates a dynamic proxy from any interface using proxy-manager-lts
  • 5 patterns — call/response, notification, streaming, subscribe, publish
  • Fire-and-forget — notifications with no response
  • Stream subscriptions — async iterables for streaming data (supports foreach)
  • Publish/Subscribe — named channels with #[RpcSubscribe] / #[RpcPublish]
  • Middleware — client-side middleware pipeline
  • Retry supportRetryableRpcClient wraps any client with configurable retry strategy

Contract Proxies

Define a shared interface:

interface MathService
{
    public function add(int $a, int $b): int;
    public function mul(int $a, int $b): int;
}

Use it transparently:

$math = $client->createProxy(MathService::class);
$sum = $math->add(10, 5);        // returns 15 — no boilerplate

The proxy is generated by friendsofphp/proxy-manager-lts using NullObjectFactory + AccessInterceptorValueHolderFactory — no eval() or runtime code generation.

Key Classes

Class Purpose
PhpWebsocketRpc\RpcClient\Client\RpcClient Main client — connect, call, notify, subscribe, publish
PhpWebsocketRpc\RpcClient\Client\ContractProxyFactory Generates dynamic proxies from interfaces
PhpWebsocketRpc\RpcClient\Client\PendingRequestStore Tracks in-flight requests
PhpWebsocketRpc\RpcClient\Client\SubscriptionManager Manages active stream subscriptions
PhpWebsocketRpc\RpcClient\Client\RetryableRpcClient Client with automatic retry
PhpWebsocketRpc\RpcClient\Transport\FramedConnection Low-level framed WebSocket connection