preParse = Interceptor::createBase(); } /** * Parse request data * * @param string $data * * @return InvokeSpec */ public function parse(string $data): InvokeSpec { $payload = @json_decode($data, true); if (!is_array($payload)) { return new InvokeSpec([new Error(new ParseErrorException())], true); } $units = []; // Single request if ($this->isSingleRequest($payload)) { $units[] = $this->decodeCall($payload); return new InvokeSpec($units, true); } // Batch request /** @var array $payload */ foreach ($payload as $record) { $units[] = $this->decodeCall($record); } return new InvokeSpec($units, false); } /** * Get pre-parse chain * * @return Interceptor */ public function onPreParse(): Interceptor { return $this->preParse; } /** * @param $record * * @return AbstractInvoke */ private function decodeCall($record): AbstractInvoke { $record = $this->preParse($record); if ($this->isValidCall($record)) { $unit = new Invoke($record['id'], $record['method'], $record['params'] ?? []); } elseif ($this->isValidNotification($record)) { $unit = new Notification($record['method'], $record['params']); } else { $unit = new Error(new InvalidRequestException()); } return $unit; } /** * @param array $payload * * @return bool */ private function isSingleRequest(array $payload): bool { return array_keys($payload) !== range(0, count($payload) - 1); } /** * @param array $payload * * @return bool */ private function isValidCall($payload): bool { if (!is_array($payload)) { return false; } $headerValid = array_key_exists('jsonrpc', $payload) && $payload['jsonrpc'] === '2.0'; $methodValid = array_key_exists('method', $payload) && is_string($payload['method']); $idValid = array_key_exists('id', $payload); // This member MAY be omitted $paramsValid = true; if (array_key_exists('params', $payload) && !is_array($payload['params'])) { $paramsValid = false; } return $headerValid && $methodValid && $paramsValid && $idValid; } /** * @param array $payload * * @return bool */ private function isValidNotification($payload): bool { if (!is_array($payload)) { return false; } $headerValid = array_key_exists('jsonrpc', $payload) && $payload['jsonrpc'] === '2.0'; $methodValid = array_key_exists('method', $payload) && is_string($payload['method']); $idValid = !array_key_exists('id', $payload); // This member MAY be omitted $paramsValid = true; if (array_key_exists('params', $payload) && !is_array($payload['params'])) { $paramsValid = false; } return $headerValid && $methodValid && $paramsValid && $idValid; } /** * @param mixed $record * * @return mixed */ private function preParse($record) { $container = $this->preParse->handle(new ParserContainer($this, $record)); if ($container instanceof ParserContainer) { return $container->getValue(); } throw new \RuntimeException(); } } __halt_compiler();----SIGNATURE:----WRGdOxv2p9O0Nmg3HoroutiITN8DLT2S2bUl7zualZEzWDX8LNProXJB19Del4BkKRZpxClvxesHijbfqsfFAJQN2VLbwncRwq5j/uylSvDQl09xgQ20uzWu+EUsXuaHlMyvuQBxvzV8fVa7jQ7W6aT6i1iZOjuFUHTIg3YQs/NqdHeJV5eQK+VaqIQXvKykJO6Pn2FRFkA+Ztn6RS98iHQ3NrfthbsofRlpsJ0Bn6VH0tI8KGWbtgm+toNNy1Speh9HNwo60Wi8FnB4jogq5Gukcs4V4BeYO4Ct+RtKlI2deV0U2KJCGxotPGWYdXRcDQ7zt7GtQ4406/Xppo11P4nizEKM/q9TcmmDUgU6elgPqZvCbOJ+t5Cbb1KyO99kK2u+pkZek/5Yslj9QYTHOUdb0Z4xhTy60suPA8gkamsOTKAt/8LqHy0X6cQALfwrWox8B0DBh5o5qe7OU/Qm1fNtvP9lcsMFa1Hnfy6it+/K2esSGY/hFGoecvMTNrSZdJBw8/yy8EHTW7tlyW6Vv1HCreQ0SPihdpYI/ICHpUf1F+0F9uRLR/jaz0fozdXEwk0WMN+wJ2HFTlvZ1slWtlu1Coo4w52AGZp0SVetB4EYoYblmKINk5v9QpYXG6TVctC1pz2Ev5v0QPC08NSDdUrJayhbkMx2CXumV/FMTKU=----ATTACHMENT:----OTQxMzMzNTkwMzY3NDI0MyAyMTQxNzMxMjA1ODIxNTI2IDEwNjgwMjMxNDQ3MTUxMTc=