/** * Handle OOB data * * @param RequestDescriptor $descriptor Request descriptor * @param RequestExecutorInterface $executor Executor, processing operation * @param EventHandlerInterface $eventHandler Event handler for this operation * * @return OperationInterface|null Operation to return to user or null to continue normal processing */ private function handleOobData(RequestDescriptor $descriptor, RequestExecutorInterface $executor, EventHandlerInterface $eventHandler) { if (!$descriptor->hasState(RequestDescriptor::RDS_OOB)) { return null; } $descriptor->clearState(RequestDescriptor::RDS_OOB); $picker = new RawFramePicker(); $socket = $descriptor->getSocket(); $meta = $descriptor->getMetadata(); $frame = $socket->read($picker, true); $event = new ReadEvent($executor, $socket, $meta[RequestExecutorInterface::META_USER_CONTEXT], $frame, true); $eventHandler->invokeEvent($event); return $event->getNextOperation(); }