9
9
Awaitable ,
10
10
Callable ,
11
11
Dict ,
12
+ Iterator ,
12
13
List ,
14
+ Literal ,
13
15
NamedTuple ,
14
16
Optional ,
15
17
Sequence ,
19
21
)
20
22
21
23
from ..enums import BootStatus
22
- from ..typing import FutureLike
24
+ from ..typing import FutureLike , SupportsOsc
23
25
from .messages import OscBundle , OscMessage
24
26
25
27
osc_protocol_logger = logging .getLogger (__name__ )
@@ -65,31 +67,35 @@ class HealthCheck:
65
67
66
68
class CaptureEntry (NamedTuple ):
67
69
timestamp : float
68
- label : str
70
+ label : Literal [ "R" , "S" ]
69
71
message : Union [OscMessage , OscBundle ]
72
+ raw_message : Union [SupportsOsc , SequenceABC , str ] | None = None
70
73
71
74
72
75
class Capture :
73
76
### INITIALIZER ###
74
77
75
- def __init__ (self , osc_protocol ) :
78
+ def __init__ (self , osc_protocol : "OscProtocol" ) -> None :
76
79
self .osc_protocol = osc_protocol
77
- self .messages = []
80
+ self .messages : list [ CaptureEntry ] = []
78
81
79
82
### SPECIAL METHODS ###
80
83
81
- def __enter__ (self ):
84
+ def __enter__ (self ) -> "Capture" :
82
85
self .osc_protocol .captures .add (self )
83
86
self .messages [:] = []
84
87
return self
85
88
86
- def __exit__ (self , exc_type , exc_value , traceback ):
89
+ def __exit__ (self , exc_type , exc_value , traceback ) -> None :
87
90
self .osc_protocol .captures .remove (self )
88
91
89
- def __iter__ (self ):
92
+ def __getitem__ (self , i : int | slice ) -> CaptureEntry | list [CaptureEntry ]:
93
+ return self .messages [i ]
94
+
95
+ def __iter__ (self ) -> Iterator [CaptureEntry ]:
90
96
return iter (self .messages )
91
97
92
- def __len__ (self ):
98
+ def __len__ (self ) -> int :
93
99
return len (self .messages )
94
100
95
101
### PUBLIC METHODS ###
@@ -98,7 +104,7 @@ def filtered(
98
104
self , sent = True , received = True , status = True
99
105
) -> List [Union [OscBundle , OscMessage ]]:
100
106
messages = []
101
- for _ , label , message in self .messages :
107
+ for _ , label , message , _ in self .messages :
102
108
if label == "R" and not received :
103
109
continue
104
110
if label == "S" and not sent :
@@ -112,24 +118,6 @@ def filtered(
112
118
messages .append (message )
113
119
return messages
114
120
115
- ### PUBLIC PROPERTIES ###
116
-
117
- @property
118
- def received_messages (self ):
119
- return [
120
- (timestamp , osc_message )
121
- for timestamp , label , osc_message in self .messages
122
- if label == "R"
123
- ]
124
-
125
- @property
126
- def sent_messages (self ):
127
- return [
128
- (timestamp , osc_message )
129
- for timestamp , label , osc_message in self .messages
130
- if label == "S"
131
- ]
132
-
133
121
134
122
class OscProtocol :
135
123
### INITIALIZER ###
@@ -293,27 +281,35 @@ def _register(
293
281
kwargs = kwargs ,
294
282
)
295
283
296
- def _send (self , message ) :
284
+ def _send (self , raw_message : Union [ SupportsOsc , SequenceABC , str ]) -> bytes :
297
285
if self .status not in (BootStatus .BOOTING , BootStatus .ONLINE ):
298
286
raise OscProtocolOffline
299
- if not isinstance (message , (str , SequenceABC , OscBundle , OscMessage )):
300
- raise ValueError (message )
301
- if isinstance (message , str ):
302
- message = OscMessage (message )
303
- elif isinstance (message , SequenceABC ):
304
- message = OscMessage (* message )
287
+ if not isinstance (raw_message , (str , SequenceABC , SupportsOsc )):
288
+ raise ValueError (raw_message )
289
+ message : OscBundle | OscMessage
290
+ if isinstance (raw_message , str ):
291
+ message = OscMessage (raw_message )
292
+ elif isinstance (raw_message , SequenceABC ):
293
+ message = OscMessage (* raw_message )
294
+ else :
295
+ message = raw_message .to_osc ()
305
296
osc_out_logger .debug (
306
297
f"[{ self .ip_address } :{ self .port } /{ self .name or hex (id (self ))} ] "
307
298
f"{ message !r} "
308
299
)
309
300
for capture in self .captures :
310
301
capture .messages .append (
311
- CaptureEntry (timestamp = time .time (), label = "S" , message = message )
302
+ CaptureEntry (
303
+ timestamp = time .time (),
304
+ label = "S" ,
305
+ message = message ,
306
+ raw_message = raw_message ,
307
+ )
312
308
)
313
309
datagram = message .to_datagram ()
314
310
udp_out_logger .debug (
315
311
f"[{ self .ip_address } :{ self .port } /{ self .name or hex (id (self ))} ] "
316
- f"{ datagram } "
312
+ f"{ datagram !r } "
317
313
)
318
314
return datagram
319
315
@@ -373,7 +369,7 @@ def register(
373
369
) -> OscCallback :
374
370
raise NotImplementedError
375
371
376
- def send (self , message : Union [OscBundle , OscMessage , SequenceABC , str ]) -> None :
372
+ def send (self , message : Union [SupportsOsc , SequenceABC , str ]) -> None :
377
373
raise NotImplementedError
378
374
379
375
def unregister (self , callback : OscCallback ) -> None :
0 commit comments