lib/phoenix_asset_pipeline.ex

defmodule PhoenixAssetPipeline do
  @moduledoc """
  Asset pipeline for Phoenix app
  """

  alias __MODULE__.Endpoint
  alias Phoenix.Endpoint.{Cowboy2Adapter, Cowboy2Handler}

  @before_compile PhoenixAssetPipeline.Utils

  def start(_type, _args) do
    upgrade_dispatch()

    children = Cowboy2Adapter.child_specs(Endpoint, config())
    Supervisor.start_link(children, strategy: :one_for_one)
  end

  defp config do
    [
      http: [
        compress: false,
        port: 4001,
        protocol_options: [
          {:env, %{dispatch: {:persistent_term, :phoenix_asset_pipeline_dispatch}}}
        ]
      ],
      otp_app: :phoenix_asset_pipeline
    ]
  end

  # Store the routes in persistent_term. This may give a performance improvement
  # when there are a large number of routes
  # See https://ninenines.eu/docs/en/cowboy/2.9/guide/routing
  defp upgrade_dispatch do
    dispatch = :cowboy_router.compile([{:_, [{:_, Cowboy2Handler, {Endpoint, []}}]}])
    :persistent_term.put(:phoenix_asset_pipeline_dispatch, dispatch)
  end
end