Heroku Deployed Elm/Phoenix App Websocket Issue

Hi all,

I deployed my elm embedded phoenix application to heroku and it compiled successfully. The issue I am having is the websocket connection no longer works. I am using the elm-phoenix-socket package, and figured all I had to do was change the socket init url from “ws://localhost:4000/socket/websocket” to “wss://my-app.herokuapp.com/socket/websocket” I have tried a couple other urls to no avail.

Not sure what to try. Any help would be appreciated.

2 Likes

Did you update the allowed incoming url’s in your configuration?

2 Likes

Can you try wss://my-app.herokuapp.com/socket instead?
I am not sure if this will work but the default url defined in the Endpoint module is "/socket"

3 Likes

I have url: [scheme: "https", host: "secret-sea...herokuapp.com", port: 443] within my Endpoint config in prod.exs. Not sure if that is what you are referring to or not.

1 Like

I ran into a similar problem and documented some of the different things I tried to fix it in this SO post.

I never got it to work properly and resorted to hard-coding my socket variable before pushing to production. If there’s a right way to accomplish this I’d love to know.

2 Likes

heroku gives an error about setting the check_origin parameter for me that did it

url: [scheme: “https”, host: “myapp.com”, port: 443],
check_origin: [
https://myapp.com”,
https://www.myapp.com
],

2 Likes

I’ve had a hard time with it too.
And I managed to tackle in non-so-satisfying way.
In my controller, I have this:

socket_prefix = get_socket_prefix(Application.get_env(:vinculi_web, :env))    
socket_host = get_socket_host(conn, Application.get_env(:vinculi_web, :env))
socket_url = socket_prefix <> "://#{socket_host}" <> "/socket/websocket"
render conn, "explore.html", layout: {VinculiWeb.LayoutView, "app_light.html"},
                                     node_uuid: node_uuid,
                                     node_labels: node_labels,
                                     server_url: server_url,
                                     socket_url: socket_url

with the following helpers:

def get_socket_prefix(:prod), do: "wss"
def get_socket_prefix(_), do: "ws"
def get_socket_host(conn, :prod), do: conn.host
def get_socket_host(conn, _), do: "#{conn.host}:#{conn.port}"

And I didn’t add any check_origin.

Again, this is not an elegant solution but it works (for me, at least) and don’t require tricks before pushing to production.
Hope it helps.