-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
live_reloader.ex
52 lines (46 loc) · 1.36 KB
/
live_reloader.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
defmodule Phoenix.Router.LiveReload do
use Phoenix.Router
@external_resource phx_js_path = "priv/static/phoenix.js"
@phoenix_js File.read!(phx_js_path)
def call(%Plug.Conn{path_info: ["phoenix"]} = conn, opts) do
conn
|> super(opts)
|> halt
end
def call(conn, _opts) do
if conn.private.phoenix_endpoint.config(:live_reload) != [] do
before_send_inject_reloader(conn)
else
conn
end
end
socket "/phoenix" do
channel "phoenix", Phoenix.Channel.ControlChannel
end
defp before_send_inject_reloader(conn) do
register_before_send conn, fn conn ->
if conn |> get_resp_header("content-type") |> html_content_type? do
[page | rest] = String.split(to_string(conn.resp_body), "</body>")
body = page <> reload_assets_tag() <> Enum.join(["</body>" | rest], "")
put_in conn.resp_body, body
else
conn
end
end
end
defp html_content_type?([]), do: false
defp html_content_type?([type | _]), do: String.starts_with?(type, "text/html")
defp reload_assets_tag() do
"""
<script>
#{@phoenix_js}
var phx = require("phoenix")
var socket = new phx.Socket("/phoenix")
socket.connect()
socket.join("phoenix", {}, function(chan){
chan.on("assets:change", function(msg){ window.location.reload(); })
})
</script>
"""
end
end