async def _run_write_task(self) -> None: """Write to the peer.""" self._check_env() # Introduce ourself so our peer knows how it can talk to us. data = dataclass_to_json( _PeerInfo(protocol=OUR_PROTOCOL, keepalive_interval=self._keepalive_interval)).encode() self._writer.write(len(data).to_bytes(4, _BYTE_ORDER) + data) # Now just write out-messages as they come in. while True: # Wait until some data comes in. await self._have_out_packets.wait() assert self._out_packets data = self._out_packets.pop(0) # Important: only clear this once all packets are sent. if not self._out_packets: self._have_out_packets.clear() self._writer.write(data)
async def send_message(self, message: _Message, timeout: Optional[float] = None) -> _Message: """Send high level messages.""" assert self._endpoint is not None response = await self._endpoint.send_message( dataclass_to_json(message).encode(), timeout=timeout) return dataclass_from_json(_Message, response.decode())
def save_state(self) -> None: """Save state to disk (if possible).""" print('ASSET-MANAGER SAVING STATE') try: with open(self.state_path, 'w', encoding='utf-8') as outfile: outfile.write(dataclass_to_json(self._state)) except Exception: logging.exception('Error writing AssetManager state')
async def _handle_raw_message(self, message: bytes) -> bytes: msgobj = dataclass_from_json(_Message, message.decode()) rspobj = await self.handle_message(msgobj) return dataclass_to_json(rspobj).encode()