3
3
4
4
"""A highlevel interface for the dispatch API."""
5
5
6
+ import abc
7
+ from typing import Protocol , TypeVar
8
+
6
9
import grpc .aio
7
10
from frequenz .channels import Broadcast , Receiver
8
11
from frequenz .client .dispatch .types import Dispatch
9
12
10
13
from frequenz .dispatch ._event import DispatchEvent
11
14
from frequenz .dispatch .actor import DispatchActor
12
15
16
+ ReceivedT = TypeVar ("ReceivedT" )
17
+ """The type being received."""
18
+
19
+
20
+ class ReceiverFetcher (Protocol [ReceivedT ]):
21
+ """An interface that just exposes a `new_receiver` method."""
22
+
23
+ @abc .abstractmethod
24
+ def new_receiver (
25
+ self , name : str | None = None , maxsize : int = 50
26
+ ) -> Receiver [ReceivedT ]:
27
+ """Get a receiver from the channel.
28
+
29
+ Args:
30
+ name: A name to identify the receiver in the logs.
31
+ maxsize: The maximum size of the receiver.
32
+
33
+ Returns:
34
+ A receiver instance.
35
+ """
36
+
13
37
14
38
class Dispatcher :
15
39
"""A highlevel interface for the dispatch API.
@@ -36,8 +60,8 @@ async def run():
36
60
service_address = "localhost:50051"
37
61
dispatcher = Dispatcher(microgrid_id, grpc_channel, service_address)
38
62
dispatcher.start() # this will start the actor
39
- dispatch_arrived = dispatcher.updated_dispatches()
40
- dispatch_ready = dispatcher.ready_dispatches()
63
+ dispatch_arrived = dispatcher.updated_dispatches.new_receiver ()
64
+ dispatch_ready = dispatcher.ready_dispatches.new_receiver ()
41
65
```
42
66
"""
43
67
@@ -65,18 +89,20 @@ async def start(self) -> None:
65
89
"""Start the actor."""
66
90
self ._actor .start ()
67
91
68
- def updated_dispatches (self ) -> Receiver [DispatchEvent ]:
92
+ @property
93
+ def updated_dispatches (self ) -> ReceiverFetcher [DispatchEvent ]:
69
94
"""Return new, updated or deleted dispatches receiver.
70
95
71
96
Returns:
72
97
A new receiver for new dispatches.
73
98
"""
74
- return self ._updated_channel . new_receiver ()
99
+ return self ._updated_channel
75
100
76
- def ready_dispatches (self ) -> Receiver [Dispatch ]:
101
+ @property
102
+ def ready_dispatches (self ) -> ReceiverFetcher [Dispatch ]:
77
103
"""Return ready dispatches receiver.
78
104
79
105
Returns:
80
106
A new receiver for ready dispatches.
81
107
"""
82
- return self ._ready_channel . new_receiver ()
108
+ return self ._ready_channel
0 commit comments