/**
  * Create child process and set up RPC endpoints.
  *
  * @param \WyriHaximus\React\ChildProcess\Messenger\Messenger $messenger
  * @param \React\EventLoop\LoopInterface $loop
  */
 public function __construct(Messenger $messenger, LoopInterface $loop)
 {
     $this->recipient = $messenger;
     $this->loop = $loop;
     $this->recipient->registerRpc('config', [$this, 'rpcConfig']);
     $this->recipient->registerRpc('modifyKarma', [$this, 'rpcModifyKarma']);
     $this->recipient->registerRpc('fetchKarma', [$this, 'rpcFetchKarma']);
 }
 /**
  * Process constructor.
  * @param LoopInterface $loop
  * @param Messenger $messenger
  */
 protected function __construct(LoopInterface $loop, Messenger $messenger)
 {
     $this->loop = $loop;
     $this->messenger = $messenger;
     $this->messenger->registerRpc(MessengerFactory::PROCESS_REGISTER, function (Payload $payload) {
         if (!is_subclass_of($payload['className'], 'WyriHaximus\\React\\ChildProcess\\Messenger\\ChildInterface')) {
             throw new \Exception('Given class doesn\'t implement ChildInterface');
         }
         $this->registerClass($payload['className']);
         $this->deregisterRpc();
         return \React\Promise\resolve([]);
     });
 }
 protected function __construct(Messenger $messenger, LoopInterface $loop)
 {
     $messenger->registerRpc('return', function (Payload $payload) {
         return \React\Promise\resolve($payload->getPayload());
     });
     $this->ran = true;
 }
 /**
  * Process constructor.
  * @param Messenger $messenger
  */
 protected function __construct(Messenger $messenger)
 {
     $messenger->registerRpc('setFlysystem', [$this, 'setFlysystem']);
     $messenger->registerRpc('unlink', [$this, 'unlink']);
     $messenger->registerRpc('stat', [$this, 'stat']);
     $messenger->registerRpc('readdir', [$this, 'readdir']);
     $messenger->registerRpc('read', [$this, 'read']);
     $messenger->registerRpc('write', [$this, 'write']);
     $messenger->registerRpc('rename', [$this, 'rename']);
 }
 /**
  * @param LoopInterface $loop
  * @param array $options
  * @param null $termiteCallable
  * @return Messenger
  */
 public static function child(LoopInterface $loop, array $options = [], $termiteCallable = null)
 {
     $messenger = new Messenger(new Stream(STDIN, $loop), new Stream(STDOUT, $loop), new Stream(STDERR, $loop), ['read' => 'stdin', 'write_err' => 'stderr', 'write' => 'stdout'] + $options);
     if ($termiteCallable === null) {
         $termiteCallable = function () use($loop) {
             $loop->addTimer(self::TERMINATE_TIMEOUT, [$loop, 'stop']);
         };
     }
     $messenger->registerRpc(Messenger::TERMINATE_RPC, function (Payload $payload, Messenger $messenger) use($loop, $termiteCallable) {
         $messenger->emit('terminate', [$messenger]);
         $termiteCallable($payload, $messenger);
         return new FulfilledPromise();
     });
     return $messenger;
 }