* * @author Larry Sule-balogun */ final class ResourceUnsubscribeHandler implements RequestHandlerInterface { public function __construct( private readonly RegistryInterface $registry, private readonly SubscriptionManagerInterface $subscriptionManager, private readonly LoggerInterface $logger = new NullLogger(), ) { } public function supports(Request $request): bool { return $request instanceof ResourceUnsubscribeRequest; } /** * @throws InvalidArgumentException */ public function handle(Request $request, SessionInterface $session): Response|Error { \assert($request instanceof ResourceUnsubscribeRequest); $uri = $request->uri; try { $this->registry->getResource($uri); } catch (ResourceNotFoundException $e) { $this->logger->error('Resource not found', ['uri' => $uri, 'exception' => $e]); return (new RequestContext($session, $request))->getProtocolVersion()->usesInvalidParamsForResourceNotFound() ? Error::forInvalidParams($e->getMessage(), $request->getId(), ['uri' => $uri]) : Error::forResourceNotFound($e->getMessage(), $request->getId()); } $this->logger->debug('Unsubscribing from resource', ['uri' => $uri]); $this->subscriptionManager->unsubscribe($session, $uri); return new Response( $request->getId(), new EmptyResult(), ); } }