1+ import json
12from typing import Dict , Generator
23
3- import json
4+ import requests
45
5- from brainframe .api . bf_codecs import ZoneStatus
6+ from brainframe .api import bf_codecs , bf_errors
67from .base_stub import BaseStub , DEFAULT_TIMEOUT
78
8- ZONE_STATUS_TYPE = Dict [int , Dict [str , ZoneStatus ]]
9+ ZONE_STATUS_TYPE = Dict [int , Dict [str , bf_codecs . ZoneStatus ]]
910ZONE_STATUS_STREAM_TYPE = Generator [ZONE_STATUS_TYPE , None , None ]
1011
1112
@@ -28,7 +29,7 @@ def get_latest_zone_statuses(self,
2829 data , _ = self ._get_json (req , timeout )
2930
3031 # Convert ZoneStatuses to Codecs
31- out = {int (s_id ): {key : ZoneStatus .from_dict (val )
32+ out = {int (s_id ): {key : bf_codecs . ZoneStatus .from_dict (val )
3233 for key , val in statuses .items ()}
3334 for s_id , statuses in data .items ()}
3435 return out
@@ -48,16 +49,26 @@ def get_zone_status_stream(self, timeout=None) -> ZONE_STATUS_STREAM_TYPE:
4849 def zone_status_iterator ():
4950 # Don't use a timeout for this request, since it's ongoing
5051 resp = self ._get (req , timeout = timeout )
51- for packet in resp .iter_lines (delimiter = b"\r \n " ):
52+
53+ packets = resp .iter_lines (delimiter = b"\r \n " )
54+ while True :
55+ try :
56+ packet = next (packets )
57+ except requests .exceptions .ChunkedEncodingError as exc :
58+ message = "Incomplete packet while attempting to read " \
59+ "from zone status iterator"
60+ raise bf_errors .ServerNotReadyError (message ) from exc
61+
5262 if packet == b'' :
5363 continue
5464
5565 # Parse the line
5666 zone_statuses_dict = json .loads (packet )
5767
58- processed = {int (s_id ): {key : ZoneStatus .from_dict (val )
59- for key , val in statuses .items ()}
60- for s_id , statuses in zone_statuses_dict .items ()}
68+ processed = {
69+ int (s_id ): {key : bf_codecs .ZoneStatus .from_dict (val )
70+ for key , val in statuses .items ()}
71+ for s_id , statuses in zone_statuses_dict .items ()}
6172 yield processed
6273
6374 return zone_status_iterator ()
0 commit comments