about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/realtime/_async/timer.py
diff options
context:
space:
mode:
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.py40
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}")