Spaces:
Runtime error
Runtime error
import logging | |
from dataclasses import dataclass | |
from datetime import datetime, timedelta | |
from typing import Optional, Tuple | |
from uuid import uuid1 | |
from selenium.webdriver.chrome.webdriver import WebDriver | |
import utils | |
class Session: | |
session_id: str | |
driver: WebDriver | |
created_at: datetime | |
def lifetime(self) -> timedelta: | |
return datetime.now() - self.created_at | |
class SessionsStorage: | |
"""SessionsStorage creates, stores and process all the sessions""" | |
def __init__(self): | |
self.sessions = {} | |
def create(self, session_id: Optional[str] = None, proxy: Optional[dict] = None, | |
force_new: Optional[bool] = False) -> Tuple[Session, bool]: | |
"""create creates new instance of WebDriver if necessary, | |
assign defined (or newly generated) session_id to the instance | |
and returns the session object. If a new session has been created | |
second argument is set to True. | |
Note: The function is idempotent, so in case if session_id | |
already exists in the storage a new instance of WebDriver won't be created | |
and existing session will be returned. Second argument defines if | |
new session has been created (True) or an existing one was used (False). | |
""" | |
session_id = session_id or str(uuid1()) | |
if force_new: | |
self.destroy(session_id) | |
if self.exists(session_id): | |
return self.sessions[session_id], False | |
driver = utils.get_webdriver(proxy) | |
created_at = datetime.now() | |
session = Session(session_id, driver, created_at) | |
self.sessions[session_id] = session | |
return session, True | |
def exists(self, session_id: str) -> bool: | |
return session_id in self.sessions | |
def destroy(self, session_id: str) -> bool: | |
"""destroy closes the driver instance and removes session from the storage. | |
The function is noop if session_id doesn't exist. | |
The function returns True if session was found and destroyed, | |
and False if session_id wasn't found. | |
""" | |
if not self.exists(session_id): | |
return False | |
session = self.sessions.pop(session_id) | |
if utils.PLATFORM_VERSION == "nt": | |
session.driver.close() | |
session.driver.quit() | |
return True | |
def get(self, session_id: str, ttl: Optional[timedelta] = None) -> Tuple[Session, bool]: | |
session, fresh = self.create(session_id) | |
if ttl is not None and not fresh and session.lifetime() > ttl: | |
logging.debug(f'session\'s lifetime has expired, so the session is recreated (session_id={session_id})') | |
session, fresh = self.create(session_id, force_new=True) | |
return session, fresh | |
def session_ids(self) -> list[str]: | |
return list(self.sessions.keys()) | |