1''' Asynchronous python bindings for the lircd socket interface. '''
43from lirc.client
import AbstractConnection
as AbstractConnection
46class AsyncConnection(object):
47 ''' Asynchronous read interface on top of an AbstractConnection.
50 - connection: Typically a lirc.RawConnection or lirc.LircdConnection.
51 - loop: AbstractEventLoop, typically obtained using
52 asyncio.get_event_loop().
55 def __init__(self, connection: AbstractConnection,
56 loop: asyncio.AbstractEventLoop):
59 ''' Read data from the connection fd and put into queue. '''
61 line = self._conn.readline(0)
63 asyncio.ensure_future(self._queue.put(line))
64 except Exception
as e:
66 self._queue.put_nowait(e)
68 self._conn = connection
70 self._queue = asyncio.Queue()
71 self._loop.add_reader(self._conn.fileno(), read_from_fd)
74 ''' Clean up loop and the base connection. '''
75 self._loop.remove_reader(self._conn.fileno())
77 async def readline(self) -> str:
78 ''' Asynchronous get next line from the connection. '''
79 line = await self._queue.get()
80 if isinstance(line, Exception):
85 ''' Return async iterator. '''
88 async def __anext__(self):
89 ''' Implement async iterator.next(). '''
90 line = await self._queue.get()
91 if isinstance(line, Exception):
92 raise StopAsyncIteration
95 async def __aenter__(self):
96 ''' Implement "async with". '''
99 async def __aexit__(self, exc_type, exc, traceback):
100 ''' Implement exit from "async with". '''