amphp / websocket-server
Websocket server for Amp's HTTP server.
Fund package maintenance!
amphp
Installs: 45 049
Dependents: 15
Suggesters: 0
Security: 0
Stars: 78
Watchers: 10
Forks: 12
Open Issues: 2
Requires
- php: >=8.1
- amphp/amp: ^3
- amphp/byte-stream: ^2
- amphp/http: ^1.3
- amphp/http-server: ^3
- amphp/socket: ^2
- amphp/websocket: ^2
- psr/log: ^1|^2|^3
- revolt/event-loop: ^0.2.4
Requires (Dev)
Suggests
- ext-zlib: Required for compression
This package is auto-updated.
Last update: 2022-07-21 20:29:23 UTC
README
This library provides a RequestHandler
to easily handle
Websocket connections using amphp/http-server
.
Installation
This package can be installed as a Composer dependency.
composer require amphp/websocket-server
Documentation
The documentation for this library is currently a work in progress. Pull requests to improve the documentation are always welcome!
Requirements
- PHP 7.2+
Example
<?php // Note that this example requires: // amphp/http-server-router // amphp/http-server-static-content // amphp/log use Amp\Http\Server\HttpServer; use Amp\Http\Server\Request; use Amp\Http\Server\Response; use Amp\Http\Server\Router; use Amp\Http\Server\StaticContent\DocumentRoot; use Amp\Log\ConsoleFormatter; use Amp\Log\StreamHandler; use Amp\Loop; use Amp\Promise; use Amp\Socket\Server; use Amp\Success; use Amp\Websocket\Client; use Amp\Websocket\Message; use Amp\Websocket\Server\ClientHandler; use Amp\Websocket\Server\Gateway; use Amp\Websocket\Server\Websocket; use Monolog\Logger; use function Amp\ByteStream\getStdout; use function Amp\call; require __DIR__ . '/vendor/autoload.php'; $websocket = new Websocket(new class implements ClientHandler { private const ALLOWED_ORIGINS = [ 'http://localhost:1337', 'http://127.0.0.1:1337', 'http://[::1]:1337' ]; public function handleHandshake(Gateway $gateway, Request $request, Response $response): Promise { if (!\in_array($request->getHeader('origin'), self::ALLOWED_ORIGINS, true)) { return $gateway->getErrorHandler()->handleError(403); } return new Success($response); } public function handleClient(Gateway $gateway, Client $client, Request $request, Response $response): Promise { return call(function () use ($gateway, $client): \Generator { while ($message = yield $client->receive()) { \assert($message instanceof Message); $gateway->broadcast(\sprintf( '%d: %s', $client->getId(), yield $message->buffer() )); } }); } }); Loop::run(function () use ($websocket): Promise { $sockets = [ Server::listen('127.0.0.1:1337'), Server::listen('[::1]:1337'), ]; $router = new Router; $router->addRoute('GET', '/broadcast', $websocket); $router->setFallback(new DocumentRoot(__DIR__ . '/public')); $logHandler = new StreamHandler(getStdout()); $logHandler->setFormatter(new ConsoleFormatter); $logger = new Logger('server'); $logger->pushHandler($logHandler); $server = new HttpServer($sockets, $router, $logger); return $server->start(); });