|
|
import abc |
|
|
import asyncio |
|
|
import threading |
|
|
from typing import Generic, TypeVar |
|
|
|
|
|
from langflow.services.base import Service |
|
|
|
|
|
LockType = TypeVar("LockType", bound=threading.Lock) |
|
|
AsyncLockType = TypeVar("AsyncLockType", bound=asyncio.Lock) |
|
|
|
|
|
|
|
|
class CacheService(Service, Generic[LockType]): |
|
|
"""Abstract base class for a cache.""" |
|
|
|
|
|
name = "cache_service" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def get(self, key, lock: LockType | None = None): |
|
|
"""Retrieve an item from the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to retrieve. |
|
|
lock: A lock to use for the operation. |
|
|
|
|
|
Returns: |
|
|
The value associated with the key, or CACHE_MISS if the key is not found. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def set(self, key, value, lock: LockType | None = None): |
|
|
"""Add an item to the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item. |
|
|
value: The value to cache. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def upsert(self, key, value, lock: LockType | None = None): |
|
|
"""Add an item to the cache if it doesn't exist, or update it if it does. |
|
|
|
|
|
Args: |
|
|
key: The key of the item. |
|
|
value: The value to cache. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def delete(self, key, lock: LockType | None = None): |
|
|
"""Remove an item from the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to remove. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def clear(self, lock: LockType | None = None): |
|
|
"""Clear all items from the cache.""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def contains(self, key) -> bool: |
|
|
"""Check if the key is in the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to check. |
|
|
|
|
|
Returns: |
|
|
True if the key is in the cache, False otherwise. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def __contains__(self, key) -> bool: |
|
|
"""Check if the key is in the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to check. |
|
|
|
|
|
Returns: |
|
|
True if the key is in the cache, False otherwise. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def __getitem__(self, key): |
|
|
"""Retrieve an item from the cache using the square bracket notation. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to retrieve. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def __setitem__(self, key, value) -> None: |
|
|
"""Add an item to the cache using the square bracket notation. |
|
|
|
|
|
Args: |
|
|
key: The key of the item. |
|
|
value: The value to cache. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
def __delitem__(self, key) -> None: |
|
|
"""Remove an item from the cache using the square bracket notation. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to remove. |
|
|
""" |
|
|
|
|
|
|
|
|
class AsyncBaseCacheService(Service, Generic[AsyncLockType]): |
|
|
"""Abstract base class for a async cache.""" |
|
|
|
|
|
name = "cache_service" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def get(self, key, lock: AsyncLockType | None = None): |
|
|
"""Retrieve an item from the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to retrieve. |
|
|
lock: A lock to use for the operation. |
|
|
|
|
|
Returns: |
|
|
The value associated with the key, or CACHE_MISS if the key is not found. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def set(self, key, value, lock: AsyncLockType | None = None): |
|
|
"""Add an item to the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item. |
|
|
value: The value to cache. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def upsert(self, key, value, lock: AsyncLockType | None = None): |
|
|
"""Add an item to the cache if it doesn't exist, or update it if it does. |
|
|
|
|
|
Args: |
|
|
key: The key of the item. |
|
|
value: The value to cache. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def delete(self, key, lock: AsyncLockType | None = None): |
|
|
"""Remove an item from the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to remove. |
|
|
lock: A lock to use for the operation. |
|
|
""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def clear(self, lock: AsyncLockType | None = None): |
|
|
"""Clear all items from the cache.""" |
|
|
|
|
|
@abc.abstractmethod |
|
|
async def contains(self, key) -> bool: |
|
|
"""Check if the key is in the cache. |
|
|
|
|
|
Args: |
|
|
key: The key of the item to check. |
|
|
|
|
|
Returns: |
|
|
True if the key is in the cache, False otherwise. |
|
|
""" |
|
|
|