From dc133690d292cdd1e76f0f965dc7d9b4359c6c35 Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Thu, 10 Oct 2019 20:49:05 +0300 Subject: [PATCH] Bump deps and update code for Elixir 1.9 --- backend/config/config.exs | 6 +-- backend/lib/archive/schemas/event.ex | 3 +- backend/lib/archive/schemas/session.ex | 3 +- backend/lib/archive/types/inet.ex | 12 +++++- backend/lib/archive/utils/session.ex | 4 +- backend/lib/reception/front_desk.ex | 36 ++++++++++++++++++ backend/lib/reception/router.ex | 12 ++---- backend/lib/reception/routes/not_found.ex | 4 +- backend/lib/reception/routes/page_view.ex | 39 +++---------------- backend/lib/reception/session.ex | 46 ++++++++++++++++++++++- backend/lib/tilastokeskus/application.ex | 4 +- backend/mix.exs | 25 ++++++------ backend/mix.lock | 34 ++++++++++------- 13 files changed, 141 insertions(+), 87 deletions(-) create mode 100644 backend/lib/reception/front_desk.ex diff --git a/backend/config/config.exs b/backend/config/config.exs index 6f3df6a..e1b24bb 100644 --- a/backend/config/config.exs +++ b/backend/config/config.exs @@ -1,6 +1,4 @@ -# This file is responsible for configuring your application -# and its dependencies with the aid of the Mix.Config module. -use Mix.Config +import Config # This configuration is loaded before any dependency and is restricted # to this project. If another project depends on this project, this @@ -29,8 +27,6 @@ use Mix.Config # # import_config "#{Mix.env}.exs" -config :ecto, json_library: Jason - config :tilastokeskus, ecto_repos: [Tilastokeskus.Archive.Repo] diff --git a/backend/lib/archive/schemas/event.ex b/backend/lib/archive/schemas/event.ex index f951318..8462124 100644 --- a/backend/lib/archive/schemas/event.ex +++ b/backend/lib/archive/schemas/event.ex @@ -17,8 +17,7 @@ defmodule Tilastokeskus.Archive.Schemas.Event do @spec changeset(Ecto.Schema.t(), map) :: Ecto.Changeset.t() def changeset(data, params \\ %{}) do data - |> cast(params, [:at, :type, :addr, :extra]) + |> cast(params, [:at, :type, :addr, :extra, :session_id]) |> validate_required([:at]) - |> put_assoc(:session, params[:session]) end end diff --git a/backend/lib/archive/schemas/session.ex b/backend/lib/archive/schemas/session.ex index 215c26f..5a790cd 100644 --- a/backend/lib/archive/schemas/session.ex +++ b/backend/lib/archive/schemas/session.ex @@ -19,8 +19,7 @@ defmodule Tilastokeskus.Archive.Schemas.Session do @spec changeset(Ecto.Schema.t(), map) :: Ecto.Changeset.t() def changeset(data, params \\ %{}) do data - |> cast(params, []) - |> put_change(:opened_at, DateTime.utc_now()) + |> cast(params, [:opened_at]) end @doc """ diff --git a/backend/lib/archive/types/inet.ex b/backend/lib/archive/types/inet.ex index 0954ef4..00010e2 100644 --- a/backend/lib/archive/types/inet.ex +++ b/backend/lib/archive/types/inet.ex @@ -2,7 +2,7 @@ defmodule Tilastokeskus.Archive.Types.Inet do @moduledoc """ Inet type for Ecto for storing IPs in PostgreSQL. - From: http://pedroassumpcao.ghost.io/ecto-type-for-ipv4-and-ipv6-addresses/ + Originally from: http://pedroassumpcao.ghost.io/ecto-type-for-ipv4-and-ipv6-addresses/ """ @behaviour Ecto.Type @@ -11,7 +11,7 @@ defmodule Tilastokeskus.Archive.Types.Inet do @doc """ Defines what internal database type is used. """ - def type(), do: :string + def type(), do: :inet @impl Ecto.Type @doc """ @@ -35,4 +35,12 @@ defmodule Tilastokeskus.Archive.Types.Inet do end def dump(_), do: :error + + @impl Ecto.Type + def equal?(term1, term2) do + term1 == term2 + end + + @impl Ecto.Type + def embed_as(_), do: :self end diff --git a/backend/lib/archive/utils/session.ex b/backend/lib/archive/utils/session.ex index 4d22a30..69dd750 100644 --- a/backend/lib/archive/utils/session.ex +++ b/backend/lib/archive/utils/session.ex @@ -47,7 +47,7 @@ defmodule Tilastokeskus.Archive.Utils.Session do """ @spec create() :: {:ok, %Session{}} | {:error, term} def create() do - cset = Session.changeset(%Session{}, %{}) - Repo.insert(cset) + Session.changeset(%Session{}, %{opened_at: DateTime.utc_now() |> DateTime.truncate(:second)}) + |> Repo.insert() end end diff --git a/backend/lib/reception/front_desk.ex b/backend/lib/reception/front_desk.ex new file mode 100644 index 0000000..4bfc299 --- /dev/null +++ b/backend/lib/reception/front_desk.ex @@ -0,0 +1,36 @@ +defmodule Tilastokeskus.Reception.FrontDesk do + @moduledoc """ + Entry point for the Raxx web service. + """ + + # Load files at compile time + @files Raxx.Static.setup(source: Path.expand("priv/static")) + + def child_spec(server_options) do + {:ok, port} = Keyword.fetch(server_options, :port) + + %{ + id: {__MODULE__, port}, + start: {__MODULE__, :start_link, [server_options]}, + type: :supervisor + } + end + + def init(init_arg) do + {:ok, init_arg} + end + + def start_link(server_options) do + {:ok, hosts} = Keyword.fetch(server_options, :hosts) + + stack = + Raxx.Stack.new( + [ + {Raxx.Static, @files} + ], + {Tilastokeskus.Reception.Router, hosts} + ) + + Ace.HTTP.Service.start_link(stack, server_options) + end +end diff --git a/backend/lib/reception/router.ex b/backend/lib/reception/router.ex index 0c02b3a..853c849 100644 --- a/backend/lib/reception/router.ex +++ b/backend/lib/reception/router.ex @@ -1,14 +1,8 @@ defmodule Tilastokeskus.Reception.Router do - @external_resource "priv/static/track.js" - @external_resource "priv/static/test.html" + use Raxx.Router - use Ace.HTTP.Service, port: 1971, cleartext: true - use Raxx.Logger - - use Raxx.Router, [ + section([{Raxx.Logger, level: :debug}], [ {%{method: :POST, path: ["track"]}, Tilastokeskus.Reception.Routes.PageView}, {_, Tilastokeskus.Reception.Routes.NotFound} - ] - - use Raxx.Static, "../../priv/static" + ]) end diff --git a/backend/lib/reception/routes/not_found.ex b/backend/lib/reception/routes/not_found.ex index faa2843..77cd0df 100644 --- a/backend/lib/reception/routes/not_found.ex +++ b/backend/lib/reception/routes/not_found.ex @@ -1,7 +1,7 @@ defmodule Tilastokeskus.Reception.Routes.NotFound do - use Raxx.Server + use Raxx.SimpleServer - @impl Raxx.Server + @impl Raxx.SimpleServer def handle_request(_req, _state) do response(404) |> set_header("content-type", "application/json") diff --git a/backend/lib/reception/routes/page_view.ex b/backend/lib/reception/routes/page_view.ex index 14104b0..91cfa89 100644 --- a/backend/lib/reception/routes/page_view.ex +++ b/backend/lib/reception/routes/page_view.ex @@ -1,9 +1,9 @@ defmodule Tilastokeskus.Reception.Routes.PageView do - use Raxx.Server + use Raxx.SimpleServer alias Tilastokeskus.Archive.Schemas.PageView require Logger - @impl Raxx.Server + @impl Raxx.SimpleServer def handle_request(req, state) do body = URI.decode_query(req.body || "") {path, path_noq, host, authority} = parse_url(body) @@ -28,14 +28,14 @@ defmodule Tilastokeskus.Reception.Routes.PageView do # Run in one transaction to avoid multiple DB checkouts {:ok, response} = Tilastokeskus.Archive.Repo.transaction(fn -> - session = get_session(req) + session = Tilastokeskus.Reception.Session.extract(req) cset = PageView.changeset( %PageView{}, %{ at: at, - session: session, + session_id: session.id, addr: addr, path: path, path_noq: path_noq, @@ -63,10 +63,7 @@ defmodule Tilastokeskus.Reception.Routes.PageView do response(200) |> set_header("content-type", "application/json") |> set_body(Jason.encode!(%{ok: "OK"})) - |> Raxx.Session.SignedCookie.embed( - session.id, - Tilastokeskus.Reception.Session.config() - ) + |> Tilastokeskus.Reception.Session.embed(session) {:error, err} -> Logger.error("Error saving pageview: #{inspect(err)}") @@ -115,32 +112,6 @@ defmodule Tilastokeskus.Reception.Routes.PageView do end end - defp get_session(req) do - case get_session_id(req) do - {:ok, uuid} -> - case Tilastokeskus.Archive.Utils.Session.find_by_id(uuid) do - nil -> - new_session() - - s -> - s - end - - {:error, _} -> - new_session() - end - end - - defp get_session_id(req) do - config = Tilastokeskus.Reception.Session.config() - Raxx.Session.SignedCookie.extract(req, config) - end - - defp new_session() do - {:ok, session} = Tilastokeskus.Archive.Utils.Session.create() - session - end - defp parse_ua(req) do Raxx.get_header(req, "user-agent", nil) |> UAInspector.parse() diff --git a/backend/lib/reception/session.ex b/backend/lib/reception/session.ex index 0894539..3b6cafb 100644 --- a/backend/lib/reception/session.ex +++ b/backend/lib/reception/session.ex @@ -18,10 +18,52 @@ defmodule Tilastokeskus.Reception.Session do end @doc """ - Raxx SignedCookie config for generating cookies for client. + Create Raxx SignedCookie config for generating cookies for client. """ + @spec config() :: Raxx.Session.t() def config() do secret = System.get_env("RAXX_SECRET") - Raxx.Session.SignedCookie.config(secret: secret, cookie_name: "tilastokeskus.session") + + Raxx.Session.config( + store: Raxx.Session.SignedCookie, + secret_key_base: secret, + salt: "statistikcentralen", + http_only: true, + key: "tilastokeskus-session-id" + ) + end + + @doc """ + Embed given session into the response. + """ + @spec embed(Raxx.Response.t(), map) :: Raxx.Response.t() + def embed(%Raxx.Response{} = response, session) when is_map(session) do + Raxx.Session.embed( + response, + session, + config() + ) + end + + @doc """ + Extract session from request or create new session. + """ + @spec extract(Raxx.Request.t()) :: map + def extract(%Raxx.Request{} = request) do + case Raxx.Session.unprotected_extract(request, config()) do + {:ok, %{id: id}} -> + case Tilastokeskus.Archive.Utils.Session.find_by_id(id) do + nil -> new_session() + session -> %{id: session.id} + end + + _ -> + new_session() + end + end + + defp new_session() do + {:ok, session} = Tilastokeskus.Archive.Utils.Session.create() + %{id: session.id} end end diff --git a/backend/lib/tilastokeskus/application.ex b/backend/lib/tilastokeskus/application.ex index 4d77416..f2e85de 100644 --- a/backend/lib/tilastokeskus/application.ex +++ b/backend/lib/tilastokeskus/application.ex @@ -16,7 +16,7 @@ defmodule Tilastokeskus.Application do children = [ {Tilastokeskus.Archive.Repo, []}, {Tilastokeskus.Archive.Scrubinator, %{days: days}}, - {Tilastokeskus.Reception.Router, [[hosts: hosts], [port: port]]} + {Tilastokeskus.Reception.FrontDesk, [hosts: hosts, port: port, cleartext: true]} ] # See https://hexdocs.pm/elixir/Supervisor.html @@ -27,7 +27,7 @@ defmodule Tilastokeskus.Application do defp get_hosts() do case System.get_env("TILASTOKESKUS_HOSTS") do - nil -> "" + nil -> [] hosts -> String.split(hosts, ",") end end diff --git a/backend/mix.exs b/backend/mix.exs index 0b57d4c..95ed7fc 100644 --- a/backend/mix.exs +++ b/backend/mix.exs @@ -4,8 +4,8 @@ defmodule Tilastokeskus.MixProject do def project do [ app: :tilastokeskus, - version: "0.1.0", - elixir: "~> 1.6", + version: "0.2.0", + elixir: "~> 1.9", start_permanent: Mix.env() == :prod, deps: deps() ] @@ -22,16 +22,19 @@ defmodule Tilastokeskus.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:raxx, "~> 0.15.4"}, - {:raxx_static, "~> 0.6.1"}, - {:ace, "~> 0.16.5"}, + {:raxx, "~> 1.1.0"}, + {:raxx_static, "~> 0.8.3"}, + {:raxx_logger, "~> 0.2.2"}, + {:raxx_session, "~> 0.2.5"}, + {:ace, "~> 0.18.8"}, {:postgrex, ">= 0.0.0"}, - {:ecto, "~> 2.2"}, - {:jason, "~> 1.0"}, - {:ua_inspector, github: "elixytics/ua_inspector"}, - {:geolix, "~> 0.16.0"}, - {:geolite2data, "~> 0.0.3"}, - {:distillery, "~> 1.5", runtime: false} + {:ecto, "~> 3.2"}, + {:ecto_sql, "~> 3.2"}, + {:jason, "~> 1.1"}, + {:ua_inspector, "~> 1.2"}, + {:geolix, "~> 1.0"}, + {:geolix_adapter_mmdb2, "~> 0.1.0"}, + {:geolite2data, "~> 1.0"} ] end end diff --git a/backend/mix.lock b/backend/mix.lock index 23acb0b..7c1ea54 100644 --- a/backend/mix.lock +++ b/backend/mix.lock @@ -1,29 +1,35 @@ %{ - "ace": {:hex, :ace, "0.16.5", "725f4511768bba7e083d3c93d8e499259101e49c0a9497252ce54a79a91e96e8", [:mix], [{:hpack, "~> 0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}, {:raxx, "~> 0.15.2", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, + "ace": {:hex, :ace, "0.18.8", "9853110247f769e7d1600be7cd2abd638b53391c8c7b1ab11baad15184cb95d4", [:mix], [{:hpack, "~> 0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}, {:raxx, "~> 0.17.0 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.3.1", "d0f424232390bf47d82da8478022301c561cf6445b5b5fb6a84d49a9e76d2639", [:rebar3], [{:parse_trans, "3.2.0", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "cookie": {:hex, :cookie, "0.1.1", "89438362ee0f0ed400e9f076d617d630f82d682e3fbcf767072a46a6e1ed5781", [:mix], [], "hexpm"}, - "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, - "decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"}, + "db_connection": {:hex, :db_connection, "2.1.1", "a51e8a2ee54ef2ae6ec41a668c85787ed40cb8944928c191280fe34c15b76ae5", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"}, + "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"}, "distillery": {:hex, :distillery, "1.5.3", "b2f4fc34ec71ab4f1202a796f9290e068883b042319aa8c9aa45377ecac8597a", [:mix], [], "hexpm"}, - "ecto": {:hex, :ecto, "2.2.10", "e7366dc82f48f8dd78fcbf3ab50985ceeb11cb3dc93435147c6e13f2cda0992e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, - "geolite2data": {:hex, :geolite2data, "0.0.3", "829acdaa56cc8a23909bd557c55e0bd158d03413e11d912ac44e980da70107f3", [:rebar3], [], "hexpm"}, - "geolix": {:hex, :geolix, "0.16.0", "0095f5e828c0b46596216efaf6a4d46aba3f1a4da3bdfec735b2e49c8cd908fb", [:mix], [{:mmdb2_decoder, "~> 0.2.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.0", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"}, + "ecto": {:hex, :ecto, "3.2.1", "a0f9af0fb50b19d3bb6237e512ac0ba56ea222c2bbea92e7c6c94897932c76ba", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"}, + "ecto_sql": {:hex, :ecto_sql, "3.2.0", "751cea597e8deb616084894dd75cbabfdbe7255ff01e8c058ca13f0353a3921b", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.2.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.2.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"}, + "geolite2data": {:hex, :geolite2data, "1.0.0", "ee10a92a2a0443b1de6efe4babc2decd1c7e37ff9ff4d39c01adb3b9d5b2003b", [:rebar3], [], "hexpm"}, + "geolix": {:hex, :geolix, "1.0.0", "b225d930fb0418871ce7d89dabf293bd80eb5bd66db1887f80510c122f4ef271", [:mix], [{:poolboy, "~> 1.0", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"}, + "geolix_adapter_mmdb2": {:hex, :geolix_adapter_mmdb2, "0.1.0", "ec8e72b095cac319a8eeb546517126c28d9673b9af208f2455464e09fc66bb01", [:mix], [{:geolix, "~> 1.0", [hex: :geolix, repo: "hexpm", optional: false]}, {:mmdb2_decoder, "~> 1.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}], "hexpm"}, "hackney": {:hex, :hackney, "1.13.0", "24edc8cd2b28e1c652593833862435c80661834f6c9344e84b6a2255e7aeef03", [:rebar3], [{:certifi, "2.3.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "hpack": {:hex, :hpack_erl, "0.2.3", "17670f83ff984ae6cd74b1c456edde906d27ff013740ee4d9efaa4f1bf999633", [:rebar3], [], "hexpm"}, "idna": {:hex, :idna, "5.1.2", "e21cb58a09f0228a9e0b95eaa1217f1bcfc31a1aaa6e1fdf2f53a33f7dbd9494", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, - "jason": {:hex, :jason, "1.0.0", "0f7cfa9bdb23fed721ec05419bcee2b2c21a77e926bce0deda029b5adc716fe2", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, + "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, - "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"}, + "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, - "mmdb2_decoder": {:hex, :mmdb2_decoder, "0.2.0", "34346c43bb1860d38d5505e5edf3d5e31a0d9fce4ee48f0c8c762875bcd05bb2", [:mix], [], "hexpm"}, + "mmdb2_decoder": {:hex, :mmdb2_decoder, "1.1.0", "2e2347521bb3bf6b81b9ee58d3be2199cb68ea42dcbafcd0d8eb40214d2844cf", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.2.0", "2adfa4daf80c14dc36f522cf190eb5c4ee3e28008fc6394397c16f62a26258c2", [:rebar3], [], "hexpm"}, - "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm"}, - "postgrex": {:hex, :postgrex, "0.13.5", "3d931aba29363e1443da167a4b12f06dcd171103c424de15e5f3fc2ba3e6d9c5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm"}, - "raxx": {:hex, :raxx, "0.15.4", "62e4a487e55e9469d1ba2d5de590672167f51eaac310f027f3f871018cb6a9fc", [:mix], [{:cookie, "~> 0.1.0", [hex: :cookie, repo: "hexpm", optional: false]}], "hexpm"}, - "raxx_static": {:hex, :raxx_static, "0.6.1", "8b48254fc3d1b8b1e473b7c307fbba0ae767c60482754ce823c664544c85d729", [:mix], [{:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:raxx, "~> 0.15.2", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, + "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"}, + "postgrex": {:hex, :postgrex, "0.15.1", "23ce3417de70f4c0e9e7419ad85bdabcc6860a6925fe2c6f3b1b5b1e8e47bf2f", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"}, + "raxx": {:hex, :raxx, "1.1.0", "d6a03143a91f8092c0be1ec555075c76c8d680601236de706f020d17abcf8b16", [:mix], [], "hexpm"}, + "raxx_logger": {:hex, :raxx_logger, "0.2.2", "51bbce9371298e7329de028fe13cf050bf59547bc8f1926910d479ba4b31c4b4", [:mix], [{:raxx, "~> 0.17.5 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, + "raxx_session": {:hex, :raxx_session, "0.2.5", "d806650289dc8f5ce7c709ba903b2b3ef306920c680af706bbbb09bfc7c2a591", [:mix], [{:cookie, "~> 0.1.1", [hex: :cookie, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:raxx, "~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, + "raxx_static": {:hex, :raxx_static, "0.8.3", "54022edeba731fa82f8c16fffe8a0c3f36bf55808aba7c3043922cb6b2951a1c", [:mix], [{:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:raxx, "~> 0.17.0 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}, - "ua_inspector": {:git, "https://github.com/elixytics/ua_inspector.git", "3cd8fb927d5e14241a6646468f6a19e57afdaccb", []}, + "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "ua_inspector": {:hex, :ua_inspector, "1.2.0", "970339552466e6a814cc6339f582d34c6814f28952bb4513f29b1d0a1dbc8847", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"}, "yamerl": {:hex, :yamerl, "0.7.0", "e51dba652dce74c20a88294130b48051ebbbb0be7d76f22de064f0f3ccf0aaf5", [:rebar3], [], "hexpm"}, }