diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/realtime/_async/timer.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/realtime/_async/timer.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/realtime/_async/timer.py b/.venv/lib/python3.12/site-packages/realtime/_async/timer.py new file mode 100644 index 00000000..bd18ca0b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/realtime/_async/timer.py @@ -0,0 +1,40 @@ +import asyncio +import logging +from typing import Callable, Optional + +logger = logging.getLogger(__name__) + + +class AsyncTimer: + def __init__(self, callback: Callable, timer_calc: Callable[[int], int]): + self.callback = callback + self.timer_calc = timer_calc + self.timer: Optional[asyncio.Task] = None + self.tries: int = 0 + + def reset(self): + self.tries = 0 + if self.timer and not self.timer.done(): + self.timer.cancel() + self.timer = None + logger.debug( + "AsyncTimer has been reset and any scheduler tasks have been cancelled" + ) + + def schedule_timeout(self): + if self.timer: + self.timer.cancel() + + self.tries += 1 + delay = self.timer_calc(self.tries + 1) + logger.debug(f"Scheduling callback to run after {delay} seconds.") + self.timer = asyncio.create_task(self._run_timer(delay)) + + async def _run_timer(self, delay: float): + try: + await asyncio.sleep(delay) + await self.callback() + except asyncio.CancelledError: + logger.debug("AsyncTimer task was cancelled.") + except Exception as e: + logger.exception(f"Error in AsyncTimer callback: {e}") |