/** * @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; }