/**
  * 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();