import json from typing import Any from django.conf import settings from typing_extensions import Protocol from . import logging from .redis import use_redis logger = logging.getLogger(__name__) REDIS_STREAM_MAXLEN = getattr(settings, "REDIS_STREAM_MAXLEN", None) logger.info(f"Redis stream maxlen {REDIS_STREAM_MAXLEN}") if use_redis: from .redis import get_connection class Stream(Protocol): def __init__(self) -> None: ... async def send(self, stream_name: str, payload: Any) -> None: ... class RedisStream: async def send(self, stream_name: str, payload: Any) -> None: fields = { "content": json.dumps(payload, separators=(",", ":")), } async with get_connection() as redis: await redis.xadd(stream_name, fields, max_len=REDIS_STREAM_MAXLEN) class NoopStream: async def send(self, stream_name: str, payload: Any) -> None: pass def load_stream() -> Stream: if use_redis: return RedisStream() else: logger.error("You have to configure redis to let OpenSlides work properly!") return NoopStream() stream = load_stream()