Socket assigns in UserSocket are not copied to the Channel's socket assigns

I’m trying out Phoenix 1.7 rc-0

I used the generator to create mix phx.gen.channel Space, then added token verification to the UserSocket and assigned the verified user_id to the socket by returning {:ok, assign(socket, user_id: user_id}

However in the Channel, in the join function, when I inspect the socket.assigns it is still an empty map instead of having the :user_id in it.

Is this a change in behavior, or user error? Thanks

Link to repo: GitHub - homanchou/thexr

The issue that you’re facing is pretty common for those who have just started their Elixir journey from other languages and runtimes; you’re using the old socket, not the new one that was given the assign call. Take a look at this part here: thexr/user_socket.ex at main · homanchou/thexr · GitHub

In your case expression, you’ve done all your work and when that expression evaluates, it’s either going to return :error or {:ok, socket}. However, the line I’ve highlighted effectively throws your new result away. Instead, what we want to do is just return the evaluated case expression like so:

  def connect(%{"token" => token}, socket, _connect_info) do
    case Phoenix.Token.verify(socket, "salt", token, max_age: 1_209_600) do
      {:ok, member_id} ->
        socket = assign(socket, member_id: member_id)
        {:ok, socket}

      {:error, reason} ->
        Logger.error("#{__MODULE__} connect error #{inspect(reason)}")
        :error
    end
  end

omgerg, :person_facepalming: how did i miss that. thank u!