import json
import stats
class NetworkReader:
def __init__(self, stream):
self._stream = stream
def read_msg(self):
data = self._stream.readline()
assert data
stats.log_received(data)
json_length = int(data.split(b":")[1].strip()) # "json-length: length" -> length
data = self._stream.readline()
assert data
stats.log_received(data)
bin_length = int(data.split(b":")[1].strip()) # "bin-length: length" -> length
json_data = self._stream.read(json_length)
assert len(json_data)==json_length
stats.log_received(json_data)
json_data = json.loads(str(json_data, encoding="utf-8"))
bin_data = self._stream.read(bin_length)
assert len(bin_data)==bin_length
stats.log_received(bin_data)
return (json_data, bin_data)
class NetworkWriter:
def __init__(self, stream):
self._stream = stream
def write_msg(self, *args):
msg = self.prep_msg(*args)
self._stream.write(msg)
self._stream.flush()
stats.log_sent(msg)
def prep_msg(self, json_data, bin_data=b""):
json_data = bytes(json.dumps(json_data, separators=(',', ':'))+"\n", encoding="utf-8")
json_length = bytes("json-length: "+str(len(json_data))+"\n", encoding="utf-8")
bin_length = bytes("bin-length: "+str(len(bin_data))+"\n", encoding="utf-8")
return b"".join((json_length, bin_length, json_data, bin_data))