Lines 80.95% 17 / 21
Functions and Methods 83.33% 5 / 6
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
ExposureProxy 80.95% 17 / 21 83.33% 5 / 6 6.25 0.00% 0 / 1
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 forwardExpose 100.00% 6 / 6 100.00% 1 / 1 1
 forwardReconfigure 100.00% 5 / 5 100.00% 1 / 1 1
 forwardUpdate 100.00% 4 / 4 100.00% 1 / 1 1
 forwardRemove 0.00% 0 / 4 0.00% 0 / 1 2
 requireAppId 100.00% 1 / 1 100.00% 1 / 1 1
1<?php
2
3declare(strict_types=1);
4
5namespace Stewart\Runtime\Broker\Exposure;
6
7use Stewart\Client\Component\ExposedEntityDefinition;
8use Stewart\Contracts\App\AppId;
9use Stewart\Contracts\Exception\ExposureException;
10use Stewart\Contracts\Exposure\ExposedEntityKey;
11use Stewart\Runtime\Broker\HaCallSlots;
12use Stewart\Runtime\Broker\WorkerHandle;
13use Stewart\Runtime\Ipc\Message\ExposeEntityRequest;
14use Stewart\Runtime\Ipc\Message\ExposeEntityResult;
15use Stewart\Runtime\Ipc\Message\ExposureAcknowledged;
16use Stewart\Runtime\Ipc\Message\ReconfigureExposedEntityRequest;
17use Stewart\Runtime\Ipc\Message\RemoveExposedEntityRequest;
18use Stewart\Runtime\Ipc\Message\UpdateExposedEntityRequest;
19use Stewart\Runtime\Model\ResourceScope;
20
21final readonly class ExposureProxy
22{
23    public function __construct(
24        private ExposureLink $exposures,
25        private HaCallSlots $slots,
26    ) {}
27
28    public function forwardExpose(WorkerHandle $handle, ExposeEntityRequest $request): void
29    {
30        $this->slots->runCounted($handle, $request, function () use ($handle, $request): ExposeEntityResult {
31            $appId = $this->requireAppId($request->scope, $request->key);
32            $definition = ExposedEntityDefinition::fromConfig($request->config, $request->device);
33            $snapshot = $this->exposures->exposeEntity($handle->id, $appId, $request->key, $definition, $request->change);
34
35            return new ExposeEntityResult($request->correlationId, $snapshot);
36        });
37    }
38
39    public function forwardReconfigure(WorkerHandle $handle, ReconfigureExposedEntityRequest $request): void
40    {
41        $this->slots->runCounted($handle, $request, function () use ($request): ExposeEntityResult {
42            $appId = $this->requireAppId($request->scope, $request->key);
43            $snapshot = $this->exposures->reconfigureEntity($appId, $request->key, ExposedEntityDefinition::fromConfig($request->config, null));
44
45            return new ExposeEntityResult($request->correlationId, $snapshot);
46        });
47    }
48
49    public function forwardUpdate(WorkerHandle $handle, UpdateExposedEntityRequest $request): void
50    {
51        $this->slots->runCounted($handle, $request, function () use ($request): ExposureAcknowledged {
52            $this->exposures->updateEntity($this->requireAppId($request->scope, $request->key), $request->key, $request->change);
53
54            return new ExposureAcknowledged($request->correlationId);
55        });
56    }
57
58    public function forwardRemove(WorkerHandle $handle, RemoveExposedEntityRequest $request): void
59    {
60        $this->slots->runCounted($handle, $request, function () use ($request): ExposureAcknowledged {
61            $this->exposures->removeEntity($this->requireAppId($request->scope, $request->key), $request->key);
62
63            return new ExposureAcknowledged($request->correlationId);
64        });
65    }
66
67    /** @throws ExposureException */
68    private function requireAppId(ResourceScope $scope, ExposedEntityKey $key): AppId
69    {
70        return $scope->appId ?? throw ExposureException::outsideApp($key);
71    }
72}