diff options
author | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
---|---|---|
committer | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
commit | 4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch) | |
tree | ee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/realtime/_async/timer.py | |
parent | cc961e04ba734dd72309fb548a2f97d67d578813 (diff) | |
download | gn-ai-4a52a71956a8d46fcb7294ac71734504bb09bcc2.tar.gz |
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}") |