Untitled

 avatar
unknown
plain_text
a year ago
2.3 kB
9
Indexable

```py
import asyncio
import json
import websockets
from constants import SUPABASE_ID, SUPABASE_KEY, SUPABASE_URL
from supabase_auth import SupabaseClient

CHANNEL = "room-1"
WSS_URL = f"wss://{SUPABASE_ID}.supabase.co/realtime/v1/websocket?apikey={SUPABASE_KEY}&vsn=1.0.0"

supabaseClient = SupabaseClient()
response = supabaseClient.login("","")

async def send_heartbeat(websocket, interval=30):
    while True:
        await asyncio.sleep(interval)
        await websocket.send(json.dumps({
            "event": "heartbeat",
            "topic": "phoenix",
            "payload": {},
            "ref": "heartbeat"
        }))
        print("Heartbeat sent")


async def connect_to_supabase():
    async with websockets.connect(WSS_URL) as websocket:
        # Authenticate
        await websocket.send(json.dumps({
            "event": "access_token",
            "topic": "realtime:*",
            "payload": {"access_token":  response.session.access_token},
            "ref": "1"
        }))

        # Subscribe to the channel with broadcast config
        await websocket.send(json.dumps({
            "event": "phx_join",
            "topic": f"realtime:{CHANNEL}",
            "payload": {
                "config": {
                    "broadcast": {"self": False, "private": True}
                }
            },
            "ref": "2"
        }))

        print(f"Subscribed to channel: {CHANNEL}")

        # Start sending heartbeat messages
        asyncio.create_task(send_heartbeat(websocket))

        # Listen for messages
        async for message in websocket:
            data = json.loads(message)
            handle_message(data)


def handle_message(data):
    event = data.get("event")

    if event == "broadcast":
        payload = data.get("payload")
        print(f"Received broadcast message: {payload}")
    elif event == "phx_reply":
        status = data.get("payload", {}).get("status")
        print(f"Reply status: {status}")
    elif event == "system":
        status = data.get("payload", {}).get("status")
        message = data.get("payload", {}).get("message")
        print(f"System message - Status: {status}, Message: {message}")
    else:
        print(f"Received unhandled message: {data}")


# Run the event loop
asyncio.get_event_loop().run_until_complete(connect_to_supabase())
```
Editor is loading...
Leave a Comment