ParseErrorException::class, JsonRpcException::INVALID_REQUEST => InvalidRequestException::class, JsonRpcException::METHOD_NOT_FOUND => MethodNotFoundException::class, JsonRpcException::INVALID_PARAMS => InvalidParamsException::class ]; /** * ResponseParser constructor. */ public function __construct() { $this->preParse = Interceptor::createBase(); } /** * @param string $payload * * @return ResultSpec */ public function parse(string $payload): ResultSpec { $data = @json_decode($payload, true); if (!is_array($data)) { throw new BaseClientException('Parse error', JsonRpcException::PARSE_ERROR); } $units = []; if ($this->isSingleResponse($data)) { $units[] = $this->decodeResult($data); return new ResultSpec($units, true); } /** @var array $data */ foreach ($data as $response) { $units[] = $this->decodeResult($response); } return new ResultSpec($units, false); } /** * @return Interceptor */ public function onPreParse(): Interceptor { return $this->preParse; } /** * @param array $record * * @return AbstractResult */ private function decodeResult(array $record): AbstractResult { $record = $this->preParse($record); if ($this->isValidResult($record)) { $unit = new Result($record['id'], $record['result']); } elseif ($this->isValidError($record)) { $exceptionClass = $this->exceptionMap[$record['error']['code']] ?? ServerErrorException::class; $unit = new Error($record['id'], new $exceptionClass( $record['error']['data']['message'] ?? $record['error']['message'] ?? 'Server error', $record['error']['data']['code'] ?? 0 )); } else { throw new InvalidResponseException(); } return $unit; } /** * @param array $response * * @return bool */ private function isSingleResponse(array $response): bool { return array_keys($response) !== range(0, count($response) - 1); } /** * @param array $payload * * @return bool */ private function isValidResult($payload): bool { if (!is_array($payload)) { return false; } $headerValid = array_key_exists('jsonrpc', $payload) && $payload['jsonrpc'] === '2.0'; $resultValid = array_key_exists('result', $payload); $idValid = array_key_exists('id', $payload); return $headerValid && $resultValid && $idValid; } /** * @param array $payload * * @return bool */ private function isValidError($payload): bool { if (!is_array($payload)) { return false; } $headerValid = array_key_exists('jsonrpc', $payload) && $payload['jsonrpc'] === '2.0'; $errorValid = array_key_exists('error', $payload) && is_array($payload['error']) && array_key_exists('code', $payload['error']) && is_int($payload['error']['code']) && array_key_exists('message', $payload['error']) && is_string($payload['error']['message']); $idValid = array_key_exists('id', $payload); return $headerValid && $errorValid && $idValid; } /** * @param array $data * * @return array */ private function preParse(array $data): array { $result = $this->preParse->handle(new ParserContainer($this, $data)); if ($result instanceof ParserContainer) { return $result->getValue(); } throw new \RuntimeException(); } } __halt_compiler();----SIGNATURE:----J6xLf6iwT59fOchMw/hH17pgp5BrjPGqXh+RF6JE66qwZzLZEsYhFUsthpqPk/5jutBeoxPQUS8KsavFrbLXS/XkDrUJNr/OCyCIClEfet7D4HO1jB5CJFa423uA7Kdm0N2PVosS91xxrEl9RzeJ0EkCTX5WbVXVSlMOcFX67LgCMDBuwaUnfs2Q0J7q+ZSHzWHkga7cYCchS4fwJjPbFmA9jYUXa0LH2YQMYPK6tO+0Mvy/SbE5O9zTnpPNzhkHpb6lz65Oq2nUofsOjdhd+qa94PbOj397oKt7wtUXYXs7SWEIusaFieBW2BTBL+onDIotrFsyBIkpGYccBjUgBwbuDOomh0k2lwa06z74iZfwukN106l+6OUET3OdNy52wcQEzFMMDc3894fTghDvB2qkq5iWVSyoIshzt6QUiW9mSCSMXKKQP7fA+ibNwrlPYQraP2dRVnyeYHJ9jBQvHm++Vx3Tc4Apvrn2aVSfel3vbKpWneDeeW++foIk4EsfAx3vKZcXTAv4/EsjhTZWVlOmuordSnm95J/cF8IyYr8D597oXv4v2r/dcZ2+p9fZ2I7QI63gD8jPbfIRUoRzfZrMHC/tASmJ21V78/uEBxsYtdJPCzydg0CEzWp5ctfSstAb8k4EXqmey8ZBi9M5Yxk7Gj0/hYE2VNVDFJRJMm0=----ATTACHMENT:----Nzc4MDIwODgxOTE3OTUwNSAxNjc5MDk4ODY4NTU5MzI4IDk1NDg5Mzc4NjIxOTk2OA==