Python Client Library to interface with the Phoenix Realtime Server
Python 3 higher
pip3 install realtime==1.0.2poetry install
python3 usage.py from realtime.connection import Socket
import asyncio
async def callback1(payload):
    print(f"Got message: {payload}")
async def main():
    # your phoenix server token
    TOKEN = ""
    # your phoenix server URL
    URL = f"ws://127.0.0.1:4000/socket/websocket?token={TOKEN}&vsn=2.0.0"
    client = Socket(URL)
    # connect to the server
    await client.connect()
    # fire and forget the listening routine
    listen_task = asyncio.ensure_future(client.listen())
    # join the channel
    channel = client.set_channel("this:is:my:topic")
    await channel.join()
    # by using a partial function
    channel.on("your_event_name", None, callback1)
    # we give it some time to complete
    await asyncio.sleep(10)
    # proper shut down
    listen_task.cancel()
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    except KeyboardInterrupt:
        loop.stop()
        exit(0)Sending data to phoenix channels using send:
await channel.send("your_handler", "this is my payload", None)One can also use references for queries/answers:
ref = 1
channel.on(None, ref, callback1)
await channel.send("your_handler", "this is my payload", ref)
# remove the callback when your are done
#                     |-> exercise left to the reader ;)
channel.off(None, ref, callback1)see usage.py, sending-receiving-usage.py, and fd-usage.py.
Here's how you could connect to your realtime endpoint using Supabase endpoint. Should be correct as of 13th Feb 2024. Please replace SUPABASE_ID and API_KEY with your own SUPABASE_ID and API_KEY. The variables shown below are fake and they will not work if you try to run the snippet.
from realtime.connection import Socket
import asyncio
SUPABASE_ID = "dlzlllxhaakqdmaapvji"
API_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MT"
async def callback1(payload):
    print("Callback 1: ", payload)
async def main():
    URL = f"wss://{SUPABASE_ID}.supabase.co/realtime/v1/websocket?apikey={API_KEY}&vsn=1.0.0"
    s = Socket(URL)
    await s.connect()
    listen_task = asyncio.ensure_future(s.listen())
    channel_1 = s.set_channel("realtime:*")
    await channel_1.join()
    channel_1.on("UPDATE", callback1)
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    except KeyboardInterrupt:
        loop.stop()
        exit(0)Then, go to the Supabase interface and toggle a row in a table. You should see a corresponding payload show up in your console/terminal.