Lines 100.00% 12 / 12
Functions and Methods 100.00% 4 / 4
Classes and Traits 100.00% 1 / 1
Name Lines Functions and Methods CRAP Classes and Traits
EventFireRequestHandler 100.00% 12 / 12 100.00% 4 / 4 6 100.00% 1 / 1
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 handledMessageClass 100.00% 1 / 1 100.00% 1 / 1 1
 handle 100.00% 1 / 1 100.00% 1 / 1 1
 fireOnHomeAssistant 100.00% 9 / 9 100.00% 1 / 1 3
1<?php
2
3declare(strict_types=1);
4
5namespace Stewart\Runtime\Broker\Message;
6
7use Psr\Log\LoggerInterface;
8use Stewart\Client\HaClient;
9use Stewart\Contracts\Exception\EventFireException;
10use Stewart\Runtime\Broker\HaCallSlots;
11use Stewart\Runtime\Broker\HaSession;
12use Stewart\Runtime\Broker\WorkerHandle;
13use Stewart\Runtime\Config\ServiceCallPolicy;
14use Stewart\Runtime\Ipc\Message\EventFireRequest;
15use Stewart\Runtime\Ipc\Message\EventFireResult;
16use Stewart\Runtime\Ipc\Message\WorkerMessage;
17use Stewart\Support\Wire\EventPayload;
18
19/** @implements WorkerMessageHandler<EventFireRequest> */
20final readonly class EventFireRequestHandler implements WorkerMessageHandler
21{
22    public function __construct(
23        private HaSession $session,
24        private HaClient $client,
25        private HaCallSlots $slots,
26        private ServiceCallPolicy $policy,
27        private LoggerInterface $logger,
28    ) {}
29
30    public function handledMessageClass(): string
31    {
32        return EventFireRequest::class;
33    }
34
35    /** @param EventFireRequest $message */
36    public function handle(WorkerHandle $handle, WorkerMessage $message): void
37    {
38        $this->slots->runBounded($handle, $message, fn(): EventFireResult => $this->fireOnHomeAssistant($message));
39    }
40
41    /** @throws EventFireException */
42    private function fireOnHomeAssistant(EventFireRequest $request): EventFireResult
43    {
44        if ($this->policy->dryRun) {
45            $this->logger->info('Event not fired: service_calls.dry_run is on', [
46                'event_type' => $request->eventType,
47                'data' => $request->data,
48            ]);
49
50            return new EventFireResult($request->correlationId, $this->policy->createDryRunContext($request->correlationId));
51        }
52
53        if (!$this->session->isConnected()) {
54            throw $request->createUnreachableFailure('Home Assistant is disconnected');
55        }
56
57        return new EventFireResult($request->correlationId, $this->client->fireEvent(new EventPayload($request->eventType, $request->data)));
58    }
59}