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:----Nbtw/FLWsnX00rfHlAqzxER09L30gwFu+0l2Xlva6OuPD7/Nh2Cw3WY+GPDmYIoLZ6fx9wfpxw8OHlb0BaCIKI67Hzvl2pa7TgKmliyTHX37aPblDyBCk+FpGJHb/Lz3FNU7GvpCHAnyzz+g6Ufk1Xi2Df3pTQHv+YBJSY3eGInK+I+Kf3ZlpKna2IqNz/pTnwfLywhCjjYp4lF8I/9WyzZwAaRCE9OPvSFFKeIkvb4JolC8++HoNsQGY/3PxP3pmn56R5U1F/7UtB6uKyMz7QbG4UHlmi3qShybd/i8QziZQ6S//seaz5bPs2gW+QBlHi6f1TwgekzoR/jDJJ05rulSudJlaEc/XPySIK/CV5Ic3KY6Hh+wXuMNusat66DLBAKRYsJlRiDQ5pHGwKL8RlyOM5bIFmZytT6T4GxNt9cm0od27JGh1Cr7WDiEM0Y8K/5ELZbEU7yLLrv5ik6tfV75d4Iu892GIwYDUEsC1Rjr4t7uWNxgqGPveYeCvJLu3gm0rRMLWN9QJgEhlZ5BUAx6DgAmUoqfKU4FPOVSUd+HDTFbqB8JpGtXvwB9CwygFZmrbiu8aRAfgq0mhzsOIuFm00V1DNu71Dq/yOo5Wa4dHwwKwKPLpe5c52+EoyY3nbQw//iBLgmBb+JLFWQP9E0PdAOjxYKPreCrFoI+Ozg=----ATTACHMENT:----NjkyNzk5MjMwNTI5ODI0MCA2NjkzMDI4NjI3NzU0MzgxIDM5MTU3MDQ3NzYzMDM5NA==