f"'{self.conf['crt']}'.")
self._ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
self._ssl_ctx.load_cert_chain(self.conf['crt'])
+ self._open_connections = 0
self._messages: List[Message] = []
self.bus.register(self.name, 'Graph',
[],
self._messages.append(message)
async def _open(self) -> None:
- self._reader = None
- self._writer = None
- (reader, writer) = await asyncio.open_connection(self._host,
- self._port,
- ssl=self._ssl_ctx)
- self._reader = reader
- self._writer = writer
- if self._writer and self._reader:
- # Read banner:
- banner_size_bytes = await self._reader.readexactly(4)
- banner_size_int = struct.unpack('<i', banner_size_bytes)[0]
- banner_message = await self._reader.readexactly(banner_size_int)
- # Inititalise call id:
- self._call_id = 0
+ self._open_connections += 1
+ if self._open_connections == 1:
+ # First connection:
+ (reader, writer) = await asyncio.open_connection(self._host,
+ self._port,
+ ssl=self._ssl_ctx)
+ self._reader = reader
+ self._writer = writer
+ if self._writer and self._reader:
+ # Read banner:
+ size_bytes = await self._reader.readexactly(4)
+ size_int = struct.unpack('<i', banner_size_bytes)[0]
+ message = await self._reader.readexactly(size_int)
+ # Inititalise call id:
+ self._call_id = 0
async def _call(self, method: str, params: List[Any]) -> Any:
if self._writer and self._reader:
return None
async def _close(self) -> None:
- if self._writer:
- # Close connection:
- self._writer.close()
- self._reader = None
- self._writer = None
+ if self._open_connections > 0:
+ self.open_connections -= 1
+ if self._open_connections == 0:
+ if self._writer:
+ # Close connection:
+ self._writer.close()
+ self._reader = None
+ self._writer = None
async def run(self) -> None:
"""Get coroot instance for name and send connection opened event."""