mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-05 20:50:22 +03:00
Add update event
This commit is contained in:
parent
ca97078855
commit
d0e2e46c82
|
@ -191,6 +191,7 @@ class Sender:
|
|||
_next_ping: float
|
||||
_read_buffer: bytearray
|
||||
_step_lock: Lock
|
||||
_step_event: Event
|
||||
_step_generator: AsyncGenerator[None, None] | None = None
|
||||
|
||||
@classmethod
|
||||
|
@ -222,6 +223,7 @@ class Sender:
|
|||
_next_ping=asyncio.get_running_loop().time() + PING_DELAY,
|
||||
_read_buffer=bytearray(),
|
||||
_step_lock=Lock(),
|
||||
_step_event=Event(),
|
||||
)
|
||||
|
||||
async def disconnect(self) -> None:
|
||||
|
@ -249,9 +251,7 @@ class Sender:
|
|||
|
||||
async def _step_until_receive(self, rx: Future[bytes]) -> bytes:
|
||||
while True:
|
||||
step = asyncio.create_task(self.do_step())
|
||||
await asyncio.wait((step, rx), return_when=FIRST_COMPLETED)
|
||||
|
||||
await self.do_step()
|
||||
if rx.done():
|
||||
return rx.result()
|
||||
|
||||
|
@ -262,8 +262,21 @@ class Sender:
|
|||
return result
|
||||
|
||||
async def do_step(self) -> None:
|
||||
if self._step_lock.locked():
|
||||
await self._step_event.wait()
|
||||
return
|
||||
|
||||
await self._do_step()
|
||||
|
||||
async def _do_step(self) -> None:
|
||||
async with self._step_lock:
|
||||
await anext(self.step)
|
||||
try:
|
||||
self._step_event.clear()
|
||||
await anext(self.step)
|
||||
except StopAsyncIteration:
|
||||
pass
|
||||
finally:
|
||||
self._step_event.set()
|
||||
|
||||
@property
|
||||
def step(self) -> AsyncGenerator[None, None]:
|
||||
|
@ -272,7 +285,6 @@ class Sender:
|
|||
return self._step_generator
|
||||
|
||||
async def _step(self) -> AsyncGenerator[None, None]:
|
||||
recv_req = asyncio.create_task(self._request_event.wait())
|
||||
recv_data = asyncio.create_task(self._step_recv())
|
||||
send_data = asyncio.create_task(self._step_send())
|
||||
|
||||
|
@ -288,8 +300,6 @@ class Sender:
|
|||
|
||||
yield
|
||||
|
||||
if recv_req.done():
|
||||
recv_req = asyncio.create_task(self._request_event.wait())
|
||||
if recv_data.done():
|
||||
recv_data = asyncio.create_task(self._step_recv())
|
||||
if send_data.done():
|
||||
|
|
Loading…
Reference in New Issue
Block a user