mirror of
https://github.com/Yetangitu/ampache
synced 2025-10-06 03:49:56 +02:00
Begin WebSocket support for Broadcast and Player control
This commit is contained in:
parent
2b128b122d
commit
6adf8307c4
516 changed files with 64260 additions and 18 deletions
63
modules/React/Http/Server.php
Normal file
63
modules/React/Http/Server.php
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
namespace React\Http;
|
||||
|
||||
use Evenement\EventEmitter;
|
||||
use React\Socket\ServerInterface as SocketServerInterface;
|
||||
use React\Socket\ConnectionInterface;
|
||||
|
||||
/** @event request */
|
||||
class Server extends EventEmitter implements ServerInterface
|
||||
{
|
||||
private $io;
|
||||
|
||||
public function __construct(SocketServerInterface $io)
|
||||
{
|
||||
$this->io = $io;
|
||||
|
||||
$this->io->on('connection', function ($conn) {
|
||||
// TODO: http 1.1 keep-alive
|
||||
// TODO: chunked transfer encoding (also for outgoing data)
|
||||
// TODO: multipart parsing
|
||||
|
||||
$parser = new RequestHeaderParser();
|
||||
$parser->on('headers', function (Request $request, $bodyBuffer) use ($conn, $parser) {
|
||||
// attach remote ip to the request as metadata
|
||||
$request->remoteAddress = $conn->getRemoteAddress();
|
||||
|
||||
$this->handleRequest($conn, $request, $bodyBuffer);
|
||||
|
||||
$conn->removeListener('data', array($parser, 'feed'));
|
||||
$conn->on('end', function () use ($request) {
|
||||
$request->emit('end');
|
||||
});
|
||||
$conn->on('data', function ($data) use ($request) {
|
||||
$request->emit('data', array($data));
|
||||
});
|
||||
$request->on('pause', function () use ($conn) {
|
||||
$conn->emit('pause');
|
||||
});
|
||||
$request->on('resume', function () use ($conn) {
|
||||
$conn->emit('resume');
|
||||
});
|
||||
});
|
||||
|
||||
$conn->on('data', array($parser, 'feed'));
|
||||
});
|
||||
}
|
||||
|
||||
public function handleRequest(ConnectionInterface $conn, Request $request, $bodyBuffer)
|
||||
{
|
||||
$response = new Response($conn);
|
||||
$response->on('close', array($request, 'close'));
|
||||
|
||||
if (!$this->listeners('request')) {
|
||||
$response->end();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->emit('request', array($request, $response));
|
||||
$request->emit('data', array($bodyBuffer));
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue