/** * @param RequestInterface $request * * @return PromiseInterface */ public function sendRequest(RequestInterface $request) { if (isset($this->promises[$request->getRequestId()])) { return promise\reject(new ClientException("ID {$request->getRequestId()} already in use")); } $this->responseBuilders[$request->getRequestId()] = new ResponseParser($request->getRequestId()); $this->promises[$request->getRequestId()] = new Deferred(); foreach ($request->toRecords() as $record) { $this->connector->write($record->encode()); } return $this->promises[$request->getRequestId()]->promise(); }
public function __construct($server, DuplexStreamInterface $stdio) { $server->on('connection', function (\React\Socket\Connection $client) use($stdio) { $name = '#' . (int) $client->stream; $log = function ($msg) use($client, &$name, $stdio) { $stdio->write(date('Y-m-d H:i:s') . ' ' . $name . ' ' . $msg . PHP_EOL); }; $log('connected'); $client->on('error', function ($error) use($log) { $msg = $error->getMessage(); while ($error->getPrevious() !== null) { $error = $error->getPrevious(); $msg .= ' - ' . $error->getMessage(); } $log('error: ' . $msg); }); $client->on('target', function ($host, $port) use($log) { $log('tunnel target: ' . $host . ':' . $port); }); $client->on('auth', function ($username) use($log, &$name) { $name .= '(' . $username . ')'; $log('client authenticated'); }); $client->on('ready', function (\React\Stream\Stream $remote) use($log) { $log('tunnel to remote stream #' . (int) $remote->stream . ' successfully established'); }); $client->on('close', function () use($log, &$client) { $dump = ''; $client->emit('dump-close', array(&$dump)); $log('disconnected' . $dump); }); }); }