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:----egkNMKZ1UxeSy0bN12QEU3UOSy+Yc+OosUcX3MhawDQ5ph8dfYtUtfrTxU/HmuMEF2reLO1CM2aae5Jw+FGNl+BFnHli90J6bcjxRu0kViBWjApDR3XS8f4Or4VhUoawLCs7ZgIQ25LpawlMfi9c3b6T3+5BDYAMKxddANWU0fYOamjnqN0JpzIqIr9BQN8YrnmRVI5AIzBTP6zZyCgCTTzmYIx7DblIfdx3iiwwRc9oOolor3pXLDuvjs8XkJK2D/DE99TcUPClqXA6LjVo8V9OfRDq12iAL85YDWIa3K1tvRe+PNHeUDj6rvd0hBWtvjCnS5M0uPMc4XQCscERMH9J9bZ0ilpeFTQChoUBV4pZtYLv1WONk6PFKVkz0MitgtG+gGIdpYWqQHS1imbyfBi9Xn/G8/HankGqVK3/gvApnPPR4+hiVGCxkoJ1eiq7LvqO7KY6h8mRjCtNjVhmQQUyw98e0nqVgIB7pWSTGEGoMLILtygGrWDC8hGwsJJX0NwkvonVk3Wk+ISyzn8Zw5Xfbe1LswMBwuju+Wui+6GO7eN3Bt5tEmoEglgRdzlxZnUWYJiAExjpZmEsHnTKfZgHZ+5/6VYIABF5oO8l2EfwXhcriZQP+5bDkYweCqlZcN55PMqnT/Oc1ElRbGKVIgoES3t5GgT4fW5jPrGNjQ0=----ATTACHMENT:----MTkzMTU3NzU4Mjc2MDcwNiA5MTI2NTIzNTY0ODc4MDM5IDY2NjQwMTI3NTA1NTg3NTU=