mirror of
https://github.com/plausible/analytics.git
synced 2024-12-28 20:12:44 +03:00
69 lines
2.0 KiB
Elixir
69 lines
2.0 KiB
Elixir
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
|