axelson

axelson

Scenic Core Team

Is it possible to dynamically choose the Phoenix Channel that a client joins? I know in the UserSocket you can use channel "room:*", MyApp.RoomChannel and then treat the different suffixes to room: differently, but all the sessions will be directly connected to MyApp.RoomChannel.

My main issue right now is am trying to load a different channel depending on the mobile client version that is connecting. And a difficulty that I forsee trying to set different intercepts for each channel.

Showing Posts 1 to 5

idi527

idi527

How many version do you expect? Is channel "v1:room:*", MyApp.V1.RoomChannel out of the question?

axelson

axelson OP

Scenic Core Team

It’s not completely out of the question, but I was hoping to split off the old client into it’s own channel while keeping the channel name as-is. However I am completely unable to change the old client.

I guess I could bifurcate at the UserSocket level into UserSocket and UserSocketOldClient but I’d prefer to do it at the channel level if I can.

idi527

idi527

So it seems like the macros like channel "v1:room:*", MyApp.V1.RoomChannel generate a bunch of __channel__/1 functions which are then called here phoenix/lib/phoenix/socket.ex at v1.4 · phoenixframework/phoenix · GitHub.

Maybe you could call Phoenix.Channel.Server.join/4 with the proper channel module “manually” somewhere? One way (maybe after a PR, unless there is a better way) would probably be the ability to provide a callback function to def handle_in(nil, %{event: "phx_join", ... like on_join which would receive the socket, opts, and some other params and return {channel, opts} instead of __channel__.

  defp handle_in(nil, %{event: "phx_join", topic: topic, ref: ref} = message, state, socket) do
    {channel, opts} = if :erlang.function_exported(socket.handler, :on_join, 2) do
      socket.handler.on_join(topic, socket)
     else
       socket.handler.__channel__(topic)
      # ...
  end
chrismccord

chrismccord

Creator of Phoenix

The easiest answer is to have your RoomChannel simply delegate to other modules with the client specific callbacks, except you want to intercept, which only works here by unnecessarily intercepting some messages in either channel. So ask yourself if you really need intercepting. In many cases, the client can filter messages for example. Worst case, you Desktop and Mobile room channel modules just push(socket, event, payload) on the intercepted messages that they don’t care about intercepting.

axelson

axelson OP

Scenic Core Team

While it looks like that approach would work, unfortunately Phoenix.Channel.Server is not part of the public API so I wouldn’t want to use that in production.

Maybe a PR could be created that would modify Phoenix.Socket.channel/3 to optionally accept a function as the second argument (instead of the Channel Module). The function would take in the socket and return the Channel Module. I actually quite like that approach.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews