LegitStack

LegitStack

I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that smart I thought I’d go as high level as possible.

I found this thread:

and this one:

and forked his code to:
https://github.com/SatoriNetwork/phx_raws

I as I was bringing it up to date I ran into this issue:

Phoenix.Socket.Transport.connect/6 is undefined or private. Did you mean:

 * connect_info/3Elixir

Call to missing or unexported function ‘Elixir.Phoenix.Socket.Transport’:connect/6ElixirLS Dialyzer

on this line:
case Transport.connect(endpoint, handler, transport, __MODULE__, nil, conn.params) do

so after consulting the docs, which I don’t understand I came up with this, which I;m sure is wildly incorrect as well:

case Transport.connect(
          %{:endpoint=>endpoint, :transport=>transport, :params=>conn.params, :options=>[
            handler: handler, __MODULE__: __MODULE__, serializer: nil]}) do

But it told me I shouldn’t use this function anyway:

Phoenix.Socket.Transport.connect/1 is undefined or private. Did you mean:

 * connect_info/3Elixir

Call to missing or unexported function ‘Elixir.Phoenix.Socket.Transport’:connect/1ElixirLS Dialyzer

I think the code is almost updated, but what do I have to do to get it to a working state?

Showing Posts 8 to 1

mtrudel

mtrudel

Creator of Bandit

Careful that sending pongs in response to client pings is explicitly handled for you by the underlying server in the WebSock world: WebSock — WebSock v0.5.3

ku1ik

ku1ik

Thank you @RooSoft! I was trying to solve these 2 specific problems (path, ping) myself and your solutions to both work perfectly.

RooSoft

RooSoft

Also figured out…

In init/1,

Process.send_after(self(), :ping, ping_timeout)

Then, add a handle_info

  @impl true
  def handle_info(:ping, %{options: options} = state) do
    ping_timeout = Keyword.get(options, :ping)

    Process.send_after(self(), :ping, ping_timeout)

    {:push, {:ping, ""}, state}
  end

Will suggest the peer has to send a PONG, and if it does, that will count as a communication and thus will reset the timeout.

RooSoft

RooSoft

Figured out this part

socket("/", RelayWeb.Sockets.EchoSocket, websocket: [path: ""])
RooSoft

RooSoft

Also would like to know how to implement heartbeat such as sending a PING and expecting a PONG after a while instead of simply closing the connection after 60s of inactivity.

RooSoft

RooSoft

Is there a way to make this thing listen to the root path, such as ws://localhost?

From what I understand, it listens to the /websocket path if the endpoint’s socket is configured like so socket "/", RelayWeb.Sockets.EchoSocket.

I’ve seen comments saying it’s better for whatever reason. Thing is, I have to fill a spec that requires that the websockets endpoint answers to the root path and I have no idea how to do that with Phoenix.Socket.Transport as we stand.

josevalim

josevalim

Creator of Elixir

There is a simpler API in Phoenix for custom websockets, you can follow the example here:

11
Post #2
ruslandoga

ruslandoga

:waving_hand:

Using cowboy might be easier than you think. Here’s a small example of how it could be done. The important bits are the plug child spec and the module implementing cowboy_websocket behaviour. You can ignore the Web.UserSocket and “pubsub” specifics.

More info on cowboy_websocket behaviour.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
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
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
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

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews