/** * Create event emitter and set optional events as array or \League\Event\ListenerProviderInterface. * Set as second argument a emitter instance, otherwise the factory creates a new one. * * Event array could have a name-handler-pair, a listener provider as instance of * `\League\Event\ListenerProviderInterface` or a argument array with name, handler and priority * * Configure event array as follows: * * ``` * $events = [ * // name-handler-pair * 'eventName' => function(){}, * * // listener provider as instance of \League\Event\ListenerProviderInterface * new \Acme\MyListenerProvider * * // argument array name, handler, prio * ['name', function(){}, 10] * * // alternating argument array name => [handler, prio] * 'eventName' => [function(){}, 10] * * ]; * ``` * * @param \League\Event\ListenerProviderInterface|array $events * @param \League\Event\EmitterInterface $emitter * * @return Emitter */ public function createEventEmitter($events = [], EmitterInterface $emitter = null) { if (null === $emitter) { $emitter = new Emitter(); } if (!is_array($events)) { $events = [$events]; } if (!empty($events)) { foreach ($events as $name => $handler) { if ($handler instanceof ListenerProviderInterface) { $emitter->useListenerProvider($handler); continue; } $args = is_array($handler) ? array_merge([$name], $handler) : [$name, $handler, EmitterInterface::P_NORMAL]; call_user_func_array([$emitter, 'addListener'], $args); } } return $emitter; }
define('WEBROOT', __DIR__ . DIRECTORY_SEPARATOR . 'webroot'); use Clue\React\Sse\BufferedChannel; use GuzzleHttp\Client; use League\Event\Emitter; use React\EventLoop\Factory; use React\Filesystem\Filesystem; use React\Http\Server as HttpServer; use React\Socket\Server as SocketServer; use WyriHaximus\React\Examples\HostnameAnalyzer\Listeners\ChannelListener; use WyriHaximus\React\Examples\HostnameAnalyzer\Listeners\DnsListener; use WyriHaximus\React\Examples\HostnameAnalyzer\Listeners\GeoListener; use WyriHaximus\React\Examples\HostnameAnalyzer\Listeners\TitleListener; use WyriHaximus\React\Examples\HostnameAnalyzer\ResponseHandler; use WyriHaximus\React\RingPHP\HttpClientAdapter; require 'vendor/autoload.php'; $loop = Factory::create(); $socket = new SocketServer($loop); $http = new HttpServer($socket, $loop); $filesystem = Filesystem::create($loop); $dns = (new \React\Dns\Resolver\Factory())->createCached('8.8.8.8', $loop); $guzzle = new Client(['handler' => new HttpClientAdapter($loop, null, $dns)]); $channel = new BufferedChannel(); $emitter = new Emitter(); $emitter->useListenerProvider(new TitleListener($emitter, $guzzle)); $emitter->useListenerProvider(new DnsListener($emitter, $dns)); $emitter->useListenerProvider(new GeoListener($emitter, $guzzle)); $emitter->useListenerProvider(new ChannelListener($emitter, $channel)); $files = $filesystem->dir(WEBROOT)->ls(); $http->on('request', new ResponseHandler($files, $filesystem, $emitter, $channel)); $socket->listen(1337); $loop->run();