analytics/lib/plausible_web/plugs/tracker.ex
2021-01-26 11:39:43 +01:00

69 lines
2.0 KiB
Elixir
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

defmodule PlausibleWeb.Tracker do
import Plug.Conn
use Agent
@templates [
"plausible.js",
"plausible.exclusions.js",
"plausible.hash.js",
"plausible.outbound-links.js",
"plausible.hash.exclusions.js",
"plausible.hash.outbound-links.js",
"plausible.hash.exclusions.outbound-links.js",
"plausible.exclusions.outbound-links.js",
"p.js"
]
@aliases %{
"plausible.js" => ["analytics.js"],
"plausible.hash.outbound-links.js" => ["plausible.outbound-links.hash.js"],
"plausible.hash.exclusions.js" => ["plausible.exclusions.hash.js"],
"plausible.exclusions.outbound-links.js" => ["plausible.outbound-links.exclusions.js"],
"plausible.hash.exclusions.outbound-links.js" => [
"plausible.exclusions.hash.outbound-links.js",
"plausible.exclusions.outbound-links.hash.js",
"plausible.hash.outbound-links.exclusions.js",
"plausible.outbound-links.hash.exclusions.js",
"plausible.outbound-links.exclusions.hash.js"
]
}
#  1 hour
@max_age 3600
def init(_) do
templates =
Enum.reduce(@templates, %{}, fn template_filename, rendered_templates ->
rendered = EEx.compile_file("priv/tracker/js/" <> template_filename)
aliases = Map.get(@aliases, template_filename, [])
[template_filename | aliases]
|> Enum.map(fn filename -> {"/js/" <> filename, rendered} end)
|> Enum.into(%{})
|> Map.merge(rendered_templates)
end)
[templates: templates]
end
def call(conn, templates: templates) do
case templates[conn.request_path] do
nil ->
conn
found ->
{js, _} = Code.eval_quoted(found, base_url: PlausibleWeb.Endpoint.url())
send_js(conn, js)
end
end
defp send_js(conn, file) do
conn
|> put_resp_header("cache-control", "max-age=#{@max_age},public")
|> put_resp_header("content-type", "application/javascript")
|> put_resp_header("cross-origin-resource-policy", "cross-origin")
|> send_resp(200, file)
|> halt()
end
end