Skip to content

Commit 40ad093

Browse files
authored
[Broadcaster] Add viewer count and backend chat stub (#12)
* Add viewer count and chat backend * Remove unnecessary comment * Fix module naming issues in tests * Remove dummy tests
1 parent b412298 commit 40ad093

File tree

11 files changed

+129
-11
lines changed

11 files changed

+129
-11
lines changed

broadcaster/assets/js/app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// If you want to use Phoenix channels, run `mix help phx.gen.channel`
22
// to get started and then uncomment the line below.
3-
// import "./user_socket.js"
3+
import "./user_socket.js"
44

55
// You can include dependencies in two ways.
66
//
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {Socket, Presence} from "phoenix"
2+
3+
let socket = new Socket("/socket", {params: {token: window.userToken}})
4+
5+
socket.connect()
6+
7+
const channel = socket.channel("stream:chat", {name: "TODO get user name"})
8+
const presence = new Presence(channel)
9+
const viewercount = document.getElementById("viewercount")
10+
11+
presence.onSync(() => {
12+
viewercount.innerText = presence.list().length
13+
})
14+
15+
channel.join()
16+
.receive("ok", resp => { console.log("Joined chat channel successfully", resp) })
17+
.receive("error", resp => { console.log("Unable to join chat channel", resp) })
18+
19+
channel.on("chat_msg", payload => {
20+
// TODO capture message from some kind of input
21+
console.log("RECEIVED CHAT MESSAGE", payload)
22+
})
23+
24+
// TODO when user types message in chat, do this
25+
channel.push("chat_msg", {body: "TODO get chat message"})
26+
27+
export default socket

broadcaster/lib/broadcaster/application.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ defmodule Broadcaster.Application do
1515
# {Broadcaster.Worker, arg},
1616
# Start to serve requests, typically the last entry
1717
BroadcasterWeb.Endpoint,
18+
BroadcasterWeb.Presence,
1819
Broadcaster.PeerSupervisor,
1920
Broadcaster.Forwarder,
2021
{Registry, name: Broadcaster.PeerRegistry, keys: :unique}

broadcaster/lib/broadcaster/peer_supervisor.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,17 @@ defmodule Broadcaster.PeerSupervisor do
6464
pc_id = generate_pc_id()
6565
{:ok, pc} = spawn_peer_connection(pc_id)
6666

67-
Logger.info("Received offer for #{inspect(pc)}, SDP:\n#{offer.sdp}")
67+
Logger.info("Received offer for #{inspect(pc)}")
68+
Logger.debug("Offer SDP for #{inspect(pc)}:\n#{offer.sdp}")
6869

6970
with :ok <- PeerConnection.set_remote_description(pc, offer),
7071
:ok <- setup_transceivers(pc, direction),
7172
{:ok, answer} <- PeerConnection.create_answer(pc),
7273
:ok <- PeerConnection.set_local_description(pc, answer),
7374
:ok <- gather_candidates(pc),
7475
answer <- PeerConnection.get_local_description(pc) do
75-
Logger.info("Sent answer for #{inspect(pc)}, SDP:\n#{answer.sdp}")
76+
Logger.info("Sent answer for #{inspect(pc)}")
77+
Logger.debug("Answer SDP for #{inspect(pc)}:\n#{answer.sdp}")
7678

7779
{:ok, pc, pc_id, answer.sdp}
7880
else
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule BroadcasterWeb.Presence do
2+
@moduledoc """
3+
Provides presence tracking to channels and processes.
4+
5+
See the [`Phoenix.Presence`](https://hexdocs.pm/phoenix/Phoenix.Presence.html)
6+
docs for more details.
7+
"""
8+
use Phoenix.Presence,
9+
otp_app: :broadcaster,
10+
pubsub_server: Broadcaster.PubSub
11+
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
defmodule BroadcasterWeb.StreamChannel do
2+
use BroadcasterWeb, :channel
3+
4+
alias BroadcasterWeb.Presence
5+
6+
@impl true
7+
def join("stream:chat", %{"name" => name}, socket) do
8+
send(self(), :after_join)
9+
{:ok, assign(socket, :name, name)}
10+
end
11+
12+
@impl true
13+
def handle_in("chat_msg", %{"body" => body}, socket) do
14+
broadcast!(socket, "chat_msg", %{body: body, name: socket.assigns.name})
15+
{:noreply, socket}
16+
end
17+
18+
@impl true
19+
def handle_info(:after_join, socket) do
20+
{:ok, _} = Presence.track(socket, socket.assigns.user_id, %{})
21+
push(socket, "presence_state", Presence.list(socket))
22+
{:noreply, socket}
23+
end
24+
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule BroadcasterWeb.UserSocket do
2+
use Phoenix.Socket
3+
4+
channel "stream:*", BroadcasterWeb.StreamChannel
5+
6+
@impl true
7+
def connect(_params, socket, _connect_info) do
8+
{:ok, assign(socket, :user_id, generate_id())}
9+
end
10+
11+
@impl true
12+
def id(socket), do: "user_socket:#{socket.assigns.user_id}"
13+
14+
defp generate_id do
15+
10
16+
|> :crypto.strong_rand_bytes()
17+
|> Base.url_encode64()
18+
end
19+
end

broadcaster/lib/broadcaster_web/components/layouts/app.html.heex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
</a>
77
</div>
88
<div class="flex items-center gap-4 font-semibold leading-6 text-brand/80">
9+
<div class="flex gap-1 px-4">
10+
<p id="viewercount">0</p>
11+
<.icon name="hero-user-solid" />
12+
</div>
913
<a href="https://github.com/elixir-webrtc/ex_webrtc" class="hover:text-brand">
1014
GitHub
1115
</a>

broadcaster/lib/broadcaster_web/endpoint.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ defmodule BroadcasterWeb.Endpoint do
1111
same_site: "Lax"
1212
]
1313

14+
socket "/socket", BroadcasterWeb.UserSocket,
15+
websocket: true,
16+
longpoll: false
17+
1418
socket "/live", Phoenix.LiveView.Socket,
1519
websocket: [connect_info: [session: @session_options]],
1620
longpoll: [connect_info: [session: @session_options]]

broadcaster/test/broadcaster_web/controllers/page_controller_test.exs

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)