anurag.peshne

anurag.peshne

Phoenix websocket: how to send message to one user

Hello,
I’m new to Phoenix and I’m following this tutorial Channels — Phoenix v1.8.8 to implement something similar to chat application as described in that tutorial.
That article talks about how to broadcast a message, I want to send a message to a particular user. And I couldn’t find something similar to send. How I can do that.
Also, to do this, do I have to save all the connected socket objects in another process’s state, maybe using a map which maps username → socket.

First 10 of 23 Posts Switch mode

amnu3387

amnu3387

One way to do it would be to subscribe your users to a particular topic individual to each one of them. Then you would have a way of sending particular messages to them using that topic and simply broadcasting to it, effectively working as if you were “sending” them a message. Of course this only accounts for when the receiving user is online and subscribed to his own topic.

anurag.peshne

anurag.peshne OP

Thanks, this should work.
How costly/cheap is creating a topic?

amnu3387

amnu3387

AFAIK the phoenix team is not yet charging for creating topics, so it’s free.

(j/k)

The cost will probably be one entry with one term in an ETS table? How that translates into “really” useful information I’m not sure.

kokolegorille

kokolegorille

The trick is to broadcast to a specific user with

socket.endpoint.broadcast!(“user:#{id}”, message, payload)

axelson

axelson

Scenic Core Team

Quite cheap, I wouldn’t worry about it at this point.

ankhnaton

ankhnaton

video tutorial for user to user private messages

Zesky665

Zesky665

I might be able to do this if you’re still interested.

SZJX

SZJX

I just wonder if there’s a way to do it without having to create additional channels per user/use specific user IDs. In my use case there will be no registration and there will be no preexisting IDs unless I generate a random one for each new user who connects, which is doable but doesn’t feel exactly natural.

I wonder if there’s a way for Presence to actually fetch specific processes/sockets, e.g. to fetch the first socket connection of the first user that joined, and pair her with the second user as soon as the second user joins. It doesn’t seem exactly easy though so far.

I meant to make a new post but the tag selection seems broken at the moment.

idi527

idi527

You can access the underlying websocket like in Broadcast to socket without channel - #27 by vlad.grb and communicate with the user directly via it, if that’s what you need.

SZJX

SZJX

I guess my problem is how I can keep track of the socket IDs/PIDs. I think I’m still a bit confused over all the terminologies and their relations between each other.

In short, my use case:

  • There is a lobby.
  • Whenever enough number (e.g. 3) of users joined the lobby, they will be teamed up, each assigned a role to start a conversation.
  • They should then be removed from the lobby.
  • The next 3 users to join repeat this process, etc.

My question is, when the third user joins, how can I:

  • know that he’s the third user
  • locate the first two users (i.e. find the PIDs of their sockets I guess)
  • send a customized message to each user (because each has a different role)
  • remove all of them from whatever tracking mechanism I’m using

The problem with normal Channel and Presence mechanisms is that they don’t seem to be able to hold any global state.

One mechanism that I’ve thought of with Presence (likely to be incorrect):

def handle_info(:after_lobby_join, socket) do
  Presence.track(socket, "lobby", %{
    pid: self()
  })

  {:noreply, socket}
end

def handle_info(:start, socket) do
  pid1 = hd(Presence.list(socket)["lobby"][:metas])[:pid]
  # Start the conversation by sending messages individually to pid1 and pid2
  ...
  untrack(pid1, "my_app:lobby", "lobby")
  {:ok, socket}
end

In the example you linked there is the use of Registry. Are you suggesting to record the PIDs of the first two users in Registry under keys such as first_user, second_user, and then look them up and send messages to them via send(socket_pid, {:socket_push, :text, Poison.encode!(%{"oh" => "my"})})?

Where Next?

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
silverdr
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated! To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead. Sta...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
michallepicki
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
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
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New

We're in Beta

About us Mission Statement