Skip to content

Commit dd8f67c

Browse files
committed
Better handle top level messages
1 parent bb35494 commit dd8f67c

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

src/labthings/server/decorators.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .view import View
1515
from .find import current_labthing
1616
from .utilities import unpack
17+
from .event import PropertyStatusEvent, ActionStatusEvent
1718

1819
from labthings.core.tasks.pool import TaskThread
1920
from labthings.core.utilities import merge
@@ -122,6 +123,7 @@ def ThingAction(viewcls: View):
122123
Returns:
123124
View: View class with Action spec tags
124125
"""
126+
# TODO: Handle actionStatus messages
125127
# Update Views API spec
126128
tag_spec(viewcls, "actions")
127129
return viewcls
@@ -190,8 +192,8 @@ def wrapped(*args, **kwargs):
190192
)
191193

192194
if current_labthing():
193-
current_labthing().emit(
194-
"propertyStatus", {property_name: property_value},
195+
current_labthing().message(
196+
PropertyStatusEvent(property_name), property_value,
195197
)
196198

197199
return original_response

src/labthings/server/event.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33

44
class Event:
5-
# Some event types are formatted slightly differently
6-
magic_types = {"propertyStatus", "actionStatus"}
7-
85
def __init__(self, name, schema=None):
96
self.name = name
107
self.schema = schema
@@ -13,9 +10,35 @@ def __init__(self, name, schema=None):
1310

1411
def emit(self, data):
1512
response = {
16-
"messageType": self.name if self.name in Event.magic_types else "event",
13+
"messageType": "event",
1714
"timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
18-
"data": data if self.name in Event.magic_types else {self.name: data},
15+
"data": {self.name: data},
1916
} # TODO: Format data with schema
2017
self.events.append(response)
2118
return response
19+
20+
21+
class PropertyStatusEvent:
22+
def __init__(self, property_name, schema=None):
23+
self.name = property_name
24+
25+
def emit(self, data):
26+
response = {
27+
"messageType": "propertyStatus",
28+
"timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
29+
"data": {self.name: data},
30+
}
31+
return response
32+
33+
34+
class ActionStatusEvent:
35+
def __init__(self, property_name, schema=None):
36+
self.name = property_name
37+
38+
def emit(self, data):
39+
response = {
40+
"messageType": "actionStatus",
41+
"timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
42+
"data": {self.name: data},
43+
}
44+
return response

src/labthings/server/labthing.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,6 @@ def init_app(self, app):
167167
self._create_base_sockets()
168168

169169
# Create base events
170-
self.add_event("propertyStatus")
171-
self.add_event("actionStatus")
172170
self.add_event("logging")
173171

174172
def _create_base_routes(self):
@@ -336,9 +334,16 @@ def add_event(self, name, schema=None):
336334

337335
def emit(self, event_type: str, data: dict):
338336
"""
339-
Emit an event to all subscribers
337+
Find a matching event type if one exists, and emit some data to it
340338
"""
341-
event_response = self.events[event_type].emit(data)
339+
event_object = self.events[event_type]
340+
self.message(event_object, data)
341+
342+
def message(self, event: Event, data: dict):
343+
"""
344+
Emit an event object to all subscribers
345+
"""
346+
event_response = event.emit(data)
342347
for sub in self.subscribers:
343348
sub.emit(event_response)
344349

src/labthings/server/spec/td.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def to_dict(self):
102102

103103
def event_to_thing_event(self, event: Event):
104104
# TODO: Include event schema
105-
return {"forms": []}
105+
return {}
106106

107107
def view_to_thing_property(self, rules: list, view: View):
108108
prop_urls = [rule_to_path(rule) for rule in rules]

0 commit comments

Comments
 (0)