示例#1
0
 public function testPeer()
 {
     $localhost = '127.0.0.1';
     $localport = '8333';
     $remotehost = '127.0.0.1';
     $remoteport = '9999';
     $loop = new StreamSelectLoop();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $reactServer = new Server($loop);
     $network = Bitcoin::getDefaultNetwork();
     $client = new NetworkAddress(Buffer::hex('0000000000000001'), $localhost, $localport);
     $server = new NetworkAddress(Buffer::hex('0000000000000001'), $remotehost, $remoteport);
     $msgs = new Factory($network, new Random());
     $serverReceivedConnection = false;
     $serverListener = new Listener($server, $msgs, $reactServer, $loop);
     $serverListener->on('connection', function (Peer $peer) use(&$serverReceivedConnection, &$serverListener) {
         $peer->close();
         $serverReceivedConnection = true;
     });
     $serverListener->listen($server->getPort());
     $connector = new Connector($loop, $dns);
     $clientConnection = new Peer($client, $msgs, $loop);
     $clientConnection->connect($connector, $server)->then(function (Peer $peer) use($serverListener, &$loop) {
         $peer->close();
         $serverListener->close();
     });
     $loop->run();
     $this->assertTrue($serverReceivedConnection);
 }
示例#2
0
 /**
  * @param  InputInterface  $input
  * @param  OutputInterface $output
  * @return int|null|void   Script exit code
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $brainName = $input->getArgument('brain');
     $host = $input->getArgument('server');
     $brain = $this->brainFactory->build($brainName);
     $responseInterpreter = new \Connect4\Client\ResponseInterpreter();
     $client = new \Connect4\Client\Client($brain);
     $loop = \React\EventLoop\Factory::create();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $connector = new \React\SocketClient\Connector($loop, $dns);
     $connector->create($host, 1337)->then(function (\React\Stream\Stream $stream) use($brain, $responseInterpreter, $client) {
         $stream->write($brain->getName());
         $stream->on('data', function ($data) use($stream, $client, $responseInterpreter) {
             if (!$data) {
                 die('CONNECTION TERMINATED');
             }
             $response = $responseInterpreter->buildResponse($data);
             $move = $client->handle($response);
             if ($move) {
                 $stream->write($move->getColumn()->getValue());
             }
         });
     });
     $loop->run();
 }
示例#3
0
 public function setUp()
 {
     $this->loop = React\EventLoop\Factory::create();
     $dnsResolverFactory = new React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $this->loop);
     $this->factory = new Factory($this->loop, $dns);
 }
示例#4
0
 /**
  * Handler called when a CONNECT message is sent by a client
  *
  * A React SocketClient will be created, Google DNS is used to resolve host names. When the connection is made
  * several event listeners are attached. When data is received on the stream, it is forwarded to the client requesting
  * the proxied TCP connection
  *
  * Other events forwarded are connect and close
  *
  * @param WebSocketTransportInterface $user
  * @param $message
  */
 protected function requestConnect(WebSocketTransportInterface $user, $message)
 {
     $address = $message->address;
     $this->logger->notice(sprintf("User %s requests connection to %s", $user->getId(), $address));
     try {
         $dnsResolverFactory = new React\Dns\Resolver\Factory();
         $dns = $dnsResolverFactory->createCached('8.8.8.8', $this->loop);
         $stream = new \React\SocketClient\Connector($this->loop, $dns);
         list($host, $port) = explode(":", $address);
         $logger = $this->logger;
         $that = $this;
         $stream->create($host, $port)->then(function (\React\Stream\Stream $stream) use($user, $logger, $message, $address, $that) {
             $id = uniqid("stream-{$address}-");
             $that->addStream($user, $id, $stream);
             // Notify the user when the connection has been made
             $user->sendString(json_encode(array('connection' => $id, 'event' => 'connected', 'tag' => property_exists($message, 'tag') ? $message->tag : null)));
             // Forward data back to the user
             $stream->on("data", function ($data) use($stream, $id, $user, $logger) {
                 $logger->notice("Forwarding " . strlen($data) . " bytes from stream {$id} to {$user->getId()}");
                 $message = array('connection' => $id, 'event' => 'data', 'data' => $data);
                 $user->sendString(json_encode($message));
             });
             // When the stream closes, notify the user
             $stream->on("close", function () use($user, $id, $logger, $address) {
                 $logger->notice(sprintf("Connection %s of user %s to %s has been closed", $id, $user->getId(), $address));
                 $message = array('connection' => $id, 'event' => 'close');
                 $user->sendString(json_encode($message));
             });
         });
     } catch (Exception $e) {
         $user->sendString(json_encode(array('event' => 'error', 'tag' => property_exists($message, 'tag') ? $message->tag : null, 'message' => $e->getMessage())));
     }
 }
 /**
  * @return HttpClient
  */
 protected function createHttpAsyncClient()
 {
     $loop = \React\EventLoop\Factory::create();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dnsResolver = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $messageFactory = new \Http\Discovery\MessageFactory\GuzzleFactory();
     return new ReactHttpClient($loop, $dnsResolver, $messageFactory);
 }
示例#6
0
 public function setUp()
 {
     $loop = React\EventLoop\Factory::create();
     $dnsResolverFactory = new React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $factory = new Socks\Factory($loop, $dns);
     $this->client = $factory->createClient('127.0.0.1', 9050);
 }
 private function createImapstream(&$imapaccount)
 {
     //$loop = \React\EventLoop\Factory::create();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $this->loop);
     $imapconnector = new \React\SocketClient\Connector($this->loop, $dns);
     $secureConnector = new \React\SocketClient\SecureConnector($imapconnector, $this->loop);
     $mailaccount = $imapaccount['mailaccount'];
     echo $mailaccount->getImapserver() . ($mailaccount->getImapport() ? $mailaccount->getImapport() : 993);
     $secureConnector->create($mailaccount->getImapserver(), $mailaccount->getImapport() ? $mailaccount->getImapport() : 993)->then(function (\React\Stream\Stream $imapstream) use(&$imapaccount) {
         $uid = uniqid();
         echo $imapaccount['mailaccount']->getImapserver() . ': ' . $uid;
         $imapaccount['imapstream'] = $imapstream;
         $login = $imapaccount['mailaccount']->getImapusername();
         $password = $imapaccount['mailaccount']->getImappassword();
         $imapstream->write($uid . " LOGIN {$login} {$password}\r\n");
         $status = 'LOGIN';
         $imapstream->on('data', function ($data) use($uid, &$status, &$imapstream, &$imapaccount) {
             echo $imapaccount['mailaccount']->getImapserver() . ': ' . $data;
             $dataexpl = explode("\r\n", $data);
             foreach ($dataexpl as $dexpl) {
                 if (preg_match("/^" . $uid . " OK/", $dexpl)) {
                     //login OK:
                     if ($status == 'LOGIN') {
                         $imapstream->write($uid . " SELECT " . $imapaccount['mailaccount']->getImappathprefix() . "\r\n");
                         $status = 'SELECT';
                         echo "SEND: SELECT {$status}\r\n";
                     } else {
                         if ($status == 'SELECT') {
                             $imapstream->write($uid . " IDLE\r\n");
                             $status = 'IDLE';
                             echo "SEND: IDLE {$status}\r\n";
                         }
                     }
                 }
                 if ($status == 'IDLE') {
                     if (preg_match("/^\\* (\\d+) RECENT/", $dexpl, $countrecent)) {
                         //login OK:
                         $countrecent = $countrecent[1];
                         echo 'RECENT:' . $countrecent;
                         $this->notifychanges($imapaccount);
                     }
                     if (preg_match("/^\\* (\\d+) EXISTS/", $dexpl, $countrecent)) {
                         //login OK:
                         $countrecent = $countrecent[1];
                         echo 'EXISTS' . $countrecent;
                         $this->notifychanges($imapaccount);
                     }
                 }
             }
         });
         $imapstream->on('end', function () use($uid, &$status, &$imapstream, &$imapaccount) {
             echo 'END!!!!!';
         });
     });
     return $imapaccount;
 }
示例#8
0
 public function start()
 {
     $loop = \React\EventLoop\Factory::create();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached($this->nameserver, $loop);
     $connector = new \React\SocketClient\Connector($loop, $dns);
     $this->loadPlugins();
     $this->startLoop($loop, $connector);
     $loop->run();
 }
 /**
  * Start transport provider
  *
  * @param \Thruway\Peer\ClientInterface $client
  * @param \React\EventLoop\LoopInterface $loop
  */
 public function startTransportProvider(ClientInterface $client, LoopInterface $loop)
 {
     $this->client = $client;
     $this->loop = $loop;
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $connector = new Connector($loop, $dns);
     $connector->create($this->address, $this->port)->then(function (Stream $stream) {
         $stream->on('data', [$this, "handleData"]);
         $stream->on('close', [$this, "handleClose"]);
         $this->handleConnection($stream);
     });
 }
示例#10
0
 public function __construct($url, LoopInterface $loop, LoggerInterface $logger, array $streamOptions = null)
 {
     $this->logger = $logger;
     $this->loop = $loop;
     $this->streamOptions = $streamOptions;
     $parts = parse_url($url);
     $this->url = $url;
     if (in_array($parts['scheme'], array('ws', 'wss')) === false) {
         throw new WebSocketInvalidUrlScheme();
     }
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $this->dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
 }
示例#11
0
function connectToLightTable($clientId, $port, $projectRootDir, Logger $log)
{
    $message = ['client-id' => intval($clientId), 'tags' => 'php.client', 'commands' => ['editor.eval.php', 'editor.eval.php.exception', 'editor.eval.php.result'], 'name' => 'PHP', 'type' => 'php', 'dir' => $projectRootDir];
    $loop = EventLoopFactory::create();
    $dnsResolverFactory = new React\Dns\Resolver\Factory();
    $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
    $connector = new React\SocketClient\Connector($loop, $dns);
    $connector->create('127.0.0.1', intval($port))->then(function (React\Stream\Stream $stream) use($log, $message) {
        echo 'Connected';
        $encodedMessage = json_encode($message);
        $stream->write($encodedMessage . "\n");
        $log->addInfo(sprintf('Acknowledged connection and client id #%d', $message['client-id']));
        $stream->on('data', function ($data) use($stream, $log, $encodedMessage) {
            $log->addInfo(sprintf('Decoding data "%s"', print_r($data, true)));
            $decodedData = json_decode($data, $asAssociativeArray = true);
            if ($decodedData[1] == 'editor.eval.php') {
                try {
                    ob_start();
                    require $decodedData[2]['path'];
                    $output = ob_get_contents();
                    $outputType = 'result';
                    $responseType = 'editor.eval.php.result';
                } catch (\Exception $exception) {
                    $output = $exception->getMessage();
                    $output .= $exception->getTraceAsString();
                    $outputType = 'ex';
                    $responseType = 'editor.eval.php.exception';
                }
                $response = json_encode([$decodedData[0], $responseType, ["meta" => $decodedData[2]['meta'], $outputType => $output]]);
                $stream->write($response . "\n");
                ob_end_clean();
            }
            if ($decodedData[1] === 'client.close') {
                $stream->close();
            }
        });
    });
    $loop->run();
}
 /**
  * Execute the console command.
  *
  * @return void
  */
 public function fire()
 {
     echo 'Iniciado' . PHP_EOL;
     $start = microtime(true);
     $totalUsers = User::count();
     $buffer = '';
     $loop = \React\EventLoop\Factory::create();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $connector = new \React\SocketClient\Connector($loop, $dns);
     $connector->create('127.0.0.1', 1337)->then(function (\React\Stream\Stream $stream) use(&$buffer) {
         $stream->on('data', function ($data, $stream) use(&$buffer) {
             $buffer .= $data;
         });
     });
     $loop->nextTick(function () use($totalUsers) {
         $this->users = $this->getUsers($totalUsers / 2, 0);
     });
     $loop->run();
     $buffer = unserialize($buffer);
     $this->users = array_merge($this->users, $buffer);
     echo 'Processados ' . count($this->users) . ' usuários' . PHP_EOL;
     echo 'Demorou ' . number_format((microtime(true) - $start) * 1000, 2, ',', '') . 'ms' . PHP_EOL;
 }
示例#13
0
<?php

include_once __DIR__ . '/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$dnsResolverFactory = new React\Dns\Resolver\Factory();
$dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
$socket = new React\Socket\Server($loop);
$socket->listen('9050', 'localhost');
$factory = new Socks\Factory($loop, $dns);
$server = $factory->createServer($socket);
$server->setAuthArray(array('tom' => 'god', 'user' => 'p@ssw0rd'));
echo 'SOCKS server listening on localhost:9050' . PHP_EOL;
$loop->run();
示例#14
0
文件: query.php 项目: nask0/whois
<?php

require __DIR__ . '/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$factory = new React\Dns\Resolver\Factory();
$resolver = $factory->create('8.8.8.8', $loop);
$connFactory = new React\Whois\ConnectionFactory($loop);
$domain = 'igor.io';
$client = new React\Whois\Client($resolver, $connFactory);
$client->query($domain)->then(function ($result) {
    echo $result;
});
echo "Getting whois for {$domain}...\n";
$loop->run();
示例#15
0
<?php

// async DNS resolution
require __DIR__ . '/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$factory = new React\Dns\Resolver\Factory();
$dns = $factory->create('8.8.8.8', $loop);
$domain = 'igor.io';
$dns->resolve($domain)->then(function ($ip) {
    echo "Host: {$ip}\n";
}, function ($e) {
    echo "Error: {$e->getMessage()}\n";
});
echo "Resolving domain {$domain}...\n";
$loop->run();
示例#16
0
 /**
  * @param $method
  * @param null $params
  * @return \React\Promise\Promise
  */
 private function request($method, $params = null)
 {
     $deferred = new Deferred();
     $loop = $this->getLoop();
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dnsResolver = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $factory = new \React\HttpClient\Factory();
     $client = $factory->create($loop, $dnsResolver);
     $request = $client->request('GET', $this->slackURL . $method . '?token=' . $this->token . '&' . $params);
     $buffer = '';
     $request->on('response', function ($response) use(&$buffer, $deferred) {
         $response->on('data', function ($data) use(&$buffer) {
             $buffer .= $data;
         });
         $response->on('error', function ($error) use($deferred) {
             $deferred->reject($error);
         });
     });
     $request->on('end', function () use(&$buffer, $deferred) {
         $deferred->resolve(json_decode($buffer));
     });
     $request->on('error', function ($error) use($deferred) {
         $deferred->reject($error);
     });
     $request->end();
     return $deferred->promise();
 }
示例#17
0
<?php

use React\Promise\Deferred;
use React\EventLoop\Timer\Timer;
require "vendor/autoload.php";
$loop = React\EventLoop\Factory::create();
if (0) {
    $dnsResolverFactory = new React\Dns\Resolver\Factory();
    $dnsResolver = $dnsResolverFactory->createCached('127.0.0.1', $loop);
    $factory = new React\HttpClient\Factory();
    $client = $factory->create($loop, $dnsResolver);
}
$loop->addPeriodicTimer(0.25, function () {
    static $count = 0;
    $count++;
    echo $count, PHP_EOL;
    if ($count == 10) {
        posix_kill(posix_getpid(), SIGTERM);
    }
});
$pcntl = new MKraemer\ReactPCNTL\PCNTL($loop);
$pcntl->on(SIGTERM, function () {
    // Clear some queue
    // Write syslog
    // Do ALL the stuff
    echo 'Bye' . PHP_EOL;
    die;
});
$pcntl->on(SIGINT, function () {
    echo 'Terminated by console' . PHP_EOL;
    die;
示例#18
0
文件: App.php 项目: clue/psocksd
 public function start(array $args)
 {
     // apply default settings for arguments
     $args += array('socket' => 'socks://localhost:9050', 'measureTraffic' => true, 'measureTime' => true, 'interactive' => DIRECTORY_SEPARATOR === '/' && !isset($args['no-interaction']) && !isset($args['n']) && defined('STDIN') && is_resource(STDIN));
     $settings = $this->parseSocksSocket($args['socket']);
     if ($settings['host'] === '*') {
         $settings['host'] = '0.0.0.0';
     }
     $this->loop = $loop = \React\EventLoop\Factory::create();
     $this->stdio = new Stream(STDOUT, $loop);
     $this->stdio->pause();
     if ($args['interactive']) {
         $this->stdio = new Stdio($loop);
         $this->stdio->getReadline()->setPrompt('> ');
         // forward all lines through commander
         $this->stdio->getReadline()->on('data', array($this, 'onReadLine'));
         // exit program when input stream closes
         $this->stdio->on('end', function () use($loop) {
             echo 'STDIN closed. Exiting program...';
             $loop->stop();
             echo PHP_EOL;
             // stop output buffering
             ob_end_flush();
         });
         // make sure any echo calls will be piped through this stdio instance
         $stdio = $this->stdio;
         ob_start(function ($chunk) use($stdio) {
             $stdio->write($chunk);
             return '';
         }, 1);
         $this->stdio->write('Running in interactive mode. Type "help" for more info.' . PHP_EOL);
     } else {
         $this->stdio->write('Running in non-interactive mode.');
     }
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $this->resolver = $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
     $this->via = new ConnectionManagerSelective();
     $this->via->addConnectionManagerFor($this->createConnectionManager('none'), '*', '*', self::PRIORITY_DEFAULT);
     $socket = new \React\Socket\Server($loop);
     $this->server = new \Clue\React\Socks\Server($loop, $socket, $this->via);
     if (isset($settings['protocolVersion'])) {
         $this->server->setProtocolVersion($settings['protocolVersion']);
     }
     try {
         $socket->listen($settings['port'], $settings['host']);
     } catch (Exception $e) {
         $this->stdio->write('ERROR: Unable to start listening socket: ' . $e->getMessage() . PHP_EOL);
         $this->stdio->close();
     }
     $this->stdio->write('SOCKS proxy server listening on ' . $settings['host'] . ':' . $settings['port'] . PHP_EOL);
     if (isset($settings['user']) || isset($settings['pass'])) {
         $settings += array('user' => '', 'pass' => '');
         $this->server->setAuthArray(array($settings['user'] => $settings['pass']));
     }
     new Option\Log($this->server, $this->stdio);
     if ($args['measureTraffic']) {
         new Option\MeasureTraffic($this->server);
     }
     if ($args['measureTime']) {
         new Option\MeasureTime($this->server);
     }
     $loop->run();
 }
示例#19
0
<?php

require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/config.php';
$loop = React\EventLoop\Factory::create();
$dnsResolverFactory = new React\Dns\Resolver\Factory();
$dnsResolver = $dnsResolverFactory->createCached(HOMER_RESOLVER_ADDRESS, $loop);
$factory = new React\HttpClient\Factory();
$client = $factory->create($loop, $dnsResolver);
$db = new PDO(HOMER_DNS);
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$queue = new Homer\Queue($db);
$search = new Homer\Search($db);
$limiter = new Homer\Limiter();
$loop->addPeriodicTimer(HOMER_TIMER, function ($timer) use($client, $queue, $search, $limiter) {
    while ($row = $queue->pop()) {
        if ($limiter->available($row['url'])) {
            $loader = new Homer\Loader($client, $queue, $search);
            if ($loader->load($row['url'], $row['deep'])) {
                $limiter->limit($row['url']);
                echo "Loading {$row['url']}\n";
                break;
            }
        }
    }
    $limiter->release(HOMER_LIMITER_TIME);
});
if (HOMER_STAT) {
    $socket = new React\Socket\Server($loop);
    $http = new React\Http\Server($socket, $loop);
    $stat = new Homer\Statistic();
示例#20
0
 /**
  * @return Resolver
  */
 public function getResolver()
 {
     if (!$this->resolver) {
         $factory = new \React\Dns\Resolver\Factory();
         $this->setResolver($factory->createCached('8.8.8.8', $this->getLoop()));
     }
     return $this->resolver;
 }
示例#21
0
文件: client.php 项目: calcinai/bolt
<?php

require __DIR__ . '/../vendor/autoload.php';
$loop = \React\EventLoop\Factory::create();
$dns_factory = new React\Dns\Resolver\Factory();
$resolver = $dns_factory->createCached('8.8.8.8', $loop);
$client = new \Calcinai\Bolt\Client('ws://127.0.0.1:1337/chat', $loop, $resolver);
$client->setOrigin('127.0.0.1');
$client->connect();
$client->on('stateChange', function ($newState) {
    echo "State changed to: {$newState}\n";
});
$client->on('message', function ($message) use($client) {
});
$loop->run();
//print_r($client);
示例#22
0
 private function getDnsResolver()
 {
     $dnsResolverFactory = new \React\Dns\Resolver\Factory();
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $this->loop);
     return $dns;
 }
示例#23
0
<?php

/**
 * Common bootstrap for all examples
 */
if (file_exists($path = __DIR__ . '/../vendor/autoload.php')) {
    require_once $path;
} elseif (file_exists($path = __DIR__ . '/../../../../vendor/autoload.php')) {
    require_once $path;
}
// Init react
$eventLoop = React\EventLoop\Factory::create();
$dnsFactory = new React\Dns\Resolver\Factory();
$dnsResolver = $dnsFactory->createCached("8.8.8.8", $eventLoop);
$httpClientFactory = new React\HttpClient\Factory();
$httpClient = $httpClientFactory->create($eventLoop, $dnsResolver);
// Register flow() function
Flow\Flow::register(new Flow\Schedulers\HorizontalScheduler($eventLoop));
示例#24
0
<?php

require __DIR__ . '/../vendor/autoload.php';
$config = (include 'config.php');
$loop = React\EventLoop\Factory::create();
$dnsResolverFactory = new React\Dns\Resolver\Factory();
$resolver = $dnsResolverFactory->createCached('192.168.0.1', $loop);
$version = new oliverlorenz\reactphpmqtt\protocol\Version4();
$connector = new oliverlorenz\reactphpmqtt\Connector($loop, $resolver, $version);
$p = $connector->create($config['server']);
$p->then(function (\React\Stream\Stream $stream) use($connector) {
    return $connector->subscribe($stream, '#', 0);
});
$loop->run();
<?php

require_once '../vendor/autoload.php';
/**
   Example is used with React stream, but you can use whatever library you want to as long as it implement Madkom\EventStore\Client\Domain\Socket\Stream
   Your EventStore must be up, to handle connection
*/
$loop = React\EventLoop\Factory::create();
$dnsResolverFactory = new React\Dns\Resolver\Factory();
$dns = $dnsResolverFactory->createCached(null, $loop);
$connector = new React\SocketClient\Connector($loop, $dns);
$resolvedConnection = $connector->create('127.0.0.1', 1113);
$resolvedConnection->then(function (React\Stream\Stream $stream) {
    // We create Event Store API Object
    $eventStore = new \Madkom\EventStore\Client\Application\Api\EventStore(new \Madkom\EventStore\Client\Infrastructure\ReactStream($stream), new \Madkom\EventStore\Client\Infrastructure\InMemoryLogger());
    // We add bunch of listeners, because API is asynchronous
    $eventStore->addAction(\Madkom\EventStore\Client\Domain\Socket\Message\MessageType::HEARTBEAT_REQUEST, function () {
        echo "I response to ES heartbeat request\n";
    });
    $eventStore->addAction(\Madkom\EventStore\Client\Domain\Socket\Message\MessageType::WRITE_EVENTS_COMPLETED, function ($data) {
        echo "Added new event: \n";
        //        print_r($data);
    });
    $eventStore->addAction(\Madkom\EventStore\Client\Domain\Socket\Message\MessageType::READ_STREAM_EVENTS_FORWARD_COMPLETED, function ($data) {
        print_r($data);
    });
    //We start to listen for event we added
    $eventStore->run();
    //Now let's try writing messages to stream
    $eventStreamId = 'someteststream';
    //    Add new event to stream