from __future__ import annotations import time from collections import OrderedDict class ViberEventDeduplicator: def __init__(self, max_size: int = 4096, ttl_seconds: int = 3600): self._cache: OrderedDict[str, float] = OrderedDict() self._max_size = max_size self._ttl = ttl_seconds def is_duplicate(self, event_key: str) -> bool: if not event_key: return False now = time.monotonic() self._evict_expired(now) if event_key in self._cache: return True self._cache[event_key] = now while len(self._cache) > self._max_size: self._cache.popitem(last=False) return False def _evict_expired(self, now: float) -> None: expired = [k for k, v in self._cache.items() if now - v > self._ttl] for k in expired: del self._cache[k] def reset(self) -> None: self._cache.clear() def build_event_dedupe_key(account_id: str, callback: dict) -> str: message_token = callback.get("message_token") if message_token: return f"{account_id}|token:{message_token}" event_type = callback.get("event", "unknown") sender = callback.get("sender", {}) sender_id = sender.get("id", "") timestamp = callback.get("timestamp", 0) return f"{account_id}|{event_type}|{sender_id}|{timestamp}"