Coverage for src/lexigram/graphql/subscriptions/transport/_connection.py: 94%
18 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1"""GraphQL WebSocket Transport for subscriptions.
3Provides WebSocket transport implementation using graphql-transport-ws protocol.
4"""
6from __future__ import annotations
8import asyncio
9from dataclasses import dataclass, field
10from typing import TYPE_CHECKING, Any, cast
12from lexigram import serialization as json
13from lexigram.graphql.subscriptions.protocol import GQLWSMessageType
14from lexigram.graphql.types import SubscriptionInfo
15from lexigram.logging import get_logger
17if TYPE_CHECKING:
18 from collections.abc import AsyncIterator, Awaitable, Callable
20 from lexigram.contracts.graphql.protocols import SubscriptionAuthHandlerProtocol
21 from lexigram.contracts.web import WebSocketProtocol
23logger = get_logger(__name__)
26@dataclass
27class SubscriptionConnection:
28 """Manages active subscriptions for a WebSocket connection."""
30 subscriptions: dict[str, SubscriptionInfo] = field(default_factory=dict)
32 def add(self, subscription_id: str, info: SubscriptionInfo) -> None:
33 """Add a subscription."""
34 self.subscriptions[subscription_id] = info
36 def remove(self, subscription_id: str) -> None:
37 """Remove a subscription."""
38 self.subscriptions.pop(subscription_id, None)
40 def get(self, subscription_id: str) -> SubscriptionInfo | None:
41 """Get a subscription by ID."""
42 return self.subscriptions.get(subscription_id)