Skip to content

chg: [serializer] add support for phoenix version 2 serialization #68

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
wants to merge 37 commits into
base: main
Choose a base branch
from

Conversation

gallypette
Copy link

A PR to be able to use this library with latest phoenix versions.

feature: support phoenix version 2 serialization (mostly turn {} in [])
bugfix: socket.summary was broken
default: set hearbeat to 30 seconds (javascript's version default)

I did not test whether I broke compatibility with version 1, so consider this as a request for comments.

@gallypette
Copy link
Author

I added basic support for sending data.

@MindsightsAI
Copy link

@gallypette Is broadcast functionality working right now?

@gallypette
Copy link
Author

It is still a poc, but yes.
I am a bit short on the documentation side but something like this should do to send packets:

from realtime.connection import Socket

if __name__ == "__main__":
    TOKEN = "your token
    URL = f"ws://127.0.0.1:4000/socket/websocket?token={TOKEN}&vsn=2.0.0"

    ss = Socket(URL)
    ss.connect()

    channel_s = ss.set_channel("your channel")
    channel_s.join()
    channel_s.send("your event", "this is my payload 1", None)

The library has to be converted to full async to be able to send/receive without getting stuck in the listen function.

@MindsightsAI
Copy link

MindsightsAI commented Oct 20, 2023

@gallypette i can't make it workable

    def test_function(payload):
        print(payload)   -> there error 'unmatched topic'

    t1 = s.set_channel("test function")
    t1.join()
    t1.on("test event", callback=test_function, ref=None)
    t1.send("test event", "Bla bla bla", None)

image

@gallypette
Copy link
Author

I guess you don't match correctly on your topic name in your channel code. Something like this would do:

def join(_topic, _payload, socket) do
   {:ok, socket}
end

def handle_in("test event", payload, socket) do
  {:reply, {:ok, payload}, socket}
end

For listening for the answer is a bit tricky though (because of the while loop in listen) but it could work for a few message. You could react on any event:

channel_s.on(None, None, callback1)
t1.listen()

Get answer to your input:

t1.on(None, 1, callback1)
t1.send("test event", "this is my payload 1", 1)
t1.listen()

@gallypette
Copy link
Author

I pushed an async version that is more suitable for send/receive patterns.
It diverged significantly so don't merge that, the API is not compatible anymore.

@gallypette gallypette closed this Oct 20, 2023
@MindsightsAI
Copy link

MindsightsAI commented Oct 24, 2023

@gallypette Can we use broadcast events using your asynchronous branch(flowintel:master) with realtime server in saas version of supabase? Or we need implement some handlers at Phoenix?

@gallypette
Copy link
Author

@MindsightsAI I was not aware that supabase realtime had this feature.

Going quickly through realtime-js source code for send and _push, it looks like sending a "broadcast" event should work out of the box using this branch.

@gallypette
Copy link
Author

I reopen this PR as it seems relevant after all.

@silentworks silentworks self-requested a review November 13, 2023 19:01
@silentworks silentworks self-assigned this Nov 13, 2023
@gallypette
Copy link
Author

I just found out about @maxbaluev and @karvetskiy 's fork and decided to merge their forks into this PR to keep track of their progress.

@sevkar
Copy link

sevkar commented Dec 2, 2023

@gallypette Hey. Thanks for noticing my PR. Want to notify you to be careful with sync callbacks because they are running blocking now. I think it is better to implement Thread execution logic if you want to use it

@adulau
Copy link

adulau commented Feb 9, 2024

Thanks for the work on this. Any news for the merge in the default branch? We recently saw https://github.com/bitnom/aiorealtime so maybe it's another option.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants