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:----v4yGAauiguASgGRKCEHnskG0+7DsQHtNH+bGeUWNoTkPvTholbEb+7T8L0/uGUmjIgxPJx539jY+M01px22TFY7XzmZhuGQ3t5hzJOwXvuoZcuM+zPBkxScqOubNlbnQt9rp8bfM5YrartnaEihUVDGR997xmKKyx6F9fFYCeBh8DY0CdPuH1d4U440U3S2iWaM62Ex23U3NFFsnVq3j8MI43pXNCrpM9ZOroHTNBybx906nQmJV6p7uVSAsxzdqejKna4Z7+v88APyWEF6fPsbftjkPuF4bTvraW4ozAe77WOmCpsrd6pkdyilVffZFMQr83nX5lKJwXXzit1Xv5OKGvHVD/9oAsceKP21xV+aNRMILKXO4d8+z95JwSUBMUZsZoaQ536zXcNPzXqifALV17JDAGFwLDIC49b4m+cGeyPZFjMb5T6787IK4Qbz5ozWE5rpxavQBdV9q6iPbZz+7iHUSXhKN3hMcqSMgeV5+qlsAvoRLGa/bXtE3B8DuIwHupaAESsjsNKCCwONzTdR8wIHPnjUzVPW84psGtJnvgsZa6hugQTJkvoIEBADL+bHMMjJWJdLHoOUKHeRtJ57hqOL1EoTUQ63ReVRe68s75QZ28XfRqVxDFNJvQ0eqWx+wpN+8Ns9NNzSxBR2vEIaLGZxRJgb3/RZaJUDK+Fs=----ATTACHMENT:----MTIxNjc3NjUwMDc5MTIwNiA0MTIwNjg5ODAwMzY4NDg4IDIwNTUwMzUyMzk3MzIwMDk=