formatErrorResponse($request, $code, $error)); return $this->response()->addHeader('content-type', 'application/json')->setBody($body); } public function buildResponse(ServerRequestInterface $request, $response): ResponsePlusInterface { $body = new SwooleStream($this->formatResponse($response, $request)); return $this->response() ->addHeader('content-type', 'application/json') ->setBody($body); } public function persistToContext(ResponsePlusInterface $response): ResponsePlusInterface { return ResponseContext::set($response); } protected function formatResponse($response, ServerRequestInterface $request): string { $response = $this->dataFormatter->formatResponse( new Response($request->getAttribute('request_id'), $response) ); return $this->packer->pack($response); } protected function formatErrorResponse(ServerRequestInterface $request, int $code, ?Throwable $error = null): string { [$code, $message] = $this->error($code, $error?->getMessage()); $response = $this->dataFormatter->formatErrorResponse( new ErrorResponse($request->getAttribute('request_id'), $code, $message, $error) ); return $this->packer->pack($response); } protected function error(int $code, ?string $message = null): array { $mapping = [ self::PARSE_ERROR => 'Parse error.', self::INVALID_REQUEST => 'Invalid request.', self::METHOD_NOT_FOUND => 'Method not found.', self::INVALID_PARAMS => 'Invalid params.', self::INTERNAL_ERROR => 'Internal error.', ]; if (isset($mapping[$code])) { return [$code, $mapping[$code]]; } return [$code, $message ?? '']; } /** * Get response instance from context. */ protected function response(): ResponsePlusInterface { return ResponseContext::get(); } }