Metadata-Version: 2.4
Name: fastx-channels
Version: 1.7.0
Summary: WebSocket channel abstraction for FastX — pub/sub rooms, presence tracking, Redis backend.
Author-email: Shreyansh Sengar <sengarsinghshreyansh@gmail.com>
License: MIT
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: starlette>=0.27.0
Provides-Extra: redis
Requires-Dist: redis<7.0.0,>=4.0.0; extra == "redis"
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"

# fastx-channels

WebSocket channel abstraction for FastX -- pub/sub rooms, presence tracking, and Redis backend support.

## Installation

```bash
pip install fastx-channels

# With Redis support
pip install fastx-channels[redis]
```

## Quick Start

```python
from starlette.websockets import WebSocket
from fastx_channels import Channel, ChannelManager, InMemoryBackend, Message

# Create a manager with an in-memory backend
backend = InMemoryBackend()
manager = ChannelManager(backend)

# In a WebSocket endpoint
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    channel = manager.get_or_create("chat:lobby")

    # Subscribe the connection
    await channel.subscribe(websocket)

    try:
        while True:
            data = await websocket.receive_json()
            msg = Message(channel="chat:lobby", event="message", data=data)
            await channel.publish(msg)
    finally:
        await channel.unsubscribe(websocket)
```

## Presence Tracking

```python
from fastx_channels import PresenceService, InMemoryPresenceBackend

presence = PresenceService(InMemoryPresenceBackend())

await presence.join("chat:lobby", user_id="user_1", metadata={"name": "Alice"})
members = await presence.get_members("chat:lobby")
online = await presence.is_online("chat:lobby", "user_1")
await presence.leave("chat:lobby", "user_1")
```

## Redis Backend (multi-process)

```python
from redis.asyncio import Redis
from fastx_channels import RedisBackend, ChannelManager

redis_client = Redis.from_url("redis://localhost:6379")
backend = RedisBackend(redis_client)
manager = ChannelManager(backend)
```

## License

MIT
